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
0
Bookmarked
2
Total users
2
Monthly active users
13 hours 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 |
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. |
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.
Pricing
| Event | Price | When |
|---|---|---|
result | $0.002 | per product returned |
locationSetup | $0.02 | once per run, only if zipCode is set |
- 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.
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.