How do you monitor Amazon prices via API without getting blocked?
Call ReefAPI's amazon product/detail action with an ASIN and a marketplace and read price, list price, rating, availability, variations and barcodes back as JSON. The two facts that decide whether your monitor is correct: an ASIN belongs to one marketplace, and a null price is a real answer rather than a failure.
This guide demonstrates the real Amazon API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.
Price monitoring, retail analytics, catalog enrichment and competitive research.
Call the live endpoint
- 1
Fix the marketplace first
marketplace selects which Amazon site is queried across 19 of them, and it changes which ASINs exist. An ASIN valid on com can be a 404 on de - we returned NOT_FOUND for exactly that case.
- 2
Resolve products by barcode when crossing borders
gtin, upc and the barcodes array are the marketplace-independent identifiers. gtin-to-asin turns one into the local ASIN.
- 3
Treat null price as a state, not an error
An unavailable product returns price, price_str and currency all null with the reason in availability. Record the state; do not substitute zero and do not retry.
- 4
Take rating_count from detail
The search card's count is currently under-reporting by a factor of 100 in our parser - 186 against 18,649 for the same ASIN. The rating value itself is consistent between the two.
- 5
Batch a watchlist rather than looping
products_batch takes a list of ASINs in one request, which is the shape a price monitor actually needs. Failed calls are not charged.
Copy the request
These snippets use the captured request params for amazon/v1/search.
curl -X POST https://api.reefapi.com/amazon/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"laptop"}'import requests
r = requests.post(
"https://api.reefapi.com/amazon/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "laptop"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/amazon/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "laptop"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.amazon.search with {"query":"laptop"}.Captured output from ReefAPI
Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.
{
"method": "POST",
"url": "https://api.reefapi.com/amazon/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "laptop"
}
}{
"ok": true,
"meta": {
"api": "amazon",
"endpoint": "search",
"mode": "live",
"latency_ms": 2675.3,
"record_count": 16,
"bytes": 1677407,
"cache_hit": false,
"completeness_pct": 100,
"marketplace": "com",
"currency_code": "USD",
"pagination": {
"page": 1,
"has_more": true
},
"charged_credits": 1,
"version": "0.1.0"
},
"data": {
"results": [
{
"asin": "B0H5BTZFC1",
"title": "15.6 Inch Laptop Computer, N4020, 4GB DDR4 RAM, 128GB eMMC,with Windows 11",
"brand": null,
"price": 229.99,
"currency": "$",
"rating": 4.8,
"rating_count": 2024,
"image": "https://m.media-amazon.com/images/I/718nDryvGTL._AC_UY218_.jpg",
"sponsored": false,
"coupon": null,
"campaign": null,
"availability": null,
"in_stock": true,
"currency_code": "USD"
},
{
"asin": "B0HFNC155T",
"title": "15.6 Inch Laptop with FHD display, 6GB RAM 128GB Storage Expandable 512GB",
"brand": null,
"price": 259.99,
"currency": "$",
"rating": 4.9,
"rating_count": 30,
"image": "https://m.media-amazon.com/images/I/81xYyz6RqhL._AC_UY218_.jpg",
"sponsored": false,
"coupon": null,
"campaign": "Limited time deal",
"availability": null,
"in_stock": true,
"currency_code": "USD"
},
{
"asin": "B0H3P26C4C",
"title": "HP Everyday Slim Laptop • 2026-2027 Edition • Microsoft Office 365 Included • Intel N150 CPU • 128GB SSD + 1TB Cloud Storage • Stunning Color • Copilot AI • Windows 11",
"brand": null,
"price": 299.99,
"currency": "$",
"rating": 5,
"rating_count": 1,
"image": "https://m.media-amazon.com/images/I/71is4WH8YTL._AC_UY218_.jpg",
"sponsored": false,
"coupon": null,
"campaign": "Limited time deal",
"availability": null,
"in_stock": true,
"currency_code": "USD"
}
],
"page": 1
}
}Why this is hard manually
The assumption that breaks cross-border price monitors is that an ASIN is a global product id. It is not. We pulled B0BSHF7WHW from amazon.com and got a MacBook Pro; the same ASIN on amazon.de returned a 404 and we surfaced it as NOT_FOUND. Amazon issues ASINs per marketplace, and the same physical product usually has a different one in each. If you want a product across regions, join on GTIN or UPC, not on ASIN.
The second is that a missing price is information. The MacBook we pulled returned price null, price_str null, currency null and availability 'Currently unavailable. We don't know when or if this item will be back in stock.' A monitor that records that as a zero, or that retries it as an error, is misreading Amazon telling it the truth. completeness_pct dropped to 85.7 on that response precisely because those fields were legitimately empty.
The third is that Amazon's search grid and its product page do not agree about numbers, and one of them is the one you want.
Why ReefAPI solves it
Read rating_count from product/detail, not from search. We measured the same ASINs through both paths on the same day and the search figure was consistently a hundredth of the detail figure: B0BQLLB61B returned 186 in search and 18,649 in detail, B0BR3M8XHK returned 307 and 30,753, B0CCDZWH5H returned 38 and 3,812. That is a defect in our search-card parsing rather than a difference in what the two surfaces measure, and we are fixing it. Until then the detail value is the one that matches what Amazon displays. The rating itself (4.4, 4.6, 4.7) agrees between the two.
Titles run the other way. Search returns Amazon's full SEO title - 'Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display | 85W Max PD, 1 Powered USB-C 5Gbps & 2 Powered USB-A 3.0 5Gbps Data Ports, for MacBook Pro...' - while detail returns the trimmed display title. If you are string-matching against a supplier catalog, the search title has more to match on.
product/detail carries the identifiers that make Amazon data joinable to anything else: gtin ('00194644101237', zero-padded to 14), upc ('194644101237'), ean and isbn (null on non-book, non-EU items), and a barcodes array that can hold more than one value - our test item listed two. That array is what lets you match an Amazon listing to a Walmart or eBay listing for the same physical product.
variations is a map, not a count. It returns count 5 plus asin_map keyed by ASIN with the option values as the value: {'B0CH9KN8TB': ['Blue'], 'B0CH9JN4R4': ['Grey'], 'B0BQLLB61B': ['Black'], ...}. To monitor a colour family you enumerate that map once and then track each ASIN separately, because price and availability move independently per variant.
currency is a symbol, not an ISO code. It comes back as '$' on the US marketplace because that is what Amazon prints. price is the numeric value, price_str is the display string ('$17.99'), and list_price carries the strike-through price when one exists - 24.99 against a 17.99 price on our test item, matching the campaign field's 'Limited time deal'. coupon is separate and was null.
Fourteen actions share the engine: product/detail, product/reviews, product/offers, product/related, search, products_batch, bestsellers, new-releases, deals, autocomplete, seller/profile, seller/products, seller/reviews and gtin-to-asin. products_batch takes a list of ASINs in one call, which is the right shape for a monitor with a fixed watchlist. gtin-to-asin goes the other way and is how you resolve a barcode you already have. Search answered in about 2.0 seconds, detail in 3.1 to 9.5 depending on how much A+ content the listing carries.
Questions developers ask
Is an ASIN the same product on every Amazon site?
No. ASINs are issued per marketplace. B0BSHF7WHW is a MacBook Pro on amazon.com and a 404 on amazon.de, which we return as NOT_FOUND. Use GTIN or UPC to match a product across marketplaces, then gtin-to-asin to get the local ASIN.
Why is price null on a product that clearly exists?
Because it is not currently purchasable. The availability field carries Amazon's own wording, such as 'Currently unavailable. We don't know when or if this item will be back in stock.' price, price_str and currency are all null together, and completeness_pct reflects it - 85.7 on our test.
Why does rating_count differ between search and detail?
Because our search-card parser is currently reading it a hundred times too low. We measured three ASINs on the same day: 186 vs 18,649, 307 vs 30,753 and 38 vs 3,812. Use the detail value, which matches the number Amazon shows. The rating score is identical on both paths.
Why is currency a dollar sign instead of USD?
Because that is what Amazon prints on the page and we pass it through rather than inferring an ISO code from the marketplace. Derive the ISO code from the marketplace parameter you sent, which you control.
How do I track every colour of a product?
product/detail returns variations.asin_map, which maps each sibling ASIN to its option values. Enumerate it once, then monitor each ASIN - price and stock move independently per variant.
Can I trust list_price as the real former price?
Treat it as Amazon's strike-through figure, not as a verified historical price. On our test item it was 24.99 against a 17.99 price with campaign 'Limited time deal', which is coherent, but a strike-through price is a merchandising number everywhere in retail.
What is the cheapest way to watch a fixed list of products?
products_batch. It takes an ASIN list in one request instead of one call per product, and failed calls are never charged.