Amazon Bestseller Rank Scraper - Prices, ASIN, Product Data avatar

Amazon Bestseller Rank Scraper - Prices, ASIN, Product Data

Pricing

$3.50 / 1,000 products

Go to Apify Store
Amazon Bestseller Rank Scraper - Prices, ASIN, Product Data

Amazon Bestseller Rank Scraper - Prices, ASIN, Product Data

ASIN lookup and Amazon product scraper past the 306-product search ceiling: 691 unique products where the same search returns 61, measured. Prices, Best Sellers Rank, duplicates removed by ASIN after a measured reshuffle between identical queries. Amazon best sellers list.

Pricing

$3.50 / 1,000 products

Rating

0.0

(0)

Developer

Snow Leo Data

Snow Leo Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Amazon Scraper - Product Data, Prices, ASIN Lookup, Bestsellers

Collect product data from amazon.com — search results, product pages and Best Sellers lists — without the Amazon API and without a browser. Prices, list prices and discounts, ratings and rating counts, stock, seller, bullet points, specifications, images, badges, Best Sellers Rank and ASINs.

A residential proxy is required and is on by default. Measured on 18 September 2026: from Apify's cloud addresses Amazon answered 503 to every request and no page could be read; through a residential address the same search returned a full page of products. The request fingerprint matters as much as the address — on the same home connection a Chrome fingerprint got 503 while a Firefox one returned 1 017 218 bytes with 28 product cards.

Every number on this page was measured, and the command that reproduces it is named next to it. Nothing here is an estimate.


What it does that a plain search cannot

One Amazon search stops at 306 products. Measured on wireless earbuds: 16 organic products per page, pages 1, 2, 3, 5, 7, 8, 10, 15 each returned 16, page 20 returned 2 and there was no page 21 — while Amazon's own header said "over 20,000 results". 306 is the whole window, not a page limit.

Deep scan walks 11 price bands instead of one search, and each band is its own window with its own ceiling. Measured: six price bands returned 96 products of which 96 were unique — zero overlap. Four sort orders returned 64 products of which 64 were unique. Bands and sort orders together returned 160 rows with 155 unique products from first pages alone, against 16 from a plain first page.

Two identical requests do not return the same products. Measured: the same first page fetched twice shared only 13 of 16 products — Amazon reshuffles. The Actor de-duplicates by ASIN across the whole run and counts the repeats in the REPORT record, so you are never charged twice for one product.

An unknown department is refused instead of being quietly ignored. Measured: https://www.amazon.com/s?k=earbuds&i=zzqqnotadept answers HTTP 200 with ordinary unfiltered results — 14 of its 16 products were identical to the search with no department at all. A scraper that passes your typo through hands you "products from department X" that are not from department X. The department field is a closed list of Amazon's 58 departments, and a department hidden inside a search URL you paste (&i=...) is checked against the same list and stops the run before the first request with a named reason.


Input

FieldWhat it does
searchTermsKeywords to search on amazon.com
startUrlsProduct pages, search URLs, Best Sellers URLs, or bare ASINs
bestsellerCategoriesBest Sellers nodes, e.g. electronics, toys-and-games
departmentOne of Amazon's 58 departments; an unknown one in a pasted URL stops the run
minPrice, maxPriceSent to Amazon as a price filter, not applied afterwards
sortByAmazon's own order: price up, price down, rating, newest, best sellers
deepScanWalk 11 price bands to break the 306-product ceiling
maxPagesPerSearch1–20; 16 organic products per page
maxItemsLimits what is written, not what is crawled
fetchProductDetailsOpen every product page: brand, seller, stock, bullets, specs, images, Best Sellers Rank
minRating, minReviewsProducts with no rating at all are kept
onlyDiscounted, onlyInStock, titleContains, brandIsFilters
onlyChanged, emitUnchangedMonitor mode
compactOutput, dropEmptyFields15 columns instead of 40; drop empty keys
requestDelaySeconds, requestTimeoutSecondsPoliteness and patience

maxItems limits the output. If a filter drops rows, the crawl keeps going until that many rows have actually been delivered — it does not stop at that many rows collected and then hand you an empty dataset.

Output

40 columns. Measured fill rate on one live search page (16 products):

fieldfilled
asin, title, url, image, rating, reviewsCount, deliveryText16/16
price, priceCurrency, listPrice, discountPercent15/16
boughtInPastMonth14/16
badge (Amazon's Choice / Best Seller)3/16

Measured fill rate on six live product pages:

fieldfilled
title, brand, rating, reviewsCount, availability, features, images, starsBreakdown6/6
price, specifications, deliveryText5/6 — the sixth is Currently unavailable, and that is what the row says
seller, bestSellersRank, breadcrumbs, variantAsins3/6 — Amazon does not print them on every page
boughtInPastMonth2/6
description1/6 — the long description block is empty on five of the six

Best Sellers lists give 30 positions per page and 2 pages per category, so 60 ranked products with bestsellerRank 1..60.

Empty numeric fields are null, never "", so the CSV loads into Excel, BigQuery and pandas without a type error.

Monitor mode

onlyChanged compares every product against what earlier runs delivered and writes only those whose price, list price, stock, rating, rating count or best seller rank moved. Each row is labelled NEW, UPDATED or UNCHANGED.

A field Amazon simply stopped printing is not counted as a change — that would bill you for the whole catalogue every morning. Memory lives in a named key-value store, so it survives between runs.

When the dataset is empty, the Actor says why

A green run with no rows is the worst thing a scraper can do to you. Every empty result here carries an empty_reason in the REPORT record and a warning in the log:

nothing-asked, department-not-recognised, price-range-empty, rating-filter-impossible, charge-limit-reached, source-returned-nothing, filtered-out, nothing-changed, nothing-collected, source-blocked.

The first 5 are settled before a single request is sent, so you are not charged for downloading pages that the next line of code would have thrown away. source-blocked exists because a block page arrives with code 200 and no products, and calling that "nothing found" would be a lie.

Honest limitations

  • amazon.com only. Measured from the Apify cloud on two separate attempts: amazon.co.uk, amazon.de, amazon.ca and amazon.in answer 503 to every request. Competitors that list many marketplaces reach them another way; this Actor does not pretend to.
  • No customer reviews. https://www.amazon.com/product-reviews/<ASIN>/ returns 221 KB with not one review body in it — Amazon puts reviews behind a sign-in. If you need review text, use a review scraper.
  • No offer listings. /gp/offer-listing/ returns a page with no offers in the markup.
  • Only organic results. Sponsored placements are skipped on purpose, so no ad slots are billed to you as products.
  • badge is filled on 3 of 16 products because Amazon shows it on 3 of 16, not because parsing misses it. On the product page that block arrives empty on all six pages measured, so the badge is taken from the search row, and there is no separate always-false "is Amazon's Choice" column.
  • 40 fields against 59 in the largest competitor's schema. What is missing is what needs a proxy, a captcha solver or a signed-in session: other-seller offers, review text, per-variant prices, delivery to a chosen ZIP code and non-US marketplaces.

How it is checked

python3 tests/run_all.py # logic, lifecycle, live source
python3 tools/prove.py # every check is broken on purpose and must fail
python3 tools/verify_readme.py # every number on this page is compared to the code

tests/test_logic.py runs against real amazon.com pages saved in recon/, not against hand-written markup. tests/test_lifecycle.py runs the whole Actor against a double that is meaner than the real source: hard page ceiling, reshuffled results, block pages, a withdrawn product, a broken push in the middle of a batch and a charge limit that does not move.

tests/test_live.py exits with code 2 on a home connection, on purpose: measured, amazon.com answers 503 to everything that is not the Apify cloud, and a check that cannot run must not report success.

What else is this called?

Buyers look for this Actor under several names, and all of them describe what it actually does: Amazon product scraper, Amazon bestseller tracker, ASIN lookup API, product catalog scraper, Amazon price tracker, stock availability monitor. It is one Actor; the names differ because the job does.

More field names: list price label with the strikethrough price (listPriceLabel), SEO canonical URL (seoUrl), bought-in-past-month figure used as a sales proxy (boughtInPastMonth), coupon detection (hasCoupon).