# Amazon Product Scraper - Price, Rating, Specs and Images (`s-r/amazon-product-scraper`) Actor

Product detail for any ASIN or Amazon link: title, brand, price and list price, star rating and review count, the bullet points, the full specification tables, every gallery image and the sibling ASINs of a variation set. Fifteen marketplaces.

- **URL**: https://apify.com/s-r/amazon-product-scraper.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Scraper

Product detail for any ASIN, on fifteen Amazon marketplaces. Give it ids or
paste product links and get one row per product: title, brand, the price you
would pay and the price it is compared against, the star rating and how many
ratings it rests on, the bullet points, the full specification tables, every
gallery image at full size, and the sibling ASINs when the product is one of a
variation set.

A pasted link works without editing. The ASIN is lifted out of the URL, so
`https://www.amazon.com/dp/B0DJGDC3BD` and `B0DJGDC3BD` are the same input.

### The marketplace decides more than the domain

Price, availability and every label on the page follow the marketplace, and so
does the currency. `currency` is read off the page as written rather than
inferred from the domain, because a page can quote a second currency and an
inferred value would be wrong without ever looking wrong.

Available: **com, co.uk, de, fr, it, es, nl, se, pl, ca, com.au, com.mx,
com.br, in, co.jp**.

### Two prices, and why both are here

`price` is what you would pay. `list_price` is the struck-through comparison
Amazon shows next to it, when there is one. They live in the same block in the
markup and are easy to confuse, which is exactly why they are separate columns
here rather than one "price" that sometimes means the other thing.

Each has a `_text` twin holding the figure exactly as displayed. When the
number and the text disagree, trust the text: it is what the page said.

### Specifications come from four different tables

Amazon uses at least four layouts for the same information and a product
carries whichever one its category was built with. All of them are read and
merged into a single `details` mapping, so a laptop's "Screen Size" and a
book's "Publisher" arrive the same way.

`bullets` is the About this item list, cleaned of the "Report an issue" action
Amazon puts in the same list.

### Images

`images` is the gallery at full size, largest variant first. These come out of
the page's own gallery data rather than the visible `img` tags, which carry
thumbnails only, so the URLs are the ones worth downloading.

### Run sizes and throttling

Amazon rate-limits harder than most. **Parallel requests** defaults to 2 on
purpose: low and slow finishes a large batch sooner than fast and blocked. A
refused page is retried with a fresh fingerprint rather than parsed into empty
fields, and **Attempts per product** is that budget.

### Errors

| Code | Meaning |
|---|---|
| `not_found` | The page carries Amazon's own 404 marker |
| `blocked` | The page came back too small, or as a challenge |
| `not_parsed` | A full page arrived with no title in it |
| `fetch_failed` | The request could not be completed |
| `bad_input` | No ASIN or product URL was given |

`not_found` and `blocked` are deliberately separate, and `not_parsed` is
separate again. A missing product, a refusal, and a page whose markup moved are
three different problems with three different responses, and reporting all
three as "no data" would hide which one you have.

**Only products that were actually read are billed.** A block is not your
problem.

### Related actors

`amazon-buybox` for the buying options and who is selling, `amazon-offers` for
every offer on a product, `amazon-reviews-scraper` for the reviews behind the
star rating, `amazon-bestsellers` for category rankings and `amazon-keywords`
for search-box autocomplete.

# Actor input Schema

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

One per line. A pasted Amazon link works as well as a bare ASIN: the id is lifted out of the URL.

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

Which Amazon site to read. Prices, availability and the language of every label follow the marketplace, so this also decides the currency.

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

How many products to fetch at once. Amazon throttles hard, so low and slow finishes sooner than fast and blocked.

## `retries` (type: `integer`):

How often to retry a refused page with a fresh fingerprint before giving up on it.

## Actor input object example

```json
{
  "asins": [
    "https://www.amazon.com/dp/B08N5WRWNW",
    "B07XJ8C8F5"
  ],
  "marketplace": "com",
  "concurrency": 2,
  "retries": 4
}
```

# Actor output Schema

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

One row per ASIN.

## `summary` (type: `string`):

How many were requested, found, and how many carried a price, a rating and images.

## `errors` (type: `string`):

Products that could not be read, and why.

# 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": [
        "B0DJGDC3BD"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/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": ["B0DJGDC3BD"] }

# Run the Actor and wait for it to finish
run = client.actor("s-r/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": [
    "B0DJGDC3BD"
  ]
}' |
apify call s-r/amazon-product-scraper --silent --output-dataset

```

## MCP server setup

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