# Amazon Product & Listing Intelligence (`eiv/amazon-product-scraper`) Actor

Scrape Amazon product data by ASIN: Best Sellers Rank in every category, buy-box seller, price, stock, variants, and listing-quality signals like A+ content and image count. The fields Jungle Scout charges a monthly seat for — no API key, no browser.

- **URL**: https://apify.com/eiv/amazon-product-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (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 $4.00 / 1,000 product scrapes

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?

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 & Listing Intelligence

Not another title-and-price scraper. Give it an ASIN and get **Best Sellers Rank, buy-box seller, and listing-quality signals** that most Amazon scrapers do not return at all.

```
B00FLYWNYQ  Instant Pot Duo 7-in-1                     $104.67   4.7★ 173,442
            #590 Home & Kitchen · #22 Kitchen Small Appliances
            Amazon holds buy box · 6 images · video ✓ · A+ ✓ · 10 bullets

B085DTZQNZ  Owala FreeSip 24 oz                         $29.97   4.6★ 133,330
            #1 Home & Kitchen · #1 Travel & To-Go Drinkware · #1 Insulated Bottles
            94 variant ASINs
```

No API keys, no browser. Amazon's own Product Advertising API requires an affiliate account with qualifying sales, and it will not tell you your competitor's rank at all.

***

### What makes this different

Most Amazon scrapers stop at title, price and rating. The fields people actually pay Jungle Scout and Helium 10 for are these:

| Field | Why it matters |
|---|---|
| **`bestSellersRank`** | Every category the product ranks in, not just the headline. The closest public proxy for unit sales. |
| **`soldByAmazon`** | Whether Amazon holds the buy box or a third-party seller does. Changes your entire strategy against that listing. |
| **`mainRank`** | Rank in the top-level department — what sellers mean by "the BSR". `topRank` is the numerically lowest, which is often a much narrower shelf. |
| **`variantAsins`** | The parent/child map — every other size and colour. |
| **Listing audit** | `imageCount`, `hasVideo`, `hasAPlusContent`, `bulletCount`, `titleLength`. Where a competitor's listing is weak. |

Plus the basics done properly: `price`, `listPrice`, `discountPercent`, `currency`, `rating`, `reviewCount`, `inStock`, `availabilityText`, `couponText`, `brand`, `breadcrumbs`.

***

### Who this is for

- **Amazon sellers and agencies** — track competitor rank, price and buy-box ownership daily. Diff on `asin` + `country`.
- **Brands policing resellers** — `soldBy` tells you who is actually selling your product, and `soldByAmazon` tells you when you have lost the buy box.
- **Cross-border pricing** — the same ASIN across 18 marketplaces, each in its own currency. Read the proxy section first: international storefronts have a hard requirement.
- **Listing optimisation** — audit a whole category: who has video, who has A+ content, who is wasting title characters.
- **Market research** — harvest a Best Sellers category and rank the whole field by review count, rating and BSR.

***

### Input

```json
{
  "asins": ["B00FLYWNYQ", "https://www.amazon.co.uk/dp/B085DTZQNZ"],
  "countries": ["us", "uk", "de"],
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Accepts a bare ASIN or any Amazon product URL. **A URL that names a marketplace wins over the country list**, so an `amazon.co.uk` link is read as a UK listing.

| Option | Default | Notes |
|---|---|---|
| `countries` | `["us"]` | One record per ASIN **per marketplace**, each billed |
| `bestSellerCategories` | — | Slugs like `electronics`; the discovery route |
| `maxProductsPerCategory` | `50` | Your billing guard on categories |
| `includeBullets` | `true` | Counts are always included |
| `includeDescription` | `false` | Off keeps the dataset far smaller |
| `includeImages` / `includeVariants` | `false` / `true` | |
| `maxConcurrency` | `8` | Lower it if you see bot checks |

**Marketplaces:** us, uk, de, fr, it, es, nl, se, pl, ca, mx, br, au, jp, in, ae, sg, tr — but see the proxy section: everything except `us` needs a proxy in that country.

***

### Proxy: read this before using international marketplaces

**amazon.com works on plain datacenter proxy.** Enable the Apify proxy and it runs.

**International storefronts do not.** amazon.de, amazon.co.uk and the rest reject datacenter IP ranges outright — measured at 0 of 4 succeeding from a US datacenter address while the identical requests from a European consumer IP succeeded 4 of 4 at the same moment. It is address reputation, not request rate, so lowering concurrency does not help and neither does backing off. Those marketplaces need **a proxy located in that country**: either a residential pool, or a datacenter plan that includes it.

Note the cost, because it lands on the Actor and not on the caller: pages average 2 MB, so residential traffic runs about **$16 per 1,000 listings**. International coverage is a feature for small, targeted cross-border checks, not for bulk runs.

When a marketplace is shut out completely the Actor names it and says which country's proxy would fix it, rather than leaving a column of blocked rows to interpret.

Amazon also geolocates *within* a working request. A US listing fetched from a European address returns no buy box — "This item cannot be shipped to your selected delivery location" — so `price` and `soldBy` come back null for a product US shoppers can buy freely. Enabling the proxy without picking a country makes the Actor read each marketplace from its own country automatically. Currency is pinned with Amazon's own locale cookies; without it the same listing reports `EUR90.69` from Europe and `$104.67` from the US.

***

### Five things worth knowing

Each was measured against live listings, not assumed.

**Best Sellers Rank is on about 4 listings in 5.** Measured at **83% across 24 ASINs in six categories.** Amazon omits the rank block entirely on its tech-spec page template, which is consistent per ASIN rather than intermittent — re-running will not conjure it. `bestSellersRank` is an empty array when absent, never a fabricated zero.

**Keyword search is not scrapeable, so this Actor does not claim to.** Amazon's `/s?k=` endpoint returns an empty 2 KB shell to non-browser clients. Discovery is via Best Sellers categories, which do work and paginate.

**Reviews are not included.** The `/product-reviews/` page returns 308 KB with zero review blocks in the HTML — Amazon renders them client-side behind a session. Anything promising bulk Amazon review text from a plain HTTP scraper is either using a browser fleet or not delivering.

**A price is only ever read from the buy box.** A listing page carries sponsored tiles, "similar items" and comparison tables, each with its own price markup — on one live page *every* price element belonged to a different ASIN's advert. A page-wide price selector reported $12.59 for a $29.97 water bottle, lifted from a sponsored tile for ASIN B0CCD8LMJ7. Those blocks are deleted before parsing, and a list price at or below the current price is dropped rather than reported. When there is no buy box, `price` is null — never a neighbour's number.

**`imageCount` counts this variant's gallery, not the page's.** A listing embeds every sibling variant's images too: one 7-image product carried 126 hi-res URLs because it sells 94 colourways. Counting raw URLs would make a listing audit meaningless.

***

### Output

```json
{
  "asin": "B00FLYWNYQ", "country": "us", "marketplace": "amazon.com",
  "title": "Instant Pot Duo 7-in-1 Electric Pressure Cooker…",
  "brand": "Instant Pot", "category": "Home & Kitchen",
  "price": 104.67, "listPrice": null, "currency": "USD",
  "rating": 4.7, "reviewCount": 173441,
  "bestSellersRank": [
    { "rank": 589, "category": "Home & Kitchen" },
    { "rank": 22, "category": "Kitchen Small Appliances" }
  ],
  "mainRank": 590, "mainRankCategory": "Home & Kitchen",
  "topRank": 22, "topRankCategory": "Kitchen Small Appliances",
  "inStock": true, "soldBy": "Amazon.com", "shipsFrom": "Amazon.com", "soldByAmazon": true,
  "imageCount": 6, "hasVideo": true, "hasAPlusContent": true, "bulletCount": 10, "titleLength": 179,
  "variantCount": 1, "recordType": "product"
}
```

Three ready-made views: **Products**, **Price by marketplace** and **Listing quality audit**. Set `flattenOutput: true` for CSV.

***

### Honest limits

- **ASIN-driven, not keyword-driven.** See above.
- **No review text.** See above.
- **An ASIN missing from a marketplace returns `NOT_FOUND`** and is **not charged**. ASINs are marketplace-specific; a wide country list will always produce some.
- **Blocks come in two kinds.** On amazon.com they are occasional and rate-driven — the identical request succeeded four times in five when spaced four seconds apart — and are retried on a fresh address after a backoff. On international storefronts from a datacenter IP they are total; see the proxy section. Either way `BLOCKED` rows are **not charged**.
- **Best Sellers lists contain non-products.** Subscription plans and service listings sit alongside physical goods and have no price, rating or rank. They return `NOT_A_PRODUCT`, named, and are **not charged**.
- **Premium-brand pages carry no breadcrumbs and no rank.** Apple and similar use a template with neither, so `breadcrumbs` is empty and `bestSellersRank` absent by design, not by failure.
- **Pages are large** — 2.4 MB average — because the rank table sits at the very end of the document and cannot be truncated away.
- **`price` is the buy-box price**, not the cheapest offer on the listing — and it is null when Amazon renders no buy box for the requesting country. That is the proxy setting above, not a parsing failure.

***

### Pricing

| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Once per run |
| Product scraped | $0.004 | Per listing parsed (one per ASIN per marketplace) |

**$4.00 per 1,000 listings.** Tracking 50 competitor ASINs across 3 marketplaces daily costs about **$0.61 a day**. Failed, missing and blocked listings are never charged.

***

### Tips

- **Diff on `asin` + `country` daily.** A `mainRank` that halves is a sales spike; a `soldByAmazon` that flips is a buy-box loss.
- **Compare on `mainRank`, not `topRank`.** #2 in Home & Kitchen beats #1 in Kids' Sheet & Pillowcase Sets by a wide margin, and only one of those two numbers says so.
- **Watch rank, not `reviewCount`.** Rank moves within hours; review counts take weeks.
- **Audit a whole category** with `bestSellerCategories` once, then feed the returned ASINs back as `asins` for cheap daily monitoring.
- **Sort your own catalogue by `titleLength` and `hasVideo`** to find the listings costing you conversions.

# Actor input Schema

## `asins` (type: `array`):

One per line. Accepts a bare ASIN ('B00FLYWNYQ') or any Amazon product URL. A URL that names a marketplace wins over the marketplace list below, so an amazon.co.uk link is read as a UK listing.

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

Category slugs to harvest ASINs from, e.g. 'electronics', 'home-garden', 'toys-and-games'. Take the slug from a Best Sellers URL: amazon.com/gp/bestsellers/<slug>/. Amazon's keyword search is not scrapeable, so this is the discovery route.

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

Cap on ASINs taken from each category, per marketplace. Amazon serves about 30 per page and paginates to two, so 50 covers a full category list. This is your billing guard when using categories.

## `startUrls` (type: `array`):

Alternative to ASINs, for feeding output from another Actor straight into this one.

## `sourceDatasetId` (type: `string`):

Read ASINs from an existing dataset instead of typing them.

## `sourceDatasetField` (type: `string`):

Which field on the source dataset holds the ASIN or product URL.

## `countries` (type: `array`):

Two-letter codes: us, uk, de, fr, it, es, nl, se, pl, ca, mx, br, au, jp, in, ae, sg, tr. One record is produced per ASIN per marketplace, and each is billed. The same ASIN is often a different price — or absent entirely — in another country.

## `includeBullets` (type: `boolean`):

Store the listing's feature bullets. A count is always included regardless.

## `includeDescription` (type: `boolean`):

Store the long product description. Off by default because it dominates dataset size; a 300-character snippet is always included.

## `includeImages` (type: `boolean`):

Store the gallery image URLs. A count is always included regardless.

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

Store the sibling ASINs of the same parent product — the other sizes and colours. A count is always included regardless.

## `flattenOutput` (type: `boolean`):

Emit flat dot-notation columns with arrays joined by ' | '. Use for spreadsheets; leave off for warehouses.

## `maxConcurrency` (type: `integer`):

Listings fetched in parallel. Amazon product pages average 2.4 MB, so raise memory alongside this. Lower it if you start seeing bot checks.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout. Amazon pages are large and can be slow to serialise.

## `maxRetries` (type: `integer`):

Retries for connection resets and 5xx responses. A 404 is not retried, because an ASIN missing from a marketplace stays missing.

## `proxyConfiguration` (type: `object`):

Strongly recommended. Amazon geolocates the request: a US listing read from a European address shows no buy box at all, so price, seller and stock come back empty. Enable the Apify proxy without choosing a country and the Actor reads each marketplace from an IP in that country automatically.

## Actor input object example

```json
{
  "asins": [
    "B00FLYWNYQ",
    "B085DTZQNZ",
    "B0154ASID6"
  ],
  "maxProductsPerCategory": 50,
  "sourceDatasetField": "asin",
  "countries": [
    "us"
  ],
  "includeBullets": true,
  "includeDescription": false,
  "includeImages": false,
  "includeVariants": true,
  "flattenOutput": false,
  "maxConcurrency": 8,
  "requestTimeoutSecs": 45,
  "maxRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One dataset item per ASIN per marketplace.

# 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 = {
    "asins": [
        "B00FLYWNYQ",
        "B085DTZQNZ",
        "B0154ASID6"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eiv/amazon-product-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 = { "asins": [
        "B00FLYWNYQ",
        "B085DTZQNZ",
        "B0154ASID6",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eiv/amazon-product-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 '{
  "asins": [
    "B00FLYWNYQ",
    "B085DTZQNZ",
    "B0154ASID6"
  ]
}' |
apify call eiv/amazon-product-scraper --silent --output-dataset

```

## MCP server setup

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