🛒 Amazon Best Sellers Scraper avatar

🛒 Amazon Best Sellers Scraper

Pricing

$19.99/month + usage

Go to Apify Store
🛒 Amazon Best Sellers Scraper

🛒 Amazon Best Sellers Scraper

Amazon Bestsellers Actor extracts top-ranked products from Amazon’s Best Sellers lists across any category. It collects titles, prices, ratings, reviews, rankings, images, and seller details. Perfect for market research, trend spotting, competitor analysis, and automated product insights at scale

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

16

Total users

1

Monthly active users

3 days ago

Last modified

Share

Amazon Best Sellers Scraper — BSR Rank, Price and ASIN Data

Amazon Best Sellers Scraper extracts Best Sellers, New Releases and Most Wished For product lists from any Amazon marketplace, returning the real on-page BSR rank, asin, name, price, stars, reviewsCount, category and image data for every product. Optional per-product enrichment adds brand, listPrice, isPrime, badges and the real category-level Best Sellers Ranks. Dropshippers, pricing analysts, market researchers and AI agents use it to track which products are actually winning a category — not just which ones show up in a positional list — with structured JSON delivered straight to an Apify dataset.

What is Amazon Best Sellers Scraper?

Amazon Best Sellers Scraper is an Apify Actor that fetches Amazon's Best Sellers, New Releases and Most Wished For list pages — for any category, on any Amazon marketplace domain — and turns each product card into a structured JSON row. It does not require an Amazon account, an Amazon Associates ID, or any Amazon API credentials; you only need an Apify account and one or more category URLs. Output lands in an Apify dataset, downloadable as JSON, CSV, Excel, XML or HTML table.

Key capabilities, read directly from the source:

  • 🧭 Three discovery modes from one input — Best Sellers (/zgbs/), New Releases (/gp/new-releases/) and Most Wished For (/gp/most-wished-for/) are all parsed by the same code path, detected automatically from the URL. (Movers & Shakers URLs are recognized and skipped with a warning — see the limitation below.)
  • 🏅 Real BSR rank, not a positional guess. rank is parsed from the on-page #N badge (span.zg-bdg-text); when a card has no badge, rank is null rather than a synthetic index. A separate position field always records list order.
  • 💲 Currency-aware pricing across the marketplace's own symbol set ($, £, , , kr, , , د.إ, and more), disambiguated against the request domain (so a bare $ on amazon.ca resolves to CAD, not USD).
  • 🔍 Optional per-product detail enrichment (detailedInformation) that visits each product's own page for brand, features, availability, coupon, list price and discount, Prime eligibility, badges, variant ASINs, breadcrumbs, the real per-category Best Sellers Ranks, and the star-rating histogram.
  • 🔎 Post-scrape quality filtersminRating, minReviews, priceRange, and primeOnly — applied before a row is billed, so filtered-out products are not charged.
  • 🌐 Residential proxy by default with rotating desktop user-agents and automatic escalation to a fresh IP when a robot-check page is detected.

What data can I extract with Amazon Best Sellers Scraper?

Every run returns product rows carrying ranking, pricing, rating and category data; enabling detailedInformation adds brand, availability and pricing-history fields sourced from the product page itself.

FieldExample valueUse case
rank1Real BSR position from the on-page badge; null if the page has no badge
position1Sequential order on the list page (always present, even when rank is null)
rankBucket"1-10"Pre-bucketed rank tier (1-10, 11-25, 26-50, 51-100, 100+) for quick filtering
asin"B08JHCVHTY"Amazon's product identifier — the join key for any downstream lookup
name"Blink Plus Plan..."Product title as rendered on the list card
url"https://www.amazon.com/dp/B08JHCVHTY"Canonical /dp/{ASIN} product URL
productUrl"https://www.amazon.com/Blink-Plus-Plan.../dp/B08JHCVHTY/..."The exact list-card link, including Amazon's tracking ref
price{ "value": 11.99, "currency": "USD" }Parsed numeric price + ISO currency code, for arithmetic and cross-marketplace comparison
priceString"$11.99"Raw price text as Amazon rendered it
numberOfOffers5Count of third-party offers when the card shows "N offers from $X"; null for single-offer listings
offersFromPrice"$23.35"The "from" price on a multi-offer card
stars4.4Star rating, parsed from the stable rating aria-label
reviewsCount277407Rating/review count from the same aria-label
thumbnailUrl"https://.../31YHGbJsldL._AC_UL300_SR300,200_.png"Primary product thumbnail
imageVariants["https://.../_UL300_...", "https://.../_UL600_..."]All resolutions found in the card's dynamic-image data
categoryName"Electronics"Category name with the "Best Sellers in" / "New Releases in" prefix stripped
categoryFullName"Best Sellers in Electronics"Category heading exactly as Amazon displays it
categoryUrl"https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"The list page this row came from
subcategories[{ "categoryName": "Accessories & Supplies", "categoryUrl": "https://..." }]Subcategory links discovered on that category page
marketplace"amazon.com"Domain with any www. prefix stripped
domain"www.amazon.com"Raw netloc of the input URL
discoveryMode"best-sellers"Which list type produced the row: best-sellers, new-releases, or most-wished-for
scrapedAt"2026-07-26T14:02:00Z"UTC timestamp of extraction
input"https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"The exact categoryUrls entry that produced the row

That is 24 fields on every row, list-scrape only, no product-page visit. With detailedInformation: true, an additional 18 keys are appended per row.

🏷️ Detail-enrichment fields (when detailedInformation is on)

Turning on detailedInformation costs one extra product-page fetch per row and adds: brand (cleaned of "Visit the" / "Store" boilerplate), features (up to 15 bullet points), availability and inStock (boolean, derived from the availability text), coupon, detailPrice, listPrice, discountPercent, savingsAmount, isDeal (true once the discount is 5% or more), isPrime, badges (Amazon's Choice, Best Seller, Prime), boughtInPastMonth, breadCrumbs, variantAsins (up to 30), bestsellerRanks (the real per-category BSR list — e.g. [{"rank": 23668, "category": "Health & Household"}]), starsBreakdown (the 5→1 star histogram percentages), and detailScraped (boolean success flag). This is the data that decides whether a product is genuinely worth sourcing or listing against — discount depth, Prime eligibility, and the category ranks it actually holds, not just the one it was scraped from.

🗂️ Discovery and targeting fields

categoryName, categoryFullName, categoryUrl, subcategories, marketplace, discoveryMode and rankBucket are what a reader filters and segments on: pull every product for a category and its listed subcategories, compare the same category across marketplaces (marketplace), or bucket a whole run by rank tier without re-sorting the dataset yourself.

Why not build this yourself?

Amazon's Best Sellers, New Releases and Most Wished For pages are server-rendered HTML with no official bulk export, so a DIY scraper has to solve the same problems this Actor's source code already handles: robot-check detection (the code matches five known block-page markers, including the literal "Robot Check" title and the CAPTCHA prompt text, and retries with a fresh proxy IP rather than failing silently), ASIN extraction that survives markup churn (three fallback selectors — data-asin, the faceout element id, and the /dp/ link — because Amazon doesn't render the ASIN the same way on every layout), currency disambiguation across marketplaces (a $ on amazon.com, amazon.ca and amazon.com.au all mean different currencies; the code cross-references the request domain against a 19-marketplace currency table before trusting the symbol), and pagination that stops on its own (the crawler caps itself at 5 pages per category as an internal safeguard, since Amazon's own Best Sellers pages generally do not expose much beyond that before they stop returning new items).

None of this is exposed through a documented, versioned Amazon endpoint a third party can call — a self-built scraper means re-discovering and re-maintaining every one of these edge cases as Amazon's markup changes. This Actor is appropriate when you need current Best Sellers data on a schedule without owning that maintenance burden; building your own is reasonable only if you need control over the HTTP/parsing layer itself (e.g. a custom anti-bot stack) that an Actor's input schema can't expose.

How to use data extracted from Amazon?

🛒 Dropshippers and e-commerce sellers

Run with categoryUrls set to the categories you're sourcing for, minRating and minReviews set to a quality floor (e.g. 4.0 and 500), and priceRange bounding the price band you can compete in. The resulting rows — asin, name, price, rank, reviewsCount — go straight into a spreadsheet of validated, currently-selling candidates instead of a list of products that merely exist on Amazon.

📊 Agencies monitoring client categories

An agency tracking several brands' category standing runs one categoryUrls entry per client category on an Apify schedule, with detailedInformation on for the categories that matter and off for a cheaper daily rank check elsewhere. rank, rankBucket and bestsellerRanks (with detail on) give a week-over-week ranking trend per client without touching Amazon's Seller Central.

🔬 Market research and pricing intelligence

Scrape a category tree with subcategoryDepth: 2 or higher to pull the main category plus its listed subcategories in one run, then group the resulting rows by categoryName and bucket by price.value or rankBucket to map price distribution and category density — useful for expansion research into a new product line before committing inventory.

🤖 AI agents and automated pipelines

Because output is plain JSON on an Apify dataset, an agent framework can call this Actor as a tool, pass a category URL, and read back rank, price and reviewsCount for a grounding step in a product-research or repricing pipeline — no HTML parsing inside the agent itself.

🔼 Input sample

categoryUrls is the only required field; every other input has a working default.

ParameterRequiredTypeDescriptionExample value
categoryUrlsYesarrayAmazon list-page URLs to scrape. Supports Best Sellers (/zgbs/), New Releases (/gp/new-releases/) and Most Wished For (/gp/most-wished-for/). Movers & Shakers is not supported (see below).["https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"]
maxResultsNointegerMax products to extract per category URL, across main list + subcategories, deduped by ASIN. Minimum 1, maximum 500, default 100.100
subcategoryDepthNointeger1 = main category only. 2 or higher also scrapes the listed subcategories (still capped by maxResults). Minimum 1, default 1.2
detailedInformationNobooleanVisit each product page for brand, features, availability, coupon, list price/discount, Prime, badges, variant ASINs, breadcrumbs, real Best Sellers Ranks and the star histogram. Slower, and billed per enriched row. Default false.true
minRatingNonumberKeep only products rated at least this (1–5, decimals allowed, e.g. 4.5). Products with no rating are dropped. Leave empty for no filter.4
minReviewsNointegerKeep only products with at least this many ratings/reviews. Products with no review count are dropped. Minimum 0. Leave empty for no filter.1000
priceRangeNoobjectKeep only products priced within {"min": X, "max": Y} in the marketplace's own currency. Products with no price are dropped once a bound is set.{"min": 10, "max": 100}
primeOnlyNobooleanKeep only Prime-eligible products. Requires detailedInformation: trueisPrime only exists on the product page. Default false.true
languageNostring (enum)Preferred Amazon content language (Accept-Language). Options: "" (default), cs, da, de, en, es, fr, nl, pl, pt, sv, tr, he, ar, hi, bn, ta, te, kn, ml, ko, zh_CN, zh_TW, ja. Unsupported values fall back to the domain default."de"
proxyConfigurationNoobjectProxy settings. Default: {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}. Amazon robot-checks datacenter IPs, so residential is recommended.see default
{
"categoryUrls": [
"https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
],
"maxResults": 100,
"subcategoryDepth": 1,
"detailedInformation": false,
"minRating": 4,
"minReviews": 100,
"priceRange": { "min": 10, "max": 200 },
"primeOnly": false,
"language": "",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Common pitfall: setting primeOnly: true without also setting detailedInformation: true does nothing — isPrime is only populated during detail enrichment, since Prime eligibility is not present on the list card itself. The Actor logs a warning and returns unfiltered results in that case rather than silently dropping everything.

🔽 Output sample

Output is typed, normalized JSON with a consistent schema across every row — no export-only fields that differ between JSON and CSV. Download as JSON, CSV, Excel, XML or HTML table from the Apify Console's Storage tab, or pull it via the API. The dataset ships two views: 🛒 Best Sellers (the 16 core list columns, populated on every run) and 🔍 Enriched (19 columns, populated when detailedInformation is on) — both are views over the same underlying rows, not separate datasets.

{
"rank": 1,
"position": 1,
"rankBucket": "1-10",
"asin": "B08JHCVHTY",
"name": "Blink Plus Plan with monthly auto-renewal",
"url": "https://www.amazon.com/dp/B08JHCVHTY",
"productUrl": "https://www.amazon.com/Blink-Plus-Plan-monthly-auto-renewal/dp/B08JHCVHTY/ref=zg_bs_g_electronics_sccl_1",
"price": { "value": 11.99, "currency": "USD" },
"priceString": "$11.99",
"numberOfOffers": null,
"offersFromPrice": null,
"stars": 4.4,
"reviewsCount": 277407,
"thumbnailUrl": "https://m.media-amazon.com/images/I/31YHGbJsldL._AC_UL300_SR300,200_.png",
"imageVariants": [
"https://m.media-amazon.com/images/I/31YHGbJsldL._AC_UL300_SR300,200_.png",
"https://m.media-amazon.com/images/I/31YHGbJsldL._AC_UL600_SR600,400_.png"
],
"categoryName": "Electronics",
"categoryFullName": "Best Sellers in Electronics",
"categoryUrl": "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/",
"subcategories": [
{ "categoryName": "Accessories & Supplies", "categoryUrl": "https://www.amazon.com/Best-Sellers-Electronics-Accessories-Supplies/zgbs/electronics/172282" }
],
"marketplace": "amazon.com",
"domain": "www.amazon.com",
"discoveryMode": "best-sellers",
"scrapedAt": "2026-07-26T14:02:00Z",
"input": "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
}

With detailedInformation: true, each row also carries brand, features, availability, inStock, coupon, detailPrice, listPrice, discountPercent, savingsAmount, isDeal, isPrime, badges, boughtInPastMonth, breadCrumbs, variantAsins, bestsellerRanks, starsBreakdown and detailScraped.

Data quality notes (honest coverage)

  • rank is the authoritative BSR badge value; it is null whenever a card has no visible badge, including the embedded-ASIN-list fallback path the Actor uses when the primary grid markup isn't present. position is never null and always reflects list order.
  • listPrice, isPrime, badges, coupon and boughtInPastMonth do not exist on the list page at all — they populate only with detailedInformation on, and are null on the product page when genuinely absent, never guessed.
  • numberOfOffers is populated only when the card shows a real "N offers from $X" line; it is null for standard single-price listings, not 0.
  • If the product-page fetch fails during enrichment (timeout, block, 404), detailScraped is set to false but the row is still pushed and still billed at the detail_result rate — it simply carries the list-scrape fields without the enrichment fields. Filter on detailScraped: true downstream if you need to guarantee enrichment succeeded.

How do you filter and target specific products?

Four filter axes work together to narrow a broad category down to exactly the products worth acting on. Category vs. depth — a single categoryUrls entry pulls one category page; add more entries for unrelated categories, or raise subcategoryDepth to 2+ to also sweep the subcategories listed on that same page, all deduplicated by asin so a product appearing in both the parent and a subcategory is only billed once. Quality thresholdsminRating and minReviews drop products before they're counted against maxResults or billed, so you can request "top 50 in Electronics rated 4+ with 500+ reviews" and get exactly that instead of filtering a raw 100-row export yourself. Price scopingpriceRange bounds results to a {"min", "max"} band in the marketplace's own currency; products with no visible price are dropped once either bound is set. Prime and enrichment-gated flagsprimeOnly only works once detailedInformation is on, since isPrime lives on the product page, not the list card.

Three real targeting examples:

{ "categoryUrls": ["https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"],
"minRating": 4.5, "minReviews": 1000, "maxResults": 50 }
{ "categoryUrls": ["https://www.amazon.co.uk/gp/new-releases/kitchen/"],
"priceRange": { "min": 15, "max": 60 }, "subcategoryDepth": 2 }
{ "categoryUrls": ["https://www.amazon.com/Best-Sellers-Beauty/zgbs/beauty/"],
"detailedInformation": true, "primeOnly": true, "minRating": 4, "maxResults": 100 }

▶️ Want to try other SimpleAPI scrapers?

ScraperWhat it extracts
../amazon-seller-data-extractorSeller intel and product listings from ASINs, seller IDs, keywords or category/seller URLs on Amazon
../Airbnb-Availability-%26-Rate-ScraperForward-looking Airbnb listing calendars — availability, min/max nights and nightly price where present

How to extract Amazon Best Sellers data programmatically

This Actor runs on the Apify platform, so it's callable as a standard REST call through the Apify API — one authenticated POST to start a run, one GET to fetch the finished dataset, structured JSON back.

🐍 Python example

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("YOUR_USERNAME/amazon-bestsellers-scraper").call(run_input={
"categoryUrls": ["https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"],
"maxResults": 100,
"minRating": 4,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["rank"], item["asin"], item["priceString"])

📥 Export to spreadsheets or CRM

From the Apify Console's Storage tab, export the dataset directly as CSV or Excel — asin, name, priceString, stars and reviewsCount map cleanly to spreadsheet columns for a sourcing shortlist, or import into a CRM/PIM via Apify's Make and Zapier integrations to route new Best Sellers into an existing product-research workflow.

Scraping publicly available Amazon Best Sellers pages is generally legal — these are public product listings Amazon publishes for anyone to browse, not gated or authenticated content. This Actor returns product and pricing data (asin, price, rank, stars), not personal data about identifiable individuals, so GDPR and CCPA do not attach to the records it collects. What does apply is Amazon's own Terms of Service, which govern automated access to the site, and database-rights law in some jurisdictions, which can restrict systematic extraction and re-use of a structured dataset. Consult legal counsel before any commercial use involving bulk storage or resale of scraped data.

❓ Frequently asked questions

What happens to a product that gets delisted or goes out of stock?

The Actor reports availability exactly as Amazon shows it at scrape time; it does not track a product's history across runs. With detailedInformation on, availability (raw text) and inStock (boolean) come from the product page and will read as unavailable/out-of-stock once Amazon marks it that way. Without detail enrichment, a delisted product simply stops appearing on the category list on the next run — there is no explicit "delisted" flag on the base list row.

Can I get ratings and review counts along with the rank?

Yes — stars and reviewsCount are on every list row by default, parsed from the product card's rating aria-label, no detailedInformation required. The full 5-to-1 star percentage breakdown (starsBreakdown) is only available with detailedInformation on, since that histogram lives on the product page.

How accurate is the price and rank data?

The Actor returns exactly what Amazon's page shows at request time — rank from the live BSR badge, price parsed from the live price node. Amazon updates Best Sellers rankings and prices on its own schedule, so a single snapshot reflects that moment only; run the Actor on an Apify schedule if you need a rank or price trend over time rather than a point-in-time read.

How many products can I get per run?

maxResults caps results per categoryUrls entry at up to 500, default 100, counted after filters and after ASIN deduplication. With subcategoryDepth at 2 or higher the same cap applies to the combined main-category-plus-subcategory total, not per subcategory. Independently of maxResults, the crawler caps itself at 5 pages of pagination per category page as an internal safeguard — the source notes that Amazon's own Best Sellers pages typically stop returning new items after around 2 pages (roughly 100 products) in practice.

Are products dropped by minRating, minReviews or priceRange billed?

No. Filters run before a row is emitted, and a product that fails any active filter is skipped entirely — it is never pushed to the dataset and never billed. The one exception is primeOnly combined with detail enrichment: a row is briefly held after its detail fetch, and if it fails primeOnly at that point it is discarded unbilled as well.

Does subcategoryDepth actually control how deep the crawl goes?

Yes — subcategoryDepth: 1 (the default) scrapes only the category in categoryUrls. Any value of 2 or higher scrapes the subcategories listed on that category's own page in addition to the main list, still bounded by maxResults for the run. It does not currently recurse into a subcategory's own subcategories; depth applies one level below the input URL.

Does this scraper work with Claude, ChatGPT and AI agent frameworks?

Yes, as a callable HTTP endpoint through the Apify API — any agent framework that can make an authenticated REST call can start a run, poll for completion, and read back the dataset as JSON, using the same apify_client call shown above.

How does Amazon Best Sellers Scraper compare to other Amazon scrapers?

As observed on the Apify Store on 2026-07-26, junglee/amazon-bestsellers and amazon-scraper/amazon-bestsellers-scraper both publish output examples with a position field for list order but no separate field parsed from the on-page rank badge — this Actor's rank is sourced specifically from that badge and kept distinct from position. curious_coder/amazon-scraper targets individual product and search-result pages rather than Best Sellers/New Releases/Most Wished For list pages specifically, with a flat-rate monthly price rather than pay-per-event; the other two, like this Actor, price by result. Filter flexibility (minRating, minReviews, priceRange, primeOnly) applied before billing is not documented on any of the three competitor listings reviewed.

Can I use this without an Amazon API key or developer account?

Yes. No Amazon account, Amazon Associates ID, or Amazon API credentials of any kind are required — only an Apify account and one or more categoryUrls. Proxy access is included by default through Apify's residential proxy.

Conclusion

Amazon Best Sellers Scraper turns Amazon's Best Sellers, New Releases and Most Wished For pages into structured, filterable JSON — real BSR rank pulled from the page badge rather than a positional guess, currency-aware pricing across marketplaces, and optional per-product enrichment for brand, discount and Prime status. It's built for anyone who needs to know which products are actually winning a category right now: dropshippers sourcing inventory, agencies tracking client rankings, and researchers mapping category and price distribution. Start a run from the Actor page in Apify Console with a category URL and a maxResults value, or call it through apify_client to fold Best Sellers data into an existing pipeline.