Amazon Product Scraper API avatar

Amazon Product Scraper API

Pricing

from $10.00 / 1,000 products

Go to Apify Store
Amazon Product Scraper API

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

Shakamize

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

4 days ago

Last modified

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

FieldWhat it does
categoryOrProductUrlsSearch, category, Best Sellers or product URLs. Required.
maxItemsPerStartUrlStop after this many products per start URL.
maxSearchPagesPerStartUrlHow many listing pages to walk per start URL.
scrapeProductDetailsOn by default. Off keeps listing-only fields, which is faster and billed lower.
countryCodeDelivery country. Changes prices and availability.
zipCodeDelivery postal code, for address-level pricing.
locationDeliverableRoutesWhich page types the delivery location applies to.
languageLanguage to read Amazon in.
proxyCountryCountry to route requests through. Best left unset when using a ZIP code.
maxProductVariantsAsSeparateResultsScrape this many variants as full products of their own.
scrapeProductVariantPricesEmit a price for every variant.
maxOffersAlso collect competing offers per product.
scrapeSellersAttach seller details to each offer.
proxyConfigurationProxy 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.

EventPriceWhat it is
Product$0.012One fully scraped product, including its price.
Listing-only product$0.002One product read from a listing without opening it.
Variant price$0.012One variant priced individually.
Offer$0.003One additional seller offer.
Seller$0.0015One 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.

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.