# Amazon Product Details Scraper (`steadyscrape/amazon-product-scraper`) Actor

Product details from Amazon by ASIN or link: title, brand, buy box price, list price, discount, coupon, stock, seller, delivery, rating, reviews count, bullets, description, images, categories, best sellers rank, specs, variations, book formats. No browser, no login, pay per product.

- **URL**: https://apify.com/steadyscrape/amazon-product-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** E-commerce, AI, Automation
- **Stats:** 1 total users, 1 monthly users, 87.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 product reads

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 Details Scraper

Product details from Amazon for any list of ASINs or product links, straight from the product page: title, brand, the buy box price with its list price, discount, coupon and unit price, stock and availability, who sells and who ships it, delivery estimates, rating and review count, bullet points, description, the image gallery, categories, best sellers ranks, every specification Amazon lists, the product's variations (sizes, colours, styles with their ASINs) and, for books, the authors and formats with their prices. **Every product comes back as a row**, and when Amazon has nothing the row says why (`not_found`, `invalid`, `blocked`) instead of an empty dataset. You pay only for products read.

No browser, no login, no API key: it reads the page Amazon serves to a desktop browser, paces itself, and rotates IPs if Amazon's bot check shows up.

### What you get

One row per product:

- **The offer**: `price`, `currency`, `priceText`, `listPrice`, `discountPercent`, `pricePerUnit` ("$0.32 per count"), `coupon` ("Save 15%: Coupon available when you select Subscribe & Save."), `availability` ("In Stock", "Only 9 left in stock - order soon.", "Currently unavailable…"), `inStock`, `soldBy`, `shipsFrom`, `sellerId`, `deliveryMessage`, `fastestDeliveryMessage`, and `deliveryLocation` (the place Amazon priced delivery for).
- **The product**: `title`, `brand`, `byline` (the store or brand line as written), `bylineUrl`, `authors` (books), `rating`, `ratingText`, `reviewCount`, `bulletPoints`, `description`, `images` (the hi-res gallery), `videoCount`, `categories` (the breadcrumb), `bestSellersRank` (`[{ rank, category }]`), `bestSellerBadge` ("#1 Best Seller in Electric Pressure Cookers"), `amazonsChoice`, `specifications` (`[{ name, value }]`: everything from the overview table, the details tables and the detail bullets), `dateFirstAvailable`.
- **Variations**: `parentAsin`, `variation` (this ASIN's attributes, e.g. `{ "Size": "6 Quarts" }`), `variations` (every sibling ASIN with its attributes), `variationCount`; and `formats` for books (Kindle, Hardcover, Paperback, Audiobook with price, ASIN and which one the page shows).
- **What was asked**: `input` (the line as you gave it), `asin`, `marketplace`, `url`, `canonicalUrl`, `scrapedAt`.
- **`status` and `reason`**: `ok`, `not_found` (Amazon has no such ASIN), `invalid` (the line is neither an ASIN nor an Amazon link), or `blocked` (every IP route was refused; unpaid).

### Input

| field | what it does |
|---|---|
| `products` | One per line: an ASIN (`B00FLYWNYQ`, or an ISBN-10 for books) or any Amazon product link (`/dp/…`, `/gp/product/…`, a link copied from the site with its slug and parameters). The link's domain picks the marketplace. |
| `marketplace` | Where bare ASINs are looked up: `com` (default), `ca`, `com.mx`, `com.br`, `co.uk`, `de`, `fr`, `it`, `es`, `nl`, `co.jp`, `in`, `com.au`… |
| `residentialFallback` | Retry through residential proxies when Amazon refuses the datacenter IPs. Default on. |

```json
{
    "products": ["B00FLYWNYQ", "https://www.amazon.com/dp/0735211299", "https://www.amazon.ca/dp/B00FLYWNYQ"],
    "marketplace": "com"
}
```

### Output example

```json
{
    "asin": "B00FLYWNYQ",
    "marketplace": "com",
    "url": "https://www.amazon.com/dp/B00FLYWNYQ",
    "status": "ok",
    "reason": null,
    "input": "B00FLYWNYQ",
    "title": "Instant Pot Duo 6 Qt 7-in-1 Electric Pressure Cooker, Stainless Steel",
    "brand": "Instant Pot",
    "byline": "Visit the Instant Pot Store",
    "bylineUrl": "https://www.amazon.com/stores/InstantPot/page/64EB4502-…",
    "authors": [],
    "price": 109.99,
    "priceText": "$109.99",
    "currency": "USD",
    "listPrice": null,
    "listPriceText": null,
    "discountPercent": null,
    "pricePerUnit": null,
    "coupon": null,
    "availability": "In Stock",
    "inStock": true,
    "soldBy": "Amazon.com",
    "shipsFrom": "Amazon.com",
    "sellerId": null,
    "deliveryMessage": "FREE delivery Thursday, September 24",
    "fastestDeliveryMessage": "Or fastest delivery Wednesday, September 23",
    "deliveryLocation": "Ashburn 20149",
    "rating": 4.7,
    "ratingText": "4.7 out of 5 stars",
    "reviewCount": 184406,
    "bulletPoints": ["7 Cooking Functions: Pressure cook, slow cook, sauté, steam, make rice, yogurt, or simply keep your meal warm—all in one appliance", "…"],
    "description": "The Instant Pot Duo: the original all-in-one cooker that made fast, versatile cooking a household staple. …",
    "images": ["https://m.media-amazon.com/images/I/71Z401LjFFL._AC_SL1500_.jpg", "…"],
    "videoCount": 19,
    "categories": ["Home & Kitchen", "Kitchen & Dining", "Small Appliances"],
    "bestSellersRank": [{ "rank": 562, "category": "Home & Kitchen" }, { "rank": 24, "category": "Kitchen Small Appliances" }],
    "bestSellerBadge": null,
    "amazonsChoice": "Amazon's Choice",
    "specifications": [{ "name": "Brand", "value": "Instant Pot" }, { "name": "Capacity", "value": "5.7 liters" }, { "name": "Part Number", "value": "IP-DUO60" }, "…"],
    "dateFirstAvailable": null,
    "parentAsin": "B0GXKV5FHP",
    "variation": { "asin": "B00FLYWNYQ", "attributes": { "Size": "6 Quarts" } },
    "variations": [{ "asin": "B06Y1YD5W7", "attributes": { "Size": "3 Quarts" } }, { "asin": "B00FLYWNYQ", "attributes": { "Size": "6 Quarts" } }],
    "variationCount": 2,
    "formats": [],
    "canonicalUrl": "https://www.amazon.com/Instant-Pot-Multi-Use-Programmable-Pressure/dp/B00FLYWNYQ",
    "scrapedAt": "2026-09-19T05:00:00.000Z"
}
```

### Prices: what to expect

- **`price` is the buy box price of the new offer**, as Amazon shows it to a shopper in the marketplace's country who is not signed in. A used or renewed offer never leaks into it, and neither does its strike-through price.
- **`listPrice` and `discountPercent` are Amazon's own** ("List Price: $49.00", "-73%"); `null` when the page shows none.
- **A product with no buy box price** (unavailable, discontinued, a parent listing that needs a size chosen, or "See All Buying Options") comes back with its fields and a `null` price: `inStock` says `false` when Amazon says it is unavailable and `null` when it only offers other buying options. `availability` carries Amazon's wording.
- **Delivery and availability depend on the delivery location**, which Amazon picks from the run's IP (`deliveryLocation` says which); prices on amazon.com are in USD, on amazon.ca in CAD, and so on.

### Use cases

- **Price and stock monitoring**: schedule a run over your ASINs; alert on `price`, `inStock`, `coupon` or `bestSellersRank` changes.
- **Catalogue enrichment**: titles, brands, bullet points, specifications, images and categories for a list of ASINs.
- **Competitor and seller research**: who wins the buy box (`soldBy`, `sellerId`), whether Amazon ships it, ranks and ratings across a niche.
- **Variation mapping**: every sibling ASIN of a product with its size, colour or style, from one page.

### Limits and honesty

- **Marketplaces**: amazon.com, amazon.ca, amazon.com.mx and amazon.com.br answer from Apify's cloud on every run. The European, Indian, Japanese and Australian marketplaces mostly answer Amazon's "Continue shopping" bot check to cloud IPs (amazon.de let one run of three through, amazon.co.uk none, on 2026-09-19): the Actor tries every route it has, reads the page when one gets through, and otherwise gives a free `blocked` row.
- **Amazon throttles an IP after a burst** (about twenty pages in a row from one IP on 2026-09-19): the Actor then moves to datacenter and, if needed, residential proxies, so a long list keeps going; a product every route refuses is a free `blocked` row.
- One request per product; Amazon serves a page in one to two seconds, three in parallel.
- The page is read as Amazon serves it without JavaScript: sections Amazon loads later (some device pages' specifications, the reviews list) are not in it.
- Reviews are not scraped: only the rating and the review count.

### Pricing

Pay per event: one `product` event per row with status `ok`. Rows with any other status are free. Set a spending limit on the run and the Actor stops at it.

### Legal

The Actor reads publicly available product pages that Amazon shows to anyone, without logging in, and stores no personal data. Use the data in line with Amazon's terms and your local law.

# Actor input Schema

## `products` (type: `array`):

One product per line: an ASIN (<code>B00FLYWNYQ</code>) or any Amazon product link (<code>https://www.amazon.com/dp/B00FLYWNYQ</code>, <code>/gp/product/…</code>, a link copied from the site with its slug). A link's domain picks its marketplace; a bare ASIN uses the marketplace below.

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

Where an ASIN without a link is looked up. Amazon.com, .ca, .com.mx and .com.br answer from Apify's cloud; the other marketplaces currently answer Amazon's bot check to cloud IPs and come back as free <code>blocked</code> rows.

## `residentialFallback` (type: `boolean`):

When Amazon refuses the run's own IP and the datacenter proxies, retry through residential proxies (included in the price: you pay per product, not per proxy byte). Off: those products come back with status <code>blocked</code>, unpaid.

## Actor input object example

```json
{
  "products": [
    "B00FLYWNYQ",
    "https://www.amazon.com/dp/0735211299"
  ],
  "marketplace": "com",
  "residentialFallback": true
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "products": [
        "B00FLYWNYQ",
        "https://www.amazon.com/dp/0735211299"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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 = { "products": [
        "B00FLYWNYQ",
        "https://www.amazon.com/dp/0735211299",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/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 '{
  "products": [
    "B00FLYWNYQ",
    "https://www.amazon.com/dp/0735211299"
  ]
}' |
apify call steadyscrape/amazon-product-scraper --silent --output-dataset

```

## MCP server setup

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