Amazon Product Scraper API
Pricing
from $10.00 / 1,000 products
Amazon Product Scraper API
Scrape Amazon products from search, category and product URLs across 23 marketplaces. Pricing is localized to the delivery location you choose, so a ZIP code, a region or a whole country each return what a buyer there actually pays.
Pricing
from $10.00 / 1,000 products
Rating
0.0
(0)
Developer
Shakamize
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape Amazon products from search results, category pages and product URLs. Returns titles, prices, ratings, review counts, variants, offers and sellers as structured JSON, CSV or Excel, across 23 Amazon marketplaces.
Pricing is localized to the delivery location you choose. Amazon charges different prices in different places, so a ZIP code, a region or a whole country each return what a buyer in that location would actually pay, in their own currency.
Use it to track a competitor's price over time, monitor stock and which seller holds the buy box, enrich a list of ASINs into a full product catalogue, or check what a product costs for a shopper at a specific address. For customer reviews, star breakdowns per review and review text, use Amazon Reviews Scraper API instead: this Actor returns catalogue and pricing data, not reviews.
What people scrape Amazon product data for
- Amazon price tracking and repricing - watch what a product costs at a specific delivery address over time, in the currency a buyer there actually pays.
- Competitor and market research on Amazon - pull a whole search or category, with ratings, review counts and Amazon bestseller ranks.
- ASIN catalogue enrichment - turn a list of ASINs into full product data.
- Buy box, offer and seller monitoring - see who else is selling an item and at what price, including which seller currently holds the buy box.
How to scrape Amazon prices by delivery address and ZIP code
Amazon does not have one price. It has a price per delivery location, and it picks that location from wherever your request appears to come from. A scraper that does not set the location explicitly reports whatever its exit node implied - and often reports no price at all, because Amazon hides the buy box for an address it cannot ship to.
Set countryCode and zipCode and the scraper performs Amazon's own delivery
address handshake before it reads a page, so every price is the price for that
address. Across a 40-product test spanning five categories, every product came back with
the requested location applied and a price attached.
Every result carries the location it was actually scraped under:
"deliveryLocation": {"countryCode": "US", "zipCode": "10001","city": "NEW YORK", "state": "NY", "applied": true}
If applied is false, the price is whatever Amazon showed for the exit node's
own location rather than yours. It is never silently presented as the same
thing.
How to scrape an Amazon search, category, product URL or bare ASIN
At minimum, one or more URLs:
{"categoryOrProductUrls": [{ "url": "https://www.amazon.com/s?k=microsd+card" }],"maxItemsPerStartUrl": 100,"countryCode": "US","zipCode": "10001"}
Search URLs, category URLs and product URLs all work, and can be mixed. Bare ASINs are accepted too.
Best Sellers and New Releases URLs work as well, and carry the rank:
{"categoryOrProductUrls": [{ "url": "https://www.amazon.com/gp/bestsellers/electronics/" }],"scrapeProductDetails": false}
Each row from one of those pages carries bestsellerRank, read from the badge
on the card. The rank is not continuous across pages: Amazon renders 30 of every
50 ranks, so page 2 starts at #51. A bestsellers card also carries no price
of its own; leave scrapeProductDetails on to price the products it lists.
Input reference for every Amazon scraper setting
| Field | What it does |
|---|---|
categoryOrProductUrls | Search, category, Best Sellers or product URLs. Required. |
maxItemsPerStartUrl | Stop after this many products per start URL. |
maxSearchPagesPerStartUrl | How many listing pages to walk per start URL. |
scrapeProductDetails | On by default. Off keeps listing-only fields, which is faster and billed lower. |
countryCode | Delivery country. Changes prices and availability. |
zipCode | Delivery postal code, for address-level pricing. |
locationDeliverableRoutes | Which page types the delivery location applies to. |
language | Language to read Amazon in. |
proxyCountry | Country to route requests through. Best left unset when using a ZIP code. |
maxProductVariantsAsSeparateResults | Scrape this many variants as full products of their own. |
scrapeProductVariantPrices | Emit a price for every variant. |
maxOffers | Also collect competing offers per product. |
scrapeSellers | Attach seller details to each offer. |
proxyConfiguration | Proxy settings. Residential by default, which Amazon requires. |
Amazon product data you get back, as JSON, CSV or Excel
One record per product, with price, list price, stars, review count, star breakdown, variants, bestseller ranks and seller. This is a real result, not an illustration:
{"url": "https://www.amazon.com/dp/B0GC4J6CCC","asin": "B0GC4J6CCC","title": "NORTIV 8 Men's Trail Running Shoes Wide Toe Box","brand": "NORTIV 8","price": {"value": 63.99,"currency": "$","currencyCode": "USD"},"listPrice": {"value": 69.99,"currency": "$","currencyCode": "USD"},"inStock": true,"stars": 4.4,"reviewsCount": 1188,"starsBreakdown": {"5star": 0.7,"4star": 0.16,"3star": 0.07,"2star": 0.03,"1star": 0.04},"breadCrumbs": "Clothing, Shoes & Jewelry › Men › Shoes › Athletic › Running › Trail Running","features": ["Breathable mesh upper with a wide toe box"],"variantAsins": ["B0FG2KH6BQ", "B0GC584NSB"],"variantAttributes": [{"key": "size_name","label": "Size","value": "11"},{"key": "color_name","label": "Color","value": "Dark Blue"}],"bestsellerRanks": [{"category": "Clothing, Shoes & Jewelry","rank": 10192}],"seller": {"name": "topshoesUS","id": "ABB9OQDQJ01FR"},"deliveryLocation": {"countryCode": "US","zipCode": "10001","city": "NEW YORK","state": "NY","applied": true},"locationText": "New York 10001","countryCode": "US"}
Variant prices and offers arrive as their own records, keyed by parentAsin.
A field that could not be read is null. It is never a zero, and never a value
borrowed from a neighbouring product on the page.
Correctness: buy box prices, locale numbers and variant pricing
Three things this scraper is deliberately careful about, because they are the common ways Amazon data comes back quietly wrong.
Prices come only from the buy box. A product page also carries prices for recommended products in its carousels. A page-wide price selector picks one of those up and reports it as the product's own price.
Numbers are read in the locale that wrote them. 36 704 évaluations on
amazon.fr is 36,704 reviews, not 36. Nr. 1.234 on amazon.de is rank 1234,
not rank 1. 48.6K on a search card is 48,600, not 48. Separator handling is
decided from the number's own structure first and the marketplace only when the
number is genuinely ambiguous.
Variant prices cannot take the product down with them. Each variant price is fetched as an independent request. A variant that fails to load costs you that variant, not the parent product.
Amazon product scraper pricing, pay per result
You are charged for results, not for runs or for time.
| Event | Price | What it is |
|---|---|---|
| Product | $0.012 | One fully scraped product, including its price. |
| Listing-only product | $0.002 | One product read from a listing without opening it. |
| Variant price | $0.012 | One variant priced individually. |
| Offer | $0.003 | One additional seller offer. |
| Seller | $0.0015 | One seller profile attached to an offer. |
Setting a delivery location is not charged. It is the part most likely to be wrong elsewhere, so it is included rather than sold separately.
If you only need names, prices and ratings across a category, turn off
scrapeProductDetails: results then come from the listing pages at a sixth of
the price.
Proxies for scraping Amazon without getting blocked
Use Apify residential proxy. Amazon serves an anti-bot interstitial to unproxied traffic, and datacenter addresses are blocked after roughly one request. Residential is the default in the input.
Leave the proxy country unset when you pass a zipCode. An exit inside the
marketplace's own country makes Amazon resolve a location of its own, and it
will then not hand over the token needed to change that location to yours. The
scraper handles this for you unless you override proxyCountry explicitly.
Supported Amazon marketplaces, 23 countries
Australia, Belgium, Brazil, Canada, Egypt, France, Germany, India, Ireland, Italy, Japan, Mexico, Netherlands, Poland, Saudi Arabia, Singapore, South Africa, Spain, Sweden, Turkey, United Arab Emirates, United Kingdom, United States.
Errors: what happens when an Amazon URL cannot be scraped
A URL that cannot be scraped produces a record rather than disappearing:
{"error": "product_not_found","errorDescription": "Loaded a 404 page. The product does not exist.","input": "https://www.amazon.com/dp/B0XXXXXXXX","url": "https://www.amazon.com/dp/B0XXXXXXXX"}
FAQ
Why is the price different from what I see on Amazon?
Amazon prices against a delivery address. With no address set it picks one for
you, based on where the request appeared to come from, and the page you get is
correct for somewhere else. Set countryCode and zipCode and the price is for
your address instead.
Measured on 2026-09-01, the same renewed iPhone 11 was $176.00 with free next-day delivery to ZIP 10001, and $177.95 plus $5.64 shipping arriving eight days later to ZIP 99501. That is $176.00 against $183.59 landed, from nothing but the delivery address.
How do I scrape Amazon prices for a specific ZIP code?
Set countryCode and zipCode, then read deliveryLocation.applied on each
row. true means Amazon accepted your address; false means that row's price
is for the exit node's location rather than yours. locationText shows the
address Amazon printed on the page.
To compare regions, run once per ZIP and join on asin. There is no
multi-address mode, because Amazon holds one delivery address per session.
How do I know the delivery location actually applied?
deliveryLocation.applied. This matters more than it sounds, because a
plausible price comes back whether or not the address took effect, so the price
alone is not evidence.
Also test on a product whose price actually moves. Of three products measured across two ZIPs, only one changed price. Verifying this feature on the other two would have suggested it does nothing.
Can I use a cheaper proxy?
For located runs, not reliably. The delivery-location handshake did not complete
once in ten cold attempts on Apify Unblocker, and a located run applied the ZIP
to 0 of 7 products where residential applied it to 10 of 10. The actor
fills in RESIDENTIAL when you leave the proxy group empty for that reason. An
explicit choice still wins.
Some products come back with no price. Is that a bug?
Usually it is a short render rather than a suppressed buy box, and the fix is to fetch again. Of six such pages re-fetched, five priced on the next attempt.
Separately, treat a currency that disagrees with the marketplace as a failed read rather than a surprising number. Roughly 3 in 200 products on amazon.com come back from a foreign store, and the currency code is the only thing that gives it away.
Legal: public product data only, no personal data
This scraper collects publicly visible product information only. It does not collect personal data, and it does not collect reviewer identities or review text.
Telemetry
The actor reports run health to its maintainer: error codes, the build number, the marketplace domain, and per-field counts of how often a value was found.
When requests fail, it also sends a small, capped sample of the failures themselves, so that a broken run can be diagnosed and fixed: the Amazon URL that was requested, the HTTP status code that came back, and the error with its stack trace. That URL is the page you asked for, query string included. It is not personal data, but it is your input, and this section says so rather than leave you to find out.
Your other input settings, your proxy configuration, and the scraped content itself are never sent. A run that succeeds sends the same summary without the failure sample: how many results it stored, the run and build it came from, and the per-field counts. Nothing about a healthy run is worth hiding, and a run nobody hears about cannot be improved.
At the end of a run the actor also reads the run's own platform cost and adds up what it charged, and sends those two dollar amounts with the summary, so the maintainer can tell when a run cost more to serve than it earned. Nothing about your account or billing beyond this run's two totals is read or sent.

