# Amazon Best Sellers Scraper - Full Top 100, No Login (`benthepythondev/amazon-bestsellers-scraper`) Actor

Returns the full top 100 of any Amazon Best Sellers or New Releases category: rank, ASIN, title, clean product link, price and currency, rating, review count, image. Walks subcategories on request. amazon.com, .co.uk, .de, .fr, .it, .es, .ca, .co.jp. No browser, no login.

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

## Pricing

from $0.80 / 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

Returns the full top 100 of any Amazon Best Sellers or New Releases category, with no browser and no login. One row per ranked product: rank, ASIN, title, a clean product link, price and currency, star rating, number of ratings, image and the category it ranks in. Give category links or slugs, or let the Actor walk down the category tree. Works on amazon.com, .co.uk, .de, .fr, .it, .es, .ca and .co.jp.

**Price:** $1.00 per 1,000 products on the Apify Free plan, $0.90 on Bronze, $0.85 on Silver and $0.80 from Gold up. A category without products, a link that is no category and a page Amazon refuses cost nothing. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Amazon Best Sellers Scraper?

Amazon's Best Sellers pages rank the 100 products that sell best in a category, and says they are updated frequently. A page shows 50 ranks and draws the second half of them only when a browser scrolls. This Actor reads the page's own rank list and asks Amazon for the missing cards the way the page does, so four plain requests give ranks 1 to 100 of a category. A category takes 3 to 5 seconds, 512 MB of memory is enough, and three categories are read side by side.

#### What data does it extract?

- **Rank:** the position in the list, 1 to 100, exactly as Amazon numbers it
- **Product:** ASIN, title, image and a clean link `https://www.amazon.<marketplace>/dp/<ASIN>`
- **Price:** as a number, as shown (`priceText`) and with its ISO currency code; for a price range the lower end; the number of offers when the card says "13 offers from"
- **Reviews:** average star rating and number of ratings
- **Category:** its name as Amazon shows it, its node id, the list link and, for subcategories, the link of the parent list
- **List and marketplace:** `bestsellers` or `new-releases`, and `amazon.com`, `amazon.de` and so on

#### What users of other Best Sellers Actors report, and what this one does

The issue pages of the two most used Amazon Best Sellers Actors on Apify were read on October 21, 2026.

| Reported there | Here |
|---|---|
| Duplicate ASINs with the same rank, titles mixed German and English on amazon.de | Every request carries the marketplace's own language, so titles come in one language; an ASIN is saved once per category |
| URL is null, ASIN field missing | Every row has its ASIN and a `/dp/<ASIN>` link; both come from Amazon's rank list, also for a product whose card did not load |
| Paging stops at page 1, or a run returns 82 to 94 of 100 | Both pages and the hidden second half of each page are read. When Amazon itself lists fewer than 100 (Camera & Photo listed ranks 1-46 and 51-100 on test day), the run's status message names the category and the count |
| Deliver to a zip code | Not offered, see the limits below |

In a test from a server in Germany, 28 amazon.com departments gave 2,793 products in 29 seconds with 119 requests: 100 products in 26 of them, 98 and 95 in two where Amazon's own list has gaps.

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `categoryUrls` | array | | Best Sellers or New Releases links. The link decides marketplace and list |
| `categories` | array | | Or slugs as in the link: `electronics`, `beauty`, or a node such as `electronics/172541` |
| `marketplace` | string | `com` | For slugs: `com`, `co.uk`, `de`, `fr`, `it`, `es`, `ca`, `co.jp` |
| `listType` | string | `bestsellers` | For slugs: `bestsellers` or `new-releases` |
| `maxItemsPerCategory` | integer | 100 | Ranks to save per category, from rank 1 |
| `includeSubcategories` | boolean | false | Also read the child categories each page links to, level by level |
| `maxCategories` | integer | 20 | Upper bound of categories in a run with subcategories, start categories counted |
| `language` | string | `local` | `local` for the marketplace's language, `en` for Amazon's English view |

An empty input reads Headphones & Earbuds on amazon.com (100 products in about 4 seconds). Each marketplace has its own slugs: amazon.de calls electronics `ce-de`, amazon.co.uk calls toys `kids`. A slug that does not exist on the marketplace ends as "no products listed" and costs nothing. The input names of `junglee/amazon-bestsellers` (`maxItemsPerStartUrl`, `depthOfCrawl`) are read as well.

#### Example input

The full top 100 of two categories on two marketplaces:

```json
{
  "categoryUrls": [
    "https://www.amazon.com/gp/bestsellers/beauty",
    "https://www.amazon.de/gp/bestsellers/kitchen"
  ]
}
```

Every subcategory under Headphones, up to 30 lists:

```json
{
  "categoryUrls": ["https://www.amazon.com/gp/bestsellers/electronics/172541"],
  "includeSubcategories": true,
  "maxCategories": 30
}
```

The page `https://www.amazon.com/gp/bestsellers/` has no products itself; with subcategories on, it starts the walk at every department.

### ⬆️ Output

```json
{
  "rank": 1,
  "asin": "B08JHCVHTY",
  "title": "blink plus plan with monthly auto-renewal",
  "url": "https://www.amazon.com/dp/B08JHCVHTY",
  "image": "https://images-na.ssl-images-amazon.com/images/I/31YHGbJsldL._AC_UL300_SR300,200_.png",
  "price": 11.99,
  "priceText": "$11.99",
  "currency": "USD",
  "numberOfOffers": null,
  "rating": 4.4,
  "reviewCount": 281304,
  "category": "Electronics",
  "categoryId": "electronics",
  "categoryUrl": "https://www.amazon.com/gp/bestsellers/electronics",
  "parentCategoryUrl": null,
  "listType": "bestsellers",
  "marketplace": "amazon.com",
  "position": 1,
  "name": "blink plus plan with monthly auto-renewal",
  "thumbnail": "https://images-na.ssl-images-amazon.com/images/I/31YHGbJsldL._AC_UL300_SR300,200_.png",
  "scrapedAt": "2026-10-21T00:31:12.418913+00:00"
}
```

`position`, `name` and `thumbnail` repeat `rank`, `title` and `image` under the names `junglee/amazon-bestsellers` uses, so code written for that Actor keeps working. Its `currency` is a symbol (`$`); here it is an ISO code (`USD`), and the symbol is in `priceText`. The run's key-value store holds a `SUMMARY` record with the count per category and the categories that had no products or were not served.

Filled in a 2,793-row test: title, link, image, currency and category 100%, price 98.4%, rating and rating count 96.5% (new products without ratings), offers 44% (only cards that show "N offers from").

### 💡 Use cases

- 📈 **Product research:** find what sells in a niche now, and watch new entrants in New Releases
- 🏷️ **Price watch:** schedule a run each day and compare prices and ranks of the top 100
- 🧭 **Category mapping:** walk the tree under a department to see every sub-niche and its leaders
- 🤝 **Lead lists:** collect the brands that rank in your category for outreach or partnerships

### 🤖 For AI agents

No credential is needed. One input to copy:

```json
{"categories": ["electronics"], "marketplace": "com", "maxItemsPerCategory": 20}
```

Each row is one ranked product; `rank` and `asin` identify it within `categoryUrl`.

### ⚠️ Limits

- Amazon ranks at most 100 products per category, and some lists have gaps in their numbering. The Actor returns what Amazon lists and says so in the status message.
- Prices are those a visitor without an address sees. Delivering to a zip code or a country is not offered; prices that depend on location can differ from what a logged-in shopper sees.
- Movers & Shakers, Most Wished For and Gift Ideas are not offered: on test day Amazon showed visitors no products there.
- Only the data on the list page is returned. Product details (bullet points, seller, Best Sellers Rank in other categories) are not read.
- About one quick request in eight gets Amazon's captcha page. The Actor never solves it; it starts a new visitor and asks again, and after repeated refusals moves to Apify's datacenter and then residential addresses of the marketplace's country.
- A run that stops at a timeout or at its spending limit saves what it read and continues where it stopped when resurrected; a product is never saved twice for the same category.

### ❓ FAQ

**How fresh are the ranks?** Amazon says the lists are updated frequently. A row's `scrapedAt` says when it was read.

**Why does a category return fewer than 100?** Either Amazon's own list has gaps (the status message names such categories), or the category is small, or the run was a continuation and the other rows were saved before.

**Can I read every category of a marketplace?** Start at `/gp/bestsellers/` with subcategories on and raise `maxCategories`. Amazon.com has about 40 departments and thousands of subcategories; each costs up to 100 rows.

**Which slugs exist?** The ones in the links of the Best Sellers page of that marketplace. Copying a link into `categoryUrls` is the safest way.

**Does it need proxies?** No setup. It asks directly first and switches routes by itself when Amazon refuses.

**What does a run cost?** The top 100 of one category: $0.10 on the Free plan, plus a start fee of $0.00005. A walk of 30 categories: about $3.

**Can I get English titles on amazon.de?** Set `language` to `en`. Amazon's English view translates only part of the titles, which is why the marketplace language is the default.

**Is it legal?** It reads public pages that anyone can open without an account, and returns product data, not personal data. Check Amazon's terms and the law of your country for your use, especially before republishing the data.

### 🔗 You might also like

- [Amazon Product Scraper](https://apify.com/benthepythondev/amazon-product-scraper): products from Amazon keyword searches
- [Shopify Store Scraper](https://apify.com/benthepythondev/shopify-store-scraper): every product of a Shopify store
- [AliExpress Product Scraper](https://apify.com/benthepythondev/aliexpress-product-scraper): full AliExpress product records with prices, variants and shipping

**Keywords:** amazon best sellers scraper, amazon bestsellers api, amazon top 100, amazon best sellers rank, amazon new releases scraper, amazon category scraper, amazon product research, amazon asin export, amazon bestseller list csv, amazon.de bestseller, amazon uk best sellers, amazon japan ranking, ecommerce trend data, product research tool, amazon price tracking, amazon ranking monitor

# Actor input Schema

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

Amazon Best Sellers or New Releases links, for example https://www.amazon.com/gp/bestsellers/electronics or https://www.amazon.de/gp/bestsellers/ce-de. The link decides marketplace and list. The page /gp/bestsellers/ itself has no products; with subcategories on, it starts the walk at every department.

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

Slugs as in the Amazon link, read on the marketplace and list chosen below: electronics, beauty, books, or a node such as electronics/172541. Each marketplace has its own slugs (amazon.de: ce-de, kitchen, drugstore).

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

Used for category slugs. Links carry their own marketplace. Prices come in the marketplace's own currency.

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

Used for category slugs. Movers & Shakers and Most Wished For are not offered: Amazon shows visitors no products there at present.

## `maxItemsPerCategory` (type: `integer`):

Ranks to save per category, from rank 1. Amazon lists at most 100 per category.

## `includeSubcategories` (type: `boolean`):

Also reads the child categories that Amazon links from each category page, level by level, until the limit below.

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

Upper bound of categories read in one run when subcategories are included, start categories counted. Each category costs up to 100 rows.

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

Language of the titles. The marketplace language gives consistent titles; English is a translation Amazon offers on some marketplaces and mixes languages within titles.

## `debug` (type: `boolean`):

Logs every request with its size and time.

## Actor input object example

```json
{
  "categoryUrls": [
    "https://www.amazon.com/Best-Sellers-Electronics-Headphones-Earbuds/zgbs/electronics/172541"
  ],
  "marketplace": "com",
  "listType": "bestsellers",
  "maxItemsPerCategory": 100,
  "includeSubcategories": false,
  "maxCategories": 20,
  "language": "local",
  "debug": false
}
```

# Actor output Schema

## `results` (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-Headphones-Earbuds/zgbs/electronics/172541"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = { "categoryUrls": ["https://www.amazon.com/Best-Sellers-Electronics-Headphones-Earbuds/zgbs/electronics/172541"] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/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 '{
  "categoryUrls": [
    "https://www.amazon.com/Best-Sellers-Electronics-Headphones-Earbuds/zgbs/electronics/172541"
  ]
}' |
apify call benthepythondev/amazon-bestsellers-scraper --silent --output-dataset

```

## MCP server setup

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