# Amazon Best Sellers Scraper & Rank Tracker (`cleanpull/amazon-bestsellers-tracker`) Actor

Amazon Best Sellers, New Releases and Movers & Shakers with all 100 ranks in 22 marketplaces, plus what changed since your last run: rank moves, new entries, drop-outs and computed movers, with a summary per chart. Bestseller rank tracking from $1.50 per 1,000 products.

- **URL**: https://apify.com/cleanpull/amazon-bestsellers-tracker.md
- **Developed by:** [CleanPull](https://apify.com/cleanpull) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 1 monthly users, 97.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 product rows

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 & Rank Tracker

Track Amazon's **Best Sellers** and **New Releases** charts in **22 marketplaces**, with **all 100 ranks** (also the ranks Amazon loads only as you scroll), and see **what changed since your last run**: products that climbed or fell and by how many places, **new entries**, **re-entries**, products that **dropped out**, **days on chart**, price changes, and **our own Movers & Shakers** computed from your runs. Products that are on both charts are flagged, and every chart gets a **summary row** (new entries, drop-outs, volatility, median price, brands entering and leaving). Add **product details** for the top products: Best Sellers Rank at every category level, brand, seller, stock, parent product and "bought in past month". Fast HTTP, from **$1.50 per 1,000 products**.

### What you can do with it

- **Find products before they peak**: schedule a daily run with Changes only and get the new entries, the biggest climbers and the products that are both a New Release and a Best Seller.
- **Watch your category**: a summary row per chart tells you how much the top 100 moved, which brands came in or left, and where the median price went.
- **Track your own products and rivals**: every row says where a product was last time, how long it has been on the chart, and how its price moved.
- **Build a rank history**: name a history dataset and every run appends its ranks, ready to chart in Sheets or a BI tool, without a database of your own.
- **Research many categories**: read every department, and their subcategories to any depth, with a category limit.

### Why this actor

- **All 100 ranks, verified.** Amazon puts only about 30 of each page's 50 products in the page itself and loads the rest as you scroll. Many scrapers return 60 of 100 or ranks without details. This actor loads the rest the way the page does and adds a coverage block to each chart summary listing any rank whose details Amazon did not serve (its rank and ASIN are still given).
- **Movement, not just a list.** Previous rank, places climbed, new, re-entry, dropped out, days on chart, price change and computed movers in every row; a changes-only mode where unchanged products cost $0.10 per 1,000.
- **Our own Movers & Shakers.** Amazon currently shows its Movers & Shakers, Most Wished For and Gift Ideas pages empty in most categories ("no movers and shakers available"). This actor still reads them when Amazon fills them (with Amazon's own percentage change), reports them as empty and never bills an empty chart, and flags the biggest climbers from your own runs (`computedMover`).
- **Local prices.** Pages are requested in the marketplace's own currency, and every row says which currency its price is in; prices in different currencies are never compared.
- **Cross-chart signals.** `new-release-on-best-sellers`, `best-seller-is-new-release`, `new-entry-top-10` and `computed-mover`.
- **22 marketplaces, one language each.** Pages are always requested in the marketplace's own language and currency, so a product never appears twice under two titles.
- **Honest failures.** A category a marketplace does not have (Amazon then shows its all-departments chart instead) is reported, not billed as data. Blocked pages are retried through datacenter and then residential proxies; Amazon's "continue shopping" interstitial is passed automatically.

### Input

| Field                                                | Type                      | What it does                                                                                                                                              |
| ---------------------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `categories`                                         | array                     | Department slugs (`kitchen`, `toys-and-games`), department names (`Toys & Games`) or `department/node` for a subcategory (`kitchen/289728`)               |
| `startUrls`                                          | array                     | Any chart URL: Best Sellers, New Releases, Movers & Shakers, Most Wished For, Gift Ideas, in any category and marketplace                                 |
| `marketplaces`                                       | array                     | `US`, `GB` (or `UK`), `DE`, `FR`, `IT`, `ES`, `CA`, `MX`, `BR`, `JP`, `IN`, `AU`, `NL`, `SE`, `PL`, `BE`, `TR`, `AE`, `SA`, `SG`, `EG`, `IE` (default US) |
| `charts`                                             | array                     | `best-sellers`, `new-releases`, `movers-and-shakers`, `most-wished-for`, `gift-ideas`                                                                     |
| `allCategories`, `subcategoryDepth`, `maxCategories` | boolean, integer, integer | Every department, how many subcategory levels below each category, and a limit                                                                            |
| `maxItemsPerChart`, `maxItems`                       | integers                  | Ranks per chart (up to 100) and rows per run                                                                                                              |
| `monitorName`                                        | string                    | The memory each run compares with (default `default`)                                                                                                     |
| `changesOnly`, `changeTypes`, `minRankChange`        | boolean, array, integer   | Only products that moved: `new`, `re-entry`, `up`, `down`, `dropped`; smaller moves count as unchanged                                                    |
| `moverCount`                                         | integer                   | Climbers flagged as movers per chart (default 10)                                                                                                         |
| `includeSummary`                                     | boolean                   | A summary row per chart (default on)                                                                                                                      |
| `historyDatasetName`                                 | string                    | A named dataset every run appends its ranks to                                                                                                            |
| `includeProductDetails`, `productDetailsTopN`        | boolean, integer          | Product pages for the top N of each chart                                                                                                                 |
| `fields`                                             | array                     | Return only these fields                                                                                                                                  |

`categoryUrls` and `domain` from other best-seller actors work as they are.

#### Example inputs

Kitchen in the US, both charts, a daily watch for what moved:

```json
{
  "categories": ["kitchen"],
  "charts": ["best-sellers", "new-releases"],
  "changesOnly": true,
  "monitorName": "kitchen-daily"
}
```

Every department in the UK and Germany, one level of subcategories, top 50:

```json
{
  "allCategories": true,
  "subcategoryDepth": 1,
  "maxCategories": 300,
  "marketplaces": ["GB", "DE"],
  "maxItemsPerChart": 50
}
```

### Output

A product row (a real row from 6 October 2026: the second run under the same tracking name, an hour after the first, when this product had not moved; `movement` is `up`, `down`, `new` or `re-entry` when it has):

```json
{
  "recordType": "item",
  "marketplace": "US",
  "chart": "best-sellers",
  "category": "Kitchen & Dining",
  "categoryPath": ["Kitchen & Dining"],
  "rank": 31,
  "asin": "B0DCDZP98B",
  "title": "STANLEY Quencher ProTour Flipstraw Tumbler, 30 oz, Rose Quartz | Built-In Straw & Handle | …",
  "url": "https://www.amazon.com/dp/B0DCDZP98B",
  "price": 30,
  "currency": "USD",
  "rating": 4.7,
  "reviewCount": 21199,
  "previousRank": 31,
  "rankChange": 0,
  "movement": "same",
  "firstSeenOnChart": "2026-10-06T03:20:37.944Z",
  "daysOnChart": 0,
  "priceChangePercent": 0,
  "computedMover": false,
  "alsoOn": [],
  "signals": [],
  "details": {
    "bestSellersRanks": [
      { "rank": 31, "category": "Kitchen & Dining" },
      { "rank": 3, "category": "Insulated Tumblers" }
    ],
    "brand": "STANLEY",
    "soldBy": "Amazon.com",
    "shipsFrom": "Amazon.com",
    "inStock": true,
    "parentAsin": "B0FDG9B5Q8",
    "boughtPastMonth": "4K+ bought in past month"
  }
}
```

The first run under a tracking name is a baseline: movement fields are null and every product is returned. A `dropped` row names a product that left the chart (`lastRank`, `lastSeen`, `firstSeenOnChart`).

The chart summary from the same run (when the chart has moved, new entries, drop-outs and climbers are counted here; `brandsEntering` and `brandsLeaving` compare the brands of the detailed top products):

```json
{
  "recordType": "chart-summary",
  "marketplace": "US",
  "chart": "best-sellers",
  "category": "Kitchen & Dining",
  "firstRun": false,
  "itemCount": 100,
  "coverage": { "ranksListed": 100, "withDetails": 100, "missingDetailRanks": [] },
  "newEntries": 0,
  "reEntries": 0,
  "dropped": 0,
  "climbed": 0,
  "fell": 0,
  "unchanged": 100,
  "volatilityPercent": 0,
  "topClimbers": [],
  "priceMedian": 17,
  "previousPriceMedian": 17,
  "priceMedianChangePercent": 0,
  "brandsEntering": [],
  "brandsLeaving": [],
  "amazonShowsEmpty": false
}
```

Every run writes `RUN_SUMMARY` to the key-value store: the outcome (`COMPLETE`, `PARTIAL`, `NO_CHANGES`, `EMPTY` or `FAILED`), charts read, charts Amazon shows empty, categories found, charges, warnings and failures.

### Pricing

Pay only for results. Empty charts and failed pages are never charged.

| Event                                                               | Free and Bronze | Silver | Gold  |
| ------------------------------------------------------------------- | --------------- | ------ | ----- |
| Product row                                                         | $1.50           | $1.35  | $1.20 |
| Change (changes only: a product that moved, entered or dropped out) | $2.00           | $1.80  | $1.60 |
| Unchanged product checked (changes only)                            | $0.10           | $0.09  | $0.08 |
| Chart summary                                                       | $2.00           | $1.80  | $1.60 |
| Product details (per product page)                                  | $4.00           | $3.60  | $3.20 |

Prices are per 1,000; your tier depends on your Apify plan. Each run also has a $0.00005 start fee. The history dataset is free.

### Limits

- Only what Amazon shows every visitor. Sales figures are not public; "bought in past month" appears only on products where Amazon shows it, and Best Sellers Rank is Amazon's own.
- Amazon currently shows Movers & Shakers, Most Wished For and Gift Ideas empty in most categories. They are read whenever Amazon fills them; meanwhile the computed movers cover chart movement.
- A delivery postcode cannot be set without signing in to Amazon, so prices and stock are those Amazon shows to a visitor without one.
- Movement compares runs under the same tracking name; schedule them at a steady interval (daily is typical). Two runs with the same name at the same time share one memory.
- Large crawls (every department, deep subcategories) take time: Amazon answers bursts with CAPTCHAs, so requests are paced.
- **Nothing found**: when no chart could be read because none exists (a category or department name Amazon does not have, a chart it 404s), the run still succeeds, with one free `recordType: "unreadable"` row per item giving the `reason`; nothing is charged. A run near its time limit stops starting categories, delivers what it read and lists the rest the same way.

### Changelog

- **0.1.x, reliability** (2026-10-24): runs that find nothing (unknown categories or department names, missing charts) end SUCCEEDED with a free `unreadable` row per item saying why, instead of FAILED; a run stops starting categories before its time limit and ends with what it read, never TIMED-OUT. A run whose every chart Amazon refused still fails. Prices and events unchanged.
- **0.1.x** (2026-10-23): `priceMedian` uses the shared median, to the cent (an even count's mean was rounded to 0.1).
- **0.1** (October 2026): Best Sellers, New Releases, Movers & Shakers, Most Wished For and Gift Ideas in 22 marketplaces; all 100 ranks; movement between runs, computed movers, cross-chart signals, chart summaries; changes-only mode; history dataset; product details.

# Actor input Schema

## `categories` (type: `array`):

Departments or categories, one per line: a department slug from the chart URL ("kitchen", "toys-and-games"), a department name ("Toys & Games"), or department/node for a subcategory ("kitchen/289728"). Read in every marketplace below.

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

Optional. Any Amazon chart page: Best Sellers, New Releases, Movers & Shakers, Most Wished For or Gift Ideas, in any category and marketplace (amazon.com/gp/bestsellers/kitchen/289728, amazon.co.uk/Best-Sellers-…/zgbs/…).

## `marketplaces` (type: `array`):

Country codes or domains: US, GB (or UK), DE, FR, IT, ES, CA, MX, BR, JP, IN, AU, NL, SE, PL, BE, TR, AE, SA, SG, EG, IE. Default US.

## `charts` (type: `array`):

Which charts to read for each category. Amazon currently shows Movers & Shakers, Most Wished For and Gift Ideas empty in most categories; empty charts are reported and never billed.

## `allCategories` (type: `boolean`):

Read every department of each marketplace (about 40 on amazon.com). Combine with Subcategory depth to go deeper.

## `subcategoryDepth` (type: `integer`):

How many levels of subcategories to read below each category: 0 reads only the category, 1 adds its subcategories, and so on. Limited by Max categories.

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

Stop after this many categories (each category reads every chart selected). The run summary says how many were found.

## `maxItemsPerChart` (type: `integer`):

Ranks to read per chart (Amazon shows 100 on two pages). Every rank is included, also the ones Amazon loads only as you scroll.

## `maxItems` (type: `integer`):

Optional. Stop after this many product rows in the run.

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

Optional. One marketplace domain, as other actors take it (amazon.de).

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

Optional. Same as Chart URLs; accepted so inputs from other actors work unchanged.

## `monitorName` (type: `string`):

Each run remembers every chart under this name, and the next run reports movement against it: previous rank, places climbed, new entries, re-entries, products that dropped out, days on chart and price change. Use different names for different schedules.

## `changesOnly` (type: `boolean`):

Return only products that moved (and products that dropped out), plus a summary per chart. Unchanged products cost $0.10 per 1,000. The first run returns every product as a baseline. Schedule it daily or hourly.

## `changeTypes` (type: `array`):

Which movements count as a change.

## `minRankChange` (type: `integer`):

Moves of fewer places count as unchanged.

## `moverCount` (type: `integer`):

How many of the biggest climbers in each chart are flagged as movers (computedMover), our Movers & Shakers from your own runs.

## `includeSummary` (type: `boolean`):

One summary row per chart: new entries, drop-outs, climbers, volatility, median price and its change, brands entering and leaving (with product details), and coverage.

## `historyDatasetName` (type: `string`):

Optional. A named dataset that every run appends its ranks to (date, chart, category, rank, ASIN, price), for rank history charts without a database of your own. Free.

## `includeProductDetails` (type: `boolean`):

Open the product page of the top products in each chart: Best Sellers Rank at every category level, brand, seller and who ships it, stock, parent product, date first available, and "bought in past month" when Amazon shows it. Billed per product.

## `productDetailsTopN` (type: `integer`):

Read product details for this many products from the top of each chart.

## `fields` (type: `array`):

Optional. Keep only these fields, for example \["rank", "asin", "title", "price", "rankChange"]. Dotted paths reach into lists.

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

Categories read in parallel. Amazon answers bursts with CAPTCHAs, so keep this low.

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

Optional. The actor picks proxies itself (direct, then datacenter, then residential only when Amazon blocks the others).

## Actor input object example

```json
{
  "categories": [
    "kitchen"
  ],
  "marketplaces": [
    "US"
  ],
  "charts": [
    "best-sellers"
  ],
  "allCategories": false,
  "subcategoryDepth": 0,
  "maxCategories": 50,
  "maxItemsPerChart": 100,
  "monitorName": "default",
  "changesOnly": false,
  "changeTypes": [
    "new",
    "re-entry",
    "up",
    "down",
    "dropped"
  ],
  "minRankChange": 3,
  "moverCount": 10,
  "includeSummary": true,
  "includeProductDetails": false,
  "productDetailsTopN": 20,
  "maxConcurrency": 2
}
```

# Actor output Schema

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

Product rows, dropped-out products and chart summaries.

## `products` (type: `string`):

No description

## `movers` (type: `string`):

No description

## `summaries` (type: `string`):

No description

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

Outcome (COMPLETE, PARTIAL, NO_CHANGES, EMPTY, FAILED), counts, empty charts, charges and failures.

# 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 = {
    "categories": [
        "kitchen"
    ],
    "marketplaces": [
        "US"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanpull/amazon-bestsellers-tracker").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 = {
    "categories": ["kitchen"],
    "marketplaces": ["US"],
}

# Run the Actor and wait for it to finish
run = client.actor("cleanpull/amazon-bestsellers-tracker").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 '{
  "categories": [
    "kitchen"
  ],
  "marketplaces": [
    "US"
  ]
}' |
apify call cleanpull/amazon-bestsellers-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanpull/amazon-bestsellers-tracker"
        }
    }
}
```

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/hj3AyIXxkeCwqMKIi/builds/bZyihPd6lqbehgkgC/openapi.json
