# Amazon ASIN Scraper | Product Details & Variants (`danthedataman/amazon-product-details-scraper`) Actor

Turn ASINs or Amazon product URLs into rows: prices, stock, ratings, Best Sellers Rank, variants, seller offers and specs, in 21 marketplaces. Optional delivery ZIP; no login.

- **URL**: https://apify.com/danthedataman/amazon-product-details-scraper.md
- **Developed by:** [Eli J](https://apify.com/danthedataman) (community)
- **Categories:** E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.80 / 1,000 product rows

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?

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 by ASIN or URL

Turn known Amazon products into rows for price monitoring, catalog enrichment and seller tracking. Supply bare ASINs, product URLs, or both. Each row describes the anonymous product page that Amazon served, including its displayed prices, availability, catalog details, images and listed variants.

```json
{"asins":["B0BNWWFDJL"],"marketplace":"US"}
```

The form's prefilled ASIN is a convenient first experiment. API calls do not inherit it: `{}` performs no product reads and exits successfully with guidance.

### Output

One row per distinct resolved product, in first-input order. Bare ASINs come before product URLs. Duplicate requested or resolved identities collapse when both marketplace and ASIN match; the first input supplies the row's provenance. A URL's host decides its marketplace. The same ASIN on different marketplaces remains separate.

Illustrative shortened row; current source values vary:

```json
{
  "input":"B0BNWWFDJL",
  "inputType":"asin",
  "requestedAsin":"B0BNWWFDJL",
  "asin":"B0BNWWFDJL",
  "marketplace":"US",
  "title":"[2-Pack] USB C Charger Block 40W Max Output Type C Fast Charging Wall Plug",
  "price":{"value":7.99,"currency":"USD","raw":"$7.99"},
  "availabilityText":"In Stock",
  "inStock":true
}
```

Prices use major currency units, such as dollars rather than cents. Each price keeps the displayed `raw` text and the source-supported ISO currency code. An ambiguous currency remains null; the Actor never converts money. Rating is on a 0–5 scale; histogram shares are percentages on a 0–100 scale. Counts are integers; video durations are seconds.

| Output fields | Contents |
| --- | --- |
| `input`, `inputType`, `requestedAsin`, `asin` | Original input, its type (`asin` or `url`), requested identity and the page's own ASIN. A followed product redirect may change the page ASIN. Amazon may also serve another item for a requested ASIN: `asin` shows the served item, and the row is charged like any other. |
| `parentAsin`, `variantOf`, `variantAsins`, `variantAttributes`, `variants` | Source variation family, selected dimensions and listed ASINs/dimensions. A variant row names its parent row in `variantOf`. |
| `marketplace`, `language`, `url`, `canonicalUrl`, `scrapedAt` | Host code, page language, fetched URL, literal source canonical and ISO-8601 UTC collection time. A canonical naming another ASIN is preserved. |
| `title`, `brand`, `bylineText`, `storeUrl`, `author`, `modelNumber`, `manufacturer` | Displayed identity, byline/store link and catalog labels. |
| `price`, `listPrice`, `unitPrice`, `subscribeSavePrice`, `shippingPrice` | Price objects `{value, currency, raw}`; `unitPrice` also retains its displayed unit. Free delivery stays in delivery text rather than an invented numeric amount. |
| `priceType`, `priceRange`, `discountPercent`, `couponText`, `dealText` | Displayed offer type (`featured`, `other_offer`, `subscription_offer`), price range, discount, coupon and deal text. |
| `availabilityText`, `inStock`, `condition` | Availability and condition; stock is a boolean only when the source text states it. |
| `rating`, `reviewCount`, `ratingHistogram`, `hasReviews`, `answeredQuestions`, `reviewsUrl` | Ratings, explicit review/question counts, histogram, review-presence flag and source review link. Review-list pages are not requested. |
| `breadcrumbs`, `bestSellerRanks` | Ordered source category path and rank objects `{rank, category, url}`. |
| `mainImageUrl`, `images`, `galleryThumbnails`, `videosCount`, `videos` | Main and gallery images, source video count, and page video objects `{title, durationSeconds, url, thumbnail, creator, creatorType}`. |
| `features`, `description`, `aPlusText`, `brandStoryText`, `bookDescription`, `whatsInTheBox` | Source bullets, description, A+ and brand-story text, book description and box contents. Images are not transcribed into text. |
| `attributes`, `productOverview`, `productDetails`, `manufacturerAttributes`, `importantInformation`, `productComparison`, `sustainabilityFeatures` | Page tables and sections. Key/value lists preserve the source labels; comparison rows preserve cell order. |
| `seller`, `shipsFrom`, `soldBy`, `returnPolicy`, `support` | Seller `{name, id, url}`, buy-box fulfillment, returns and support text. Seller profile pages are not fetched. |
| `deliveryText`, `fastestDeliveryText`, `locationText`, `loadedCountryCode` | Displayed delivery and location context; country code only when the page supplies it. |
| `isAmazonChoice`, `amazonChoiceText`, `isBestSeller`, `boughtPastMonth` | Source badges and purchase-volume text. Missing badges remain null. |
| `otherSellers` | Buy-box summary `{text, count, fromPrice, url}`. It is a summary rather than a list of individual offers. |
| `offers` | Other sellers' offers from the anonymous offer panel when the product shows its seller-summary link: condition, displayed price, seller, fulfillment and delivery. An offer that needs sign-in to buy can lack a seller ID, seller URL and delivery details. The featured offer remains in the product's main fields. |
| `reviewSummary`, `reviewAspects`, `topReviews` | With deep details enabled: source review insights, aspect counts/sentiment and on-page review cards. A review's date retains the source date-and-country line. |

A field absent from the served page is null. Displayed content that cannot be extracted is an extraction error and is not sold as a row. Deep fields (`reviewSummary`, `reviewAspects`, `topReviews`, `boughtPastMonth`) are omitted when `includeDeepDetails` is false, rather than labelled source-absent.

Mexico's bare `Modelo` label is retained in `attributes`; its distinction from model name is unverified, so it does not populate `modelNumber`. The separately labelled `Número Modelo` is supported. This mapping gap remains open.

### Input

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `asins` | array | — | Bare ASIN strings. Prefill `B0BNWWFDJL`; no API default. |
| `productUrls` | array | — | HTTPS `/dp/ASIN`, `/gp/product/ASIN` or `/name/dp/ASIN` URLs on supported hosts. Credentials, ports, fragments and other URL families are refused. |
| `marketplace` | string | `US` | Marketplace for bare ASINs. URL inputs keep their own host. |
| `maxProductVariantsAsSeparateResults` | integer | `0` | Maximum additional listed variants per requested product. Zero collects only requested products. Each variant price requires a separate charged row. |
| `includeDeepDetails` | boolean | `false` | Read deep sections for on-page reviews, review insights and purchase-volume text. |
| `maxConcurrency` | integer | `8` | Maximum simultaneous product reads, from 1 to 16; capped at one per 256 MB of run memory. Direct access stays sequential. |
| `deliveryZip` | string | — | Anonymous delivery postal code. A source refusal or missing location echo becomes an error. |
| `proxyConfiguration` | object | — | Optional Apify Proxy or custom proxy settings. Omission uses the automatic datacenter pool. Explicit buyer settings are honored. |

Marketplace codes: `US`, `UK`, `DE`, `JP`, `IN`, `AU`, `IT`, `ES`, `MX`, `CA`, `FR`, `BR`, `NL`, `SE`, `PL`, `TR`, `SG`, `SA`, `AE`, `EG`, `IE`. Product availability differs by marketplace.

Variant rows follow their parent in ascending ASIN order. Already requested products keep their own input position, and a previously emitted variant is not emitted again. The limit counts attempted additional variants, including unresolved ones, so failures cannot silently enlarge the requested work.

### Collection and limitations

Delivery country, page language and display currency cannot be selected in this version; pages are read in the marketplace's default anonymous context. Delivery ZIP is supported.

The primary path reads product HTML with a browser TLS fingerprint through datacenter proxies. Each browserless HTTP transfer has a 60-second total timeout, shortened to the remaining collection budget. A proxied miss gets up to two fresh-identity retries, and a product whose offer panel is refused on all three identities gets up to two more. With direct access, the primary makes one attempt and retains pacing between products; a refused direct primary is not replayed on that connection identity. A delivered no-puzzle `/errors_page/validateCaptcha` GET form may be completed once on the same identity using only its hidden fields, followed by one product re-read. Checkpoint and sign-in redirects are not followed; puzzle CAPTCHAs are not answered. Product reads run concurrently within `maxConcurrency` and the memory cap, with at most one request per second per identity. Output keeps first-input order; listed variants follow their parent. The bound does not increase after refusals. Up to four times the effective bound can be read ahead across requested products and variants while output waits for an earlier product. When variant rows are enabled, requested products use at most one more than the effective bound, leaving room for the current family; a single read slot keeps only one pending product. After a parent resolves, its variant reads run concurrently through those same slots and share the total read-ahead bound with requested products. Direct access and a single read slot keep variants serial.

Default memory is 4096 MB. You can override memory when starting a run, within the 256–4096 MB limits.

Benchmarks on 2026-10-31 at 4096 MB with 8 concurrent reads: 10 deep-detail products took 18 seconds, 50 products took 63 seconds at default depth, and 180 deep-detail products took 269 seconds, one run each. Source delays, retries and product pages vary.

One-product runs on an earlier build, 22 pairs interleaved with a leading Amazon product Actor on 2026-10-31: median 4.9 seconds against 7.1, p95 11.6 against 9.6, slowest 19.0 against 9.7. This Actor's p95 run was the only one of its 22 that pulled the image, about 4.6 seconds the platform controls. Offer panels, which the other Actor does not return, and spacing after refusals make up the rest of the tail. The slowest run was two slow reads on one identity, cause not separated.

At deep depth, a page below 1.1 MB missing the entire lower-section cluster (product details, description, A+ and rating histogram) gets a fresh-identity re-read within the same two retries. A single absent section does not trigger a retry. The best page is kept; a surviving thin page is counted in `SUMMARY.thinPages`, with its size and missing markers in the transport reads. Thin pages do not trigger the browser service. If their required offer panel is refused, the target remains an uncharged error. Default-depth reads close earlier and do not use this rule.

After remaining browserless misses, the Actor can call a pinned shared browser service, with at most one call across the run. Browser attempts do not add a separate row charge. Browser pages load without image, media and font files, which cuts proxy traffic. On amazon.com, the service imports the primary's allowed anonymous delivery and preference cookies and may complete the same delivered no-puzzle GET form once. Unsupported cookies are omitted when no context was requested; cookies from an identity that encountered a sign-in or checkpoint page or redirect are also omitted. Other marketplaces keep a cookieless browser fallback. If requested delivery or preference context cannot be carried, the Actor refuses before a browser call with `LOCATION_BROWSER_UNSUPPORTED`, `PREFERENCE_BROWSER_UNSUPPORTED` or `BROWSER_COOKIES_UNSUPPORTED`. Unsupported buyer proxy settings retain `BROWSER_PROXY_UNSUPPORTED`. If requested delivery context could not be established, the target remains an error; the returned browser page must also echo the requested ZIP. Cookie values are never logged or included in output. A browser document requiring a separate offer panel is also unresolved unless that panel is included in the returned document. Collection stops 30 seconds before the platform run timeout to save closing records; when no timeout is supplied, the collection budget is 270 seconds. Targets left when it expires receive `TIME_LIMIT` errors without additional source reads. A binding customer charge limit stops further work and records each unfulfilled requested target in `ERRORS`.

Prices and availability belong to the anonymous delivery context served by Amazon. They can differ from a signed-in, Prime, business or personally located session. Only reviews already on the product page are included; full review lists require sign-in and are outside this Actor. Search/category discovery and seller profiles are outside its product-details slice. For keyword discovery, use [Amazon Search Scraper](https://apify.com/danthedataman/amazon-search-scraper).

Amazon's Conditions of Use exclude “any collection and use of any product listings, descriptions, or prices” from the license. Consider those terms for your intended use. Product documents are preferred to auxiliary routes. Amazon.com's robots wildcard block includes `Disallow: /gp/offer-listing/` and `Disallow: /gp/aw/ol/`. The legacy offer-listing link redirects to the product; this Actor reads the modern `/gp/product/ajax/aodAjaxMain` panel when additional offers are shown. An unreadable or incomplete panel becomes an error rather than a fabricated empty list. A panel refused on every identity ends as `OFFERS_FAILED` in `ERRORS` with no row charge. Where a browser call is allowed, that call decides instead, and a failed call also charges no row.

### Pricing and errors

The Store Pricing tab states the tier's row price and Actor Start charge. Actor Start is charged once per GB of run memory, minimum one. At the default 4096 MB that is four events, or USD 0.005 per run. One delivered dataset row is one row event, including each variant row. A removed/not-found product, a validation error or an extraction failure is never a row charge. The Actor Start charge can still apply to a zero-row run.

Unresolved targets go to the key-value store's `ERRORS` record with their input index, requested target and reason. They never enter the dataset. `SUMMARY` records delivered rows, attempted reads, duplicate collapse, errors and transport attempts. Partial success preserves the rows that were delivered. Empty input exits successfully with guidance; an all-attempts-failed run is marked failed with a concise message.

For help, include the run URL, requested marketplace and a product input. Do not post credentials or signed-in cookies.

# Changelog

This Actor's version history is a separate document: https://apify.com/danthedataman/amazon-product-details-scraper/changelog.md

# Actor input Schema

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

Bare product ASINs. Omitted or empty lists add no products.

## `productUrls` (type: `array`):

HTTPS Amazon /dp/ASIN, /gp/product/ASIN or /name/dp/ASIN URLs. Each URL uses its own marketplace.

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

Marketplace for bare ASINs; product URL hosts take precedence.

## `maxProductVariantsAsSeparateResults` (type: `integer`):

Maximum additional listed variants to read as separate charged product rows. Zero collects only requested products.

## `includeDeepDetails` (type: `boolean`):

Read through deep sections for on-page reviews, review summary/aspects and bought-in-past-month text. These fields are omitted when false.

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

Maximum simultaneous product reads, capped at one per 256 MB of run memory and at 16. Direct access stays sequential. Output keeps input order.

## `deliveryZip` (type: `string`):

Anonymous delivery postal code. A refused or unverified location never silently reverts to the site's default.

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

Optional buyer proxy settings. When omitted, use Apify's automatic datacenter pool.

## Actor input object example

```json
{
  "asins": [
    "B0BNWWFDJL"
  ],
  "marketplace": "US",
  "maxProductVariantsAsSeparateResults": 0,
  "includeDeepDetails": false,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

No description

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

Handled request failures, when present; never result rows.

## `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 = {
    "asins": [
        "B0BNWWFDJL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("danthedataman/amazon-product-details-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": ["B0BNWWFDJL"] }

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

```

## MCP server setup

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