# Amazon Best Sellers Scraper: Rankings & Products (`deepmine/amazon-best-sellers-scraper`) Actor

Amazon best sellers scraper for Best Sellers, New Releases, Movers & Shakers, Most Wished For and Gift Ideas: the top 100 ranks per category with title, ASIN, price, rating, reviews and full product details, on any marketplace. Scrape Amazon bestsellers and subcategories. No login.

- **URL**: https://apify.com/deepmine/amazon-best-sellers-scraper.md
- **Developed by:** [DeepMine](https://apify.com/deepmine) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Amazon Best Sellers Scraper: Rankings & Products

An Amazon best sellers scraper for every ranked list Amazon has: Best Sellers, New Releases, Movers & Shakers, Most
Wished For and Gift Ideas, in any category and on any Amazon marketplace. Each list gives its top 100 products in
rank order with title, ASIN, price, rating, reviews and image, plus the full product page if you want it (features,
specs, every Best Sellers Rank, variants, seller, delivery, Prime, badges). Scrape Amazon bestsellers for a whole
category tree with subcategories. No login, no cookies, no browser.

| position | title | price | stars | reviewsCount | listName | asin |
|---|---|---|---|---|---|---|
| 1 | blink plus plan with monthly auto-renewal | $11.99 | 4.4 | 280,900 | Electronics | B08JHCVHTY |
| 2 | Apple AirPods Pro 3 Wireless Earbuds with Active Noise Cance… | $179.00 | 4.4 | 16,114 | Electronics | B0FQFB8FMG |
| 3 | Amazon Fire TV Stick HD (newest model), free & live TV, Alex… | $15.99 | 4.0 | 6,121 | Electronics | B0DJGDC3BD |
| 4 | Amazon Echo Dot (newest model) - Vibrant sounding speaker, D… | $39.99 | 4.7 | 200,587 | Electronics | B09B8V1LZ3 |
| 5 | Apple AirTag (2nd Generation): Tracker for Keychain, Wallet,… | $24.00 | 4.6 | 11,632 | Electronics | B0GJTFXNRX |

<sub>Collected from a saved Best Sellers in Electronics page (2026-10-07, local test run; platform rows to follow).</sub>

With **📝 Full product details** on (the default), each row also carries the product page:

| position | title | brand | price | isPrime | badges | sellerName | delivery |
|---|---|---|---|---|---|---|---|
| 8 | Apple EarPods Headphones with USB-C Plug, Wired… | Apple | $19.00 | true | Amazon's Choice | Amazon.com | FREE delivery October 12 - 14 on orders shipped… |

<sub>The same local run with the saved EarPods product page; the row has 90+ keys (features, specs, images, variants,
every Best Sellers Rank when the page shows one). The free 📑 Rankings dataset holds its rank in every list.</sub>

**$1.99 per 1,000 products** on the Starter plan ($2.35 Free, $1.69 Scale, $1.49 Business, Platinum and Diamond),
and that price includes the full product page (brand, seller, delivery, Prime, badges, specs), not only the list.
Seller offers, only if you turn them on: $0.75 per 1,000 offers. Ranking rows are free. The prefilled run
(100 products: the top 100 Best Sellers in Electronics with full details, offers off) costs about $0.20 on Starter.

### What you can scrape

- **Every chart**: Best Sellers, New Releases, Movers & Shakers, Most Wished For and Gift Ideas, ranks 1-100.
- **Any category and marketplace**: paste a list URL in its modern (`amazon.com/zgbs/electronics`) or older
  (`amazon.com/gp/bestsellers/books`) form, from amazon.com, .co.uk, .de, .fr, .it, .es, .ca, .co.jp, .in, .com.au
  and 13 more. Or type just the category (`electronics`, `books/4`) and pick the marketplace and chart.
- **Subcategories**: with **🗂️ Subcategory levels** at 2, Electronics also gives Headphones, Camera & Photo and its
  other subcategories, each with its own top 100; 3 goes one level deeper. **🗂️ Max lists** caps how many lists
  the subcategories bring the run to.
- **Full product details** (on by default, same price): description, features, specs, every Best Sellers Rank,
  images, variants, seller, delivery for your ZIP code, Prime, badges and Amazon's AI review summary. Off: only
  what the list shows, much faster.
- **Rankings across lists**: a product that several lists rank is one product row, charged once, and the free
  **📑 Rankings** dataset keeps its rank in every list.
- **Seller offers** ($) and **variants as separate products** ($: each variant row is a product, charged like
  one), as in the Amazon Scraper.

### How to use it

1. Paste **🔗 Best seller lists** (URLs, one per line) or type categories such as `electronics`.
2. Keep **📊 Products per list** at 100 for the full list, or lower it for the top N.
3. Leave **📝 Full product details** on for the full row; off returns the list fields only.
4. Press **Start**. Rows stream into the dataset in rank order, list by list.

Saved inputs of junglee/amazon-bestsellers run as they are: `categoryUrls`, `maxItemsPerStartUrl`, `depthOfCrawl`
and `detailedInformation` work the same way (`language` and `useCaptchaSolver` aren't needed: the log says so).
`startUrls` and the Amazon Scraper's `categoryOrProductUrls` and `scrapeProductDetails` work too. Product and
search URLs aren't lists: the run summary names them, and our Amazon Scraper reads them.

### Pricing

You pay per product in the dataset, once per product per run however many lists rank it, at your Apify plan's
price (see the Pricing tab). Ranking rows, failed lists and the run summary are never charged. Seller offers are
charged per offer, only when **🛍️ Seller offers per product** is above 0. A run stops at your spending limit
without reading pages it can't deliver.

### Output

**🏆 Best Sellers** (the default dataset): one row per product, the same keys on every row; anything Amazon doesn't
show is `null`. Views: **🏆 Best Sellers**, **📈 Stats** (every number) and **📝 Details**.

| Key | What it is |
|---|---|
| position, pageNumber | The rank in the list it was found in first, and the list page (1: ranks 1-50, 2: 51-100) |
| listType, listName, listFullName, listUrl | That list: Best Sellers in Electronics, its URL |
| subcategories, subcategoryUrls | The list's subcategories and their lists |
| thumbnailImage | The main picture |
| title, brand, author | Title, brand, book author |
| asin, url | Amazon's id and the product page |
| price, priceValue, currency | Price as shown ($19.00), as a number, ISO currency |
| listPrice, listPriceValue | Crossed-out list price |
| priceRange, priceRangeMin, priceRangeMax | Variation parents: the price range |
| shippingPrice, shippingPriceValue | Delivery price ('Free' or the amount) |
| inStock, inStockText, condition | Availability and the buy box condition |
| stars, reviewsCount | Average rating and number of ratings |
| fiveStarPercent … oneStarPercent | The star breakdown in percent |
| hasReviews | Whether it has ratings |
| isPrime, badges | Prime delivery in the buy box; '#1 Best Seller in …', Amazon's Choice, Climate Pledge Friendly |
| fullDetails | true: read from the product page; false: the list fields only |
| aiReviewsSummarySnippet, aiReviewsSummary, aiReviewsKeywords | Amazon's "Customers say" summary and aspects |
| monthlyPurchaseVolume, monthlyPurchases | "10K+ bought in past month" and the number |
| isAmazonChoice, amazonChoiceText | The Amazon's Choice badge |
| bestsellerRank, bestsellerCategory, bestsellerCategoryUrl | Best Sellers Rank in the main category |
| bestsellerRanks, bestsellerRankUrls | Every rank the product page shows ("#12 in Earbud Headphones") and its list |
| breadCrumbs | The category path |
| descriptionSnippet, description, bookDescription | Description (or the seller's A+ "Product description") |
| features | The "About this item" bullets |
| attributes, productOverview, manufacturerAttributes | Product details, overview and technical specs as "Key: Value" |
| importantInformation, sustainabilityFeatures | Safety/legal notes, Climate Pledge Friendly features |
| aPlusContent, aPlusImages, aPlusVideos | The A+ (From the manufacturer) block |
| brandStory, brandStoryImages | The "From the brand" block |
| productComparisonAsins | ASINs in the comparison table |
| galleryThumbnails, highResolutionImages, videosCount | Gallery images and videos |
| variantAsins, variantDimensions, variantAttributes, variantDetails | Variants: ASINs, what they differ in, this one's values, each variant |
| variantPrices, variantImages | Each variant's price and picture |
| sellerName, sellerId, sellerUrl | The buy box seller |
| offersCount | Seller offers: the all-offers panel's count (with offers on), else the product page's ("New & Used (12) from"), else the list's ("3 offers from") |
| returnPolicy, support, storeUrl | Returns, support, the brand store |
| delivery, fastestDelivery, locationText, loadedCountryCode | Delivery promise and the location it was read for |
| answeredQuestions, reviewsUrl | Answered questions (when shown), the reviews page |
| isSponsored, badge | Search fields of the shared row (null for lists) |
| marketplace, originalAsin, unNormalizedProductUrl, input, scrapedAt | Provenance and time (UTC) |

**📑 Rankings** (free, a second dataset): one row per list and product, so a product that two lists rank keeps
both ranks; the product row stays where it was found first, and each ranking row says which list that is.

| asin | listType | position | isProductRowList | productListUrl | productPosition |
|---|---|---|---|---|---|
| B0DJGDC3BD | Best Sellers | 3 | True | amazon.com/Best-Sellers-Electronics/zgbs/electronics/ | 3 |
| B0DJGDC3BD | New Releases | 2 | False | amazon.com/Best-Sellers-Electronics/zgbs/electronics/ | 3 |

<sub>From saved Best Sellers (2026-10-07) and New Releases (2026-10-14) pages in Electronics, local test run.</sub>

Its keys: position, thumbnailImage, title, asin, listType, listName, listFullName, listUrl, pageNumber, depth
(1: a list you gave, 2: its subcategory...), parentListUrl, isProductRowList, productListUrl, productPosition,
productUrl, listedAsin (when the list's ASIN opens another product's page), marketplace, input, scrapedAt.

**🛍️ Seller Offers** (with offers on): asin, productTitle, position, isPinnedOffer (the buy box), condition, price,
priceValue, currency, shippingPrice, shippingPriceValue, delivery, shipsFrom, sellerName, sellerId, sellerUrl,
sellerRating, offersUrl, productUrl, marketplace, input, scrapedAt.

**🧾 Run summary** (the OUTPUT record): per list its status, depth and parent list, products delivered, ranking
rows, products an earlier list already delivered (with their rank), failures; delivery location, calls, traffic.

#### Field map for junglee/amazon-bestsellers users

`name` → `title`, `thumbnailUrl` → `thumbnailImage`, `categoryName` / `categoryFullName` / `categoryUrl` →
`listName` / `listFullName` / `listUrl`, `numberOfOffers` → `offersCount`, `price {value, currency}` → `price`,
`priceValue`, `currency`; `position`, `asin`, `url`, `stars`, `reviewsCount`, `input` keep their names and
`subcategories` → `subcategories` + `subcategoryUrls`. Failed lists go to the run summary, not into your rows.

### Limits

- Amazon ranks 100 products per list; a list with fewer gives what it has.
- Prime and badges come from the product page: with full details off they are `null`.
- Rows are read from Amazon's English pages; titles keep the language the seller wrote them in.
- A delivery postcode Amazon rejects stops that marketplace's lists (rather than return another location's prices).

### FAQ

**Do I need proxies?** No: the default Apify datacenter proxy works for Amazon. A page Amazon refuses is asked
again on another IP.

**Why did a product come out once when two lists rank it?** You pay once per product per run. The Rankings dataset
has a row for each list that ranks it, with that list's rank.

**What if a run is interrupted?** Resurrect it: products already in the dataset are never pushed or charged again,
and ranking rows already written aren't written twice.

### Your feedback

Found a bug, or a field you need? Open an issue on the Issues tab and we'll answer within two days. If the data
helped you, a short review on this page helps other users find the Actor.

# Actor input Schema

## `categoryUrls` (type: `array`):

Any Best Sellers, New Releases, Movers & Shakers, Most Wished For or Gift Ideas list URL, one per line, on any Amazon site. Or just a category (electronics, books/4), read on the marketplace and chart below.

## `maxItemsPerStartUrl` (type: `integer`):

Top N ranks of each list (Amazon ranks 100). A product several lists rank is charged once; the free Rankings dataset keeps every rank.

## `detailedInformation` (type: `boolean`):

On: the full product row (features, specs, Best Sellers Ranks, seller, delivery, Prime, badges, variants). Off: only what the list shows, much faster (fullDetails false). Same price.

## `depthOfCrawl` (type: `integer`):

1 = only the lists you give. 2 = also each list's subcategories (Electronics → Headphones, Camera & Photo...), 3 = their subcategories too, and so on, up to Max lists.

## `domain` (type: `string`):

The Amazon site a category typed without a URL is read on. URLs keep their own site.

## `listType` (type: `string`):

Which ranked list a category typed without a URL is read from.

## `zipCode` (type: `string`):

Read prices and delivery for this postcode, e.g. 10001 (amazon.com) or 10115 (amazon.de). Empty = each marketplace's capital; amazon.com uses the proxy's US location. The run stops if Amazon rejects it.

## `countryCode` (type: `string`):

Two-letter country to deliver to, for international shipping prices, e.g. DE on amazon.com. Empty = the marketplace's own country. Not used with a postcode.

## `maxCategories` (type: `integer`):

With Subcategory levels above 1: no more subcategories are added once the run has this many lists (the lists you give are always read).

## `maxOffers` (type: `integer`):

Also list up to this many seller offers per product (price, condition, seller, ships from, delivery) in the Offers dataset, charged per offer. Needs Full product details. 0 = none.

## `maxProductVariantsAsSeparateResults` (type: `integer`):

Also return up to this many variants (sizes, colors…) of each ranked product as rows of their own. Each variant row is a product and is charged like one. Needs Full product details. 0 = none.

## `proxyConfiguration` (type: `object`):

Leave as is: Apify datacenter proxies work for Amazon. Residential is replaced by datacenter (it costs more per page than a product row earns).

## `startUrls` (type: `array`):

Same as Best seller lists (for API callers used to startUrls).

## `categoryOrProductUrls` (type: `array`):

Same as Best seller lists (the Amazon Scraper's key).

## `scrapeProductDetails` (type: `boolean`):

Same as Full product details (the Amazon Scraper's key): false turns details off.

## `maxConcurrency` (type: `integer`):

Engine setting.

## `language` (type: `string`):

Kept for saved junglee/amazon-bestsellers inputs: rows are read from Amazon's English pages.

## `useCaptchaSolver` (type: `boolean`):

Kept for saved junglee/amazon-bestsellers inputs: not needed (a refused page is retried on a new IP).

## Actor input object example

```json
{
  "categoryUrls": [
    "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
  ],
  "maxItemsPerStartUrl": 100,
  "detailedInformation": true,
  "depthOfCrawl": 1,
  "domain": "www.amazon.com",
  "listType": "bestsellers",
  "maxCategories": 1000,
  "maxOffers": 0,
  "maxProductVariantsAsSeparateResults": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 12
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `rankingsUrl` (type: `string`):

No description

## `offersUrl` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "categoryUrls": [
        "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
    ],
    "maxItemsPerStartUrl": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/amazon-best-sellers-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "categoryUrls": ["https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"],
    "maxItemsPerStartUrl": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/amazon-best-sellers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "categoryUrls": [
    "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
  ],
  "maxItemsPerStartUrl": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call deepmine/amazon-best-sellers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deepmine/amazon-best-sellers-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bJrVOrWhMLLzp7lbz/builds/9s6Tib0M3QxMFu1RR/openapi.json
