# Amazon Scraper AIO | Products, Best Sellers, Prices & BSR (`tactful_anvil/amazon-product-search-scraper`) Actor

All-in-one Amazon scraper: keyword/URL search, full product pages (price, Best Sellers Rank, star breakdown, bullets, images, variants, seller) and the public Best Sellers & New Releases rankings. Filter by price, rating, reviews, Prime. 18 marketplaces. From $2 per 1,000 results.

- **URL**: https://apify.com/tactful\_anvil/amazon-product-search-scraper.md
- **Developed by:** [Mr Zack](https://apify.com/tactful_anvil) (community)
- **Categories:**
- **Stats:** 1 total users, 1 monthly users, 77.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 search 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?

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 Scraper AIO | Products, Best Sellers, Prices & BSR

Search Amazon by keyword or paste any Amazon search/category URL and get every product card as clean JSON — ASIN, title, price, list price, discount, rating, review count, **"bought in past month"**, Best Seller / Amazon's Choice badges, sponsored flag, Prime, coupon, image. Add ASINs (or product URLs) to pull **full product pages**: brand, availability, **Best Sellers Rank** (all categories), bullet points, description, high-res images, variants, seller / ships-from, specs, dimensions, weight.

Works on 18 marketplaces (amazon.com, .co.uk, .de, .ca, .fr, .it, .es, .com.au, .in, .co.jp, …). Prices are always returned in the marketplace's own currency. No browser, no proxies to configure — fast and cheap.

### Who uses this

- **Sellers & brands** — track competitor prices, BSR, review velocity and "bought last month" for a keyword or ASIN list.
- **Product researchers** — validate a niche in one run: median price, avg rating, sponsored share, total monthly demand (free `market-summary` row per keyword).
- **Repricers / price-monitoring** — schedule ASIN lists hourly, feed the dataset into Sheets or your DB.
- **Affiliate & content sites** — refresh price, rating, image and availability for the products you list.
- **Analysts / data teams** — structured Amazon data without maintaining selectors.

### Input

| Field | Description |
|---|---|
| `keywords` | Search queries, one per line (`"air fryer"`). |
| `searchUrls` | Full Amazon search/category URLs with filters (price, brand, Prime, rating). |
| `asins` | ASINs or `/dp/` URLs → full product detail rows. |
| `domain` | Marketplace (default `amazon.com`). |
| `maxResultsPerQuery` | Cards per keyword/URL (default 48, max 700; Amazon shows ≈22–60 per page). |
| `includeSponsored` | Keep sponsored cards (flagged `sponsored: true`). Default on. |
| `enrichDetails` | Also fetch the full product page for every search result. |
| `category`, `sort` | Department alias (`electronics`, `kitchen`, …) and sort (price, reviews, newest, best sellers). |
| `priceMin` / `priceMax` | **New in 0.0.3.** Price band in the marketplace currency (Amazon `low-price` / `high-price`; also applied to pasted URLs). |
| `minRating` / `minReviews` | **New in 0.0.3.** Keep only cards rated ≥ X / with ≥ N ratings — dropped cards are never charged. |
| `primeOnly` | **New in 0.0.3.** Prime-eligible cards only (`rh=p_85` on amazon.com + badge check on every marketplace). |
| `proxyConfiguration` | **New in 0.0.4.** Optional. Empty = built-in fallback chain (direct → Apify datacenter proxy → residential relay). Point it at your own residential proxy for the highest success rate on large runs. |
| `includeMarketSummary` | Free aggregate row per keyword (default on). |

```json
{ "keywords": ["standing desk"], "maxResultsPerQuery": 100, "includeSponsored": false,
  "asins": ["B0C33CHG99", "https://www.amazon.com/dp/B0CSZ7WBYW"], "domain": "amazon.com" }
```

### Output

**`search-result`** row (one per card):

```json
{ "type": "search-result", "position": 3, "page": 1, "asin": "B0HBWW3958", "title": "Wireless Earbuds, Bluetooth 5.3 …",
  "url": "https://www.amazon.com/dp/B0HBWW3958", "price": 19.97, "currency": "USD", "listPrice": 249.99, "discountPct": 92,
  "rating": 4.8, "reviewCount": 305, "boughtLastMonth": 7000, "sponsored": false, "isBestSeller": false, "isAmazonsChoice": true,
  "badges": ["Overall Pick"], "coupon": null, "isPrime": true, "otherVariants": 5, "usedNewOffers": null,
  "image": "https://m.media-amazon.com/images/I/61D5ZCSIymL.jpg", "query": "wireless earbuds", "domain": "amazon.com" }
```

**`product`** row (one per ASIN):

```json
{ "type": "product", "asin": "B0C33CHG99", "title": "Cosori TurboBlaze Air Fryer, 9-in-1, 6 Qt …", "brand": "Cosori",
  "price": 89.99, "currency": "USD", "listPrice": 119.99, "discountPct": 25, "availability": "In Stock", "inStock": true,
  "rating": 4.8, "reviewCount": 21639, "boughtLastMonth": 30000,
  "bestSellersRank": 23, "bestSellersRankCategory": "Kitchen & Dining",
  "bestSellersRanks": [{ "rank": 23, "category": "Kitchen & Dining" }, { "rank": 1, "category": "Air Fryers" }],
  "breadcrumbs": ["Home & Kitchen", "Kitchen & Dining", "Small Appliances", "Fryers", "Air Fryers"],
  "bullets": ["…"], "description": "…", "images": ["https://m.media-amazon.com/images/I/81R9sA3IyBL._AC_SL1500_.jpg", "…"],
  "variants": [{ "asin": "B0C33CHG99", "name": "Gray / Air fryer", "isCurrent": true }], "variationDimensions": { "color_name": ["Cream", "Gray", "…"] },
  "soldBy": "Amazon", "shipsFrom": "Amazon", "isFba": true, "otherSellersCount": null,
  "specs": { "Brand": "COSORI", "Capacity": "6 Quarts", "Item Weight": "13.2 pounds", "…": "…" },
  "manufacturer": "Cosori", "itemModelNumber": "CAF-DC601", "productDimensions": "14.4\"D x 11.8\"W x 11.9\"H" }
```

**`market-summary`** row (free, per keyword): `listings, organic, sponsored, sponsoredSharePct, priceMin, priceMedian, priceMax, avgRating, medianReviews, totalBoughtLastMonth, bestSellers[], amazonsChoice[]`.

Failed ASINs / blocked searches are pushed as `type: "failed"` rows and are **never charged**.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Search result row | $0.002 |
| Product detail row | $0.004 |
| Actor start | $0.001 |

1,000 search results ≈ **$2**. 1,000 full product pages ≈ **$4**. Market-summary, failed and duplicate rows are free.

### Notes

- Amazon rotates layouts and A/B tests constantly; if a field comes back `null` on a page where you can see it, open an issue with the ASIN and it gets fixed fast.
- `boughtLastMonth` is Amazon's lower bound (`"30K+"` → `30000`).
- Sponsored cards keep the ad click URL in `sponsoredLink`; `url` is always the canonical `/dp/ASIN`.
- Best Sellers lists, reviews and seller storefronts are separate use cases — this actor is search + product detail.

### Changelog

- **0.1.0 (9 Sep 2026) — All-in-one: Best Sellers, New Releases and star breakdown.** New `bestSellersCategories` / `bestSellersUrls` (+ `bestSellersList`, `bestSellersPages`) read Amazon's **public Best Sellers and New Releases rankings** — rank, ASIN, title, price, rating, review count and image, deduplicated, in the same run as your keyword search. Every product row now also carries **`ratingBreakdown`** (`star5`…`star1` percentages) at no extra request or charge. Honest limits: Amazon server-renders about **30 ranked items per page** (the rest of each 50 is JavaScript-loaded, so an HTTP scraper cannot see it), and **Movers & Shakers pages are not supported**. Nothing was removed or renamed, and the price did not change.
- **0.0.9 (9 Sep 2026) — Big runs no longer die.** A run with "fetch full product page" over a whole search page used to fail with an out-of-memory crash **after** the rows had already been delivered and charged. Fixed at the root: product rows are now flattened before they are stored (Amazon product pages are ~3 MB and V8 kept the whole page alive through every extracted field), concurrency adapts to the memory the run has, and the Actor's default memory is now 2 GB. Verified: the exact run that used to crash now finishes with 123 results, peaking at 1 GB of 2 GB.
- **0.0.6 (9 Sep 2026) — Field yang selama ini diam-diam kosong sekarang terisi.** Amazon menyimpan blok `<style>` **di dalam** kontainer konten (A+ description, badge kupon, widget penjual), jadi ekstraksi teks polos ikut memanen CSS. Akibatnya: `description` hampir selalu kosong, `coupon` kadang berisi potongan CSS, `otherSellersCount` sering null, dan `videoCount` **selalu** null karena markup `"videoCount"` sudah tidak ada di halaman Amazon. Semuanya diperbaiki: `description` sekarang jatuh ke konten A+ / deskripsi buku (dengan `descriptionSource` baru yang menyebut asalnya), `videoCount` dihitung dari thumbnail video (+ `hasVideo` baru), `coupon` dan `otherSellersCount` dibersihkan dari CSS. Tidak ada field lama yang dihapus atau berubah arti, dan tidak ada perubahan harga. Coverage terukur pada 34 produk live: description 5% → **88%**, videoCount 0% → **71%**, otherSellersCount 23% → **47%**, kebocoran CSS **0**.
- **0.0.4 (8 Sep 2026)** — reliability: every request now escalates *direct ×2 (fresh browser fingerprint) → proxy ×2 sessions (your `proxyConfiguration`, or Apify datacenter) → residential relay* instead of failing on Amazon's bot wall; parser and billing errors can no longer abort a run that already has data; run summary reports `directRetries`, `proxyUsed`, `proxyBlocked`.
- **0.0.3 (8 Sep 2026)** — price band (`priceMin`/`priceMax`), quality filters `minRating`/`minReviews`, `primeOnly`; filtered cards are never charged (`filteredOut` in the `SUMMARY` record). No existing field changed.
- **0.0.2 (7 Sep 2026)** — launch: keyword search + ASIN details, BSR, sponsored flag, market summary, residential fallback.

### Found this useful? A review helps more than you'd think

If this Actor saved you time, a short review on the **Reviews** tab of this Store page takes 30 seconds and is the only signal other buyers have before they spend anything. If something is broken instead, open a ticket on the **Issues** tab — parser bugs and field requests get fixed.

**Related Actors from the same account**

- [AliExpress Product Search Scraper](https://apify.com/tactful_anvil/aliexpress-product-search-scraper)
- [TikTok Shop Scraper AIO](https://apify.com/tactful_anvil/tiktok-shop-scraper)

# Actor input Schema

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

One search per line, exactly what you would type into the Amazon search box (e.g. "air fryer", "wireless earbuds").

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

Full amazon.\* URLs copied from the browser — search results with any filters (price, brand, Prime, rating), category browse pages (/s?i=…\&rh=…), Best Sellers lists are NOT supported here (use ASINs).

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

10-character ASINs or amazon.\*/dp/… URLs. Each one is fetched as a full product page (Best Sellers Rank, bullets, images, variants, seller, specs).

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

Marketplace for keyword searches and ASIN lookups. Prices are returned in that marketplace's currency.

## `maxResultsPerQuery` (type: `integer`):

Product cards to collect per keyword/URL (≈22 organic+sponsored per page, Amazon caps at 7–20 pages). Max 700.

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

Sponsored cards are returned with sponsored: true. Untick to keep only organic ranking.

## `enrichDetails` (type: `boolean`):

Adds a product-detail row (BSR, bullets, images, variants, seller, specs) for each search result — charged per product detail.

## `category` (type: `string`):

Amazon department alias for keyword searches, e.g. electronics, kitchen, beauty, toys-and-games, sporting, garden, pets. Empty = All departments.

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

Amazon sort for keyword searches.

## `priceMin` (type: `number`):

Lower price bound in the marketplace currency (Amazon `low-price`); also drops cheaper cards from pasted URLs. 0 = no filter.

## `priceMax` (type: `number`):

Upper price bound (Amazon `high-price`). 0 = no filter.

## `minRating` (type: `number`):

Keep only cards rated at least this (e.g. 4.3). Unrated cards are dropped. Dropped cards are never charged.

## `minReviews` (type: `integer`):

Keep only cards with at least this many ratings (proven sellers). Never charged when dropped.

## `primeOnly` (type: `boolean`):

Only Prime-eligible cards (Amazon `rh=p_85` filter on amazon.com + card badge check on every marketplace).

## `includeMarketSummary` (type: `boolean`):

One extra row per keyword (type: market-summary) with price min/median/max, avg rating, sponsored share, total bought last month, Best Seller / Amazon's Choice ASINs. Never charged.

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

Leave empty to use the built-in fallback chain (direct → Apify datacenter proxy → residential relay). Point it at your own residential proxy for the highest success rate on big runs.

## `bestSellersCategories` (type: `array`):

Scrape Amazon's public Best Sellers ranking for these category slugs (e.g. `kitchen`, `electronics`, `books`, `toys-and-games`). Amazon server-renders about 30 ranked products per page (the rest of each page of 50 is loaded by JavaScript, which an HTTP scraper cannot see) — raise 'Ranking pages' to go deeper. Leave empty to skip.

## `bestSellersUrls` (type: `array`):

Or paste full Amazon ranking URLs, e.g. https://www.amazon.com/gp/bestsellers/kitchen or https://www.amazon.com/gp/new-releases/electronics. Movers & Shakers pages are NOT supported.

## `bestSellersList` (type: `string`):

Which ranking to read when you give category slugs.

## `bestSellersPages` (type: `integer`):

How many ranking pages per category. Each page yields about 30 ranked products (page 1 = ranks 1-30, page 2 = ranks 51-80, and so on). Charged as search results.

## `variantPrices` (type: `boolean`):

For products that have variants, also fetch each variant's own page and add `variantPrices[]` — ASIN, variant name, price, list price, stock, rating and review count per variant. Costs one extra page load per variant (no extra charge), so keep the cap low on big runs.

## `maxVariantsPerProduct` (type: `integer`):

How many variants to price per product when the option above is on.

## Actor input object example

```json
{
  "keywords": [
    "air fryer"
  ],
  "domain": "amazon.com",
  "maxResultsPerQuery": 48,
  "includeSponsored": true,
  "enrichDetails": false,
  "sort": "relevance",
  "priceMin": 0,
  "priceMax": 0,
  "minRating": 0,
  "minReviews": 0,
  "primeOnly": false,
  "includeMarketSummary": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "bestSellersCategories": [],
  "bestSellersUrls": [],
  "bestSellersList": "bestsellers",
  "bestSellersPages": 1,
  "variantPrices": false,
  "maxVariantsPerProduct": 5
}
```

# Actor output Schema

## `products` (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 = {
    "keywords": [
        "air fryer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "bestSellersCategories": [],
    "bestSellersUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("tactful_anvil/amazon-product-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": ["air fryer"],
    "proxyConfiguration": { "useApifyProxy": False },
    "bestSellersCategories": [],
    "bestSellersUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("tactful_anvil/amazon-product-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": [
    "air fryer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "bestSellersCategories": [],
  "bestSellersUrls": []
}' |
apify call tactful_anvil/amazon-product-search-scraper --silent --output-dataset

```

## MCP server setup

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