# Amazon Best Sellers Scraper: Top 100 by Category (`dtkfoundry/amazon-bestsellers`) Actor

Amazon Best Sellers scraper: the top 100 best sellers and new releases for any category on 12 Amazon marketplaces, with rank, ASIN, title, price, rating, reviews, image and category path. Subcategories too. Pay per product.

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

## Pricing

from $2.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: Top 100 by Category

Amazon's Best Sellers and New Releases lists for any category, on 12 Amazon marketplaces: rank, ASIN, title,
price in the marketplace's currency, rating, review count, image, author and format for books, and the full
category path. Up to the top 100 per category, and optionally every subcategory below it. One clean record per
product.

- **Reliable.** Tested on 200 varied lists (all 12 marketplaces, departments and subcategories, Best
  Sellers and New Releases, top 20/50/100): all 200 answered, 0 failed. 189 came back complete with ranks
  1 to N and no gaps; the other 11 are lists Amazon itself shows as empty. Amazon's robot check came up on
  about 1 request in 20 and was cleared every time by retrying from a different IP.
- **The whole top 100.** Amazon shows 30 products per page and loads the rest as you scroll; this actor
  fetches those too, so you get ranks 1-100 without gaps.
- **12 marketplaces, local prices.** amazon.com, .co.uk, .de, .ca, .fr, .it, .es, .com.au, .in, .co.jp,
  .com.mx and .nl. Prices come in the marketplace's own currency and titles in its own language, as a local
  shopper sees them.
- **Subcategories in one run.** Give "Electronics" and a depth of 1 or 2 to get the top lists of Headphones,
  Earbud Headphones and every other subcategory below it.
- **Pay per product.** Lists that fail or are empty are never charged.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `categories` | array | `[]` | One per line: a Best Sellers or New Releases URL copied from Amazon (`https://www.amazon.com/gp/bestsellers/electronics`), or a category path (`electronics`, `electronics/172541`). A URL keeps its own marketplace and list. Empty = a free format example. |
| `marketplace` | string | `com` | The Amazon site for categories given as paths: `com`, `co.uk`, `de`, `ca`, `fr`, `it`, `es`, `com.au`, `in`, `co.jp`, `com.mx`, `nl`. |
| `list` | string | `bestsellers` | For category paths: `bestsellers` or `new-releases`. |
| `maxProductsPerCategory` | integer | `100` | 1-100, the top N by rank. |
| `subcategoryDepth` | integer | `0` | 0 = only your categories. 1 = also their subcategories. 2 = one level further. |
| `maxCategories` | integer | `100` | Upper limit on lists per run, counting subcategories. |

```json
{
    "categories": [
        "https://www.amazon.com/gp/bestsellers/electronics",
        "https://www.amazon.de/gp/new-releases/kitchen",
        "books/1"
    ],
    "maxProductsPerCategory": 100,
    "subcategoryDepth": 0
}
```

### Output (one record per product)

```json
{
    "status": "ok",
    "rank": 3,
    "asin": "B0HJB69GJL",
    "title": "Apple AirPods 5 Wireless Earbuds with Active Noise Cancellation | Bluetooth Headphones, Personalized Spatial Audio, Live Translation, USB-C Charging Case, H2 Chip",
    "url": "https://www.amazon.com/dp/B0HJB69GJL",
    "image": "https://images-na.ssl-images-amazon.com/images/I/618C8GA55KL._AC_UL900_SR900,600_.jpg",
    "price": 129,
    "priceMax": null,
    "priceText": "$129.00",
    "currency": "USD",
    "offerFrom": false,
    "rating": 4.3,
    "reviewCount": 290,
    "byline": null,
    "format": null,
    "list": "bestsellers",
    "marketplace": "amazon.com",
    "categoryName": "Headphones",
    "categoryPath": ["Electronics", "Headphones"],
    "categoryNodeId": "172541",
    "categoryUrl": "https://www.amazon.com/gp/bestsellers/electronics/172541",
    "page": 1,
    "position": 3,
    "scrapedAt": "2026-10-20T22:29:21+00:00"
}
```

- `rank` is Amazon's rank in that list (1-100); `page` and `position` say where it sits on Amazon's two pages
  of 50.
- `price` is the number from `priceText` as Amazon shows it on the list. For a range ("$9.99 - $19.99")
  `priceMax` holds the upper end. `offerFrom: true` means Amazon shows "1 offer from" or "offers from": the
  lowest offer, not a featured price. Products shown without a price (out of stock) have `price: null`.
- `byline` is the author or artist for books, music and Kindle, `format` the format (Hardcover, Kindle
  Edition, Audible Audiobook). Both are empty for other products.
- `categoryPath` is the path in Amazon's category tree, in the marketplace's language.
- A category with no list gives one record with `status: "no-results"` (and its subcategories, if Amazon shows
  any); a list that could not be loaded gives `status: "failed"` and an `error`. Neither is charged.

### Pricing

Pay per event, no subscription.

| Event | Price | When it is charged |
|---|---|---|
| Product | **$0.002** | Once per product delivered. The top 100 of one category = $0.20. |

Set a maximum charge in the run options and the actor stops before it would go over. Apify's standard
run-start event adds $0.00005 per run.

### Limits, stated plainly

- Amazon's lists stop at 100 products per category. Some small subcategories have fewer.
- Best Sellers and New Releases only. Movers & Shakers, Most Wished For and Gift Ideas are not offered: Amazon
  served those pages empty for every category we tried.
- Ranks and prices are what the public list shows at the time of the run. Amazon updates Best Sellers hourly.
  The list does not show stock levels, sales numbers, Prime status or the seller.
- If ranks 31-100 cannot be loaded after retries, you still get the ranks that were loaded, the log says
  which list was cut short, and only the delivered products are charged.
- Department landing pages without a list of their own (amazon.com Digital Music) give `no-results` with
  their subcategories; use a subcategory or a depth of 1.
- Public data only: no login, no personal data.

### Privacy

Only the category pages you ask for are requested from Amazon. Results are stored only in your run's dataset.
The actor runs with limited permissions and reads nothing else in your account.

# Actor input Schema

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

One per line: a Best Sellers or New Releases URL copied from Amazon ("https://www.amazon.com/gp/bestsellers/electronics", "https://www.amazon.de/gp/new-releases/kitchen"), or a category path ("electronics", "electronics/172541"). A URL keeps its own marketplace and list; a path uses the marketplace and list below. Leave empty for a free format example.

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

The Amazon site for categories given as paths. Prices come in that site's currency and titles in its language.

## `list` (type: `string`):

Best Sellers (Amazon's top sellers, updated hourly) or New Releases (best-selling new and upcoming products).

## `maxProductsPerCategory` (type: `integer`):

1-100, the top N by rank. Amazon's lists stop at 100. Each product is one charged result.

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

0 = only the categories you give. 1 = also each of their subcategories (Electronics > Headphones). 2 = one level further (Headphones > Earbud Headphones). Every subcategory is its own list of up to 100 products, so this multiplies the cost; cap it with the maximum below.

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

Upper limit on the number of lists scraped in one run, counting subcategories found through the depth setting.

## Actor input object example

```json
{
  "categories": [
    "https://www.amazon.com/gp/bestsellers/electronics",
    "kitchen"
  ],
  "marketplace": "com",
  "list": "bestsellers",
  "maxProductsPerCategory": 100,
  "subcategoryDepth": 0,
  "maxCategories": 100
}
```

# Actor output Schema

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

Every product with rank, ASIN, title, price, rating, reviews, image and category path.

## `resultsCsv` (type: `string`):

The same products as CSV.

# 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",
        "kitchen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dtkfoundry/amazon-bestsellers").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",
        "kitchen",
    ] }

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

```

## MCP server setup

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

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/PbNxqXS4r5T9585As/builds/fnNtnfT8jGOwDNPiC/openapi.json
