# Amazon Product Scraper - Best Sellers, ASIN, Prices, Ratings (`clover_folktale/amazon-scraper`) Actor

Amazon API alternative: search products by keyword, list a category or pull Best Sellers rankings on 24 marketplaces. Get ASIN, title, price and list price, rating and rating count, Prime and badges, bought-past-month volume. No login or cookies needed. Export to JSON, CSV or Excel.

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

## Pricing

from $4.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 Product Scraper collects public product data from Amazon search results, category listings and Best Sellers rankings on 24 Amazon marketplaces, and returns it as clean, flat JSON. Every record has the ASIN, title, price and list price as numbers, rating and number of ratings, Prime, Amazon's Choice and best-seller flags, the "bought in past month" volume, delivery text and image. It is for sellers, product researchers, price monitors and data teams who want an Amazon API alternative with no Amazon account, API keys, proxies or cookies. Pricing is pay-per-event: $0.004 per product, plus a $0.017 start fee per run.

### What data can you get?

One record per product. Search and category records use the same field names in every marketplace. Best Sellers records use a smaller set of 15 fields (see below the table). Fields that only make sense in one mode are noted.

| Field | What it contains |
|---|---|
| `asin` | Amazon product ID (ASIN) |
| `url` | Link to the product page |
| `title` | Product title |
| `price` | Price as a number in the marketplace currency |
| `priceText` | Price exactly as Amazon shows it, with currency symbol |
| `originalPrice` | Crossed-out list price as a number |
| `originalPriceText` | Crossed-out list price as shown |
| `currency` | Currency code of the prices |
| `rating` | Average star rating out of 5 |
| `ratingCount` | Number of ratings |
| `salesVolume` | Lower bound of the "bought in past month" text, as a number (for example 10000 for "10K+") |
| `salesVolumeText` | Bought-in-past-month text as shown, for example "10K+ bought in past month" |
| `isPrime` | Eligible for Prime |
| `isAmazonChoice` | Carries the Amazon's Choice badge |
| `isBestSeller` | Carries the Best Seller badge |
| `isClimatePledgeFriendly` | Carries the Climate Pledge Friendly label |
| `rank` | Position in the Best Sellers ranking (bestSellers mode) |
| `rankChangeLabel` | Rank movement label shown by Amazon, when there is one (bestSellers mode) |
| `category` | Best Sellers category path the ranking belongs to (bestSellers mode) |
| `categoryName` | Name of the Best Sellers category (bestSellers mode) |
| `categoryId` | Category ID the product was listed under (category mode) |
| `searchKeyword` | Search keyword the product was found with (search mode) |
| `offerCount` | Number of offers (sellers) for the product |
| `lowestOfferPriceText` | Lowest offer price as shown |
| `badge` | Deal badge, such as "Limited time deal" |
| `couponText` | Coupon or subscribe-and-save text |
| `unitCount` | Number of units in the pack, when Amazon gives it |
| `unitPriceText` | Price per unit as shown |
| `hasVariations` | Has size, colour or other variations |
| `subtitle` | Short line under the title (features or brand line), as Amazon shows it |
| `bookFormat` | Format shown for books and media |
| `delivery` | Delivery estimate text |
| `imageUrl` | Main product image |
| `country` | Marketplace country code |
| `domain` | Amazon domain the data came from |
| `type` | Record type: `product` or `bestSeller` |

Best Sellers records contain only these 15 fields: `type`, `rank`, `asin`, `url`, `category`, `categoryName`, `title`, `priceText`, `price`, `rating`, `ratingCount`, `rankChangeLabel`, `imageUrl`, `country` and `domain`. The other fields in the table (for example `originalPrice`, `currency`, `isPrime`, `salesVolume`, `delivery`, `offerCount` and `badge`) appear only in product records from search and category mode.

#### How the data is shaped

- **Numbers you can use.** `price` and `originalPrice` are numbers; the text as Amazon shows it is kept in `priceText` and `originalPriceText`. `rating` is a number out of 5. `salesVolume` is the lower bound of Amazon's rounded "bought in past month" text.
- **Flat fields, nothing nested.** One record per product. Search and category records share the same field names in every marketplace, so you can merge those runs without remapping columns. Best Sellers records use the smaller set of 15 fields listed above.
- **Two record types.** Search and category runs return `"type": "product"`. Best Sellers runs return `"type": "bestSeller"` with `rank`, `category` and `categoryName`, limited to the 15 fields listed above.

### How to use Amazon Product Scraper

1. Open the Actor in Apify Console.
2. Choose a **Mode**: search products by keyword, products of a category, or a Best Sellers ranking.
3. Choose the **Marketplace** (for example US for amazon.com, DE for amazon.de, JP for amazon.co.jp).
4. Fill in the input for your mode: keywords or ASINs, category IDs, or Best Sellers category paths. In search mode you can add sort, condition, deals and Prime filters.
5. Set **Max results** to the total number of products you want for the whole run.
6. Click **Start**. When the run finishes, download the dataset as JSON, CSV or Excel, or read it through the Apify API.

The Actor also runs in seconds with an empty input: `{}` searches "wireless earbuds" on amazon.com.

### Input

| Field | Type | Required | What it does | Default |
|---|---|---|---|---|
| `mode` | string | Optional | `search` (products by keyword), `category` (products of a category) or `bestSellers` (Best Sellers ranking) | `search` |
| `country` | string | Optional | Marketplace: US, GB, DE, FR, IT, ES, NL, SE, PL, BE, IE, TR, AE, SA, EG, ZA, IN, JP, SG, AU, CA, MX, BR, CN | `US` |
| `keywords` | array of strings | Optional (search mode) | Search keywords or ASINs, searched one after the other until `maxResults` is reached | Falls back to `wireless earbuds` when empty |
| `categoryIds` | array of strings | Required in category mode | Numeric Amazon category IDs (for example `172282` for Electronics), or category links that contain `node=<ID>` | none |
| `bestSellerCategories` | array of strings | Optional (bestSellers mode) | Category paths as they appear in a Best Sellers link after `/zgbs/` (for example `electronics` or `electronics/172282`), or the full link. A ranking holds up to 100 products | Falls back to `electronics` when empty |
| `sort` | string | Optional (search and category modes) | `relevance`, `priceLowToHigh`, `priceHighToLow`, `reviews` (most reviews), `newest`, `bestSellers` (best selling). Best Sellers rankings are always in rank order | `relevance` |
| `condition` | string | Optional (search mode) | `all`, `new`, `used`, `renewed`, `collectible` | `all` |
| `deals` | string | Optional (search mode) | `any` (no filter), `discounted` (discounted products), `todaysDeals` (today's deals) | `any` |
| `primeOnly` | boolean | Optional (search mode) | Only products eligible for Prime | `false` |
| `maxResults` | integer | Optional | Maximum number of products for the whole run (1 to 5000). The run stops as soon as it is reached. You are charged per product returned | `20` |

#### Example: keyword search with filters

```json
{
  "mode": "search",
  "keywords": ["wireless earbuds", "laptop stand"],
  "country": "US",
  "sort": "reviews",
  "condition": "new",
  "primeOnly": true,
  "maxResults": 100
}
```

#### Example: products of a category

```json
{
  "mode": "category",
  "country": "US",
  "categoryIds": ["172282"],
  "sort": "bestSellers",
  "maxResults": 50
}
```

#### Example: Best Sellers rankings

```json
{
  "mode": "bestSellers",
  "country": "US",
  "bestSellerCategories": ["electronics", "electronics/172282"],
  "maxResults": 200
}
```

### Output example

The values below are illustrative.

#### Product record (search or category mode)

```json
{
  "type": "product",
  "asin": "B0EXAMPLE1",
  "url": "https://www.amazon.com/dp/B0EXAMPLE1",
  "searchKeyword": "wireless earbuds",
  "title": "Wireless Earbuds, Bluetooth 5.3 Headphones with Charging Case, IPX7 Waterproof (White)",
  "subtitle": null,
  "priceText": "$19.97",
  "price": 19.97,
  "originalPriceText": "$39.99",
  "originalPrice": 39.99,
  "currency": "USD",
  "rating": 4.4,
  "ratingCount": 1250,
  "offerCount": 1,
  "lowestOfferPriceText": "$19.97",
  "isBestSeller": false,
  "isAmazonChoice": false,
  "isPrime": true,
  "isClimatePledgeFriendly": false,
  "hasVariations": true,
  "badge": null,
  "couponText": null,
  "salesVolumeText": "500+ bought in past month",
  "salesVolume": 500,
  "delivery": "FREE delivery Mon, Oct 19 on $35 of items shipped by Amazon",
  "imageUrl": "https://m.media-amazon.com/images/I/example.jpg",
  "country": "US",
  "domain": "www.amazon.com"
}
```

#### Best Sellers record (bestSellers mode)

Best Sellers records have `"type": "bestSeller"` and contain only these fields: `rank`, `category`, `categoryName`, `asin`, `url`, `title`, `priceText`, `price`, `rating`, `ratingCount`, `rankChangeLabel`, `imageUrl`, `country` and `domain`.

```json
{
  "type": "bestSeller",
  "rank": 1,
  "category": "electronics",
  "categoryName": "Electronics",
  "asin": "B0EXAMPLE2",
  "url": "https://www.amazon.com/dp/B0EXAMPLE2",
  "title": "Example Streaming Media Player with Voice Remote",
  "priceText": "$29.99",
  "price": 29.99,
  "rating": 4.7,
  "ratingCount": 54000,
  "rankChangeLabel": null,
  "imageUrl": "https://m.media-amazon.com/images/I/example2.jpg",
  "country": "US",
  "domain": "www.amazon.com"
}
```

### How much does it cost?

The Actor uses pay-per-event pricing. These are the charge events and their prices:

| Event | Price (USD) | When it is charged |
|---|---|---|
| `run-start` | $0.017 | Once per run, charged when the first request to the data source succeeds, even if that request returns nothing. It is not charged when the data source fails from the start or rejects the IDs, or when your spending limit cannot cover it. When you give several keywords, categories or rankings, each one after the first pays one more start fee, but only if the run actually reaches it. That extra fee is charged before that input's first request and is kept even if that input then fails or returns nothing. |
| `result` | $0.004 | For each product returned |

Worked examples:

- **100 products from one keyword:** $0.017 + 100 x $0.004 = **$0.417**.
- **A full Best Sellers ranking (100 products) for one category:** $0.017 + 100 x $0.004 = **$0.417**.
- **100 products in total from two keywords, where the first keyword runs out after 40 products and the other 60 come from the second:** 2 x $0.017 + 100 x $0.004 = **$0.434**. If the first keyword alone fills all 100 products, the second keyword is never searched, no second start fee is charged, and the cost stays $0.417.

You never pay for more than `maxResults` items, you are never charged for items that were not delivered, and the run stops by itself if your spending limit is reached.

On the free Apify plan, a run returns at most 10 results in total; any paid Apify plan removes the limit. On the free Apify plan each account can run this Actor up to 3 times per 24 hours and 10 times per 7 days, within a small lifetime free allowance shared across all our Actors, and all free accounts share a daily free budget. When any of these limits is reached, the run stops before fetching anything and nothing is charged.

### Use cases

- **Product research and selection:** see what sells in a niche, at what price, with how many ratings and how many bought in the past month.
- **Price and promotion monitoring:** compare list price against current price, and track deals, coupons and Prime eligibility.
- **Best Sellers tracking:** pull the top 100 of any category by marketplace, and run it on a schedule to see which products move up or down.
- **Market comparison:** run the same keyword on amazon.com, amazon.de and amazon.co.jp and compare prices, ratings and badges.
- **Competitor and ASIN watch lists:** search ASINs to check their current price, rating and Amazon's Choice or Best Seller badges.
- **AI and data projects:** use clean, flat product records for catalogs, price models and recommendations.

### Integrations and API

You can start runs from your own code with the Apify API, schedule runs (for example a daily Best Sellers snapshot), and connect the dataset to Apify integrations and webhooks so new results flow into your other tools. Results can be read from the API as JSON, CSV or Excel.

Example with the Python `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("clover_folktale/amazon-scraper").call(run_input={
    "mode": "search",
    "keywords": ["wireless earbuds", "laptop stand"],
    "country": "US",
    "sort": "reviews",
    "condition": "new",
    "primeOnly": True,
    "maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Tips and limits

- **Page sizes.** A search page holds about 16 products, a category page about 24, and a Best Sellers page 50. A ranking has two pages, so 100 products. Large runs make many requests; expect roughly 2-5 seconds per page. Different pages of one search do not overlap.
- **Fewer results than requested.** A listing ends when a page comes back thin or empty, so you may get fewer products than `maxResults` for narrow searches.
- **Searches that find nothing.** A search that finds nothing is skipped. If too many inputs return nothing, the run stops to protect your budget.
- **Stable runs.** The Actor retries transient errors on its own, stops cleanly instead of failing half-way, and never charges for items it did not deliver.
- **Price parsing.** `price` is read from the price text of the marketplace (for example `239,00 €` becomes 239.0). `salesVolume` is the lower bound of Amazon's rounded text.
- **Currency and timing.** Prices are in each marketplace's own currency and are what Amazon shows at the time of the run.
- **Unknown category IDs.** A category ID that Amazon does not know can return unrelated products instead of nothing; check the first results.
- **Which fields are often empty:** `salesVolume` and `salesVolumeText` are empty for products without a recent sales figure; `originalPrice` is empty when the product is not discounted; `subtitle`, `badge`, `couponText`, `unitCount`, `unitPriceText` and `bookFormat` are empty for most products; `price` is empty for products Amazon shows only as "see price in cart" or "click to see price"; `rankChangeLabel` is almost always empty.
- **Free plan.** On the free Apify plan a run returns at most 10 results in total; any paid Apify plan removes the limit.
- **Feedback.** Missing a field or a filter? Open an issue from the Actor page and it will be looked at.

### FAQ

#### Do I need an Amazon account, API key or cookies?

No. You do not need an Amazon account, API keys, proxies or cookies. You only need an Apify account to run the Actor.

#### Is it legal to scrape Amazon?

The Actor returns only public listing data: what anyone sees on an Amazon search, category or Best Sellers page. It returns no account data and no buyer data, and no private data such as phone numbers or messages. You are responsible for how you use the data and for following the laws and terms that apply to you.

#### How fresh is the data?

Each run reads Amazon at the time of the run. Prices, ratings, badges and rankings are what Amazon shows at that moment.

#### Why are some fields empty?

Amazon does not show every field for every product. For example, `originalPrice` is only there for discounted products and `salesVolume` only for products with a recent sales figure. See "Which fields are often empty" in Tips and limits.

#### How many results can I get?

Up to 5000 products per run, set with `maxResults`. A Best Sellers ranking holds up to 100 products. Narrow searches can return fewer products. On the free Apify plan a run returns at most 10 results.

#### Does it scrape review text?

No. Each product record has the average `rating` and the `ratingCount`, but not the text of individual reviews.

#### Which marketplaces are supported?

24: US, GB, DE, FR, IT, ES, NL, SE, PL, BE, IE, TR, AE, SA, EG, ZA, IN, JP, SG, AU, CA, MX, BR and CN.

#### Can I schedule runs and export the data?

Yes. You can schedule runs in Apify, start them through the API, and export every dataset as JSON, CSV or Excel.

### More tools from the same developer

- [TikTok Shop Scraper - Products, SKUs, Reviews & Reviewer IDs](https://apify.com/clover_folktale/tiktok-shop-scraper)
- [Taobao 淘宝 Scraper - Products, Prices, Sales & Shop Ratings](https://apify.com/clover_folktale/taobao-scraper)
- [1688 阿里巴巴 Scraper - Wholesale Prices & Suppliers](https://apify.com/clover_folktale/1688-scraper)
- [Douyin Shop 抖音商城 Scraper - Products, Sales, Commission](https://apify.com/clover_folktale/douyin-shop-scraper)
- [Reddit Scraper - Posts, Comments & User IDs, No Login](https://apify.com/clover_folktale/reddit-scraper)

# Actor input Schema

## `mode` (type: `string`):

What to scrape: products by keyword, the products of a category, or a Best Sellers ranking.

## `country` (type: `string`):

The Amazon marketplace to read (US = amazon.com, DE = amazon.de, JP = amazon.co.jp ...).

## `keywords` (type: `array`):

Search keywords or ASINs. Results are collected keyword by keyword until Max results is reached. Falls back to "wireless earbuds" when empty.

## `categoryIds` (type: `array`):

Numeric Amazon category IDs (for example 172282 for Electronics), or category links that contain node=<ID>. Required in this mode.

## `bestSellerCategories` (type: `array`):

Category paths as they appear in an Amazon Best Sellers link after /zgbs/ (for example electronics or electronics/172282), or the full link. Falls back to electronics when empty. A ranking holds up to 100 products.

## `sort` (type: `string`):

Order of the results. Best Sellers rankings are always in rank order.

## `condition` (type: `string`):

Only products in this condition.

## `deals` (type: `string`):

Only discounted products, or only today's deals.

## `primeOnly` (type: `boolean`):

Only products eligible for Prime.

## `maxResults` (type: `integer`):

Maximum number of products to return in total for this run. You are charged per product returned. On the free Apify plan a run returns at most 10 results in total; any paid Apify plan removes the limit.

## Actor input object example

```json
{
  "mode": "search",
  "country": "US",
  "keywords": [
    "wireless earbuds"
  ],
  "bestSellerCategories": [
    "electronics"
  ],
  "sort": "relevance",
  "condition": "all",
  "deals": "any",
  "primeOnly": false,
  "maxResults": 20
}
```

# Actor output Schema

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

All scraped items (JSON, CSV, Excel via the dataset API).

# 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 = {
    "keywords": [
        "wireless earbuds"
    ],
    "bestSellerCategories": [
        "electronics"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clover_folktale/amazon-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 = {
    "keywords": ["wireless earbuds"],
    "bestSellerCategories": ["electronics"],
}

# Run the Actor and wait for it to finish
run = client.actor("clover_folktale/amazon-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 '{
  "keywords": [
    "wireless earbuds"
  ],
  "bestSellerCategories": [
    "electronics"
  ]
}' |
apify call clover_folktale/amazon-scraper --silent --output-dataset

```

## MCP server setup

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