Getting Started
Find the products you care about, check their current prices in one batch, then read any one of them in full.
1. Get your API key
Create an account and generate a FetchLayer API key from your dashboard. There is no Amazon account, no Product Advertising API approval and no Associates tag involved.
Create free account →2. Find the products
Price checks and product details take ASINs. If you have a keyword instead, search for it — every result carries its ASIN.
curl -X POST https://api.fetchlayer.dev/amazon/search-products \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"query":"mechanical keyboard","maxPrice":100,"marketplace":"com"}'Tip
/resolve-url first — it returns the marketplace and ASIN, or the query and filters of a search URL, without contacting Amazon, and it does not consume a credit. 3. Check their prices
/price-check takes up to 20 ASINs or product URLs on one marketplace and returns the current price of each, with a per-product status. One product failing never fails the batch.
curl -X POST https://api.fetchlayer.dev/amazon/price-check \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"asins":["B09B8V1LZ3","B00FLYWNYQ","B07S98411N"],"marketplace":"com"}'fast or full
mode: "fast" prices the whole batch in the fewest page loads and is what a polling price monitor should use; seller and stock status come back only where they are free. mode: "full" reads every product page and returns seller and stock status for every product, with a full product-page load per product. Both return the same price. 4. Read one product in full
/product-details returns the title, brand, price and list price, stock, seller, aggregate rating, images, feature bullets, categories and every variation with its own ASIN.
curl -X POST https://api.fetchlayer.dev/amazon/product-details \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"product":"https://www.amazon.de/dp/B0CFPWLGF2"}'Same ASIN, different marketplace
marketplace that contradicts it is a 400 rather than a guess, because the same ASIN can be a different product, or no product, on another Amazon. Errors and retries
A 400 names the field to fix and a 404 means the product does not exist on that marketplace — neither is worth retrying. A 502 or 503 means Amazon did not give a usable answer this time; retry after a short pause. Read notes on every successful response too.
Error responses
Every error, on every route, is JSON in one shape: error (what went wrong, in words), status, code, retryable and requestId, which also comes as the X-Request-Id header. Branch on code and retryable rather than on the text; on a 5xx the text is generic. Quote requestId when reporting a problem.
{
"error": "Missing required parameter: url",
"status": 400,
"missing": ["url"],
"code": "invalid_input",
"retryable": false,
"requestId": "922874e3-c0d0-40d8-8866-d198af132420"
}| code | Status | Retryable | Meaning |
|---|---|---|---|
| invalid_input | 400 | no | The request needs fixing; error names the field. A missing required parameter also lists it in missing. |
| unauthorized | 401 | no | The API key is missing or not valid. |
| insufficient_credits | 402 | no | Nothing left to spend: no credits, a used-up free trial, or a monthly allowance and credit balance both spent. error says which. Waiting does not help; topping up does. |
| forbidden | 403 | no | This key or account is not allowed this request. |
| not_found | 404 | no | What the request names does not exist or is not public. |
| expired | 410 | no | What the request refers to is no longer available; ask for it afresh. |
| quota_exceeded | 429 | no | A request-rate limit was reached; error says which. Slow down before sending more. |
| cancelled | 499 | no | The caller closed or cancelled the request before it finished. The work was stopped and nothing was charged. |
| time_limit | 503 | yes | Your timeoutMs ran out before there was anything to return; ask again, or allow more time. |
| temporarily_unavailable | 503 | yes | Not available right now; ask again shortly. |
| posts_unavailable | 403 | no | TikTok user videos: TikTok is not showing this account’s posts publicly right now. Asking again at once returns the same answer; nothing is charged. |
| store_unreachable | 503 | yes | Store routes (Shopify, WooCommerce): the store itself can’t be reached right now — it may be offline. Ask again later. Where a store route doesn’t say so yet, an offline store is temporarily_unavailable. |
| upstream_error | 502 | yes | The source answered in a way that could not be used; ask again later. |
| internal_error | 500 | yes | Something failed on our side; ask again later, and quote requestId if it persists. |
| tool_error | — | no | MCP only: a tool call failed in a way no other code describes; error says what. |
More codes may be added; treat one you do not recognise by its retryable flag. Over MCP, a tool error carries the same fields in structuredContent, and as a JSON text block beside the message.