Amazon Product Scraper — Zip-Code Accurate Prices
Pricing
from $2.00 / 1,000 product results
Amazon Product Scraper — Zip-Code Accurate Prices
Scrape Amazon products by ASIN, URL or keyword across 15 marketplaces. Real-time prices, ratings, stock, images, brand and review aspects, priced for the zip code you choose. Location billed once per run, never per result. Never charged for not-found items.
Pricing
from $2.00 / 1,000 product results
Rating
0.0
(0)
Developer
Dev
Maintained by CommunityActor stats
1
Bookmarked
15
Total users
8
Monthly active users
14 days ago
Last modified
Categories
Share
Scrape Amazon product data by ASIN, product URL, or search keyword across 15 marketplaces. 28 fields per product — real-time prices, Best Sellers Rank, rating distribution, specs, seller, demand signals, delivery estimates and Amazon's own review aspects — priced and dated for the zip code you choose, not whatever region the scraper happened to run from.
No Amazon API key. No Amazon login. No scraping infrastructure to maintain.
Why this one
Amazon shows different prices, delivery dates and availability depending on where the shopper is. Most scrapers ignore this and silently return whatever their proxy saw — so your "price history" is really a history of random data-centre locations.
This Actor sets a real delivery location first, then scrapes. And it bills that setup once per run, not once per product.
| Typical competitor | This Actor | |
|---|---|---|
| Location-accurate pricing | rarely, or billed per result | yes, billed once per run |
| Charged for not-found items | often | never |
| Charged for blocked retries | often | never |
| Minimum charge | commonly applied | none |
| Missing price returned as | 0 | null (a 0 would mean "free") |
| Delivery estimate per zip | rarely | yes, deliveryDate moves with the zip |
| Duplicate rows billed | sometimes | never — deduplicated before charging |
| Warns when your proxy degrades results | no | yes, during the run and in RUN_SUMMARY |
Worked example — 100 products with a zip code:
This Actor: 100 x $0.002 + $0.02 once = $0.22Per-result location billing: 100 x $0.038 = $3.80
Quick start
Pick any one of three input modes. You can combine them.
By ASIN
{ "asins": ["B07CMS5Q6P", "B07L4BM851"] }
By URL
{ "urls": ["https://www.amazon.com/dp/B07CMS5Q6P"] }
By keyword search
{ "search": ["wireless gaming mouse"], "maxItemsPerStartUrl": 20 }
With location-accurate pricing
{ "asins": ["B07CMS5Q6P"], "zipCode": "90210" }
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
asins | string[] | [] | Amazon ASINs, e.g. "B07CMS5Q6P". |
urls | string[] | [] | Amazon product URLs. The ASIN is extracted automatically. |
search | string[] | [] | Search keywords. Every matching product is scraped. |
maxItemsPerStartUrl | integer | 20 | Max products collected per search keyword. The Actor paginates Amazon's result pages to reach it. |
marketplace | string | "amazon.com" | One of the 15 marketplaces listed below. |
zipCode | string | null | Delivery zip code for location-accurate prices and stock. Cannot be combined with countryCode. |
countryCode | string | null | Delivery country as an alternative to zipCode. Cannot be combined with it. |
proxyConfiguration | object | Apify proxy | Supply your own residential proxies to pay the discounted BYO rate. See below. |
includePersonalData | boolean | false | Off by default. Product output contains no customer data. |
At least one of asins, urls or search is required.
Marketplaces: amazon.com · amazon.co.uk · amazon.de · amazon.fr ·
amazon.it · amazon.es · amazon.ca · amazon.com.mx · amazon.com.br ·
amazon.co.jp · amazon.in · amazon.com.au · amazon.nl · amazon.se · amazon.pl
The proxy country is matched to the marketplace automatically.
Output reference
One dataset item per product. Every field below is always present; nullable ones are marked.
| Field | Type | Null? | Description |
|---|---|---|---|
asin | string | no | Amazon Standard Identification Number. |
url | string | no | Canonical product URL. |
title | string | yes | Product title. |
brand | string | yes | Brand name. |
price | object | no | { value: number|null, currency: string|null } — current offer. |
listPrice | object | no | { value: number|null, currency: string|null } — RRP / strike-through price. |
stars | number | yes | Average rating, 1–5. |
reviewsCount | integer | yes | Total ratings count. |
inStock | boolean | no | Whether Amazon reports the item in stock. |
availability | string | yes | Raw availability text, e.g. "In Stock". |
features | string[] | no | Feature bullets. Empty array if none. |
images | string[] | no | Absolute image URLs. Empty array if none. |
breadCrumbs | string | yes | Category path, e.g. "Video Games > PC > Gaming Mice". |
categories | string[] | no | Category path as an array. |
bestsellerRanks | object[] | no | { rank: number, category: string } — Best Sellers Rank per category. |
specs | object | no | Amazon's specification table as key/value pairs. |
starsBreakdown | object | yes | { "5star": 79, "4star": 11, ... } rating distribution, in percent. |
badges | string[] | no | e.g. "Amazon's Choice", "Prime", "Best Seller". |
discountPercent | integer | yes | Computed from price against listPrice. |
description | string | yes | Long product description. |
boughtInPastMonth | string | yes | Amazon's demand signal, e.g. "10K+ bought in past month". |
soldBy | string | yes | Seller name. |
shipsFrom | string | yes | Fulfiller, e.g. "Amazon". |
deliveryDate | string | yes | Delivery estimate for the zip code you requested. |
hasAPlusContent | boolean | no | Whether the listing has A+ brand content. |
aspects | object[] | no | Amazon's own review aspects — see below. |
deliveryLocation | string | yes | The location the price reflects, e.g. "Beverly Hills 90210". |
scrapedAt | string | no | ISO 8601 UTC timestamp. |
Example output
{"asin": "B07CMS5Q6P","url": "https://www.amazon.com/dp/B07CMS5Q6P","title": "Logitech G305 Lightspeed Wireless Gaming Mouse - Black","brand": "Logitech G","price": { "value": 29.99, "currency": "$" },"listPrice": { "value": 49.99, "currency": "$" },"stars": 4.6,"reviewsCount": 39996,"inStock": true,"availability": "In Stock","features": ["The next-generation optical HERO sensor delivers incredible performance"],"images": ["https://m.media-amazon.com/images/I/31zy93Vq31L._AC_.jpg"],"breadCrumbs": "Video Games > PC > Accessories > Gaming Mice","categories": ["Video Games", "PC", "Accessories", "Gaming Mice"],"bestsellerRanks": [{ "rank": 10, "category": "Video Games" },{ "rank": 1, "category": "PC Gaming Mice" }],"specs": { "Brand": "Logitech G", "Color": "Black", "Connectivity Technology": "USB" },"starsBreakdown": { "5star": 79, "4star": 11, "3star": 4, "2star": 2, "1star": 4 },"badges": ["Amazon's Choice", "Prime"],"discountPercent": 40,"boughtInPastMonth": "10K+ bought in past month","soldBy": "Sold by Amazon Resale and Fulfilled by Amazon.","shipsFrom": "Amazon","deliveryDate": "FREE delivery Tuesday, September 22","hasAPlusContent": true,"aspects": [{ "label": "quality", "mentions": 3241, "mentionsPercentage": 84, "sentimentMentions": 2715 },{ "label": "battery life", "mentions": 894, "mentionsPercentage": 84, "sentimentMentions": 754 }],"deliveryLocation": "Beverly Hills 90210","scrapedAt": "2026-09-16T19:43:28.633Z"}
Review aspects
aspects carries Amazon's own AI-extracted review themes with mention counts across the
entire review corpus — a sentiment breakdown over tens of thousands of reviews,
without scraping a single review body. Useful for product research and competitor
comparison.
Zip-code accurate pricing
Pass zipCode and the Actor performs Amazon's real delivery-location flow before
scraping, so prices, delivery dates and stock reflect that location.
{ "asins": ["B07CMS5Q6P"], "zipCode": "10001" }
Every returned row carries deliveryLocation so you can prove which location a price
came from, and deliveryDate — Amazon's delivery estimate for that zip code. Change
the zip and both move. Location setup is charged once per run regardless of how many
products you scrape.
Bring your own proxy
Residential proxy bandwidth is most of what this Actor costs to run, so you can supply your own and pay less.
{ "asins": ["B07CMS5Q6P"],"proxyConfiguration": { "proxyUrls": ["http://user:pass@your-gateway:7777"] } }
Residential proxies only — this is not a preference
Amazon blocks datacenter IPs. Measured on 12 live products at production concurrency:
| proxy type | requests that returned a product |
|---|---|
| Residential | 83% |
| Datacenter | 25% |
A datacenter pool does not fail cleanly — it returns some rows. You would get roughly a quarter of the products you asked for, with the rest silently missing, and the run would look like it worked. Prices and stock you do get are still correct; the problem is everything you never receive.
Worse, a datacenter proxy can pass the startup check by luck, because that check only needs one request to succeed. So the Actor also watches the block rate during the run and warns you if it climbs:
PROXY QUALITY: Amazon blocked 45% of requests through your proxy. That patternusually means datacenter IPs — Amazon blocks those (measured ~25% success, against~83% for residential). Results will be incomplete until you switch to a residential pool.
The same warning is written to RUN_SUMMARY.proxyQualityWarning, so an automated
pipeline can detect it without reading logs.
If you are unsure what you have: datacenter proxies are the cheap, fast, unlimited- bandwidth kind. Residential proxies are sold by the gigabyte and cost meaningfully more — roughly what makes this discount worth taking in the first place.
Do not paste an Apify Proxy URL here. proxy.apify.com is not reachable from inside
a running Actor, so it fails with unreachable. If you want Apify Proxy, leave this
field on "Use Apify Proxy" instead — the Actor wires it up correctly and bills the
standard rate.
- Your proxy is checked before the run starts. The Actor fetches an Amazon page through it, retrying on fresh sessions. If it cannot get through, the run stops immediately with the reason and nothing is charged — you are never billed for a run that was doomed by a proxy misconfiguration.
- There is no fallback. If your proxies fail mid-run you get fewer results. The Actor will never quietly finish on our bandwidth at the discounted rate.
- Rotation is yours to provide. One session is pinned to one of your URLs for its lifetime. Supply several URLs, or a gateway that rotates per connection or accepts a session token in the username, or every request will exit from the same IP.
- Leave it unset and the Actor uses our proxies at the standard rate.
Pricing
| Event | Price | When |
|---|---|---|
result | $0.002 | per product returned, using our proxies |
resultByoProxy | $0.0012 | per product returned, using your proxies (from 5 October 2026) |
locationSetup | $0.02 | once per run, only if zipCode is set |
The BYO rate takes effect on 5 October 2026 — Apify requires two weeks' notice for
any pricing change on a public Actor. You can supply proxies today; until that date those
runs are billed at the standard result rate.
- No minimum charge.
- Not-found products are never charged.
- Blocked requests and retries are never charged.
50 products, no location 50 x $0.002 = $0.1050 products, with zip code 50 x $0.002 + $0.02 = $0.12
Use cases
- Price monitoring — track competitor prices per region with zip-code accuracy.
- MAP compliance — verify resellers honour minimum advertised price in each market.
- Dropshipping and arbitrage — check live prices and stock before listing.
- Market research — compare ratings, review distribution, Best Sellers Rank and review aspects across a category.
- Demand estimation —
bestsellerRanksplusboughtInPastMonthare the inputs sales-estimate models are built on. - Logistics and delivery SLAs —
deliveryDateper zip code, for comparing fulfilment speed by region. - Catalogue enrichment — fill in titles, brands, images and features from ASINs.
- AI agents and RAG — feed structured, typed product data to an LLM pipeline.
Calling from code
API — start a run and wait for results
curl -X POST "https://api.apify.com/v2/acts/smart_albatross~amazon-product-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"asins":["B07CMS5Q6P"],"zipCode":"10001"}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('smart_albatross/amazon-product-scraper').call({asins: ['B07CMS5Q6P', 'B07L4BM851'],zipCode: '10001',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].price.value);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("smart_albatross/amazon-product-scraper").call(run_input={"search": ["wireless gaming mouse"], "maxItemsPerStartUrl": 20})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["asin"], item["price"]["value"], item["stars"])
For AI agents and automated callers
Deterministic contract, in one place:
- Actor ID:
smart_albatross/amazon-product-scraper - Required input: at least one of
asins(string[]),urls(string[]),search(string[]) - Mutually exclusive:
zipCodeandcountryCode. Supplying both fails fast, before any network cost. - Output: one dataset item per product, schema exactly as the Output reference table.
- Never returns: partial rows without an
asin, or a numeric0standing in for an unknown price. - Run summary: written to the key-value store under
RUN_SUMMARYas{ requested, ok, notfound, blocked, charged, locationCharged, blockRate, transport }. - Failure semantics: a single unavailable ASIN never fails the run. The Actor exits
0with partial results, andRUN_SUMMARYreports what happened. - Idempotency: same input, same marketplace and same zip code yield the same rows, except for values Amazon itself changes (price, stock, review counts).
Distinguishing the three "no data" cases:
| Case | Row returned? | Signal |
|---|---|---|
| Product exists, no current offer | yes | price.value is null, inStock is false |
| ASIN does not exist / wrong marketplace | no | counted in RUN_SUMMARY.notfound |
| Amazon blocked the request after retries | no | counted in RUN_SUMMARY.blocked |
Limits and behaviour
- Search paginates through Amazon's result pages until
maxItemsPerStartUrlis reached, the results stop changing, or 20 pages are read — whichever comes first. Amazon serves roughly 30–60 organic results per page, so a request for 500 reads about 10 pages. - Sponsored placements and availability vary by marketplace and location; results reflect the live page at scrape time.
price.valueisnull— never0— when Amazon shows no offer.- Transport retries blocked requests on a fresh session and reports
blockRateinRUN_SUMMARY. Retries are not billed.
FAQ
Do I need an Amazon API key? No. The Actor reads publicly accessible product pages.
Does it need an Amazon account or login? No. It never logs in, and never asks for credentials or session cookies.
Can I get prices for a specific city or zip code?
Yes — that is the point. Pass zipCode and every row reports the deliveryLocation its
price came from.
Why is price.value null for some products?
Amazon shows no offer for that item — it is unavailable, delisted, or not sold in the
selected marketplace. Returning 0 would assert the product is free, so null is used
instead. The row still carries title, rating, review count and aspects.
Does it scrape review text? No. It returns review counts and Amazon's aggregated review aspects. It does not return individual review bodies.
Which marketplaces are supported? Fifteen, listed in the Input reference. The proxy country is matched automatically.
What happens if one ASIN fails?
Nothing else is affected. The run completes, returns every other product, and records the
failure in RUN_SUMMARY.
Why did my run fail with "PROXY CHECK FAILED"? Your proxy could not reach Amazon, so the run stopped before doing any work and you were charged nothing. The message names the cause:
| verdict | meaning | fix |
|---|---|---|
auth | the proxy rejected our credentials | check the username and password in the URL |
unreachable | no connection at all | check host and port, and that this Actor's IP is allowed by your provider |
blocked | reached Amazon, but Amazon blocked it | use residential proxies — Amazon blocks datacenter IPs |
Legal and compliance
This Actor collects only publicly accessible Amazon product data. It does not log in to Amazon, bypass authentication, or use or request Amazon account credentials or logged-in session cookies. It collects no personal data by default.
You are responsible for ensuring your use complies with applicable law, including GDPR and copyright, and with Amazon's Terms of Service.