# Amazon Best Sellers Scraper (`steadyscrape/amazon-bestsellers-scraper`) Actor

Amazon Best Sellers and New Releases: all 100 ranks of any category, its subcategories to any depth, ten marketplaces. ASIN, title, price, rating, reviews, author, format, image, category path. No browser, no login, pay per product.

- **URL**: https://apify.com/steadyscrape/amazon-bestsellers-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** E-commerce, Lead generation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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.

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

Amazon's **Best Sellers** and **New Releases** charts for any category, **all 100 ranks**, with the subcategories of that category to any depth and on twelve marketplaces: rank, ASIN, title, price, the cheapest offer when there is no buy box price, rating, review count, author or brand, format, image, and where the category sits in Amazon's tree. **Every chart you ask for comes back**: when Amazon has nothing the row says why (`not_found`, `invalid`, `blocked`) instead of an empty dataset. You pay only for products read.

No browser, no login, no API key: it reads the chart pages Amazon serves to a desktop browser, including the second half of each page that Amazon loads as you scroll, and moves to another IP if Amazon's bot check shows up.

### What you get

One row per product per chart:

- **The rank**: `list` (`bestsellers` or `new-releases`), `rank` (1–100), `categoryId` (`books/5267710011`), `categoryName`, `categoryPath` (`["Books", "Test Preparation", "Citizenship"]`, as the category's own page shows it), `categoryUrl`, `depth` (0 for a category you named, 1 for its subcategories…).
- **The product**: `asin`, `title`, `url` (`https://www.amazon.com/dp/<ASIN>`), `image` (the original picture, not the thumbnail), `byline` (author, brand or app developer) with `bylineUrl` when Amazon links it, `format` ("Paperback", "Kindle Edition", "Audible Audiobook"), `formatsAvailable`.
- **The price**: `price`, `currency`, `priceText` as written ("$22.38", "R$ 6,66", "₹1,399.00"), and `offerCount` when the card shows "4 offers from ₹1.00" instead of a buy box price: then `price` is the cheapest of those offers.
- **The reviews**: `rating` (4.6) and `reviewCount` (21791); `null` for a product too new to have any.
- **What was asked**: `input` (the line as you gave it; subcategories carry the line they were reached from), `marketplace`, `scrapedAt`.
- **`status` and `reason`**: `ok`; `not_found` (Amazon shows no chart for that category: it does not exist, or Amazon keeps it empty); `invalid` (the line is not an Amazon chart); `blocked` (every IP route was refused; unpaid).

### Input

| field | what it does |
|---|---|
| `categories` | One per line: any Best Sellers or New Releases link (`https://www.amazon.com/gp/bestsellers/books`, `https://www.amazon.com/Best-Sellers-Kitchen-Dining/zgbs/kitchen`, a link copied from Amazon's category menu with its `ref=` tracking), or a department with an optional node (`electronics`, `books/5267710011`). The link's domain picks the marketplace. **Leave it empty to read every department** of the marketplace. |
| `lists` | `bestsellers` (default), `new-releases`, or both: each category is read in every chart you tick. |
| `maxProductsPerList` | How many ranks to read from each chart, from #1. Default and maximum 100. |
| `subcategoryDepth` | 0 (default) reads only your categories; 1 also every subcategory their menu lists; up to 5. |
| `maxCategories` | The most categories one run reads, yours and their subcategories together. Default 100. |
| `marketplace` | Where a bare department name is read: `com` (default), `ca`, `com.mx`, `com.br`, `co.uk`, `de`, `es`, `fr`, `it`, `in`, `co.jp`, `com.au`… |
| `residentialFallback` | Retry through residential proxies when Amazon refuses the datacenter IPs. Default on, included in the price. |

```json
{
    "categories": ["https://www.amazon.com/gp/bestsellers/books/5267710011", "kitchen", "https://www.amazon.com.br/gp/bestsellers/electronics"],
    "lists": ["bestsellers", "new-releases"],
    "subcategoryDepth": 1,
    "maxCategories": 50
}
```

### Output example

```json
{
    "status": "ok",
    "reason": null,
    "input": "books/11632",
    "list": "bestsellers",
    "marketplace": "com",
    "categoryId": "books/11632",
    "categoryName": "Citizenship",
    "categoryPath": ["Books", "Test Preparation", "Citizenship"],
    "categoryUrl": "https://www.amazon.com/gp/bestsellers/books/11632",
    "depth": 0,
    "rank": 1,
    "asin": "B004T4WQP0",
    "title": "US Citizenship Flash Cards 2026 with 128 Civics Questions and English Literacy Cards for Naturalization Test",
    "url": "https://www.amazon.com/dp/B004T4WQP0",
    "image": "https://images-na.ssl-images-amazon.com/images/I/71RjRaG+RnL.jpg",
    "byline": "American Prudence",
    "bylineUrl": null,
    "format": "Cards",
    "formatsAvailable": null,
    "price": 9.97,
    "priceText": "$9.97",
    "currency": "USD",
    "offerCount": null,
    "rating": 4.7,
    "reviewCount": 3967,
    "scrapedAt": "2026-10-19T14:00:00.000Z"
}
```

A category Amazon does not have:

```json
{ "status": "not_found", "reason": "amazon.com shows no bestsellers chart for books/99999999999: no such category, or one Amazon keeps empty", "input": "books/99999999999", "list": "bestsellers", "rank": null, "asin": null, "…": "…" }
```

### Use cases

- **Product research and sourcing**: what sells in a niche right now, at what price and with how many reviews, down to the leaf categories.
- **Rank tracking**: schedule a daily run over your categories and follow an ASIN's `rank`, yours or a competitor's.
- **Book and KDP research**: Books and Kindle Store charts with authors, formats and prices; New Releases show what is breaking out.
- **Catalogue mapping**: walk a department's tree (`subcategoryDepth`) to collect its category ids, names and paths.
- **More detail on a product**: feed the ASINs to our [Amazon Product Details Scraper](https://apify.com/steadyscrape/amazon-product-scraper) for the buy box, stock, seller, specs and variations.

### Limits and honesty

- **Marketplaces**: measured from Apify's cloud on 2026-10-19, amazon.com, .ca, .com.mx, .com.br, .es, .fr, .it, .in, .co.jp and .com.au answer their charts directly; amazon.co.uk and amazon.de answer Amazon's "Continue shopping" bot check to cloud IPs and were read through residential proxies of their own country (included in the price). A chart every route refuses is a free `blocked` row.
- **Department names differ by marketplace**: electronics is `electronics` on amazon.com and `ce-de` on amazon.de. Copy the link from Amazon's category menu when in doubt; a name the marketplace does not have comes back as a free `not_found` row.
- **Prices follow the IP**: Amazon prices what a visitor from the run's IP would pay. amazon.co.jp showed US dollars to Apify's American IP ("USD 6.27") in one run and yen in another; `currency` always says which. Residential proxies are taken in the marketplace's country so that amazon.co.uk reads in pounds.
- **Movers & Shakers, Most Wished For and Gift Ideas are not offered**: Amazon currently shows them as "Sorry, there are no … available in this category" to anyone not signed in.
- **A category can sit under two parents** in Amazon's tree (Kitchen & Dining lists Bar Tools & Drinkware, whose own page places it under Dining & Entertaining): `categoryPath` is the path the category's own page shows.
- A chart of 100 takes four requests (two pages, each with the half Amazon loads on scroll), three charts in parallel, one request per second per IP.
- The same product appears once per chart it ranks in, and is charged once per row: that is the data (its rank in each category).
- Product pages are not opened: no description, specs or stock beyond what the chart card shows.

### Pricing

Pay per event: one `product` event per row with status `ok`, US$0.001 (US$0.10 for a whole chart of 100). Rows with any other status are free. Set a spending limit on the run and the Actor stops at it.

### Legal

The Actor reads publicly available chart pages that Amazon shows to anyone, without logging in, and stores no personal data. Use the data in line with Amazon's terms and your local law.

# Actor input Schema

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

One category per line: any Amazon Best Sellers or New Releases link (<code>https://www.amazon.com/gp/bestsellers/books</code>, <code>https://www.amazon.com/Best-Sellers-Kitchen-Dining/zgbs/kitchen</code>, a link copied from the site's category menu), or a department with an optional node (<code>electronics</code>, <code>books/5267710011</code>) on the marketplace below. A link's domain picks its marketplace. Leave it empty to read every department of the marketplace.

## `lists` (type: `array`):

Which charts to read for each category. Movers & Shakers, Most Wished For and Gift Ideas are left out: Amazon currently shows them empty to visitors.

## `maxProductsPerList` (type: `integer`):

How many ranks to read from each chart, from #1 down. Amazon's charts end at 100.

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

0 reads only the categories above; 1 also reads every subcategory their menu lists; 2 the subcategories of those, and so on.

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

The most categories one run reads, the ones above and their subcategories together. A department at depth 2 can hold several hundred.

## `marketplace` (type: `string`):

Where a department without a link (<code>books</code>) is read, and whose departments an empty Categories reads. Measured from Apify's cloud on 2026-10-19: .com, .ca, .com.mx, .com.br, .es, .fr, .it, .in, .co.jp and .com.au answer directly, .co.uk and .de through residential proxies of their country. Department names differ by marketplace (electronics is <code>ce-de</code> on amazon.de): a link copied from Amazon's menu always works.

## `residentialFallback` (type: `boolean`):

When Amazon refuses the run's own IP and the datacenter proxies, retry through residential proxies (included in the price: you pay per product, not per proxy byte). Off: those charts come back with status <code>blocked</code>, unpaid.

## Actor input object example

```json
{
  "categories": [
    "https://www.amazon.com/gp/bestsellers/electronics"
  ],
  "lists": [
    "bestsellers"
  ],
  "maxProductsPerList": 100,
  "subcategoryDepth": 0,
  "maxCategories": 100,
  "marketplace": "com",
  "residentialFallback": true
}
```

# Actor output Schema

## `products` (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 = {
    "categories": [
        "https://www.amazon.com/gp/bestsellers/electronics"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/amazon-bestsellers-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 = { "categories": ["https://www.amazon.com/gp/bestsellers/electronics"] }

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/amazon-bestsellers-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 '{
  "categories": [
    "https://www.amazon.com/gp/bestsellers/electronics"
  ]
}' |
apify call steadyscrape/amazon-bestsellers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/amazon-bestsellers-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/Rvq82v5jVgeWzR6di/builds/CkKlyvnqAqEcadXax/openapi.json
