# Amazon Product Search Scraper & API - Prices, ASINs, Ranks (`rel8ble/amazon-search-scraper`) Actor

Amazon product scraper and search API: search Amazon by keyword or URL on any marketplace (.com, .co.uk, .de, .co.jp, .in...). One row per product: rank, ASIN, title, price, list price, rating, ratings count, bought last month, sponsored/badge flags, URL. Optional details. $2.00 per 1,000 results.

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

## Pricing

from $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 Product Search Scraper & API - Prices, ASINs, Ranks

**Amazon search scraper** for product research and rank tracking: give it keywords or Amazon search URLs from amazon.com, amazon.co.uk, amazon.de, amazon.co.jp, amazon.in or any other marketplace and get the ranked product list as clean JSON, CSV or Excel: position, **ASIN**, title, price, list price, star rating, ratings count, "bought in past month", sponsored flag and Best Seller / Amazon's Choice badges. Use it as an **Amazon product scraper**, an **Amazon search results scraper** for keyword rank tracking, or an unofficial **Amazon product search API**; turn on `includeDetails` to also get brand, bullet points, seller, Best Sellers Rank and specs from each product page.

It reads the HTML Amazon already sends over plain HTTP through residential proxies in the marketplace's country, with **no headless browser and no login**, so a 50-product search takes seconds.

### What you get

One dataset item per product, in the order Amazon shows them:

- **Position**: `position` on the overall list, `organicPosition` among non-sponsored results, `page`, `isSponsored`.
- **Identity**: `asin`, `title`, `url` (`https://www.amazon.<tld>/dp/ASIN`), `imageUrl` (full size) and `thumbnailUrl`, `brand` when the card shows a brand row (otherwise in `details`).
- **Price**: numeric `price` and `listPrice` (strike-through "List:" / "Typical price:"), ISO `currency`, raw `priceText` / `listPriceText`, `unitPriceText` ("$14.50/count"), `offersText` ("7+ used & new offers"), `dealText` ("Limited time deal"), `couponText`, `primeExclusive`, `isPrime`, `deliveryText`.
- **Social proof**: `rating` (0-5), `ratingsCount`, `boughtLastMonth` (number) and `boughtLastMonthText` ("10K+ bought in past month").
- **Badges**: `isBestSeller`, `isAmazonChoice` (includes "Overall Pick"), `isSmallBusiness`, `variantsText` ("+5 other colors/patterns").
- **Context**: `keyword`, `searchUrl`, `marketplace`, `scrapedAt`.
- **With `includeDetails`**: a `details` object with `brand`, `bulletPoints`, `description`, `availability`, `soldBy`, `shipsFrom`, `savingsText`, `bestSellersRank` (`[{ rank, category }]`), `categories` (breadcrumb path), `images`, `overview` (the "Brand / Color / Ear placement" table), `specs` (dimensions, weight, model number, date first available...), `manufacturer`, `modelNumber`, `dateFirstAvailable`, `variantCount`, `variationNames`, `couponText`, `deliveryText`.

### Sample output

Real rows from two runs (from `sample-output.json`; only two saved real rows exist):

| keyword | marketplace | position | asin | title | priceText | rating | ratingsCount | boughtLastMonthText |
|---|---|---|---|---|---|---|---|---|
| wireless earbuds | amazon.com | 3 | B0FQFB8FMG | Apple AirPods Pro 3 Wireless Earbuds with Active Noise Cancellation ... | $199.00 | 4.4 | 16,100 | 10K+ bought in past month |
| kopfhörer | amazon.de | 3 | B0FQF32239 | Apple AirPods Pro 3 Wireless In-Ear Headphones, Active Noise Cancellation ... | USD 201.50 | 4.6 | 11,400 | 5K+ bought in past month |

### Use cases

- **Keyword and rank tracking**: where your products and your competitors' rank for a keyword, daily, per marketplace; how many sponsored slots sit above the first organic result.
- **Product research and sourcing**: price bands, rating levels and "bought last month" demand signals for any niche, on any marketplace.
- **Price monitoring and repricing**: schedule a keyword set and diff `price` / `listPrice` by ASIN.
- **Catalog building**: collect ASINs for a category, then enrich with `includeDetails` for bullets, specs and images.
- **AI agents**: an agent can ask for "the top 20 standing desks on amazon.de under 300 EUR" and get structured rows back through MCP.

### Pricing

$2.00 per 1,000 results (pay per result; failed requests are never charged; one result = one product, with or without details). The most-used Amazon product scraper on the Store charges $5.00 per 1,000.

### FAQ

**Is it legal to scrape Amazon search results?**
It collects only publicly available product listing data, not personal data. You're responsible for using it in line with Amazon's terms of service and applicable law. This is not legal advice.

**Does it need a login, cookies or a browser?**
No. Plain HTTPS requests only. Review texts are not included (Amazon hides them behind a login); ratings and counts are.

**How fast is it and how many results can I get?**
A 50-product search takes seconds. Amazon stops paginating after about 7 pages, so expect about 300 products per search; use narrower keywords, departments or price bands for more. `includeDetails` adds one request per product and makes runs several times slower.

**Which marketplaces work, and can I get organic results only?**
Any `amazon.*` domain: .com, .co.uk, .de, .fr, .it, .es, .nl, .se, .pl, .be, .ie, .ca, .com.mx, .com.br, .com.au, .co.jp, .in, .sg, .ae, .sa, .eg, .com.tr. Set `includeSponsored: false` for organic results only.

**Can I schedule it or use it via API, and what about proxies?**
Yes: Apify schedules, the REST API, JavaScript / Python clients, Make, Zapier, n8n and MCP. Residential proxies in the marketplace's country are the default (their traffic is billed separately by Apify); captchas, 503s and WAF challenges are retried on a fresh IP, up to 8 times.

### How to use

1. Enter one or more **Search keywords** (e.g. `wireless earbuds`, `standing desk`), pick the **Marketplace domain**, and optionally a **Department**, **Sort order** and **Min / Max price**. Or paste full **Amazon search URLs** with any filters already applied (price, brand, Prime, rating, category node...).
2. Set **Max products per search** (default 50; up to 500, usually ~300 available). Untick **Include sponsored products** for organic results only. Tick **Open each product page** when you need brand, bullets, BSR, seller and specs.
3. Click **Start**. Download the results as JSON, CSV, Excel or HTML from the **Output** tab, or pull them through the Apify API, Make, Zapier, n8n or an MCP client.

### Input example

| Field | Default | Description |
|---|---|---|
| `keywords` | `["wireless earbuds"]` (demo) | One search per line |
| `searchUrls` | - | Full Amazon search/category URLs, any marketplace, filters included |
| `domain` | `amazon.com` | Marketplace for `keywords` |
| `department` | `aps` (all) | Amazon department alias (`electronics`, `fashion`, `beauty`, `stripbooks`...) |
| `sort` | `relevance` | `price-asc`, `price-desc`, `reviews`, `newest`, `bestsellers` |
| `minPrice` / `maxPrice` | - | Whole units in the marketplace currency |
| `maxItemsPerSearch` | 50 | 1-500 |
| `includeSponsored` | true | Keep ad listings (flagged) |
| `includeDetails` | false | Open each product page (one extra request per product) |
| `proxyConfiguration` | Residential | Apify residential proxies in the marketplace's country (recommended) |

Example: two keywords on amazon.com, electronics only, sorted by reviews, $20-$100, organic results only:

```json
{
    "keywords": ["wireless earbuds", "bluetooth speaker"],
    "domain": "amazon.com",
    "department": "electronics",
    "sort": "reviews",
    "minPrice": 20,
    "maxPrice": 100,
    "maxItemsPerSearch": 100,
    "includeSponsored": false
}
```

Example: a filtered amazon.de search URL with full product details:

```json
{
    "searchUrls": ["https://www.amazon.de/s?k=kopfh%C3%B6rer&i=electronics&rh=p_36%3A2000-5000"],
    "maxItemsPerSearch": 30,
    "includeDetails": true
}
```

### Output example

One dataset item per product. From a real run (amazon.de, "kopfhörer", first organic result; prices as quoted to the visitor's country):

```json
{
    "position": 3,
    "organicPosition": 1,
    "asin": "B0FQF32239",
    "title": "Apple AirPods Pro 3 Wireless In-Ear Headphones, Active Noise Cancellation, Heart Rate Monitor, Hearing Aid Function, Bluetooth Headphones, 3D Audio, Hi-Fi Sound, Charging via USB-C",
    "brand": null,
    "price": 201.5,
    "priceText": "USD 201.50",
    "listPrice": 234.47,
    "listPriceText": "USD 234.47",
    "currency": "USD",
    "unitPriceText": null,
    "offersText": null,
    "rating": 4.6,
    "ratingsCount": 11400,
    "boughtLastMonth": 5000,
    "boughtLastMonthText": "5K+ bought in past month",
    "isSponsored": false,
    "isBestSeller": false,
    "isAmazonChoice": false,
    "isPrime": false,
    "primeExclusive": false,
    "dealText": null,
    "couponText": null,
    "deliveryText": "USD 12.14 delivery Mon 26 Oct Delivers to United States",
    "variantsText": null,
    "isSmallBusiness": false,
    "imageUrl": "https://m.media-amazon.com/images/I/61VHVpa4wvL.jpg",
    "thumbnailUrl": "https://m.media-amazon.com/images/I/61VHVpa4wvL._AC_UY218_.jpg",
    "url": "https://www.amazon.de/dp/B0FQF32239",
    "page": 1,
    "keyword": "kopfhörer",
    "searchUrl": "https://www.amazon.de/s?k=kopfh%C3%B6rer&i=electronics",
    "marketplace": "amazon.de",
    "scrapedAt": "2026-10-08T17:54:36.611Z"
}
```

With `includeDetails: true`, each item also carries (shortened):

```json
{
    "details": {
        "brand": "Apple",
        "bulletPoints": ["WORLD'S BEST IN-EAR ACTIVE NOISE CANCELLATION — Removes up to 2x more unwanted noise ...", "..."],
        "price": 199,
        "listPrice": 249,
        "savingsText": "-20%",
        "availability": "In Stock",
        "soldBy": null,
        "shipsFrom": "Amazon.com",
        "rating": 4.4,
        "ratingsCount": 16166,
        "boughtLastMonth": 10000,
        "bestSellersRank": [{ "rank": 200, "category": "Electronics" }, { "rank": 8, "category": "Sleep Earbuds" }],
        "categories": ["Electronics", "Headphones, Earbuds & Accessories", "Headphones & Earbuds"],
        "images": ["https://m.media-amazon.com/images/I/61solmQSSlL.jpg", "..."],
        "overview": { "Brand": "Apple", "Color": "White", "Ear Placement": "In Ear" },
        "specs": { "Product Dimensions": "1.1 x 0.8 x 1.2 inches", "Item Weight": "9.07 g", "Manufacturer": "Apple", "Item model number": "MFHP4LL/A" },
        "modelNumber": "MFHP4LL/A",
        "dateFirstAvailable": "September 8, 2025",
        "deliveryText": "FREE delivery Tuesday, October 13"
    }
}
```

Fill rates on a 40-product test (amazon.de): ASIN, title, image, URL and currency 100%; rating and ratings count 98%; price 90%; list price 85%; delivery text 90%; "bought last month" 65%. On search cards `brand` is usually `null` (Amazon rarely prints a brand row there); with `includeDetails` brand, bullets, availability, images and the overview table were 100% on a 12-product test, Best Sellers Rank and categories 67%.

### Integrations

- **Make, Zapier and n8n**: start runs and send new prices or rankings to Sheets, Slack, Airtable or your database.
- **Google Sheets**: export the dataset straight into a spreadsheet, or refresh it on a schedule.
- **Apify API**: run the actor and fetch results over REST, or with the official JavaScript and Python clients.
- **Webhooks**: get notified when a run finishes and process the data right away.
- **Schedules**: run the same keywords daily or hourly to track rank and price over time.
- **MCP for AI agents**: through the Apify MCP server (https://mcp.apify.com), Claude, ChatGPT, Cursor and other agents can call this Amazon search API directly and read the results.

### Limits (read before large runs)

- **About 300 products per search.** Amazon stops paginating after ~7 pages for most searches. Use narrower keywords, departments or price bands to see more.
- **Search cards show the default offer only.** Variations (sizes, colours) are summarised in `variantsText`; open details for `variantCount` and `variationNames`.
- **Prices are what Amazon shows to a visitor in the marketplace's country** (the default residential proxy country). With other proxy countries Amazon may quote export prices in another currency; `currency` follows the text shown.
- **Rankings change constantly** and sponsored slots rotate per request. Use `scrapedAt`, `position` and `organicPosition` to build time series.
- **Residential proxies are the default** because Amazon blocks most datacenter IP ranges. Datacenter proxies work with more retries and occasional failed searches.
- **Reviews text is not included** (Amazon hides reviews behind a login). Ratings and counts are.

### How it works (for developers)

A search page is one GET per page (`/s?k=...&page=N`), parsed with Cheerio: each `s-search-result` card gives the ASIN, title (headline plus its continuation row), prices from the `price-recipe` block, rating and counts from the `reviews-block`, badges from the status-badge and deal components, and the sponsored flag from the `/sspa/click` link or the sponsored label. Pagination follows the "Next" link until `maxItemsPerSearch`, the page limit or the end of results; ASINs are deduplicated per search. Product pages are parsed for the byline, feature bullets, buy box, merchant block, `prodDetTable` / tech-spec tables, detail bullets, breadcrumbs and the dynamic image map. Every field is read defensively: a changed card just has fewer fields.

Run it locally:

```bash
npm install
npm test                                  # parser tests on saved fixtures
node src/main.js                          # input in storage/key_value_stores/default/INPUT.json
```

# Actor input Schema

## `keywords` (type: `array`):

Provide these or searchUrls. One search per line, written as you would type it into Amazon's search box: "wireless earbuds", "standing desk", "nike running shoes men". Each keyword is searched on the marketplace in domain, within department, sorted by sort, and returns up to maxItemsPerSearch products. Default \["wireless earbuds"] (demo).

## `searchUrls` (type: `array`):

Optional. Full Amazon search result URLs from any marketplace, one per line, with any filters already applied (price, brand, Prime, rating, category node...), e.g. https://www.amazon.de/s?k=kopfh%C3%B6rer\&i=electronics\&rh=p_36%3A2000-5000. Each URL carries its own marketplace and filters; domain, department, sort and price settings do not apply to them.

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

Optional. Amazon marketplace used for keywords: "amazon.com", "amazon.co.uk", "amazon.de", "amazon.fr", "amazon.it", "amazon.es", "amazon.ca", "amazon.com.au", "amazon.co.jp", "amazon.in", "amazon.com.mx", "amazon.com.br", "amazon.nl", "amazon.se", "amazon.pl", "amazon.sg", "amazon.ae", "amazon.sa", "amazon.eg", "amazon.com.tr", "amazon.be", "amazon.ie". Default "amazon.com". Prices come back in the marketplace currency.

## `department` (type: `string`):

Optional. Amazon department alias to search within (the "i=" parameter): "aps" (All, default), "electronics", "computers", "fashion", "beauty", "hpc" (health), "home-garden" or "garden", "kitchen", "toys-and-games", "sporting", "automotive", "pets", "grocery", "office-products", "tools", "stripbooks" (books), "videogames", "baby-products", "luggage", "industrial", "appliances", "arts-crafts", "software", "music", "movies-tv", "pet-supplies". Any alias Amazon accepts works.

## `sort` (type: `string`):

Optional. "relevance" (Amazon's default ranking), "price-asc", "price-desc", "reviews" (average review), "newest" (newest arrivals), "bestsellers" (best sellers). Default "relevance".

## `minPrice` (type: `integer`):

Optional. Lowest price in the marketplace's currency, whole units (e.g. 20 for $20 / 20 EUR). Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Optional. Highest price in the marketplace's currency, whole units (e.g. 100). Leave empty for no maximum.

## `maxItemsPerSearch` (type: `integer`):

Optional. Products to save per keyword or URL, integer 1-500. Default 50. Amazon returns 16-60 products per page and up to about 7 pages (300+ products) per search; set 20 for a quick answer, 300 for everything. Sponsored and organic results count together.

## `includeSponsored` (type: `boolean`):

Optional boolean. true (default) = keep sponsored (ad) listings too, flagged with isSponsored: true and organicPosition: null. false = organic results only.

## `includeDetails` (type: `boolean`):

Optional boolean. true = also open every product's page and add a details object: brand, bullet points, description, availability, seller, ships from, Best Sellers Rank per category, category path, all images, specs (dimensions, weight, model number, date first available), variations. Costs one extra request per product (still one result) and makes the run several times slower. Default false.

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

Optional, advanced. Parallel requests, integer 1-20. Default 5. Keep it low; Amazon rate-limits aggressively.

## `maxRequestRetries` (type: `integer`):

Optional, advanced. Retries per blocked or failed request, integer 0-20; each retry uses a new proxy session. Default 8.

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

Optional, advanced. Apify Proxy settings object. Default: Apify residential proxies in the marketplace's country, which Amazon rarely blocks and which return local prices and delivery dates. Datacenter proxies ({"useApifyProxy": true}) work but see more captchas and retries.

## Actor input object example

```json
{
  "keywords": [
    "wireless earbuds"
  ],
  "domain": "amazon.com",
  "department": "aps",
  "sort": "relevance",
  "maxItemsPerSearch": 20,
  "includeSponsored": true,
  "includeDetails": false,
  "maxConcurrency": 5,
  "maxRequestRetries": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All products found: position, ASIN, title, price, list price, rating, ratings count, bought last month, sponsored flag, badges, image, URL and (optionally) product-page details.

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

Per-search counts, pages read, Amazon's reported total and stop reasons.

# 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 = {
    "keywords": [
        "wireless earbuds"
    ],
    "maxItemsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/amazon-search-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 = {
    "keywords": ["wireless earbuds"],
    "maxItemsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/amazon-search-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 '{
  "keywords": [
    "wireless earbuds"
  ],
  "maxItemsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call rel8ble/amazon-search-scraper --silent --output-dataset

```

## MCP server setup

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