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

Scrape Amazon products from URLs, keywords or ASINs across 23 marketplaces. Get price, Buy Box seller, stock, delivery, rating, reviews, Best Sellers Rank, variants, offers and specs as clean JSON. Monitor mode tracks price and stock changes. No login needed.

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

## Pricing

from $2.45 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### What is Amazon Product Scraper?

**Amazon Product Scraper** extracts public product data from Amazon, such as price, Buy Box seller, stock, ratings and Best Sellers Rank, so you can track prices and research products without copying pages by hand. Paste Amazon URLs, or type search keywords or ASINs (Amazon's product IDs), choose from 23 Amazon marketplaces and click **Start**; no coding is needed. Each run on the free Apify plan returns at most 10 rows, and getting more rows per run needs a paid Apify plan.

This Amazon scraper saves one row per product while the run is going. You can download the finished Amazon product dataset as JSON, CSV, Excel, XML or HTML.

- **Track prices and stock:** schedule runs in monitor mode to use it as an Amazon price tracker or Amazon stock tracker. Each row lists what changed since the previous run.
- **Watch the Amazon Buy Box:** see who sells and ships each product, whether Amazon fulfills it, and collect Amazon seller data such as seller ratings and business addresses.
- **Research products:** compare ratings, Amazon's AI review summary, "bought in past month" text and Best Sellers Rank, as you would in an Amazon product research tool.
- **Compare stores:** look up the same ASIN on several marketplaces for Amazon price comparison between countries.
- **Follow search positions:** record organic and sponsored positions in search results for Amazon competitor analysis.
- **Enrich a catalog:** fill your Amazon product catalog with images, specifications, GTINs and variants, or feed the rows into LLM pipelines.

**Amazon Product Scraper is not an official Amazon product API. It needs no Amazon account and no API keys, because it reads the same public pages a shopper sees.**

#### What can Amazon Product Scraper do?

- 🔗 **Scrape Amazon products** from product, search, category, Best Sellers, New Releases, Movers & Shakers, Most Wished For, seller and storefront URLs, plus amzn.to short links
- 🔍 **Search keywords and look up ASINs** on the marketplaces you select (23 stores available)
- 🎯 **Filter listings** by price range, star rating, number of ratings, Prime, Amazon sidebar filters, title words, sponsored products and sort order
- 📍 **Set the delivery location** by ZIP or postcode or by country, plus the page language and currency
- 🔔 **Monitor changes between runs**: price, stock, Buy Box seller, rank, rating, offers count and coupon
- ⚡ **Fast mode** that saves listing data only, when you don't need full product pages
- 📦 **Export and automate**: JSON, CSV, Excel, XML or HTML downloads, API access, schedules and integrations
- 🛡️ **Proxy handling**: starts without a proxy and switches to Apify Proxy automatically when Amazon blocks requests (if Apify Proxy is available to your account)

***

### What data can Amazon Product Scraper extract?

Each row is one product. As an Amazon product data scraper, it fills these fields (names as in the Output tab and the API):

| | | |
|---|---|---|
| 📝 Title and brand: `title`, `brand`, `author` | 🔗 URL and IDs: `url`, `asin`, `parentAsin`, `gtin` | 💲 Prices: `price`, `listPrice`, `typicalPrice`, `savingsPercent`, `unitPrice`, `usedPrice` |
| 🛒 Buy Box: `buyBox` (sold by, ships from, fulfillment, FBA flag) | 👤 Sellers and offers: `seller`, `offersCount`, `offers`, `lowestOfferPrice` | 📦 Stock: `inStock`, `inStockText`, `stockLeft`, `maxOrderQuantity` |
| 🚚 Delivery: `delivery`, `fastestDelivery`, `isPrime`, `locationText` | ⭐ Ratings: `stars`, `starsBreakdown`, `reviewsCount` | 💬 Reviews: `topReviews`, `aiReviewsSummary` |
| 🏆 Ranks and badges: `bestsellerRanks`, `isAmazonChoice`, `bestsellerBadge`, `dealBadge` | 🏷️ Deals: `coupon`, `promotions`, `subscribeAndSavePrice` | 📈 Demand: `monthlyPurchaseVolume`, `monthlyPurchaseVolumeMin` |
| 📸 Media: `thumbnailImage`, `highResolutionImages`, `videos` | 📄 Content: `description`, `features`, `aPlusContent`, `brandStory` | 🔧 Specifications: `attributes`, `productOverview`, `dimensions`, `weight`, `modelNumber`, `manufacturer` |
| 🎨 Variants: `variantAsins`, `variantDetails`, `priceRange` | 📍 Position in lists: `categoryPageData`, `bestsellerPageData` | 📅 Run info: `status`, `changes`, `marketplace`, `scrapedAt` |

A few fields in more detail:

- **Prices:** as an Amazon price scraper, it records the Buy Box price, list and typical price, savings, unit price, used price, shipping price and Subscribe & Save price, each with its currency.
- **Ranks:** `bestsellerRanks` holds the Amazon best seller rank for each category shown on the product page, with the category name and link.
- **Images:** it works as an Amazon product image scraper only in the sense that it returns image URLs (thumbnail, gallery and full size). It does not download image files.
- **Sellers:** with **Scrape seller profiles** on, it also works as an Amazon seller scraper. It adds seller rating, rating count, business name and address for the Buy Box seller and for offer sellers (not for Amazon itself).

> **Note:** a field stays empty when Amazon doesn't show it for that product. `price` can be empty when there is no featured offer, or when Amazon shows the price only in the cart (`priceHidden` is then `true`). When there is no featured offer and **Fill missing price from offers** is on (default), `lowestOfferPrice` and `lowestOfferSeller` come from the other offers. `offers` stays empty unless **Max seller offers per product** is above 0, and `topReviews` and `aiReviewsSummary` are empty when **Include reviews** is off.

#### What data can't Amazon Product Scraper extract?

- Full review lists: only the top reviews shown on the product page and Amazon's AI review summary
- Image or video files: only their URLs
- Price history charts: monitor mode compares with the previous run only
- Exact sales numbers: only Amazon's "bought in past month" text and Best Sellers Rank
- Data behind a login, such as orders, cart or account data
- Manufacturer attributes and product comparison tables: the `manufacturerAttributes` and `productComparison` columns exist in the output, but the current version always leaves them empty (`null`)

***

### How to scrape Amazon product data

Amazon Product Scraper is designed for an easy start, even if you have never tried to scrape Amazon data before. This is the recommended first run:

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [Amazon Product Scraper](https://apify.com/insights_data/amazon-product-scraper).
3. In **Amazon URLs**, paste one search URL, for example `https://www.amazon.com/s?k=keyboard`. Or leave the URLs empty and type `keyboard` in **Search keywords** (it searches amazon.com by default). Keep **Max products per input** at 10.
4. Click **Start**. Rows appear in the **Output** tab while the run is going.
5. Download your data: in Apify Console, open **Storage → Datasets**, select the run's dataset, select **Export**, choose a format (JSON, CSV, Excel, XML or HTML) and select **Download**.

That's how to scrape Amazon without writing any code. This first run saves up to 10 products with full details, so the results part of the bill is at most about $0.035. Then open the run's page and note its cost, which lets you estimate bigger runs (see pricing below). When the rows look right, add more keywords, ASINs, filters or marketplaces.

***

### Amazon Product Scraper pricing: how much does it cost to scrape Amazon?

Amazon Product Scraper uses **pay-per-event** pricing. The bill for a run has three parts:

| Part | Price | When it's charged |
|---|---|---|
| 💲 Results | **$3.50 per 1,000 results** ($0.0035 each) on the Free plan (lower on paid plans, see below) | Each saved row with status `OK` (full product) or `CARD` (fast mode). `NOT_FOUND` and `FAILED` rows are saved but not charged. With **Save only changed products**, unchanged products are neither saved nor charged. |
| 🚀 Actor start | $0.00005 per GB of run memory | Once per run: $0.00005 at the default 1 GB memory |
| ⚙️ Apify platform usage | Paid by you, on top of the two events above | The compute, storage and any Apify Proxy traffic the run uses. This README gives no fixed figure for it, because it depends on your settings and on how Amazon responds. |

| Apify plan | Price per result | Price per 1,000 results |
|---|---|---|
| Free | $0.0035 | $3.50 |
| Starter | $0.00315 | $3.15 |
| Scale | $0.0028 | $2.80 |
| Business and higher | $0.00245 | $2.45 |

Paid Apify plans get a lower result price. The plan discount applies to that price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

What you pay for results at the Free plan price (the start fee is under a tenth of a cent per run):

| Results | Results cost |
|---|---|
| 10 | about $0.035 + platform usage |
| 100 | about $0.35 + platform usage |
| 1,000 | about $3.50 + platform usage |

**How to estimate your total:** run 10 products with the settings you plan to use, then open the run's page in Apify Console, where [Apify shows the cost of each run](https://docs.apify.com/platform/actors/running/actors-in-store). Multiply that run's platform usage by 10 for about 100 products, or by 100 for about 1,000. Treat it as a rough guide: blocks, proxy switches and extra options change it. The same test run also shows how long a run takes with your settings; this README gives no fixed run time.

- Fast mode costs the same per row, but it opens fewer pages, so it uses less platform usage.
- **Max seller offers per product**, **Scrape seller profiles** and **Scrape variant prices** load extra pages. They add platform usage, not charged rows. **Variants as separate rows** adds charged rows.
- The result price depends on your Apify plan: $3.50 per 1,000 results on the Free plan, down to $2.45 on Business (see the plan table above).

**Maximum charge limit:** Apify lets you [define a maximum charge limit when you start a run](https://docs.apify.com/platform/actors/running/actors-in-store) (`maxTotalChargeUsd` in the API). When the run reaches it, Amazon Product Scraper stops cleanly and keeps the rows already saved; its status message calls this the "spend limit". See the [pricing tab](https://apify.com/insights_data/amazon-product-scraper/pricing) for the event list.

#### Is Amazon Product Scraper free?

You can try it on the free Apify plan. The [Apify Free plan](https://apify.com/pricing) includes $5 of platform usage per month, and results are charged at $0.0035 each on the Free plan. On the free plan:

- Each run returns at most 10 rows. To get more than 10 rows in one run, you need a paid Apify plan.
- Rows that could not be loaded (`NOT_FOUND`, `FAILED`) count toward the 10, even though they are not charged.
- **Max products per input** is lowered to 10 if you set a higher value or 0.
- The log mentions the limit at the start of every free-plan run. When a run stops at 10 rows, the final status message explains why.
- A new run does not continue where the previous run stopped. The Actor adds no monthly limit on the number of runs.

Paid Apify plans have no per-run cap from the Actor.

***

### Amazon Product Scraper input

To run Amazon Product Scraper, you need **at least one Amazon URL, search keyword or ASIN**. Any mix works, and every other field has a default. With none of the three, the run fails with "Nothing to scrape: add Amazon URLs, keywords or ASINs".

Here's an example that searches Amazon.com for "keyboard" and saves up to 10 products with full details:

```json
{
  "urls": ["https://www.amazon.com/s?k=keyboard"],
  "maxItemsPerStartUrl": 10
}
```

See the [input tab](https://apify.com/insights_data/amazon-product-scraper/input-schema) for every field.

#### Settings most people change

| Setting | What it does | Default |
|---|---|---|
| 🔗 **Amazon URLs** or 🔍 **Search keywords** | What to scrape: paste links or type search words (ASINs work too) | empty |
| 🌐 **Marketplaces for keywords and ASINs** | Which Amazon stores to search | amazon.com |
| 📦 **Max products per input** | How many products per URL, keyword or ASIN | 10 |
| 📋 **Scrape full product details** | Off = fast mode with listing data only | on |
| 📮 **Delivery ZIP / postcode** | Prices, stock and delivery for that address | store's home country |
| 🔔 **Monitor changes between runs** | Lists what changed since the previous run | off |

Everything else is optional. The sections below explain each setting in detail; the ones marked (advanced) are settings that most people can leave at their defaults.

#### Amazon URLs, keywords and ASINs

- **Amazon URLs** (`urls`): paste one or more URLs. Product pages (`/dp/ASIN`) make it an Amazon product page scraper, and search pages (`/s?k=`) make it an Amazon search results scraper. It also takes categories (`/b?node=`), seller pages (`/sp?seller=`), storefronts (`/s?me=`) and amzn.to short links. With Best Sellers, New Releases, Movers & Shakers and Most Wished For lists, it works as an Amazon best sellers scraper. Each URL keeps its own store. Other URLs are skipped with a log line, without a row or a charge.

- **Search keywords** (`keywords`): each keyword is searched once on every selected marketplace.

- **ASINs** (`asins`): an Amazon ASIN lookup on every selected marketplace, so you can use it as an Amazon ASIN scraper for cross-store checks.

- **Marketplaces for keywords and ASINs** (`marketplaces`): 23 stores, default `amazon.com`. They apply only to keywords and ASINs.

- ✅ Good: `"asins": ["B07WJ5D3H4"]` with `"marketplaces": ["amazon.com", "amazon.co.uk"]` gives 2 lookups

- ❌ Bad: selecting `amazon.de` to change the store of an `amazon.com` URL (URLs keep their own store)

> ⚠️ Many keywords × many marketplaces = many inputs, and each one has its own **Max products per input** limit.

#### Max products per input

`maxItemsPerStartUrl` (default 10) counts per input: one URL, one keyword on one marketplace, or one ASIN on one marketplace. It is not a total for the run. 0 means no per-input limit on paid plans. The limit counts every listed product that passes your filters, so duplicates that get skipped and products that later fail to load still use it up.

- ✅ Good: `10` for a first test
- ❌ Bad: `0` on a large search with **Deep search** on and no maximum charge limit

> ⚠️ On the free plan, this value is lowered to 10 if you set a higher value or 0, and the whole run stops at 10 rows.

#### Full product details or fast mode

**Scrape full product details** (`scrapeProductDetails`, on by default) opens every product page, so you get the complete record from the Amazon product details scraper mode. Off means fast mode for search, category, best-seller and seller inputs: rows get the status `CARD` and contain only the data shown in the listing. Product URLs and ASINs always open the product page.

In fast mode, duplicates are not removed, so the same product can appear twice (for example as an organic and a sponsored result), and some best-seller list items may keep only the ASIN and rank. The FAQ has a side-by-side comparison of the two modes.

- ✅ Good: fast mode for quick price and rank checks of a search
- ❌ Bad: fast mode when you need the Buy Box, offers or reviews

> ⚠️ `CARD` rows are charged like full rows. Fast mode only lowers platform usage, because it opens fewer pages.

#### Delivery location, language and currency

The delivery location follows this order: **Delivery ZIP / postcode** (`zipCode`) first, then **Delivery country** (`countryCode`, 2 letters, ignored when a ZIP is set), then **Deliver to the store's home country** (`autoLocation`, on by default, used only when neither is given). Check `locationApplied` and `locationText` in each row to see what Amazon accepted.

**Language** (`language`) is checked against the languages the store offers; if it isn't offered, the store default is used and the log says so. **Currency** (`currency`): Amazon offers other currencies only when delivering to another country. Otherwise prices stay in the store's currency and the log says so.

- ✅ Good: `"zipCode": "10001"` on amazon.com
- ❌ Bad: `"currency": "EUR"` on amazon.com without a foreign `countryCode`

#### Monitor mode for price and stock tracking

Turn on **Monitor changes between runs** (`monitorMode`), keep the same **Monitor list name** (`monitorListName`, default `default`) and schedule the Actor. That turns it into an Amazon price monitoring tool: each row gets a `changes` list compared with the previous run of the same list. Tracked fields are price, list price, stock, Buy Box seller, fulfillment, stars, number of ratings, main Best Sellers Rank, offers count, coupon, deal badge, the "bought in past month" minimum and the title.

The first run marks every product as new. Only full product rows (status `OK`) are tracked. With **Save only changed products** (`onlyChanged`), unchanged products are neither saved nor charged; without monitor mode, this option has no effect.

On the first run, every product gets `[{ "field": "*", "old": null, "new": null, "change": "NEW_PRODUCT" }]`. On later runs, `changes` lists each tracked field that moved. This example shows the shape with made-up values:

```json
"changes": [
  { "field": "price", "old": 11.7, "new": 11.11, "change": { "delta": -0.59, "percent": -5.04 } },
  { "field": "inStock", "old": true, "new": false, "change": null }
]
```

To run it every day, create an [Apify schedule](https://docs.apify.com/platform/schedules) for the Actor. **Cost example (paid plan):** 50 ASINs checked once a day for 30 days = 1,500 results = at most about $4.73 on Starter, $4.20 on Scale or $3.68 on Business, plus 30 start fees (under a cent in total) and platform usage. The first run is charged for every product, because each one is new. After that, **Save only changed products** charges only new or changed products.

- ✅ Good: `"monitorMode": true`, `"monitorListName": "my-watchlist"`, run on a daily schedule
- ❌ Bad: monitor mode with fast mode (`CARD` rows get no changes)

#### Skip duplicate products (advanced)

**Skip duplicate products** (`dedupeAcrossInputs`, on by default) saves each product once per marketplace per run, in full-details mode only. If you turn it off, a product is scraped, saved and charged again each time it shows up.

#### Deep search and search pages (advanced)

**Max search pages per input** (`maxSearchPagesPerStartUrl`, default 0) sets how many result pages are read; 0 means no page limit, so pages are read until Amazon shows no next page. **Deep search** (`deepSearch`, off by default) keeps collecting past Amazon's result-page limit on large searches. It only starts when Max search pages per input is 0 and a search or category listing reaches Amazon's last result page. It still stops at **Max products per input** and at **Max products to check per input** (`maxScanned`, default 2,000), which counts across the whole deep search.

- ✅ Good: `"deepSearch": true`, `"maxSearchPagesPerStartUrl": 0`, plus a higher `maxItemsPerStartUrl` and `maxScanned`
- ❌ Bad: `"deepSearch": true` with `"maxSearchPagesPerStartUrl": 5` (deep search never starts)

> ⚠️ Raise **Max products to check per input** if you expect more than 2,000 listed products for one input.

#### Filters (advanced)

Filters work on search, category and seller listings. They don't apply to best-seller lists, product URLs or ASINs.

| Filter | Field | How it works |
|---|---|---|
| 💲 Price range | `minPrice`, `maxPrice` | In the store's currency. If min is above max, they are swapped. |
| ⭐ Rating | `minRating` | 0 to 5 stars |
| 💬 Ratings count | `minReviews` | Minimum number of ratings |
| 🚚 Prime only | `primeOnly` | Uses the store's Prime or shipped-by-Amazon filter. If a listing has none, products whose card shows they are not Prime are skipped. |
| 🧩 Amazon filters by name | `refinements` | Any left-sidebar filter by its visible name, for example "4 Stars & Up". Missing filters are listed in the log with the names that are available. |
| ✅ / 🚫 Title words | `titleIncludes`, `titleExcludes` | Any of the words, not case sensitive |
| 📣 Sponsored products | `includeSponsored`, `includeAdPlacements` | Both on by default. Sponsored carousels count only when sponsored products are included. |
| 🔃 Sort order | `sortBy` | Featured, price low to high, price high to low, average customer review, newest arrivals or best sellers. If a store doesn't offer the order, the log says so and Amazon's default order is used. |

> ⚠️ If 600 listed products are checked for an input and none pass your filters, that input stops with a warning that the filter looks too strict.

#### Offers, sellers, variants and reviews (advanced)

- **Max seller offers per product** (`maxOffers`, 0 = off): offers from other sellers with price, condition, seller and delivery.
- **Scrape seller profiles** (`scrapeSellers`, off): seller rating, rating count, business name and address.
- **Scrape variant prices** (`scrapeProductVariantPrices`, off): adds price and availability to `variantDetails`.
- **Variants as separate rows** (`maxProductVariantsAsSeparateResults`, 0 = off): saves up to this many variants of each product as their own full rows, with `variantOf` set. Each variant row that loads is charged as a result.
- **Include reviews** (`includeReviews`, on): `topReviews` and `aiReviewsSummary` from the product page.
- **Output fields** (`outputFields`): saves only these fields, in this order. Unknown names become empty columns, and the log warns about them.

#### Run settings and proxy (advanced)

- **Parallel product pages** (`maxConcurrency`, 1 to 20, default 4): how many product pages load at the same time.
- **Retries per page** (`maxRetries`, 0 to 10, default 4). A value of 0 does not turn retries off; it behaves like 3.
- **Min delay between requests** (`minDelaySeconds`): leave it empty and the Actor sets the delay itself.
- **Proxy configuration** (`proxyConfiguration`): no proxy by default. When Amazon blocks requests, the Actor switches to Apify Proxy automatically (if it is available to your account), and the log shows each switch. You can also choose your own proxy settings. Apify Proxy traffic is part of platform usage.

***

### Amazon Product Scraper output

Results are stored in a dataset in the **Output** or **Storage** tab, and rows appear while the run is going. The dataset has 11 views: Overview, Pricing & deals, Buy Box & sellers, Stock & delivery, Reviews & ratings, Ranks & badges, Description & content, Images & videos, Specifications, Variants, and Monitor & run info. You can view the data as a table or JSON. To download it, open **Storage → Datasets** in Apify Console, select the dataset, select **Export**, pick JSON, CSV, Excel, XML or HTML and select **Download**.

#### JSON example

Results for the input example above (one row, shortened):

```json
{
  "status": "OK",
  "title": "Amazon Basics Wired QWERTY Keyboard, Works with Windows, Plug and Play, Easy to Use with Media Control, Full-Sized, Black",
  "url": "https://www.amazon.com/dp/B07WJ5D3H4",
  "asin": "B07WJ5D3H4",
  "brand": "Amazon Basics",
  "price": { "value": 11.11, "currency": "USD" },
  "typicalPrice": { "value": 11.7, "currency": "USD" },
  "savingsPercent": 5,
  "inStock": true,
  "inStockText": "In Stock",
  "delivery": "FREE delivery Thursday, October 15 on orders shipped by Amazon over $35",
  "buyBox": { "soldBy": "Amazon.com", "shipsFrom": "Amazon.com", "isAmazonSeller": true, "fulfillment": "AMAZON", "isFBA": false },
  "stars": 4.5,
  "starsBreakdown": { "5 star": 77, "4 star": 12, "3 star": 5, "2 star": 2, "1 star": 4 },
  "reviewsCount": 10022,
  "bestsellerRanks": [{ "rank": 3, "category": "Computer Keyboards", "url": "https://www.amazon.com/gp/bestsellers/pc/12879431" }],
  "isAmazonChoice": true,
  "monthlyPurchaseVolume": "10K+ bought in past month",
  "monthlyPurchaseVolumeMin": 10000,
  "offersCount": 4,
  "lowestOfferPrice": { "value": 9.22, "currency": "USD" },
  "locationText": "Lebanon 66952",
  "locationApplied": true,
  "marketplace": "amazon.com",
  "categoryPageData": { "pageNumber": 1, "productPosition": 1, "organicPosition": 1, "isSponsored": false, "totalResults": 100000 },
  "scrapedAt": "2026-10-09T14:04:02+00:00"
}
```

`locationText` shows the delivery location Amazon displayed. No ZIP or country was set in this example, so the Actor delivered to the store's home country (the US for amazon.com), and Amazon showed that US address ("Lebanon 66952").

Full rows also include description, features, image URLs, videos, A+ content, top reviews, the AI review summary, specifications, dimensions, weight, GTIN and variants.

#### Row status

| `status` | Meaning | Charged? |
|---|---|---|
| `OK` | Full product page scraped | Yes |
| `CARD` | Fast mode: listing data only | Yes |
| `NOT_FOUND` | The product page returned "not found" (404) | No |
| `FAILED` | The page could not be loaded after retries, the page had no product title, or an unexpected error happened. `error` says why. | No |

#### Run summary

Each run also saves a `RUN_SUMMARY` record in its key-value store (shown as **Run summary** in the Output tab). It holds the rows saved, results saved, rows by status, unchanged products in monitor mode, why the run stopped (free plan limit, maximum charge limit or none), the proxy switches and the final status message.

#### Export tips for spreadsheets

- Use **Output fields** to keep only the columns you need, in your order, for example `asin`, `title`, `price`, `buyBox`.
- Through the API, add `flatten=price` (or another field) to turn nested fields into flat columns such as `price.value` and `price.currency`.
- Through the API, add a view to the dataset items request (for example `view=pricing`) to download one section only.
- Keep the `marketplace` column when you mix stores, so you know which store and currency each price comes from.

***

### Tips and advanced usage

#### How many results can you scrape with Amazon Product Scraper?

There is no fixed total on paid plans. The number depends on your limits, your filters, how many products Amazon lists, how many keywords × marketplaces you add, and your run budget. A run or an input stops when one of these happens:

- Every input has been processed.
- Free plan: 10 rows are saved in the run (`OK`, `CARD`, `NOT_FOUND` and `FAILED` rows each count).
- The maximum charge limit you set for the run is reached.
- Many requests in a row cannot reach Amazon (a network or proxy problem). Rows already saved are kept.
- One input reaches **Max products per input**.
- A search, category or seller listing reaches **Max search pages per input**, has no next page, shows a page without results, shows the same page as before, or has a results page that can't be loaded after retries.
- 600 listed products are checked for an input and none pass the filters.
- **Max products to check per input** is reached (default 2,000).
- Best Sellers, New Releases, Movers & Shakers and Most Wished For lists: at most 2 pages per list.

Unsupported URLs are skipped. The best way to know what to expect for your search is a quick test run.

#### How to keep costs down

- Use fast mode when listing data (price, rating, position) is enough. It costs the same per row, but it opens fewer pages, so it uses less platform usage.
- Keep **Max products per input** low and use price, rating or title filters, so fewer products are opened and charged.
- Keep **Skip duplicate products** on, so in full-details mode a product found by several inputs is charged once per marketplace.
- For regular Amazon product scraping, use monitor mode with **Save only changed products**, so unchanged products aren't saved or charged.
- Set a maximum charge limit when you start large runs.

#### If something goes wrong

- **`FAILED` rows:** the page couldn't be loaded after retries, had no product title, or hit an unexpected error. Read `error`, then run those URLs or ASINs again. These rows are not charged.
- **`NOT_FOUND` rows:** Amazon returned "not found" (404) for that product page.
- **Empty `price`:** there is no featured offer, or Amazon shows the price only in the cart (`priceHidden`).
- **Delivery location not applied:** Amazon didn't accept it, and `locationApplied` is `false` or empty.
- **Empty `topReviews`:** Amazon didn't show the review list on that page; `aiReviewsSummary` is still collected.
- **No offers:** seller offers can be unavailable for a run. The log shows a warning and offers are skipped.
- **Empty best-seller list:** Amazon shows some lists only from time to time.
- **Status "No products found for this input":** check the URLs or keywords, or set a proxy.

If the problem stays, open an issue (see Support and feedback below).

***

### Integrations and API

#### Can I use Amazon Product Scraper as an API?

Yes. The Amazon Product Scraper API works through the [Apify API](https://docs.apify.com/api/v2): start runs, schedule them and fetch results. If you need an Amazon scraper API or an Amazon product data API for your own app, use the `apify-client` [NPM package](https://apify.com/insights_data/amazon-product-scraper/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/amazon-product-scraper/api/python) for Python. The [API tab](https://apify.com/insights_data/amazon-product-scraper/api) has ready-to-use code.

#### Amazon Product Scraper Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/amazon-product-scraper").call(run_input={
    "urls": ["https://www.amazon.com/s?k=keyboard"],
    "maxItemsPerStartUrl": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["asin"], item.get("title"), item.get("price"))
```

#### Can I integrate Amazon Product Scraper with other apps?

Yes. Like other Apify Actors, this Amazon data scraping tool connects with [Apify integrations](https://apify.com/integrations) such as **Make, Zapier, Slack, Google Sheets, Google Drive, Airbyte, GitHub and LangChain**. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes. For example, schedule a daily run in monitor mode with **Save only changed products** and send the new rows to Google Sheets or a Slack channel.

#### Can I use Amazon Product Scraper with AI agents (MCP)?

Yes. Connect Amazon Product Scraper to Claude and other AI assistants through the Apify MCP server. Open the [MCP tab](https://apify.com/insights_data/amazon-product-scraper/api/mcp) for setup steps.

***

### Other e-commerce and research scrapers

These Actors from the same author cover related e-commerce and research tasks:

| Actor | What it does |
|---|---|
| 🛍️ [Flipkart Product Scraper](https://apify.com/insights_data/flipkart-product-scraper) | Scrapes Flipkart products by keyword or category URL: prices, discounts, ratings, specs, sellers and offers. |
| ⭐ [Flipkart Reviews Scraper](https://apify.com/insights_data/flipkart-reviews-scraper) | Scrapes Flipkart product reviews, star ratings, photos and rating summaries in bulk. |
| 📊 [Keyword Search Volume — Bulk Google Metrics (CPC & Trend)](https://apify.com/insights_data/keyword-search-volume) | Gets Google search volume, CPC, ad competition and a 12-month trend for keywords. |
| 📢 [Google Ads Transparency Center Scraper & API](https://apify.com/insights_data/google-ads-transparency-center-scraper-api) | Extracts ads across Search, YouTube, Shopping, Maps and Play by brand, domain or advertiser ID. |

***

### ❓ FAQ

#### Is it legal to scrape Amazon?

It depends on where you are, what you collect and how you use it. This Actor reads only public product pages, without logging in. Some fields can contain personal data: `topReviews` include reviewer names, and seller profiles include business names and addresses. Personal data is protected by laws such as the GDPR, so collect it only with a legitimate reason. Also take Amazon's terms of use into account. This is not legal advice; if you are unsure, ask a lawyer.

#### How does Amazon Product Scraper work?

It works like a shopper browsing Amazon, only faster. For each input, it opens the listing (search, category, best-seller list or seller storefront), applies your filters, opens each product page (unless fast mode is on) and saves one structured row per product as soon as it is ready. The delivery location, language and currency are set per store first. This Amazon data extraction runs in the Apify cloud, so as an Amazon product web scraper it keeps working when your computer is off. At the end, it saves the run summary and a status message.

#### How is fast mode different from full product details?

Fast mode reads only the listing pages, while full product details (the default) also opens each product page.

| | Full product details (default) | Fast mode |
|---|---|---|
| Pages opened | Listing pages and each product page | Listing pages only |
| Row status | `OK` | `CARD` |
| Buy Box, offers, reviews, variants | ✅ | ❌ |
| Monitor changes | ✅ | ❌ |
| Duplicate removal | ✅ (with **Skip duplicate products**) | ❌ |
| Inputs | Every input type | Search, category, best-seller and seller inputs (product URLs and ASINs always use full details) |
| Price per row | $0.0035 on the Free plan (lower on paid plans) | $0.0035 on the Free plan (lower on paid plans) |
| Platform usage | Higher (more pages) | Lower (fewer pages) |

#### Why scrape Amazon product data?

- **Pricing:** Amazon product monitoring of your own and competitors' prices, coupons and deals.
- **Sellers:** check which seller holds the Buy Box and how it ships.
- **Assortment:** find products by search, category or best-seller list and compare ratings and ranks.
- **Data teams:** load clean rows into BI tools, spreadsheets or LLM pipelines.

#### How to scrape Amazon prices?

Add a search URL, keywords or ASINs, pick the marketplaces and, if needed, a delivery ZIP or country. Run with full product details for the Buy Box price, list price, savings and lowest offer, or use fast mode for listing prices only. The **Pricing & deals** view shows the price columns together. To follow prices over time, use monitor mode on a schedule.

#### Can I compare Amazon prices between countries?

Yes. Add ASINs and select several marketplaces: each ASIN is looked up once per store. That gives you an Amazon price comparison between countries in one dataset, with the store in `marketplace` and the currency in each price. Prices are not converted to one currency, so convert them yourself when you compare.

#### Why am I getting fewer results than expected?

Usually because of one of these three causes:

- **Max products per input** is 10 by default, and skipped duplicates and failed products count toward it.
- On the free plan, a run stops at 10 rows.
- Strict filters reject products, or Amazon's result-page limit ends the search (**Deep search** helps only when Max search pages per input is 0).

Every other stop condition is listed in "How many results can you scrape with Amazon Product Scraper?" above.

#### Do I need an Amazon account or a proxy?

No Amazon account is needed. The run starts without a proxy and switches to Apify Proxy automatically when Amazon blocks requests, if Apify Proxy is available to your account. The [Apify Free plan](https://apify.com/pricing) includes some Apify Proxy access; the pricing page lists what is included and what is billed by use, and proxy traffic counts as platform usage. If no stronger proxy is available, the Actor keeps retrying on the current connection, and products that still can't be loaded are saved as `FAILED` rows, which are not charged. You can also choose a proxy yourself in **Proxy configuration**.

***

### Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/amazon-product-scraper/issues/open).

Need a **custom solution** or more data? Contact us at hello.insights.data@gmail.com.

Built and maintained by [Insights Data](https://apify.com/insights_data).

# Actor input Schema

## `urls` (type: `array`):

Paste one or more Amazon URLs, or upload a text file with many URLs (bulk). Supported: product pages (/dp/ASIN), search results (/s?k=...), categories (/b?node=...), Best Sellers, New Releases, Movers & Shakers and Most Wished For lists, seller pages (/sp?seller=...), storefronts (/s?me=...) and amzn.to short links. Leave it empty when you use keywords or ASINs below (at least one URL, keyword or ASIN is needed).

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

Search phrases, e.g. "wireless mouse". Each keyword is searched on every marketplace selected below.

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

Amazon product IDs (10 characters, e.g. B07WJ5D3H4). Each ASIN is looked up on every marketplace selected below, which makes cross-store price comparison easy.

## `marketplaces` (type: `array`):

Amazon stores used for the keywords and ASINs above (URLs always use their own store). Every keyword and ASIN runs once per selected store.

## `maxItemsPerStartUrl` (type: `integer`):

Maximum products saved for each URL, keyword or ASIN (0 = no limit). Free plan users are limited to 10 items per run; paid plans have no limit.

## `maxSearchPagesPerStartUrl` (type: `integer`):

Maximum result pages read per search or category (0 = every page Amazon shows).

## `sortBy` (type: `string`):

Sort order for search and category results. Leave empty for Amazon's default (relevance). If a store does not offer the chosen order, the run says so in the log and keeps Amazon's default.

## `minPrice` (type: `number`):

Only products priced at or above this value, in the store's currency (e.g. 25 or 19.99).

## `maxPrice` (type: `number`):

Only products priced at or below this value, in the store's currency.

## `deepSearch` (type: `boolean`):

Amazon shows only a limited number of result pages per search. Turn this on to keep going past that limit and collect many more products from large searches (works when Max search pages is 0).

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

Keep sponsored (ad) products in the results, with their sponsored position.

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

Only products rated at least this many stars (0-5), e.g. 4.

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

Only products with at least this many ratings, e.g. 100.

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

Use the store's own Prime / shipped-by-Amazon filter.

## `refinements` (type: `array`):

Any filter from Amazon's left sidebar, by its visible name, e.g. "LEGO", "4 Stars & Up", "Subscribe & Save", "Today's Deals". Filters not offered on a listing are reported in the log with the names that are available.

## `includeAdPlacements` (type: `boolean`):

Also collect sponsored products shown in carousels and brand banners, not only in the result grid.

## `titleIncludes` (type: `array`):

Keep products whose title contains any of these words (not case sensitive).

## `titleExcludes` (type: `array`):

Skip products whose title contains any of these words (not case sensitive).

## `maxScanned` (type: `integer`):

Stop looking after checking this many listed products per input when strict filters keep rejecting them (0 = no limit).

## `scrapeProductDetails` (type: `boolean`):

On: open every product page for the full record (description, features, images, Buy Box, reviews, ranks...). Off: fast mode that saves only the data shown in search and best-seller lists, about 20x fewer page loads.

## `scrapeProductVariantPrices` (type: `boolean`):

Add the price and availability of every variant (size, color...) to variantDetails.

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

Also save up to this many variants of each product as their own full rows (0 = off).

## `maxOffers` (type: `integer`):

Collect up to this many offers from other sellers for each product (price, condition, seller, delivery). 0 = off.

## `scrapeSellers` (type: `boolean`):

Add seller rating, rating count, business name and address for the Buy Box seller and offer sellers.

## `includeReviews` (type: `boolean`):

Add the top reviews and Amazon's AI review summary shown on the product page.

## `dedupeAcrossInputs` (type: `boolean`):

Save each product only once per marketplace, even when it appears in several inputs.

## `fillMissingPriceFromOffers` (type: `boolean`):

When a product has no featured offer ("See All Buying Options"), fill lowestOfferPrice and lowestOfferSeller from its other offers.

## `discoverEndpoints` (type: `boolean`):

Keep request settings up to date automatically (recommended).

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

Deliver-to ZIP or postcode, e.g. 10001. Prices, stock and delivery dates follow this location.

## `countryCode` (type: `string`):

Deliver-to country as a 2-letter code, e.g. GB or DE. Ignored when a ZIP code is set.

## `autoLocation` (type: `boolean`):

When no ZIP or country is given, deliver to the store's own country (e.g. US for amazon.com) so prices are shown no matter where the run happens.

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

Page language, e.g. es or es_US. Checked against the languages the store offers; if not offered, the store default is used and the log says so.

## `currency` (type: `string`):

Display currency, e.g. EUR. Amazon offers other currencies only when delivering to another country (set Delivery country); otherwise prices stay in the store currency and the log says so.

## `monitorMode` (type: `boolean`):

Remember each product and add a "changes" list (price, stock, Buy Box seller, rank, rating, offers, coupon...) compared with the previous run of the same monitor list.

## `monitorListName` (type: `string`):

Name of the product history to compare with. Use different names for different watch lists.

## `onlyChanged` (type: `boolean`):

With monitoring on, save only products that are new or changed since the last run.

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

How many product pages are loaded at the same time.

## `maxRetries` (type: `integer`):

How many times a page is retried when it fails or is blocked.

## `minDelaySeconds` (type: `number`):

Minimum pause between requests in seconds. Leave empty for automatic pacing.

## `outputFields` (type: `array`):

Optional: save only these fields, in this order, e.g. asin, title, price, buyBox. Leave empty for all fields.

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

Default: no proxy. If Amazon blocks the run, it switches to a datacenter proxy and then to a residential proxy automatically, and stays on residential for the rest of the run. You can also pick a proxy yourself.

## Actor input object example

```json
{
  "urls": [
    "https://www.amazon.com/s?k=laptop"
  ],
  "marketplaces": [
    "amazon.com"
  ],
  "maxItemsPerStartUrl": 10,
  "maxSearchPagesPerStartUrl": 0,
  "deepSearch": false,
  "includeSponsored": true,
  "primeOnly": false,
  "includeAdPlacements": true,
  "maxScanned": 2000,
  "scrapeProductDetails": true,
  "scrapeProductVariantPrices": false,
  "maxProductVariantsAsSeparateResults": 0,
  "maxOffers": 0,
  "scrapeSellers": false,
  "includeReviews": true,
  "dedupeAcrossInputs": true,
  "fillMissingPriceFromOffers": true,
  "discoverEndpoints": true,
  "autoLocation": true,
  "monitorMode": false,
  "monitorListName": "default",
  "onlyChanged": false,
  "maxConcurrency": 4,
  "maxRetries": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every scraped product with all fields, overview columns.

## `overview` (type: `string`):

Main product facts: title, price, rating, stock, Prime.

## `pricing` (type: `string`):

Prices, discounts, coupons and deals.

## `buybox` (type: `string`):

Buy Box winner, seller and offers.

## `stock` (type: `string`):

Availability, delivery and location.

## `reviews` (type: `string`):

Ratings, AI review summary and top reviews.

## `ranks` (type: `string`):

Best Sellers Rank, badges and positions.

## `content` (type: `string`):

Description, features and A+ content.

## `media` (type: `string`):

Image and video URLs.

## `specs` (type: `string`):

Brand, model, size, weight and identifiers.

## `variants` (type: `string`):

Parent ASIN and all variants.

## `monitor` (type: `string`):

Changes since the last run, status and errors.

## `runSummary` (type: `string`):

JSON summary: rows saved, rows by status, stop reason and proxy switches.

# 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 = {
    "urls": [
        "https://www.amazon.com/s?k=laptop"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/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 = {
    "urls": ["https://www.amazon.com/s?k=laptop"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/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 '{
  "urls": [
    "https://www.amazon.com/s?k=laptop"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/amazon-product-scraper --silent --output-dataset

```

## MCP server setup

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