# Amazon Search + Product Details Scraper Pro (`dami0089/amazon-search-detail-scraper-pro`) Actor

Scrape Amazon search results, categories and product pages in one run: price, variants, offers, BSR, specs and review insights across 20 marketplaces.

- **URL**: https://apify.com/dami0089/amazon-search-detail-scraper-pro.md
- **Developed by:** [Damian Oliva](https://apify.com/dami0089) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 results

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 Search + Product Details Scraper (20 stores)

Scrape Amazon **search results, categories and product pages in one run**: price, variants, offers, BSR, specs and review insights across **20 marketplaces** — for **$0.002 per product**.

### What it does in 2 lines

Give it keywords, search/category URLs, bare ASINs or product URLs — mixed, even from different countries — and get back structured product data (price, brand, rating breakdown, Best Sellers Rank, images, specs, sellers) as JSON, CSV or Excel through the Apify dataset. Failures never kill the run: they come back as typed error items.

### Use cases

- **Daily price & stock monitoring** — schedule the actor every morning over your ASIN list and diff the dataset.
- **Category research** — scrape a whole search (`/s?k=...`) with `maxItems` to map prices, ratings and BSR in a niche.
- **Buy-box & seller tracking** — `scrapeOffers: true` returns the other sellers per product.
- **Variant expansion** — `scrapeVariants: true` emits every size/color variant as its own row.
- **Multi-country catalog** — mix `amazon.com`, `amazon.de`, `amazon.co.jp` URLs in one run; each keeps its marketplace, language and currency.

### How to use (step by step)

1. Paste one or more entries into **Start URLs**: a keyword (`wireless mouse`), a search URL (`https://www.amazon.com/s?k=wireless+mouse`), a category URL, a bare ASIN (`B09X7MPX8L`) or a product URL. You can mix them.
2. Set **Max items per start URL** (`maxItems`) — search pagination stops there (up to 7 pages per query).
3. Pick the **Amazon domain** for bare ASINs/keywords, plus **language** and **delivery ZIP** (controls the prices/availability Amazon shows).
4. Optionally enable **scrapeOffers** and **scrapeVariants** (each costs extra requests and time).
5. Run. Results stream into the dataset; error rows carry `error` + `error_description` and are **free**.

### Example input

```json
{
  "domain": "amazon.com",
  "language": "en",
  "maxItems": 10,
  "startUrls": ["https://www.amazon.com/s?k=wireless+mouse"]
}
```

Mixed-marketplace example:

```json
{
  "domain": "amazon.com",
  "language": "en",
  "zipCode": "10010",
  "maxItems": 5,
  "scrapeOffers": true,
  "startUrls": [
    "https://www.amazon.com/s?k=wireless+mouse",
    "https://www.amazon.de/dp/B09X7MPX8L",
    "B0FGHD3D5Y"
  ]
}
```

### Example output (real local run)

```json
{
  "asin": "B0GYDCW11T",
  "url": "https://www.amazon.com/dp/B0GYDCW11T?language=en",
  "title": "PHILIPS Wireless Mouse for Laptop, Silent Click, 4000 DPI High Precision",
  "brand": "PHILIPS",
  "price": "ARS28,957.38",
  "price_value": 28957.38,
  "currency": "ARS",
  "list_price": "ARS30,482.25",
  "discount_percent": 5,
  "coupon": null,
  "stars": 4.5,
  "reviews_count": 169,
  "rating_breakdown": {
    "1": 5,
    "2": 1,
    "3": 3,
    "4": 14,
    "5": 77
  },
  "best_sellers_rank": [
    "#423 in Computer Mice"
  ],
  "bought_past_month": null,
  "badge": null,
  "availability": "In Stock",
  "delivery_date": "Friday, October 16",
  "seller_name": "Philips Choice US",
  "ships_from": null,
  "offers_count": 2,
  "offers": null,
  "variants": [
    {
      "asin": "B0GYDCW11T",
      "title": "Black",
      "dimension": "color_name: Black",
      "price": null,
      "price_value": null,
      "url": "https://www.amazon.com/dp/B0GYDCW11T",
      "selected": true
    }
  ],
  "images": [
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SL1500_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SY355_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SY450_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SX425_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SX466_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SX522_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SX569_.jpg",
    "https://m.media-amazon.com/images/I/71uErwvB5iL._AC_SX679_.jpg",
    "https://m.media-amazon.com/images/I/41EfcA+ex6L.jpg",
    "https://m.media-amazon.com/images/I/41kB8TQGmuL.jpg",
    "https://m.media-amazon.com/images/I/41p4AHuRNQL.jpg",
    "https://m.media-amazon.com/images/I/41ighJpG-oL.jpg"
  ],
  "breadcrumbs": [
    "Electronics",
    "Computers & Accessories",
    "Computer Accessories & Peripherals",
    "Keyboards, Mice & Accessories",
    "Mice"
  ],
  "features": [
    "BEFORE FIRST USE & BATTERY SETUP: Ready to boost your productivity straight out of the box with the included AA battery! Important Setup Tip: Make sure to manually peel off the clear protective plastic film wrapped around the battery before inserting, and align the positive (+) and negative (-) terminals. The 2.4G USB receiver is conveniently stored inside the battery compartment for fast plug-and-play and easy travel storage",
    "PALM-CRADLE ERGONOMICS & SILENT CLICKS: Designed for long-hour comfort during extended work sessions. Engineered with a contoured thumb rest and non-slip silicone side grips, this ergonomic wireless mouse follows natural palm curves and fits small to medium-sized hands. Equipped with whisper-quiet micro-switches on primary keys, it delivers noise-free clicking for distraction-free work in quiet offices, libraries, or home setups",
    "SEAMLESS 3-DEVICE DUAL-MODE SWITCHING: Effortlessly connect and control up to 3 devices simultaneously—1 via the 2.4GHz USB receiver and 2 via Bluetooth (BT3.0/BT5.2). Easily toggle control between your laptop, desktop PC, MacBook, or iPad with a single click of the bottom mode switch. Enjoy a stable wireless connection up to 33ft with broad cross-platform support. Broad System Compatibility: Both 2.4G and BT 3.0 modes fully support Windows XP/7/8/10/11 and macOS 10.5+; BT 5.2 mode supports Windows 8/10/11 and macOS 10.5+. Fully backward-compatible with USB 1.1/2.0/3.0 ports",
    "5-LEVEL DPI & 7 EFFICIENT BUTTONS: Quickly cycle through 800, 1600 (default), 2400, 3200, and 4000 DPI using the top switch to adjust tracking sensitivity for spreadsheets or ultra-high-resolution 4K displays. Built with an intuitive 7-button layout, the side thumb keys (forward/backward) streamline web browsing and file navigation. Mac OS Note: Side buttons work seamlessly on Windows, but do not support macOS/iOS due to system restrictions",
    "SMART POWER SAVING & SLEEP MODE WAKE-UP: Enters deep sleep after 10 mins of inactivity and features an ON/OFF physical switch to deliver up to 12 months of standby performance. Important Wake-Up & Reconnect Notice: To prevent accidental cursor movement and maximize battery life, this mouse wakes up by clicking any button. When waking from deep sleep, simply click any key once and wait 1–2s for the 2.4G or Bluetooth signal to automatically reconnect"
  ],
  "product_details": {
    "Connectivity Technology": "USB",
    "Additional Features": "Wireless",
    "Movement Detection": "Optical",
    "Button Quantity": "6",
    "Hand Orientation": "Right",
    "Compatible Devices": "Personal Computer, Tablet",
    "Operating System": "Mac OS 9, Windows 11",
    "Battery Average Life": "18 months",
    "Number of Batteries": "1 AA batteries required.",
    "Hardware Platform": "Linux, Mac, PC",
    "Power Source": "Battery Powered",
    "Mouse Maximum Sensitivity": "4000 dots_per_inch",
    "Minimum Required Operating System Version": "Mac OS X 10.5 Leopard, Windows XP",
    "Range": "33 feet",
    "Item Dimensions L x W": "3.5\"L x 2\"W",
    "Unit Count": "1 Count",
    "Brand": "PHILIPS",
    "Model Name": "SPK7547",
    "Antenna Location": "Office",
    "Model Number": "SPK7547",
    "Included Components": "Mouse",
    "Manufacturer": "Philips",
    "Warranty Description": "1 Year",
    "Best Sellers Rank": "#423 in Computer Mice",
    "ASIN": "B0GYDCW11T",
    "Customer Reviews": "4.5 out of 5 stars (169)",
    "Color": "Black",
    "Pattern": "Solid Color",
    "Enclosure Material": "Plastic",
    "Finish": "Matte"
  },
  "description": null,
  "review_summary": "Customers find the wireless mouse works well and is a great value for money. The connectivity receives positive feedback, with customers noting it's easy to set up, and one mentioning it can be used with both USB and Bluetooth. The button responsiveness receives mixed reviews.",
  "scrape_time": "2026-10-05T18:50:01.845Z",
  "error": null,
  "error_description": null
}
```

All 32 fields are always present (`null` when Amazon doesn't show the data — never invented).

### Delivery location, language and currency

- `zipCode` sets Amazon's **Deliver-to** location through Amazon's own address endpoint before scraping, so prices and availability match what a local shopper sees.
- `language` is sent on every request (same options as Amazon's language menu).
- `currency` is detected per price string (`$`, `€`, `£`, `ARS`, …) with the marketplace default as fallback.

### Pricing

| Event | Price |
|---|---|
| `result-item` — per product returned to the dataset (search hit or full detail) | **$0.002** |
| Error items (`product_not_found`, `blocked`, `no_results_found`, `invalid_url`, …) | **free** |

Example: **1,000 products ≈ US$ 2.00**. The actor respects your max-spend budget: when the pay-per-event limit is reached it stops gracefully and keeps everything collected so far.

### Scheduling daily monitoring

Keep a fixed ASIN list in `startUrls`, set a schedule (e.g. every day at 07:00) with the same input, and compare `price_value`, `availability` and `offers_count` across runs. New runs append to a fresh dataset — use Apify webhooks or the API to pipe rows into your spreadsheet/DB.

### Error items reference

| `error` | Meaning |
|---|---|
| `product_not_found` | ASIN/URL returns 404 or Amazon's "couldn't find that page". |
| `no_results_found` | Search/listing page has zero results. |
| `blocked` | Persistent bot check after retries with fresh sessions (CAPTCHAs are never solved). |
| `invalid_url` | Entry is not an Amazon URL, ASIN or keyword. |
| `fetch_error` / `parse_error` | Network/HTTP failure or an unrecognised page layout. |

Error rows are free and never stop the run.

### FAQ

**Why is a field empty (`null`)?** Amazon varies by product, marketplace and delivery location: some pages hide list price, coupons, BSR or the AI review summary. `null` means "not shown", not "failed" — the row itself is the success signal.

**Search gives fewer items than `maxItems`?** The query simply has fewer results, or later pages got blocked (those become a single free `blocked` error item, the collected items are kept).

**How do variants work?** By default a product row includes a `variants` array (ASIN + dimension + price when listed). With `scrapeVariants: true` each variant is additionally fetched and emitted as its own full row (each charged).

**Which marketplaces?** US, UK, DE, FR, ES, IT, CA, MX, BR, AE, SA, IN, JP, AU, NL, PL, SE, TR, SG, IE. Bare ASINs use `domain`; full URLs always keep their own country — mix freely.

**Proxies?** On Apify the actor uses Apify Proxy with a country matching each Amazon domain (a `amazon.de` request goes out from a German IP), rotating sessions with exponential backoff. Locally it runs direct without a proxy.

### How it compares

Generic Amazon scrapers either cover only search *or* only product pages, charge per result at a higher rate, or fail a visible share of runs under bot checks. This actor combines **search + detail + offers in one run**, charges **$0.002 per product** (error rows free), and treats blocks as data (typed error items after session rotation + backoff) instead of failing the run. If you only need raw HTML or a single marketplace, a thinner single-purpose scraper may be cheaper to run — compare the per-result price against your volume.

### Legal note

Public product data only: search, category and product pages that Amazon serves without login, limited to paths allowed by Amazon's `robots.txt` (`/s/`, `/dp/`, `/gp/product/`, `/gp/offer-listing/`). No accounts, no CAPTCHA solving, no personal data collected.

### Integrations

- **Apify API** — `GET https://api.apify.com/v2/actor-runs/{runId}/dataset/items?format=csv` (or `json`, `xlsx`) for the dataset.
- **Make / Zapier** — trigger on "new dataset items" after each scheduled run.
- **MCP** — query the actor through the Apify MCP server from Claude/AI assistants.
- **Webhooks** — notify your backend when a monitoring run finishes.

### Support

Issues and feature requests: open an issue on the actor's GitHub repo (linked from the Store page). For site-wide layout changes, reports with the failing ASIN + marketplace get priority.

# Actor input Schema

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

Amazon search/category/product URLs or bare ASINs, one per item. Full URLs keep their own marketplace; bare ASINs use 'domain'. Plain keywords are searched on 'domain'.

## `maxItems` (type: `integer`):

Max products returned per start URL. The run stops when any limit is reached.

## `domain` (type: `string`):

Amazon domain for bare ASINs and keyword searches, e.g. amazon.com, amazon.de, amazon.co.uk.

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

Page language, same options as Amazon's language menu (e.g. en, es, de, fr, it, pt, ja).

## `zipCode` (type: `string`):

Postal code for the Deliver-to location, in the site's own format (e.g. 10010, 10115, 160-0022). Controls price and availability.

## `scrapeOffers` (type: `boolean`):

Also scrape the offer list (other sellers) of each product. Increases requests and run time.

## `scrapeVariants` (type: `boolean`):

Emit each product variant as a separate result item. Increases requests and run time.

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

Residential proxies with a country matching the Amazon domain are REQUIRED: Amazon blocks datacenter IPs on the first request. The actor forces the RESIDENTIAL pool automatically when no groups are set. Locally the actor works without a proxy.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.amazon.com/s?k=wireless+mouse"
  ],
  "maxItems": 10,
  "domain": "amazon.com",
  "language": "en",
  "scrapeOffers": false,
  "scrapeVariants": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped items in the default dataset.

# 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 = {
    "startUrls": [
        "https://www.amazon.com/s?k=wireless+mouse"
    ],
    "maxItems": 10,
    "domain": "amazon.com",
    "language": "en",
    "scrapeOffers": false,
    "scrapeVariants": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami0089/amazon-search-detail-scraper-pro").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 = {
    "startUrls": ["https://www.amazon.com/s?k=wireless+mouse"],
    "maxItems": 10,
    "domain": "amazon.com",
    "language": "en",
    "scrapeOffers": False,
    "scrapeVariants": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dami0089/amazon-search-detail-scraper-pro").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 '{
  "startUrls": [
    "https://www.amazon.com/s?k=wireless+mouse"
  ],
  "maxItems": 10,
  "domain": "amazon.com",
  "language": "en",
  "scrapeOffers": false,
  "scrapeVariants": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call dami0089/amazon-search-detail-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami0089/amazon-search-detail-scraper-pro"
        }
    }
}
```

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/YilV1K5DXUCmUFwQa/builds/dxsMUIhRFUyk2sWLD/openapi.json
