How to get Amazon product data as JSON without the Product Advertising API
Turn an ASIN into JSON with one GET: title, price, availability, rating, images, bullets and the spec table. No Amazon developer account or affiliate approval.
In short
- GET /v1/structured/amazon/product?asin=… returns the product page as JSON in one call. It costs 1 credit, or 0 when a stored copy is fresh enough.
- You choose the marketplace with tld and the price currency with currency. Language is fixed to English so field labels stay stable.
- Amazon sometimes serves a CAPTCHA instead of the page. The API answers 503 SITE_BLOCKED; wait and retry, or accept a stored copy with a larger max_age.
- If you need official data for an affiliate site, Amazon's Product Advertising API is the right tool. This endpoint is for reading public product pages.
Amazon’s own Product Advertising API needs an approved Associates account, a signed request and three qualifying sales in the first 180 days, or your access is revoked. If all you want is the public product page as structured data, there is a shorter path: one GET request with the ASIN.
The request
curl "https://api.webscrapingapi.dev/v1/structured/amazon/product?asin=B0B44XTV71&tld=com¤cy=USD" \
-H "X-API-Key: wsa_your_key"
Three parameters matter. asin is the 10-character product id from the URL (/dp/B0B44XTV71). tld picks the marketplace and defaults to com. currency is the ISO code the prices should be shown in and defaults to USD. Everything else is handled for you: browser headers, redirects, the cookie that switches the price currency, and the parsing.
What comes back
The response uses the same field names as every other shop endpoint on this service, so a client written for Amazon does not need a rewrite for the next store. Amazon-only values sit in extra.
{
"site": "amazon",
"action": "product",
"data": {
"product": {
"name": "CUCKOO Twin Pressure Rice Cooker, 12-Cup Cooked, White",
"brand": { "name": "CUCKOO", "url": null },
"price": "339.99",
"regularPrice": null,
"currency": "USD",
"availability": "InStock",
"aggregateRating": { "ratingValue": "4.4", "reviewCount": 608 },
"mainImage": "https://m.media-amazon.com/images/I/71QNsrTZ47L.jpg",
"images": ["https://m.media-amazon.com/images/I/71QNsrTZ47L.jpg", "…"],
"features": ["16 Versatile Modes: …", "…"],
"additionalProperties": [{ "name": "Capacity", "value": "6 cups" }, { "name": "Part Number", "value": "CRP-ST0609FW" }],
"breadcrumbs": [{ "name": "Home & Kitchen", "url": "https://www.amazon.com/…" }, { "name": "Rice Cookers", "url": "…" }],
"sku": "B0B44XTV71"
},
"extra": {
"asin": "B0B44XTV71",
"tld": "com",
"bestSellersRank": [{ "rank": 18677, "category": "Kitchen & Dining" }, { "rank": 67, "category": "Rice Cookers" }],
"soldBy": "Amazon.com",
"shipsFrom": null,
"boughtInPastMonth": "400+ bought in past month",
"availabilityText": "In Stock"
}
},
"source": "live",
"age": 0,
"fetchedAt": "2026-09-21T05:12:40.000Z",
"credits": 1,
"elapsedMs": 2140
}
A few fields deserve a note. price is a string with a dot as the decimal separator, whatever the marketplace prints, so "1234.56" is the same number on amazon.de and amazon.com. availability is one of InStock, OutOfStock, PreOrder or Unknown; when Amazon shows a delivery-dependent message such as “cannot be shipped to your selected delivery location”, the value is Unknown and the original sentence is in extra.availabilityText. images are the full-size originals with Amazon’s size suffixes removed.
Stored copies and max_age
Every product answer is stored and shared. The first person to ask for an ASIN pays one credit; anyone asking for the same ASIN in the next 24 hours gets the stored copy for zero credits, with source: "cache" and age telling them how old it is. If you need something fresher, pass max_age in seconds: max_age=3600 accepts a copy up to an hour old, max_age=0 always fetches. Fresh fetches cost the credit; stored ones do not.
For price monitoring this is the whole design. Poll with max_age=0 only as often as the price actually matters to you, and let the shared store absorb everyone else’s reads.
When Amazon says no
Amazon does not like data-center traffic. From a home connection the product page arrives on the first try; from cloud addresses it works some of the time and returns a CAPTCHA page the rest. The API detects that page and answers 503 with code SITE_BLOCKED instead of pretending it parsed something. The credit is not charged. The sensible client behaviour is to back off for a minute and retry, or to accept an older stored copy with a large max_age when one exists. Every attempt, blocked or not, shows up in your dashboard log, so you can see the real hit rate for your own traffic before you build on it.
There is no CAPTCHA solving and no proxy rotation behind this endpoint, and it will not pretend otherwise.
When to use Amazon’s official API instead
If you run an Amazon Associates site and need prices you are allowed to display with affiliate links, use the Product Advertising API: it is the only source Amazon sanctions for that, and it includes offer listings, variations and search that this endpoint does not. If you need public page facts for research, monitoring, a comparison tool or an agent that answers “what does this product cost right now”, the endpoint above is simpler and free.
Try it
Create a key in the dashboard, then paste the curl command above with your ASIN. The endpoint reference lists every parameter and the full response shape.
Questions people ask
- Do I need an Amazon account or an affiliate ID?
- No. The endpoint reads the public product page. You only need a free webscrapingapi.dev key.
- Which marketplaces are supported?
- com, co.uk, de, fr, it, es, ca, co.jp, in, com.au, com.mx, com.br, nl, ae, sa, se, pl and sg, chosen with the tld parameter.
- Why is the price in USD when I asked for amazon.de?
- Because currency defaults to USD. Pass currency=EUR (or any ISO 4217 code) and the page is fetched with that preference. Labels stay in English.
- How fresh is the data?
- Each response carries source (live or cache) and age in seconds. The stored copy is used for up to 24 hours by default; max_age=0 forces a fresh fetch.
- What happens when Amazon blocks the request?
- The API returns 503 with code SITE_BLOCKED and does not charge the credit. Retry later, or read a stored copy if one exists.