Findcheap API
The Findcheap API has 3 endpoints:
- Search — takes structured product data as input and returns up to 10 matching products with lower prices.
- Extract — takes a product page URL as input and returns structured product data from the page.
- Search URL — simply a combination of the extract and search endpoints, to enable searching with a product page URL as input. It first calls extract to get product data, then uses the resulting product data to search.
There are two ways to integrate:
- REST API — call the API from your own code using HTTPS requests.
- MCP — a Model Context Protocol server that gives Claude, ChatGPT, and any MCP-compatible agent the ability to search for products and extract product data, with no integration code.
Both surfaces share the same API keys, credits, and rate limits.
Authentication
Every request you send must carry an API key, which you can create from the developer dashboard. Keys begin with fc_live_….
Send the key in the Authorization header — a header is a line of metadata that rides along with an HTTP request, separate from its body:
Authorization: Bearer fc_live_xxxxxxxxxxxxxxxxFor quick tests, a token query parameter is also accepted (?token=fc_live_…). Use the header in anything you ship — query strings end up in server logs.
Quickstart
Every Findcheap call has the same simple shape: your code sends an HTTPS POST request (the same mechanism a browser uses to submit a form) to an endpoint URL, carrying your API key in a header and a small JSON body that says what to search. Findcheap answers with JSON.
Here’s a complete first call — finding cheaper alternatives from nothing but a product page URL:
# One complete search. -H adds a header (your key,
# then the body's format); -d is the JSON body.
curl https://api.findcheap.ai/v1/search_url \
-H "Authorization: Bearer $FINDCHEAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.amazon.com/dp/B0BTYCRJSS"}'That’s the whole integration — there is no step two. A typical response (trimmed to two results):
{
"results": [
{
"title": "Stanley Quencher H2.0 FlowState Tumbler, 40 oz",
"price": 27.99,
"currency": "USD",
"url": "https://www.walmart.com/ip/...",
"image": "https://i5.walmartimages.com/...",
"marketplace": "Walmart",
"rating": 4.8,
"ratings_count": 11204
},
{
"title": "Stanley 40oz Quencher H2.0 Tumbler",
"price": 29.50,
"currency": "USD",
"url": "https://www.ebay.com/itm/...",
"image": "https://i.ebayimg.com/...",
"marketplace": "eBay",
"rating": null,
"ratings_count": null
}
],
"result_count": 10
}Search
Finds matching products with lower prices from structured product data — a title and image you already have (for example, from a page your agent is browsing, or a prior Extract call). Only have a URL? Use Search URL.
Request body
The product title.
A product image URL. Findcheap’s matching is multimodal — the image anchors visual matching, so a clean product photo materially improves results.
The product page this data came from, if there is one. It’s excluded from results and helps confirm the brand for exact_brand.
The product’s current price. Used to rank savings and cap results at listings that actually beat it; never required.
The product’s brand, if you already know it. A brand hint sharpens matching and is especially useful with exact_brand.
ISO 4217 code for price, e.g. "USD". Defaults to the market’s currency.
Which marketplaces to search: any of "amazon", "walmart", "ebay", "aliexpress", "shein", "other_sites" (the broader web via shopping search).
Omit it for Auto mode — the agent picks the marketplaces best suited to the product’s category.
When true, only listings from the same brand as the input product are returned — deal-hunting for the exact product rather than alternatives. Returns a 422 if no brand can be determined from the input.
"used" searches secondhand listings (requires exact_brand: true). For safety, used searches on grocery and consumable products are refused with a 403.
The shopping market to search: "US", "CA", or "AU". Prices are returned in the market’s currency.
Response
Up to 10 matching products (a custom count is available on Enterprise), ordered by deal quality:
| Field | Type | Description |
|---|---|---|
| title | string | Listing title. |
| price | number | Listing price. |
| currency | string | ISO 4217 code, e.g. USD. |
| url | string | null | Direct link to the listing. null for the occasional listing with no safe direct link. |
| image | string | Product image URL. |
| marketplace | string | Where the listing lives, e.g. Walmart, eBay, or a store name for web results. |
| rating | number | null | Average review rating, when the marketplace provides it. |
| ratings_count | number | null | Number of reviews behind rating. |
| unit_size | string | null | Pack/size context for multi-pack products, e.g. 12 oz. |
| pack_count | number | null | Units per pack, when detected. |
| normalized_price | number | null | Per-unit price for apples-to-apples comparison of different pack sizes. |
| shipping | object | Enterprise only. Shipping cost and speed for the listing. |
| seller | object | Enterprise only. Seller name, feedback score, and history. |
Search URL
Finds matching products with lower prices from nothing but a product page URL. Under the hood this chains the other two endpoints: Extract pulls the product’s title, image, price, and brand from the page, then Search runs on that data. One call, one response. Billed the same as 1 /extract and 1 /search call.
Request body
The product page URL. Returns a 422 when the page isn’t a product page, and a 502 when it couldn’t be fetched.
All Search options are accepted and passed through: marketplaces, exact_brand, condition, and market. The product facts themselves (title, image_url, price, brand) come from the page — they can’t be overridden here; call Search directly if you want to supply your own.
Response
Identical to Search — up to 10 matching products, ordered by deal quality.
Extract
Extracts structured product data from any product page URL — the same extraction stage that powers Search, exposed standalone. Useful when you want the product’s identity without running a full search.
Request body
The page to extract from.
Response
{
"is_product_page": true,
"title": "Stanley Quencher H2.0 FlowState Tumbler, 40 oz",
"price": 35.00,
"currency": "USD",
"image": "https://m.media-amazon.com/images/I/...",
"brand": "Stanley",
"in_stock": true
}When the URL isn’t a product page (a homepage, a category listing, an article), is_product_page is false and the remaining fields are null. price can be null on genuine product pages too — treat title and image as the reliable core. price is the page’s standing purchase price: the price any shopper pays, not first-order, coupon, or membership prices.
in_stock is true when the page says the product is currently purchasable, false when it’s out of stock or discontinued, and null when availability couldn’t be determined from the page.
Errors
Errors use conventional HTTP status codes with a JSON body:
{
"error": {
"type": "invalid_request",
"message": "title and image_url are required."
}
}| Status | Type | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed body or missing required fields. |
| 401 | authentication_error | Missing or invalid API key. |
| 402 | insufficient_credits | Your credit balance is exhausted. Top up or upgrade from the dashboard. |
| 403 | refused | The search was refused for safety — e.g. a used-condition search on grocery or consumable products. |
| 422 | not_searchable | The input couldn't be searched: the URL isn't a product page, or exact_brand was set and no brand could be determined. |
| 429 | rate_limited | Too many requests. Honor the Retry-After header. |
| 502 | upstream_unreachable | The target page couldn't be fetched — the site blocked the request or didn't respond. A retry may succeed. |
| 5xx | api_error | Something failed on our side. Safe to retry with backoff. |
Failed requests are never billed.
MCP server
Findcheap runs a hosted Model Context Protocol server, so agents can use Findcheap without any integration code. It speaks Streamable HTTP and authenticates with the same API keys as the REST API:
https://mcp.findcheap.ai/mcpMCP tool calls are billed identically to the endpoint they wrap — there’s no separate MCP pricing.
Tools
Finds matching products with lower prices. Takes a product URL (routed through Search URL) or a title + image (routed through Search), plus optional marketplaces, exact_brand, condition, and market. Returns the ranked listings with prices, links, and ratings.
Extracts structured product data (title, price, image, brand, stock status) from a product page URL — the same contract as Extract.
Client setup
Any MCP client that supports remote servers works. Two common setups:
// Works with Claude Code, Cursor, and any client that reads .mcp.json
{
"mcpServers": {
"findcheap": {
"type": "http",
"url": "https://mcp.findcheap.ai/mcp",
"headers": {
"Authorization": "Bearer fc_live_..."
}
}
}
}Once connected, the agent sees both tools and their schemas automatically. A prompt like “find this tumbler cheaper: <url>” is enough — the agent calls find_cheaper_products and works with the returned listings.