# Amazon Product Scraper API - ASIN, Search, Bestsellers, Price (`vonsensey/amazon-product-scraper-api`) Actor

Amazon product data by ASIN, product URL, search, category or Best Sellers / New Releases list on 19 marketplaces. Full price, BSR, star breakdown, Buy Box seller and variants. Monitoring mode bills only products that changed. Failures are free, no run-start fee.

- **URL**: https://apify.com/vonsensey/amazon-product-scraper-api.md
- **Developed by:** [Blackcube Agency AB](https://apify.com/vonsensey) (community)
- **Categories:** E-commerce, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Amazon Product Scraper API - ASIN, Search, Bestsellers, Price

**Amazon product data by ASIN, product URL, search phrase, category or Best Sellers list — on 19 marketplaces, in one run and one schema.**

**A run that finds nothing costs nothing.** There is no run-start fee, error and coverage rows are free, and on a schedule a product is billed only when it has actually changed.

### ⭐ Why this one

One Actor covers what the category splits across a dozen: paste an **ASIN**, a **product URL**, a **search phrase**, a **category or browse-node URL**, or a **Best Sellers / New Releases / Movers & Shakers** list, and it returns one normalised schema for all of them.

Every product row carries the fields rivals drop: the **full 5-to-1 star breakdown**, the **Buy Box seller** with its id and whether Amazon fulfils it, **Best Sellers Rank in every category the product sits in**, **variant ASINs with their named options**, list price, delivery date and the whole product-details table.

The **price is always in the marketplace's own currency** — no export prices in the wrong currency, which is the single most common complaint about the alternatives. Put it on a schedule and it **bills only the products that changed**. Failures are free, and there is no captcha solver to buy.

### 🎯 Use cases

- **Repricing** — track a catalogue of ASINs and react the moment a competitor's price or Buy Box changes.
- **Competitor watch** — pull a rival's search rankings, Best Sellers and new arrivals on a schedule.
- **Buy Box tracking** — see who holds the Buy Box on each ASIN, whether Amazon fulfils it, and when it flips.
- **Catalogue enrichment** — turn a list of ASINs into full product records with price, BSR, star breakdown, variants and images.

### 🚀 Recipes

#### Look up a list of ASINs

Paste ASINs, one per line. Each comes back as one full product row.

```json
{ "inputs": ["B0CHX3QBCH", "B07XLTPC5L", "0735211299"], "marketplace": "com" }
```

#### Scrape a search across several pages

```json
{ "inputs": ["wireless earbuds"], "mode": "search", "maxPagesPerSearch": 5, "maxItemsPerInput": 200 }
```

#### Best Sellers for a category, enriched to full products

```json
{
  "inputs": ["https://www.amazon.com/gp/bestsellers/electronics/"],
  "fetchProductDetails": true,
  "maxItemsPerInput": 50
}
```

#### A bad ASIN never costs you

An ASIN that does not exist comes back as a free row saying so — no charge, and the rest of your list still runs.

```json
{ "inputs": ["B0CHX3QBCH", "B0ZZZZZZZZ"] }
```

### 📥 Input

| Field | What it does |
|---|---|
| `inputs` | ASINs, product URLs, search phrases, category URLs, or Best Sellers / New Releases / Movers & Shakers list URLs. Mix them freely. |
| `marketplace` | Which Amazon a bare ASIN or search is read on — 19 marketplaces. URLs carry their own. |
| `language` | English on every marketplace, or each marketplace in its native language. |
| `maxItemsPerInput` / `maxItemsTotal` | How many products or list rows to return, per input and for the whole run. |
| `maxPagesPerSearch` | How deep to page a search or category. |
| `fetchProductDetails` | Read each list row from its product page and bill it as a product — never as both. |
| `includeVariants` / `fetchVariantDetails` | List variant ASINs on the product, and optionally fetch each as its own row. |
| `onlyChangedSinceLastRun` / `stateName` / `changeFields` | Monitoring: bill only products whose watched fields changed; name the feed; choose the fields. |
| `maxCostUsd` | A hard spend ceiling for the run. |

**No proxy settings.** Unblocking is handled and priced in. You never configure infrastructure.

### 🌍 Marketplaces

Bare ASINs and searches are read on the marketplace you pick; any URL you paste carries its own. Supported: amazon.com (US), .co.uk (UK), .de (Germany), .fr (France), .it (Italy), .es (Spain), .ca (Canada), .com.au (Australia), .in (India), .co.jp (Japan), .com.mx (Mexico), .nl (Netherlands), .se (Sweden), .pl (Poland), .com.br (Brazil), .sg (Singapore), .ae (UAE), .sa (Saudi Arabia) and .com.tr (Turkey). **amazon.com, .co.uk and .de are verified against captured pages**; the other 16 share the same page layouts and are supported best-effort — open an issue if one misbehaves. The same ASIN on `.com`, `.co.uk` and `.de` comes back in one language and one schema, so a multi-market catalogue is filterable without a cleanup pass — and the **price is always in that marketplace's own currency**: a page served in another currency is refused as a free error row, never billed.

### 📊 Measured coverage

Rivals claim coverage; this publishes it, and every number below is a floor the test suite asserts over real captured pages.

| Field | Coverage on in-stock product pages | Notes |
|---|---|---|
| Title, ASIN, price | **100%** | Price always in the marketplace's own currency. |
| Star rating + full 5-to-1 breakdown | **100%** | The per-star percentages, not just the average. |
| Ratings count | **100%** | The exact number behind the average. |
| Buy Box seller | **100%** | With the seller id when the offer is third-party; the fulfiller where the page prints it. |
| Main image | **100%** | Plus every gallery image the page embeds, hi-res where Amazon has one. |
| Variant ASINs + named options | present on variation products | Colour, size, style — the child ASINs and their labels. |
| Best Sellers Rank per category | present where Amazon prints it | Every category the product ranks in, not just the top one. |

An out-of-stock product has no price on the page, so `price` comes back **`null`** — never a stale or guessed value. In general a field Amazon does not print comes back `null`, because a fabricated price or rank silently corrupts whatever you filter on.

### 📤 Output

| Row | What it is |
|---|---|
| `product` | One product: ASIN, marketplace, title, brand, price and currency, list price and discount, availability, Buy Box seller and fulfiller, star rating with the full 5-to-1 breakdown, ratings count, bought-in-past-month, bullet points, description, images, variant ASINs, breadcrumb categories, Best Sellers Rank per category, date first available, dimensions, weight and the product-details table. |
| `list-item` | One row of a search, category or ranked list: position, rank, ASIN, title, price, currency, rating, ratings count, sponsored flag and image. |
| `unchanged` | **Free.** Monitoring: a product that has not changed since the last run. |
| `coverage` | **Free.** Per input: pages read, items found and billed, whether the walk reached the end, and if not, exactly what stopped it. |
| `error` | **Free.** Anything that could not be read, with a stable reason. Nothing you typed is dropped in silence. |

### 💰 Pricing

Pay per product. **Failures are free and there is no run-start fee.**

| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|
| **product** | $16.00 | $13.30 | $10.10 | $8.00 | $7.50 | $6.90 |
| **list item** | $6.40 | $5.30 | $4.00 | $3.20 | $3.00 | $2.80 |

*Prices are per 1,000. Your tier is your Apify plan.*

On the **Gold** plan, 1,000 products cost **$8.00**. A product row is priced above the category on purpose: every product page is read from inside the marketplace's own country so the price is in its own currency — the unblocking that makes that possible is most of what a row costs to serve — and each row carries the BSR, the star breakdown and the Buy Box seller that cheaper scrapers leave empty. There is no captcha solver to buy on top. With `onlyChangedSinceLastRun` on, a scheduled re-run over unchanged products costs **$0.00** — a product whose watched fields did not move comes back as a free `unchanged` row instead of being re-billed. With it off, every run bills every row it delivers.

**Free vs paid Apify plan:** this Actor runs on the free plan. The free plan's $5 monthly credit covers about 312 products or 781 list rows at the FREE-tier price; beyond that you need a paid plan, as with every Store Actor.

### ⏰ Run it on a schedule

Set a cron — `0 * * * *` (hourly) — and leave `onlyChangedSinceLastRun` on. Because already-delivered products are never charged again, a quiet run costs close to nothing and a busy one bills only what moved. That is what makes a daily watch rational instead of a bill you cancel after a week.

### ❓ FAQ

#### How do I get Amazon product data by ASIN?

Put the ASIN — or several, one per line — in `inputs`, pick a `marketplace`, and run it. Each comes back as one full product row: price, availability, Buy Box, star breakdown, sales rank, variants and images.

#### How do I track an Amazon price over time?

Put the ASINs on a schedule with `onlyChangedSinceLastRun` on. A product is billed only when a watched field changes since the last run — by default price, availability, sales rank or Buy Box seller; unchanged products come back free. Sales rank moves on most products every few hours, so drop `salesRank` from `changeFields` if you only want price events. Add `maxCostUsd` to cap a busy day.

#### Does Amazon have a product API?

Amazon's own Product Advertising API is gated behind an affiliate account with sales requirements and returns a limited set of fields. This Actor needs no account and returns the full page — Buy Box, the star breakdown, BSR per category and variants — for any public ASIN, search or list.

#### How many pages of Amazon search results can I scrape?

As many as the search actually returns — there is no fixed page cap here. Set `maxPagesPerSearch` to the depth you want. For a whole category, point it at the category or Best Sellers URL instead, which is the more complete route.

#### Do I need a proxy or a captcha solver?

No. Unblocking is handled and priced into the per-row fee. There is no proxy field to configure and no captcha solver to buy.

#### Why is the price in the wrong currency on some other scrapers?

Because they read the page from wherever their network happens to exit, and Amazon then shows an export price. This Actor always reads each marketplace from its own country, so the price and currency match the marketplace you asked for.

#### How do I scrape Amazon Best Sellers, New Releases or Movers & Shakers?

Paste the list URL into `inputs`. You get all 100 ranks across the two pages — the ones the page prints in full, plus the rest as rank and ASIN, clearly flagged rather than padded with guesses. Turn on `fetchProductDetails` to read every ranked row as a complete product.

#### Can I get the Buy Box seller and whether Amazon fulfils it?

Yes. Every product row carries the Buy Box seller, its seller id when the offer is third-party, and whether the item ships from Amazon — the fields you need to tell an FBA offer from a merchant-fulfilled one.

#### How do I export Amazon product data to CSV, Excel or JSON?

Every run's dataset exports to CSV, Excel, JSON, XML or HTML from the Storage tab, or through the Apify API. The dataset ships with ready-made views for products, list rows, changes and the coverage report.

#### What happens when an ASIN does not exist or a page is blocked?

You get a free `error` row naming the reason, and the rest of your input still runs. Nothing you typed is dropped in silence, and a run that returns nothing costs nothing.

### 🔗 Looking for Amazon reviews?

Reviews live in a separate suite, so this one stays focused on product data:

- [amazon reviews scraper api](https://apify.com/vonsensey/amazon-reviews-scraper-api) — every review of a product.
- [amazon review monitoring scraper api](https://apify.com/vonsensey/amazon-review-monitoring-scraper-api) — new reviews on a schedule.
- [amazon ratings scraper api](https://apify.com/vonsensey/amazon-ratings-scraper-api) — the star rating and count only.

### ⚖️ Unofficial

This is an independent tool and is **not affiliated with, endorsed by or sponsored by Amazon**. It reads only publicly available pages. "Amazon" is used here only to describe what the tool reads.

### 🛟 Support

Something not working, or a marketplace you want checked? Open an issue on the **Issues** tab — it is read and answered. If the Actor does what you needed, a rating on the listing helps more than you would think.

# Actor input Schema

## `inputs` (type: `array`):

One per line. Everything works here:

• **An ASIN** — `B0CHX3QBCH` — read on the marketplace you pick below.
• **A product URL** — `https://www.amazon.com/dp/B0CHX3QBCH` — on any marketplace.
• **A search phrase** — `wireless earbuds` — or a full search URL.
• **A category URL** — `https://www.amazon.com/s?rh=n%3A172282` or `/b?node=…`.
• **A Best Sellers, New Releases or Movers & Shakers list URL.**

Mix them freely. Anything that cannot be used comes back as a free row saying exactly why, so nothing you type is dropped in silence.

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

Leave on Auto and each input is handled by its shape — an ASIN becomes a product, a search becomes list rows, a Best Sellers URL becomes ranked rows. Pin it to one mode to reject anything of the wrong shape with a free error row instead of guessing.

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

Which Amazon a bare ASIN or a search phrase is read on. Full URLs carry their own marketplace and ignore this. The price and currency always match the marketplace you pick — a page served in another currency is refused as a free error row, never billed. amazon.com, .co.uk and .de are verified against captured pages; the other 16 are supported best-effort.

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

English keeps titles and fields in English on every marketplace, so the same ASIN on .com, .co.uk and .de reads one way instead of three. Native returns each marketplace in its own language.

## `maxItemsPerInput` (type: `integer`):

How many products or list rows to return for each input. A search or category walks page by page until the site runs out or this cap is hit; a Best Sellers list returns up to 100 ranks across its two pages.

## `maxItemsTotal` (type: `integer`):

A hard ceiling on billable rows across every input in this run.

## `maxPagesPerSearch` (type: `integer`):

How many result pages to read for each search or category before stopping. Each page holds roughly 16 to 60 products.

## `fetchProductDetails` (type: `boolean`):

Off, a search or list returns the compact row the page prints. On, each row is read from its own product page instead — full price, BSR, Buy Box, variants and the rest — and is billed as a product, never as both. This also fills in the ranked-list rows a Best Sellers page lists by rank only.

## `includeVariants` (type: `boolean`):

List the child ASINs and their named options (colour, size, style) on the product row. The variants themselves are not fetched unless you turn that on below.

## `fetchVariantDetails` (type: `boolean`):

Read every listed variant ASIN as a full product row of its own. Off by default because a product with 30 colours becomes 30 billable rows.

## `onlyChangedSinceLastRun` (type: `boolean`):

The reason a daily or hourly schedule is worth running. A product whose watched fields have not moved since the last run of this feed comes back as a free 'unchanged' row and is never re-charged — so a quiet re-run costs almost nothing.

## `stateName` (type: `string`):

Names the memory used by 'only changed since the last run'. Give two schedules two different names and they track separately; leave it empty to share one feed.

## `changeFields` (type: `array`):

Which fields decide whether a product is billed again on a re-run. Title and description are left out by default on purpose — sellers re-word those constantly and you would re-pay for a typo fix.

## `maxCostUsd` (type: `number`):

A hard ceiling on what this run can cost. Leave empty for no ceiling. Set it to 0 for a dry run: nothing billable is delivered and you get only the free error and coverage rows.

## `concurrency` (type: `integer`):

Lower is gentler and slower; the default suits almost every run.

## Actor input object example

```json
{
  "inputs": [
    "B0CHX3QBCH",
    "https://www.amazon.com/s?k=wireless+earbuds",
    "https://www.amazon.com/gp/bestsellers/electronics/"
  ],
  "mode": "auto",
  "marketplace": "com",
  "language": "en",
  "maxItemsPerInput": 50,
  "maxItemsTotal": 500,
  "maxPagesPerSearch": 3,
  "fetchProductDetails": false,
  "includeVariants": true,
  "fetchVariantDetails": false,
  "onlyChangedSinceLastRun": false,
  "stateName": "",
  "changeFields": [
    "price",
    "availability",
    "salesRank",
    "buyBoxSeller"
  ],
  "concurrency": 3
}
```

# Actor output Schema

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

No description

## `items` (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 = {
    "inputs": [
        "B0CHX3QBCH",
        "https://www.amazon.com/s?k=wireless+earbuds",
        "https://www.amazon.com/gp/bestsellers/electronics/"
    ],
    "mode": "auto",
    "marketplace": "com",
    "language": "en",
    "maxItemsPerInput": 50,
    "maxItemsTotal": 500,
    "maxPagesPerSearch": 3,
    "stateName": "",
    "changeFields": [
        "price",
        "availability",
        "salesRank",
        "buyBoxSeller"
    ],
    "concurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("vonsensey/amazon-product-scraper-api").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 = {
    "inputs": [
        "B0CHX3QBCH",
        "https://www.amazon.com/s?k=wireless+earbuds",
        "https://www.amazon.com/gp/bestsellers/electronics/",
    ],
    "mode": "auto",
    "marketplace": "com",
    "language": "en",
    "maxItemsPerInput": 50,
    "maxItemsTotal": 500,
    "maxPagesPerSearch": 3,
    "stateName": "",
    "changeFields": [
        "price",
        "availability",
        "salesRank",
        "buyBoxSeller",
    ],
    "concurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("vonsensey/amazon-product-scraper-api").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 '{
  "inputs": [
    "B0CHX3QBCH",
    "https://www.amazon.com/s?k=wireless+earbuds",
    "https://www.amazon.com/gp/bestsellers/electronics/"
  ],
  "mode": "auto",
  "marketplace": "com",
  "language": "en",
  "maxItemsPerInput": 50,
  "maxItemsTotal": 500,
  "maxPagesPerSearch": 3,
  "stateName": "",
  "changeFields": [
    "price",
    "availability",
    "salesRank",
    "buyBoxSeller"
  ],
  "concurrency": 3
}' |
apify call vonsensey/amazon-product-scraper-api --silent --output-dataset

```

## MCP server setup

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

```

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/OvxyhkHuWKsfFEun9/builds/IeTyT2HwYCLhakbIN/openapi.json
