Amazon Product Scraper avatar

Amazon Product Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Amazon Product Scraper

Amazon Product Scraper

Amazon Product Scraper collects detailed product data from Amazon fast. Extract titles, prices, images, ratings, reviews, sellers, and availability. Ideal for market research, price tracking, competitor analysis, and workflows needing clean structured Amazon data.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

1

Monthly active users

8 days ago

Last modified

Share

Amazon Product Scraper — Products, Offers, Sellers and Variants

Amazon Product Scraper turns any Amazon category, search or product URL into structured product rows: title, ASIN, price, list price, rating and star breakdown, images, technical attributes, bestseller ranks, seller identity, marketplace offers and colour/size variants. Every row is typed, normalized JSON with stable key names — no HTML, no selectors, no parsing. Rows stream into the dataset as each page finishes, and only saved product rows are charged. Paste one or more URLs, set how many products you want per URL, and press Start.

⚠️ Which Amazon marketplaces this Actor really covers

Worth stating up front rather than burying in the input table, because it decides whether this Actor fits your use case.

Direct product URLs are fetched on the domain you supply. Pass https://www.amazon.de/dp/B0B3BVWJ6Y and the product page is requested from amazon.de.

Category and search URLs are fetched on the domain you supply, but the product pages behind them are resolved on amazon.com. When the Actor reads a listing page it collects the ASINs, then builds each detail URL as https://www.amazon.com/dp/<ASIN>. The same applies to the offers, seller and variant requests — those endpoints are www.amazon.com in every code path. Two further consequences:

  • If your search URL carries a k= keyword parameter, pages 2 and up are requested from amazon.com. A pure category URL (bbn=/rh= with no k=) keeps its own domain across pages, because pagination is then appended to the URL you gave.
  • Setting scrapeProductDetails to false keeps discovered product URLs on the source domain, because the lite parser resolves each link relative to the page it came from — but you then get the 9 listing-level fields instead of the full detail row.

So: full-detail scraping of a non-.com category returns US product pages for the ASINs found there. For non-US marketplaces at full detail, feed direct /dp/ URLs for that domain. Session warm-up, the language cookie and the delivery-location call are also performed against www.amazon.com.

What is Amazon Product Scraper?

Amazon Product Scraper is an Apify Actor that extracts public Amazon product data from category pages, search result pages and individual product pages. It returns three structurally different record types from the same run: full product rows, marketplace offers with their sellers, and product variants (different colour/size/style ASINs) either listed on the parent row or expanded into rows of their own.

No Amazon account, login or cookie of yours is required. Every field it returns is what an anonymous visitor sees on the page — the Actor establishes its own warmed sessions through Apify Proxy and sends anonymous requests.

  • Scrape products — 55 keys per detail row, or 9 keys per row in fast listing-only mode
  • Scrape offers and sellers — competing marketplace offers plus seller name, business name, address, phone and feedback
  • Scrape variants — every child ASIN on the parent row, optional per-variant prices, optional variant rows of their own
  • Export as JSON, CSV or Excel, or read the dataset through the Apify API
  • No proxy accounts, no session handling, no HTML parsing on your side

What data does Amazon Product Scraper collect?

One run can return product records, offer and seller records, variant records, and lightweight listing records — plus uncharged accounting rows for URLs that could not be recovered.

Data TypeKey FieldsJSON Field Names
Products (full detail)ASIN, title, brand, price, list price, stock, rating, review count, breadcrumbs, images, features, attributes, bestseller ranks, A+ content, monthly purchase volumeasin, title, brand, price, listPrice, inStock, inStockText, stars, starsBreakdown, reviewsCount, breadCrumbs, thumbnailImage, galleryThumbnails, highResolutionImages, features, attributes, bestsellerRanks, aPlusContent, monthlyPurchaseVolume
Products (lite listing mode)ASIN, title, URL, thumbnail, price, rating, review count, sponsored flag, position on pageasin, title, url, thumbnailImage, price, stars, reviewsCount, isSponsored, categoryPageData
SellersFeatured-offer seller identity, storefront link, business name, registered address, phone, feedback rating and countseller.id, seller.name, seller.url, seller.businessName, seller.address, seller.phone, seller.averageRating, seller.reviewsCount
OffersCompeting marketplace offers with price, shipping, condition, Prime flag and the seller behind eachoffers[].price, offers[].shippingPrice, offers[].condition, offers[].isPrime, offers[].seller
VariantsEvery child ASIN on the parent, per-variant prices, variant rows carrying the parent ASINvariantAsins, priceVariants[].asin, priceVariants[].price, originalAsin
Accounting rows (uncharged)The URL that failed, why it failed, whenurl, asin, status, error, scrapedAt

Need more Amazon data?

If you work with variants at scale, Amazon ASIN Scraper – Sizes, Colors, Variants goes deeper on the twister than the variantAsins list here does. For discovery rather than extraction, Amazon Today's Deals Scraper and Amazon Trending Products Scraper give you the URLs worth feeding into this Actor in the first place. Sourcing teams comparing retail prices against factory prices usually pair this with Alibaba Scraper With Supplier Contact Leads.

How does Amazon Product Scraper differ from the official Amazon API?

Amazon's official product surface is the Product Advertising API 5.0 (PA-API), which serves catalogue data to Amazon Associates for affiliate use. Amazon Product Scraper reads the public product page instead, so it is not bound to an affiliate programme and returns what the page renders rather than what the API's resource list exposes.

FeatureAmazon PA-API 5.0Amazon Product Scraper
Account requiredApproved Amazon Associates account plus PA-API credentialsApify account only
Ongoing eligibilityAccess is tied to referring qualifying sales through your associate tag — see Amazon's current PA-API documentationNo sales or affiliate requirement
Request modelSigned requests against Amazon's endpoints, with per-account quotas Amazon sets and publishes in its live docsAny category, search or product URL, at the concurrency you set in maxConcurrentRequests (1–20)
Data scopeThe attributes Amazon chooses to expose per resource groupWhat the public page renders — including breadCrumbs, aPlusContent, bestsellerRanks, monthlyPurchaseVolume, isAmazonChoice and productComparison
DiscoverySearch by keyword and index within the API's supported browse nodesPaste the filtered browse URL straight from your browser address bar
Output shapeAmazon's documented API response schemaOne flat JSON row per product, same keys every run

Use PA-API if you are an approved Associate, need a supported contractual surface, and your use case is affiliate linking. Use Amazon Product Scraper when you need page-level fields the API does not expose, when you have no Associates account, or when your input is a filtered category URL rather than a keyword.

Why do developers and teams scrape Amazon?

For AI engineers and agent builders

Product rows arrive as typed JSON, which removes the parsing step before an LLM sees them. A common pattern: index title, features, description, aPlusContent and attributes into a vector store keyed by asin, then let an agent answer "which of these keyboards are mechanical, under $80 and in stock" against price, inStock and attributes rather than against a stale export. Because starsBreakdown, bestsellerRanks and monthlyPurchaseVolume are structured, the same records double as numeric grounding for ranking questions the text alone cannot answer.

For pricing and e-commerce teams

Re-run the same category URLs on an Apify schedule and diff by asin. price, listPrice, shippingPrice and inStock give you the movement; seller.name and offers[].price tell you who moved it and whether the buy box changed hands. Setting maxOffers above 0 returns the competing offer stack for each product, which is what you need to see undercutting rather than just the headline price. countryCode and zipCode set a delivery location, so prices and availability reflect the market you actually sell into.

For market researchers and analysts

Everything returned is public listing data — no reviewer identities, no buyer records, no account-gated content. bestsellerRanks gives per-category rank, breadCrumbs gives the taxonomy path, monthlyPurchaseVolume carries Amazon's own "bought in past month" signal, and starsBreakdown returns the five-star distribution as fractions rather than a single average. A category study can therefore be assembled from category URLs alone, with isSponsored available to separate paid placements from organic ranking.

For developers building data products

The Actor is an ordinary Apify Actor, so it is callable from apify_client, from a plain HTTP request, or from an Apify schedule with a webhook on completion. Field names and types are stable across runs, so a downstream table schema does not need to move when Amazon redesigns a page. Rows are pushed to the dataset as they are parsed, meaning a long run can be consumed incrementally instead of waiting for the run to finish.

How to scrape Amazon (step by step)

Amazon Product Scraper runs on Apify. Start it from the Apify Console, or call it through the Apify API.

  1. Open Amazon Product Scraper on Apify and click Try for free
  2. Paste one or more Amazon category, search or product URLs into 🔗 Enter one or more Amazon category or product URLs (categoryOrProductUrls) — this is the only required input
  3. Set 📊 Max results (per start URL) (maxItemsPerStartUrl); switch on maxOffers, scrapeSellers or maxProductVariantsAsSeparateResults if you need offers, seller detail or variant rows
  4. Leave 🔒 Proxy configuration on Apify Residential, then click Start
  5. Export the dataset as JSON, CSV or Excel, or read it through the Apify API

To build a category URL, open Amazon in your browser, apply the filters you want (price, brand, rating, department), and copy the address bar — the filters travel with the link.

What to do when Amazon changes its structure

The Actor is maintained, and its parsers already carry modern and legacy fallbacks per field, so a layout change usually degrades one field rather than failing the row. The output keys and their types stay the same on your side, so a schedule, a webhook or a downstream table keeps working while the parser is updated.

⬇️ Input

Every parameter below is copied from the Actor's input schema. Only categoryOrProductUrls is required.

ParameterRequiredTypeDescriptionExample Value
categoryOrProductUrls✅ YesarrayAmazon category, search or product URLs. Filters applied in the browser (price, manufacturer, rating) travel with the link. A different Amazon domain selects a different marketplace — see the marketplace note above. Plain strings and { "url": "..." } objects are both accepted.["https://www.amazon.com/s?k=keyboard"]
maxItemsPerStartUrlNointegerMaximum number of results to scrape per start URL, not per run. Default 10, minimum 0.50
languageNostringLanguage to use on Amazon. Each Amazon domain supports a different set; an unsupported choice falls back to the domain default. Enum of 24 values: cs, da, de, en, es, fr, nl, pl, pt, sv, tr, he, ar, mrta, hi, bn, ta, te, kn, ml, ko, zh_CN, zh_TW, ja. No default."de"
proxyCountryNostringProxy country, to avoid geo-blocking and get region-relevant results. AUTO_SELECT_PROXY_COUNTRY matches the country to the Amazon domain in your first URL; NO_PROXY disables the proxy entirely. 252 values. Default "AUTO_SELECT_PROXY_COUNTRY"."DE"
maxSearchPagesPerStartUrlNointegerMaximum search pages per start URL. Works together with maxItemsPerStartUrl — the scraper stops at whichever limit is reached first. Default 9999, minimum 1.5
maxProductVariantsAsSeparateResultsNointegerMaximum product variants (colour/size/style ASINs) to scrape per product and output as their own result rows. Each variant row carries originalAsin = the parent product's ASIN. The parent always lists every child ASIN in variantAsins. Minimum 0. No default — absent behaves as 0.3
maxOffersNointegerMaximum offers to scrape per product. Default 0, minimum 0. 0 means no offers are fetched at all, not unlimited.10
scrapeSellersNobooleanExtract further information about sellers. Scrapes the featured-offer seller, and the seller behind each offer when maxOffers is above 0. Default false.true
ensureLoadedProductDescriptionFieldsNobooleanAlways load seller-editable description fields such as description, aPlusContent and attributes. Amazon sometimes hides these as a form of blocking. Increases request count. Default false.false
useCaptchaSolverNobooleanAttempt to solve the image captchas Amazon serves, instead of only retrying on a fresh proxy IP. Needs a CapSolver key. Works best on amazon.com. Default false.false
capSolverApiKeyNostringCapSolver API key, used only when useCaptchaSolver is on. Leave empty to fall back to the CAPSOLVER_API_KEY environment variable, or to disable solving entirely. Stored as a secret and never written to output."CAP-XXXXXXXXXXXX"
scrapeProductVariantPricesNobooleanExtract prices for each variation of a product into priceVariants. Increases request count. Default false.false
scrapeProductDetailsNobooleanOpen each product found on a category page and extract it in detail. Turn off for fast, lightweight rows straight from the listing page. Default true.true
maxConcurrentRequestsNointegerNumber of concurrent product page requests. Default 10, minimum 1, maximum 20.10
countryCodeNostringThe country code to use as the delivery location. Enum of 240 values. No default."US"
zipCodeNostringThe zip code to use as the delivery location — more precise than country alone in large countries. No default."10001"
locationDeliverableRoutesNoarrayPage types the delivery-location setting should apply to. Items: PRODUCT, SEARCH, OFFERS. Default ["PRODUCT", "SEARCH", "OFFERS"].["PRODUCT", "SEARCH", "OFFERS"]
proxyConfigurationNoobjectApify Proxy settings. Residential is prefilled and gives the fewest blocks.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Common pitfall: maxItemsPerStartUrl is per start URL, not a run total, and its default of 10 stops every URL after ten products. Ten category URLs at the default produce up to 100 rows, not 10. Setting it to 0 — the schema minimum — returns nothing at all.

Three more behaviours worth knowing before your first run:

  • locationDeliverableRoutes is applied as an on/off switch, not as a per-page-type filter. Any non-empty list containing PRODUCT, SEARCH or OFFERS enables the delivery-location call once per session; an empty list disables it. Passing ["SEARCH"] does not restrict localisation to search pages.
  • useCaptchaSolver does nothing on its own. With no key in capSolverApiKey and no CAPSOLVER_API_KEY environment variable, no solve is attempted and captchas fall back to a retry on a fresh proxy IP. CapSolver is a third-party service you sign up for and fund yourself — those solve costs are billed by CapSolver, not through Apify. Amazon also sometimes serves a reduced page after a solved captcha, on which attributes and bestsellerRanks are missing.
  • language sets the accept-language header on every request and the lc-main cookie on .amazon.com. On other Amazon domains only the header applies. Marathi is the enum value mrta (mapped internally to mr_IN) — the schema spells it that way, so pass it exactly.

Example input

{
"categoryOrProductUrls": [
"https://www.amazon.com/s?k=mechanical+keyboard",
"https://www.amazon.com/dp/B0B3BVWJ6Y"
],
"maxItemsPerStartUrl": 50,
"language": "en",
"proxyCountry": "AUTO_SELECT_PROXY_COUNTRY",
"maxSearchPagesPerStartUrl": 5,
"maxProductVariantsAsSeparateResults": 0,
"maxOffers": 5,
"scrapeSellers": true,
"ensureLoadedProductDescriptionFields": false,
"useCaptchaSolver": false,
"capSolverApiKey": "",
"scrapeProductVariantPrices": false,
"scrapeProductDetails": true,
"maxConcurrentRequests": 10,
"countryCode": "US",
"zipCode": "10001",
"locationDeliverableRoutes": ["PRODUCT", "SEARCH", "OFFERS"],
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

⬆️ Output

Typed, normalized JSON, written to the dataset as each product finishes rather than at the end of the run. Export as JSON, CSV or Excel, or read the dataset through the Apify API. The default dataset view shows ten columns (asin, title, url, brand, stars, reviewsCount, thumbnailImage, breadCrumbs, price, inStock) — that is a display subset. The stored row is much larger, and switching the view to all fields or exporting the dataset returns everything below.

A full detail row carries 55 keys, plus priceVariants when variant pricing is enabled.

Field NameTypeDescription
titlestring | nullProduct title
urlstringProduct page URL that was fetched
asinstringAmazon Standard Identification Number
originalAsinstringSame as asin on a parent row; the parent's ASIN on an expanded variant row
priceobject | null{ "value": number, "currency": string }, read from the buy-box / core price container only
inStockbooleanAvailability flag
inStockTextstring | nullAvailability text as shown, cleaned of markup
listPriceobject | nullStruck-through "was" price. Discarded when lower than price
brandstring | nullBrand, with "Visit the" / "Store" wrappers stripped
authorstring | nullBook and Kindle listings only
shippingPriceobject | null{ "value", "currency" } parsed from the delivery block
starsnumber | nullAverage rating
starsBreakdownobject{"5star": 0.86, ...} as fractions of 1. {} when Amazon does not render the histogram
reviewsCountinteger | nullNumber of ratings
breadCrumbsstring | nullCategory path joined with >. Key spelling preserved from the established Amazon output convention
videosCountintegerNumber of video thumbnails in the image strip
visitStoreLinkobject | null{ "text", "url" } for the brand storefront
thumbnailImagestring | nullMain image URL
galleryThumbnailsarrayGallery thumbnail URLs
highResolutionImagesarrayGallery URLs rewritten to high-resolution variants
importantInformationstring | nullImportant-information block, truncated
sustainabilityFeaturesstring | nullClimate Pledge Friendly / sustainability block, truncated
descriptionstring | nullProduct description; falls back to A+ content when Amazon omits the description block
featuresarrayFeature bullets
attributesarrayTechnical and detail-table rows as [{ "key", "value" }]
productOverviewarrayProduct-overview grid rows plus attributes, deduplicated
variantAsinsarrayEvery child ASIN on the twister
variantDetailsnullReserved key, always null
reviewsLinkstring | nullLink to the review page; falls back to /product-reviews/<asin>?reviewerType=all_reviews
hasReviewsbooleanWhether reviewsCount is non-zero
deliverystring | nullStandard delivery date as shown
fastestDeliverystring | nullFastest delivery date as shown
returnPolicystring | nullReturn policy text, truncated
supportstring | nullProduct support text, truncated
variantAttributesnullReserved key, always null
manufacturerAttributesnullReserved key, always null
sellerobject{ "id", "url", "name", "businessName", "phone", "address" }, plus averageRating and reviewsCount when scrapeSellers is on
bestsellerRanksarray | null[{ "rank", "category" }]
isAmazonChoicebooleanAmazon's Choice badge present
amazonChoiceTextstring | nullBadge text, truncated
bookDescriptionstring | nullBook / Kindle description, truncated
priceRangeobject | null{ "min": {...}, "max": {...} } when the page shows a range
aPlusContentstring | nullA+ content as flattened text, truncated
brandStorystring | nullBrand-story block as flattened text, truncated
productComparisonarray | nullComparison-table rows as arrays of cells
aiReviewsSummarynullReserved key, always null
monthlyPurchaseVolumestring | nullAmazon's "N bought in past month" signal, as shown
productPageReviewsnullReserved key, always null
productPageReviewsFromOtherCountriesnullReserved key, always null
locationTextstring | nullDelivery location Amazon displayed for the request
loadedCountryCodestringThe countryCode you supplied, or "US"
offersarrayOffer objects. [] unless maxOffers is above 0
unNormalizedProductUrlstringThe first URL in categoryOrProductUrls for the run. Key casing preserved
categoryPageDataobject{ "pageNumber", "saleSummary", "isSponsored", "bestsellerBadge", "productPosition" }
inputstringThe first URL in categoryOrProductUrls for the run
priceVariantsarrayPresent only when scrapeProductVariantPrices is on: [{ "asin", "url", "price" }]

Six keys — variantDetails, variantAttributes, manufacturerAttributes, aiReviewsSummary, productPageReviews and productPageReviewsFromOtherCountries — are emitted on every row and are always null. They are kept so the row shape stays drop-in compatible with the established Amazon output schema. input and unNormalizedProductUrl both carry the first start URL of the run, not necessarily the URL that produced that particular row.

Scraped product

{
"title": "Keychron K8 Tenkeyless Wireless Mechanical Keyboard, Brown Switch",
"url": "https://www.amazon.com/dp/B08JQBZ7XY",
"asin": "B08JQBZ7XY",
"originalAsin": "B08JQBZ7XY",
"price": { "value": 84.99, "currency": "$" },
"inStock": true,
"inStockText": "In Stock",
"listPrice": { "value": 109.95, "currency": "$" },
"brand": "Keychron",
"author": null,
"shippingPrice": null,
"stars": 4.5,
"starsBreakdown": { "5star": 0.71, "4star": 0.17, "3star": 0.06, "2star": 0.02, "1star": 0.04 },
"reviewsCount": 8412,
"breadCrumbs": "Electronics > Computers & Accessories > Computer Accessories & Peripherals > Keyboards, Mice & Accessories > Keyboards",
"videosCount": 3,
"visitStoreLink": { "text": "Keychron", "url": "https://www.amazon.com/stores/Keychron/page/1A2B3C4D" },
"thumbnailImage": "https://m.media-amazon.com/images/I/71pQGkxMhJL._AC_SX679_.jpg",
"galleryThumbnails": [
"https://m.media-amazon.com/images/I/71pQGkxMhJL._AC_US40_.jpg",
"https://m.media-amazon.com/images/I/61yZ2xNqL8L._AC_US40_.jpg"
],
"highResolutionImages": [
"https://m.media-amazon.com/images/I/71pQGkxMhJL._AC_SL1500_.jpg",
"https://m.media-amazon.com/images/I/61yZ2xNqL8L._AC_SL1500_.jpg"
],
"importantInformation": null,
"sustainabilityFeatures": null,
"description": "Keychron K8 is a tenkeyless wireless mechanical keyboard that connects to up to 3 devices over Bluetooth and switches between them seamlessly.",
"features": [
"Connect up to 3 devices via Bluetooth 5.1 and switch between them seamlessly",
"Hot-swappable sockets let you change switches without soldering",
"4000mAh battery supports up to 240 hours of backlight-off typing"
],
"attributes": [
{ "key": "Brand", "value": "Keychron" },
{ "key": "Connectivity Technology", "value": "Bluetooth, USB" },
{ "key": "Item Weight", "value": "1.94 pounds" },
{ "key": "Date First Available", "value": "October 2, 2020" }
],
"productOverview": [
{ "key": "Brand", "value": "Keychron" },
{ "key": "Compatible Devices", "value": "Laptop, PC, Tablet" },
{ "key": "Keyboard Description", "value": "Mechanical" },
{ "key": "Item Weight", "value": "1.94 pounds" }
],
"variantAsins": ["B08JQBRLWY", "B08JQ9V4ZC"],
"variantDetails": null,
"reviewsLink": "/product-reviews/B08JQBZ7XY?reviewerType=all_reviews",
"hasReviews": true,
"delivery": "Tuesday, July 28",
"fastestDelivery": "Sunday, July 26",
"returnPolicy": "Eligible for Return, Refund or Replacement within 30 days of receipt",
"support": "Free Amazon tech support included",
"variantAttributes": null,
"manufacturerAttributes": null,
"seller": {
"id": "A2R8KQPBP2AZR3",
"url": "https://www.amazon.com/sp?seller=A2R8KQPBP2AZR3",
"name": "Keychron Official",
"businessName": "Keychron Technology Limited",
"phone": "+852 1234 5678",
"address": "Unit 1204, 12/F, Tower A, Kowloon, Hong Kong",
"averageRating": 4.8,
"reviewsCount": 12640
},
"bestsellerRanks": [
{ "rank": 142, "category": "Computers & Accessories" },
{ "rank": 7, "category": "Computer Keyboards" }
],
"isAmazonChoice": true,
"amazonChoiceText": "Amazon's Choice for mechanical keyboard",
"bookDescription": null,
"priceRange": null,
"aPlusContent": "Designed for Mac and Windows. Type on Gateron mechanical switches with an aluminium frame and adjustable feet.",
"brandStory": "Keychron builds keyboards for people who work across operating systems.",
"productComparison": [
["", "Keychron K8", "Keychron K2", "Keychron K10"],
["Layout", "Tenkeyless", "75%", "Full size"]
],
"aiReviewsSummary": null,
"monthlyPurchaseVolume": "2K+ bought in past month",
"productPageReviews": null,
"productPageReviewsFromOtherCountries": null,
"locationText": "New York 10001",
"loadedCountryCode": "US",
"offers": [
{
"price": { "value": 84.99, "currency": "$" },
"shippingPrice": null,
"condition": "New",
"isPrime": true,
"seller": {
"id": "A2R8KQPBP2AZR3",
"name": "Keychron Official",
"url": "https://www.amazon.com/sp?seller=A2R8KQPBP2AZR3"
}
},
{
"price": { "value": 79.5, "currency": "$" },
"shippingPrice": { "value": 4.99, "currency": "$" },
"condition": "Used - Like New",
"isPrime": false,
"seller": {
"id": "A1KQ4XZ9LM3TBW",
"name": "TechResale Warehouse",
"url": "https://www.amazon.com/sp?seller=A1KQ4XZ9LM3TBW"
}
}
],
"unNormalizedProductUrl": "https://www.amazon.com/s?k=mechanical+keyboard",
"categoryPageData": {
"pageNumber": 1,
"saleSummary": null,
"isSponsored": false,
"bestsellerBadge": null,
"productPosition": 4
},
"input": "https://www.amazon.com/s?k=mechanical+keyboard"
}

Scraped product — lite listing row

With scrapeProductDetails set to false no product page is opened, and each row carries only what the listing tile renders — 9 keys:

{
"asin": "B08JQBZ7XY",
"title": "Keychron K8 Tenkeyless Wireless Mechanical Keyboard, Brown Switch",
"url": "https://www.amazon.com/Keychron-Tenkeyless-Mechanical-Keyboard/dp/B08JQBZ7XY",
"thumbnailImage": "https://m.media-amazon.com/images/I/71pQGkxMhJL._AC_UL320_.jpg",
"price": { "value": 84.99, "currency": "$" },
"stars": 4.5,
"reviewsCount": 8412,
"isSponsored": false,
"categoryPageData": { "productPosition": 4, "isSponsored": false }
}

Scraped product variants

With scrapeProductVariantPrices enabled, the parent row gains a priceVariants array — one entry per child ASIN in variantAsins:

{
"priceVariants": [
{ "asin": "B08JQBRLWY", "url": "https://www.amazon.com/dp/B08JQBRLWY", "price": { "value": 89.99, "currency": "$" } },
{ "asin": "B08JQ9V4ZC", "url": "https://www.amazon.com/dp/B08JQ9V4ZC", "price": { "value": 84.99, "currency": "$" } }
]
}

With maxProductVariantsAsSeparateResults above 0, each variant is instead fetched and pushed as its own full detail row, with originalAsin set to the parent's ASIN. Those rows are charged like any other product row.

Uncharged accounting rows

When a product URL cannot be recovered after its retries, or a search page comes back blocked or empty, the Actor writes a small accounting row so a failed URL leaves a trace instead of silently disappearing from the dataset. These rows are pushed without a charged event, so they cost nothing:

{
"url": "https://www.amazon.com/dp/B0XXXXXXXX",
"asin": "B0XXXXXXXX",
"title": null,
"status": "failed",
"error": "blocked or lite page after retries",
"scrapedAt": "2026-07-25T10:14:22.481230"
}

Product rows never carry status, error or scrapedAt, so one predicate separates them:

products = [row for row in items if row.get("status") != "failed"]

This Actor charges per row_result event — one charge per saved product row, whether it is a full detail row, a lite listing row, or an expanded variant row. Accounting rows are excluded from charging entirely.

How does Amazon Product Scraper compare to other Amazon scrapers?

FeatureAmazon Product ScraperGeneric alternative
Output format✅ 55-key typed JSON row, same keys every run✅ JSON, field set varies by Actor
Entity coverage in one run✅ Products, offers, sellers and variants❌ Usually products only, with offers or sellers as a separate Actor
Failed URLs✅ Uncharged accounting row carrying status and error❌ Often a silent gap in the dataset
Input flexibility✅ Category, search and product URLs, with browser filters preserved✅ Category or product URLs, varies
Lightweight modescrapeProductDetails: false returns listing rows without opening product pages❌ Not documented on most Amazon Actors
Anti-bot handling✅ Warmed sticky sessions, TLS impersonation, block-aware retries, optional CapSolver✅ Proxy rotation, usually undocumented in detail

If you are building an AI agent or a RAG pipeline, the output-format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature. The second row matters almost as much: an Actor that returns products but not their offers forces you to join two datasets on ASIN before you can answer a buy-box question.

How many results can you scrape with Amazon Product Scraper?

There is no hard result cap in the Actor itself. maxItemsPerStartUrl has a schema minimum of 0 and no maximum, and it applies per start URL rather than per run — ten URLs at 500 each is a target of 5,000 rows.

Pagination works from your start URL. Page 1 is fetched, ASINs are collected, and further pages are requested until either maxItemsPerStartUrl or maxSearchPagesPerStartUrl (default 9999, effectively no page ceiling) is reached. In full-detail mode pages are fetched five at a time; in lite mode they are fetched one at a time. Pagination stops early after three consecutive empty or failed pages.

Two things reduce the total below your arithmetic. First, ASINs are deduplicated across the whole run, so overlapping category URLs produce one row per product rather than one per URL. Second, Amazon itself limits a single search term to roughly seven pages — a constraint stated in this Actor's own input hint and on the two most-used competing Amazon Actors as observed on the Apify Store on 25 July 2026. The workaround they and we recommend is the same: combine a real category URL with your search terms instead of searching alone.

Integrate Amazon Product Scraper and automate your workflow

Amazon Product Scraper works with any language or tool that can send an HTTP request.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/amazon-product-scraper-pay-per-events").call(run_input={
"categoryOrProductUrls": ["https://www.amazon.com/s?k=mechanical+keyboard"],
"maxItemsPerStartUrl": 50,
"maxOffers": 5,
"scrapeSellers": True,
"proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]},
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("status") == "failed":
continue
print(row["asin"], row["title"], row["price"], row["seller"]["name"])

Works in Python, Node.js, Go, Ruby, cURL.

Automation platforms (n8n, Make, LangChain)

In n8n, use the Apify node — or an HTTP Request node pointed at the Apify run endpoint with your token — and pass the same JSON input shown above; a downstream IF node on status drops accounting rows before your database step. In Make, the Apify module supports run-and-wait, so a weekly price sweep can feed a Google Sheets or Airtable module directly. In LangChain, wrap the run call in a tool function that returns the dataset items; because every row is already typed JSON, the tool output needs no parsing before it enters the model's context. Apify schedules and webhooks cover the recurring side, so a daily category snapshot needs no code at all.

Scraping publicly listed product data is broadly treated as permissible where the data is accessible without authentication, and Amazon Product Scraper returns only what an anonymous visitor sees on a public Amazon page.

Product titles, prices, ratings, specifications, bestseller ranks and merchant trading names are commercial catalogue records, not personal data — so GDPR and equivalent personal-data regimes do not attach to this output the way they would to a scraper that collects profiles or reviewer identities. What does apply is contractual and database-related: Amazon's conditions of use, and local database or unfair-competition rules on the systematic reuse of a compiled catalogue.

One nuance: with scrapeSellers enabled, seller.businessName, seller.address and seller.phone come from Amazon's public seller-information page. For sole traders, those business details can also be personal data in some jurisdictions.

Consult legal counsel for commercial use cases involving bulk personal data, and before republishing extracted listings as a competing catalogue.

❓ Frequently asked questions

Does Amazon Product Scraper work without an Amazon account?

Yes. No Amazon account, login or cookie of yours is used. The Actor warms its own anonymous sessions against the Amazon home page and requests public pages through Apify Proxy. The only credential you need is your Apify token.

How often is the scraped data updated?

Every run fetches live pages — there is no cache and no stored snapshot, so prices, stock and ratings are whatever Amazon renders at the moment of the request. For monitoring, use an Apify schedule to re-run the same URLs and diff by asin.

What happens if a product is delisted or unavailable?

If the page still loads, you get a normal row with inStock set to false and inStockText carrying Amazon's wording — that is a valid result, not an error. If the URL is genuinely gone, the fetch returns a 4xx, which is treated as non-retryable and logged, and the URL is written to the dataset as an uncharged accounting row with status: "failed". A blocked or stripped-down "lite" page that survives all retries produces the same accounting row, with error reading blocked or lite page after retries.

What happens when a category URL returns zero results?

The Actor logs that page 1 returned no products and writes one uncharged accounting row for that start URL, with error reading search page returned no products (blocked or empty). The run then moves on to your remaining URLs rather than failing. This covers both cases — a filter combination with genuinely no matches, and a soft block where Amazon returns HTTP 200 with the results container missing. The two are indistinguishable from the response alone, so if you expected results, re-run that URL; a genuinely empty category will keep returning the same row.

Can I scrape reviews, Q&A or login-gated Amazon content?

No. Only publicly accessible product-page content is returned. Review text and reviewer identities are not scraped — you get stars, starsBreakdown, reviewsCount, hasReviews and a reviewsLink pointing at the review page, while aiReviewsSummary, productPageReviews and productPageReviewsFromOtherCountries are always null. Buyer accounts, order history, Subscribe & Save pricing and anything else behind a login are out of scope.

What am I charged for?

This Actor is priced per event. One row_result event is charged for each product row saved to the dataset — full detail rows, lite listing rows and variant rows expanded via maxProductVariantsAsSeparateResults all count once each. Accounting rows for blocked or empty URLs are pushed without a charged event, so a failed URL is visible in your dataset but costs nothing. Filter them out with row.get("status") != "failed".

How does Amazon Product Scraper handle Amazon's anti-bot system?

Requests go out through Apify Proxy — residential by default — using browser-accurate TLS impersonation with a matching user-agent, sec-ch-ua and platform header set, so the fingerprint is coherent rather than a default HTTP client signature. Sessions are warmed on the Amazon home page before use, kept sticky, and retired after 200 requests, after nine minutes, or once more than 40% of at least five requests were blocked.

Three kinds of block are detected: a Robot Check page, a product page served without id="productTitle" (the stripped "lite" page), and a search page returned as HTTP 200 with the results container missing. Each triggers a session rotation and a retry — three attempts per request with exponential backoff from 1.5s, capped at 15s, plus jitter, wrapped in an outer per-URL retry loop of up to three passes. When the rolling block rate over the last 50 requests exceeds 25%, an extra cooldown of up to 30s is added and the per-request jitter widens automatically. A 4xx is treated as non-retryable; a proxy 407 aborts that URL with an explicit log line. With useCaptchaSolver on and a CapSolver key supplied, image captchas are solved and replayed instead of only rotating the IP.

How does Amazon Product Scraper compare to other Amazon scrapers?

Checked on the Apify Store on 25 July 2026. junglee/Amazon-crawler is the most established Amazon product Actor and documents the 7-page search limit, an error-item mechanism with a seven-code reference table, and a sample output whose keys this Actor deliberately mirrors — including breadCrumbs, starsBreakdown and priceVariants. Its listed sample also includes answeredQuestions, which this Actor does not return. junglee/free-amazon-product-scraper publishes the same sample output and the same error-code table in a shorter README. axesso_data/amazon-product-details-scraper takes a different shape entirely: its documented output uses its own key names (countReview, productRating, soldBy, warehouseAvailability), it includes review text and a review-insights block, and its listing states there is no limit on the number of URLs you provide. What is documented here and not on those three listings: which marketplace each request actually resolves against, that maxOffers: 0 means no offers rather than unlimited, that failed URLs produce uncharged rows and how to filter them, and the retry and session-rotation behaviour as implemented.

Does Amazon Product Scraper work with AI agents and LLM pipelines?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so LangChain, CrewAI, n8n or a hand-written tool definition can invoke it and receive typed JSON. Every row is normalized JSON with stable field names — no HTML, no selectors, no parsing step. Pass a row straight into an LLM context window, index title, features and attributes into a vector store keyed by asin, or hand the dataset to an agent tool.

Can I use Amazon Product Scraper without managing proxies?

Yes. Select Apify Residential in proxyConfiguration — it is prefilled — and the Actor creates the sessions, warms them, keeps them sticky, rotates them when they are blocked, and runs the retry ladder. You never create a proxy account or rotate an IP. proxyCountry on AUTO_SELECT_PROXY_COUNTRY matches the proxy country to the Amazon domain in your first URL; NO_PROXY runs direct with no proxy at all, which Amazon blocks quickly.

What happens when Amazon changes its page structure?

The Actor is maintained, and each field is parsed with modern and legacy selector fallbacks, so a layout change typically empties one field rather than failing the row. Prices are read from the buy-box container specifically rather than a document-wide match, so a carousel redesign does not leak a neighbouring product's price into price. Your field names and types do not change on your end.

Scraper NameWhat it extracts
Amazon ASIN Scraper – Sizes, Colors, VariantsVariant-level breakdown for an ASIN, deeper than the variantAsins list
Amazon Today's Deals ScraperCurrent deal listings, ready to feed back in as start URLs
Amazon Trending Products ScraperTrending products for discovery before extraction
Alibaba Scraper With Supplier Contact LeadsSupplier-side pricing and MOQ for retail-versus-source comparison

💬 Your feedback

Found a bug, or need a field that is on the Amazon page but not in the output? Open an issue on the Actor's Issues tab in Apify Console. Reports that include the exact input JSON and the Amazon URL you ran are the fastest to reproduce and fix.