# Amazon Product Scraper: Search, Details, Best Sellers & Prices (`fairfetch/amazon-product-scraper`) Actor

Amazon search results, product details and Best Sellers from 11 marketplaces (US, UK, DE, FR, IT, ES, CA, IN, JP, AU, MX) in one schema: price, list price, rating, BSR, seller, stock, images, variations. Local delivery address and currency. $1 per 1,000 results, $2 per 1,000 product pages.

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

## Pricing

from $1.00 / 1,000 search or chart 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 Scraper: Search, Details, Best Sellers & Prices

Get **Amazon search results, full product details and Best Sellers charts from 11 Amazon marketplaces in one clean JSON schema**: price, list price and discount, rating and number of ratings, "bought in past month", Best Seller / Amazon's Choice badges, buy-box seller, stock, images, bullet points, description, Best Sellers rank, specifications and variations. Type search terms, paste ASINs or any Amazon URL, pick a marketplace, and get one flat row per product. Prices come in the marketplace's own currency for a local delivery address. Pay per row, no usage fees; blocked pages cost nothing.

| What you pay for | Price |
|---|---|
| `listing`: one search result or chart entry (the fields on the result card) | **$0.001** ($1 per 1,000) |
| `product`: one product with every detail field (read from its product page) | **$0.002** ($2 per 1,000) |
| Actor start (standard Apify event, per run) | $0.00005 |

| Example | Rows | Cost |
|---|---|---|
| 1 search term, 50 results | 50 listings | **$0.05** |
| 100 ASINs with full details | 100 products | $0.20 |
| Top 100 Best Sellers in 5 categories | 500 listings | $0.50 |
| The same with full details for every product | 500 products | $1.00 |
| Price monitoring: 1,000 ASINs a day for a month | 30,000 products | $60 |
| Our larger test run: 3 search terms x 100 results with full details | 300 products | $0.60 |

Apify platform costs and the proxy are included. Products that don't exist, invalid inputs, blocked pages and the run summary are free. Set **Maximum cost per run** (or `maxTotalChargeUsd` in the API) and the Actor stops cleanly at that amount: it reserves the budget for a result page's rows before reading it and for every product page before fetching it, so it stops reading pages once the limit is reached.

### What you get

- **11 marketplaces, one schema**: amazon.com, .co.uk, .de, .fr, .it, .es, .ca, .in, .co.jp, .com.au and .com.mx. Every field means the same everywhere; texts are in the marketplace's language, prices in its currency (USD, GBP, EUR, CAD, INR, JPY, AUD, MXN).
- **Search results** like a shopper typing into the search box: as many as Amazon lists (it shows about 7 result pages, so roughly 100-400 per term), read page by page, with `position`, `organicPosition` (ads not counted), `page` and a `sponsored` flag. Sort like Amazon (featured, price up / down, average review, newest, best sellers) and filter by price. Or paste a search URL with any filters you set in your browser.
- **Product details** from the product page: title, brand, price (new, buy box), list / "was" price and discount, Prime member price (where Amazon shows one), rating, number of ratings, "bought in past month", availability text and in-stock flag, Best Seller / Amazon's Choice / deal badges, buy-box seller (store name and seller ID), ships from Amazon, all images in the largest size, category breadcrumb, **Best Sellers rank in every category**, "About this item" bullets, description, specifications (product details table), parent ASIN and **variations** (dimensions, every child ASIN with its colour / size).
- **Best Sellers, New Releases, Movers & Shakers, Most Wished For and Gift Ideas**: the full top 100 of any category with `chartRank`, price, rating and image. Paste the chart URL or type the category (`electronics`, `books`...).
- **Full details for search and chart results** with one switch (`includeDetails`): every result is completed from its product page and charged as a product row.
- **Local prices and stock**: Amazon shows a visitor from abroad foreign currencies and "cannot be delivered to your location". The Actor sets each marketplace's currency and, with the same "Deliver to" form a shopper uses, a central delivery postcode (e.g. 10115 Berlin, EC1A 1BB London, 100-0001 Tokyo, 2000 Sydney), or your own postcode. On amazon.com, .ca, .com.mx and .in, Amazon itself gives a visitor from abroad a domestic location (e.g. Balzac T4B 2T3, Mexico City 11000, Mumbai 400001), which is kept unless you enter a postcode. `deliveryLocation` shows it on every row read from a product page.
- **Reliable and fast**: requests go out directly from Apify. Every new session first opens one Amazon page (the help page, which Amazon's robots.txt allows) to get Amazon's own cookies, like a visitor arriving on the site. On amazon.com and amazon.in, a marketplace that blocks direct requests switches to Apify Proxy (US IP addresses, a sticky session per worker), and back if the proxy does worse. Rate-limit and error pages (503, empty pages) are retried with a fresh session; a CAPTCHA, "continue shopping" bot check, JavaScript-challenge or 403 "forbidden" page is retried only once, from another session, and otherwise reported as `blocked`. Not-found ASINs are checked a second time before they are reported. Blocked, failed and not-found inputs cost nothing and never stop the other inputs. If Apify moves a run to another server, it continues where it stopped without returning or charging any row twice.
- **No personal data**: no reviews or reviewer names. Phone numbers, emails and postal addresses are removed, where recognisable, from titles, bullet points, descriptions and specifications (phone numbers are found with Google's libphonenumber for the marketplace's country; manufacturer, packer and importer fields keep only the company name). The seller is the store name Amazon shows in the buy box.
- Built for automation: pay-per-event pricing without usage fees, limited permissions, a stable schema, a machine-readable `SUMMARY` record per run (rows, errors, blocked pages, response times) and clear per-input errors instead of failed runs.

### Use cases

- **Price monitoring and repricing**: schedule your ASINs (or a competitor's) daily and track price, list price, discount, buy-box seller and stock in every marketplace.
- **Product and market research**: pull the top 100 Best Sellers or New Releases of a category, with ratings, ratings counts, "bought in past month" and Best Sellers ranks, to size demand and find gaps.
- **Keyword and ad research (Amazon SEO / PPC)**: see which products rank organically and which are sponsored for your keywords, position by position. Turn off "Return each product once per run" to track every position for every keyword.
- **Catalogue and listing audits**: check titles, bullets, images, variations and specifications of your listings across 11 countries.
- **Dropshipping and arbitrage**: compare the same ASIN's price and availability on amazon.com, .co.uk, .de, .co.jp...

### How to use

1. **Search terms**: one per line, e.g. `wireless earbuds`. Set **Max results per search term** (each results page has 16-60 products).
2. **Products**: ASINs (`B0BTYCRJSS`) or product URLs from any of the 11 marketplaces (`https://www.amazon.de/dp/B0BTYCRJSS`). URLs use their own marketplace; plain ASINs use the selected one.
3. **Best Sellers / New Releases**: chart URLs (`https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics`) or category names from those URLs (`electronics`, `books`, `ce-de` on amazon.de).
4. Choose the **Marketplace**, optionally a sort order, a price range and **Full product details for search and chart results**.
5. Run it and download the results as JSON, CSV or Excel, or read them via API. The dataset has the views **Products**, **Search results**, **Best Sellers & charts**, **Product details** and **All fields**.

#### Input example

The prefilled input (10 search results from amazon.com and 1 product from amazon.co.uk with full details, about 6-20 seconds depending on how much Amazon blocks, $0.012):

```json
{
  "searchTerms": ["wireless earbuds"],
  "productUrls": ["https://www.amazon.co.uk/dp/B0FQF32239"],
  "marketplace": "US",
  "maxResultsPerSearch": 10
}
```

Price research in Germany, with full details for every result:

```json
{
  "searchTerms": ["bluetooth kopfhörer"],
  "marketplace": "DE",
  "maxResultsPerSearch": 60,
  "sort": "best-sellers",
  "minPrice": 20,
  "maxPrice": 100,
  "includeDetails": true
}
```

Best Sellers in three countries: `"bestSellerUrls": ["https://www.amazon.com/gp/bestsellers/kitchen", "https://www.amazon.co.uk/gp/bestsellers/kitchen", "https://www.amazon.de/gp/new-releases/kitchen"], "maxItemsPerChart": 100`.

#### Output example

A product row from a real run on 18 Oct 2026 (rank 1 of the US Kitchen & Dining Best Sellers with full details; long texts and lists shortened):

```json
{
  "asin": "B0BZYCJK89",
  "marketplace": "amazon.com",
  "country": "US",
  "url": "https://www.amazon.com/dp/B0BZYCJK89",
  "title": "Owala FreeSip Stainless Steel Water Bottle 24 oz Denim",
  "brand": "Owala",
  "price": 29.99,
  "listPrice": null,
  "currency": "USD",
  "discountPct": null,
  "priceText": "$29.99",
  "rating": 4.6,
  "ratingCount": 141996,
  "availability": "In Stock",
  "inStock": true,
  "isPrime": true,
  "badges": ["Amazon's Choice"],
  "boughtPastMonth": 20000,
  "seller": "Amazon.com",
  "sellerId": "ATVPDKIKX0DER",
  "fulfilledByAmazon": true,
  "thumbnail": "https://m.media-amazon.com/images/I/61Gvw0-b0eL._AC_SL1500_.jpg",
  "images": ["https://m.media-amazon.com/images/I/61Gvw0-b0eL._AC_SL1500_.jpg", "..."],
  "categories": ["Home & Kitchen", "Kitchen & Dining", "Storage & Organization", "Thermoses", "Insulated Beverage Containers", "Thermoses"],
  "bestSellersRank": [
    {"rank": 1, "category": "Kitchen & Dining", "url": "https://www.amazon.com/gp/bestsellers/kitchen"},
    {"rank": 1, "category": "Travel & To-Go Drinkware", "url": "https://www.amazon.com/gp/bestsellers/home-garden/9630569011"},
    {"rank": 1, "category": "Insulated Bottles", "url": "https://www.amazon.com/gp/bestsellers/kitchen/13880501"}
  ],
  "features": ["24-ounce insulated stainless-steel water bottle with a FreeSip spout and push-button lid with lock", "..."],
  "description": "The Owala FreeSip Insulated Stainless-Steel Water Bottle with Locking Push-Button Lid easily tackles every thirst. ...",
  "specifications": {"Brand": "Owala", "Material": "Stainless Steel", "Bottle Type": "Sports Bottle", "Color": "Denim", "Capacity": "24 fluid ounces"},
  "parentAsin": "B0FLKGX4B7",
  "variations": {
    "dimensions": ["Color", "Size"],
    "count": 118,
    "selected": {"Color": "Denim", "Size": "24 Ounces"},
    "items": [{"asin": "B0FM9LXK4K", "values": {"Color": "Down to Earth", "Size": "32 Ounces"}}, "..."]
  },
  "source": "chart",
  "chartType": "best-sellers",
  "chartCategory": "Best Sellers in Kitchen & Dining",
  "chartRank": 1,
  "detailsComplete": true,
  "input": "https://www.amazon.com/gp/bestsellers/kitchen",
  "scrapedAt": "2026-10-18T04:57:40.483Z"
}
```

A search row (card fields only, `listing` event), from the same day on amazon.de:

```json
{
  "asin": "B0BTYCRJSS",
  "marketplace": "amazon.de",
  "country": "DE",
  "url": "https://www.amazon.de/dp/B0BTYCRJSS",
  "title": "soundcore by Anker P20i Kabellose Bluetooth Kopfhörer in-Ear, 10mm Treiber",
  "price": 21.24,
  "listPrice": 24.99,
  "currency": "EUR",
  "discountPct": 15,
  "priceText": "21,24 €",
  "rating": 4.3,
  "ratingCount": 117060,
  "badges": ["Befristetes Angebot"],
  "boughtPastMonth": 5000,
  "thumbnail": "https://m.media-amazon.com/images/I/51dCWVANo-L._AC_UY218_.jpg",
  "source": "search",
  "searchTerm": "wireless earbuds",
  "page": 1,
  "position": 1,
  "organicPosition": 1,
  "sponsored": false,
  "detailsComplete": false,
  "input": "https://www.amazon.de/s?k=wireless+earbuds",
  "scrapedAt": "2026-10-18T04:51:41.496Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `asin`, `marketplace`, `country`, `url` | Amazon product ID (ISBN-10 for books), site, marketplace code (US, UK, DE, FR, IT, ES, CA, IN, JP, AU, MX), canonical product URL |
| `title`, `brand` | Product title; brand (product pages, and search cards that show a brand line) |
| `price`, `listPrice`, `currency`, `discountPct`, `priceText` | New-item price (buy box), struck-through list / typical price, ISO currency, discount in %, price as Amazon prints it |
| `primePrice`, `usedPrice` | Lower price for Prime members, where Amazon shows one (e.g. Japan, Australia); price of the used offer in the buy box (e.g. when there is no new offer) |
| `rating`, `ratingCount`, `boughtPastMonth` | Average stars, number of ratings, "X+ bought in past month" as a number (lower bound; "5 mil+" = 5000, "1万点以上" = 10000) |
| `availability`, `inStock` | Availability text as shown (at most two sentences), and whether the product can be added to the cart |
| `isPrime`, `fulfilledByAmazon`, `seller`, `sellerId` | Product pages: `isPrime` is true when the buy-box offer ships from Amazon (FBA or Amazon itself, which is how Prime eligibility usually works) and false when the seller ships it; search cards: true only when the Prime icon is shown. Buy-box seller's store name and seller ID |
| `badges` | `Best Seller`, `Amazon's Choice` and deal labels as shown |
| `thumbnail`, `images` | Main image; all images in the largest size (product pages) |
| `categories`, `bestSellersRank` | Category breadcrumb; Best Sellers rank per category with the chart URL |
| `features`, `description`, `specifications` | Bullet points; description (the description block, the book description, or the text of the brand's A+ modules; empty when those are images only); product details / technical details table |
| `parentAsin`, `variations` | Variation family and every child ASIN with its dimension values |
| `source`, `searchTerm`, `page`, `position`, `organicPosition`, `sponsored` | How the row was found (`search`, `chart`, `product`) and its search position |
| `chartType`, `chartCategory`, `chartRank` | Chart rows: chart, its heading, rank |
| `detailsComplete` | `true` for rows read from the product page (all fields, `product` event), `false` for search / chart cards (`listing` event) |
| `deliveryLocation`, `input`, `scrapedAt` | Delivery location Amazon used (e.g. "10115 Berlin"; for amazon.com without a postcode, the location Amazon picked from the IP address), the input the row came from, run time (ISO 8601 UTC) |

### Use it from the API or an app

Run synchronously and get the rows in one call (keep your API token in the `APIFY_TOKEN` environment variable):

```bash
curl -X POST "https://api.apify.com/v2/acts/fairfetch~amazon-product-scraper/run-sync-get-dataset-items?maxTotalChargeUsd=0.50" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"productUrls": ["B0BTYCRJSS", "https://www.amazon.co.uk/dp/B0FQF32239"], "marketplace": "US"}'
```

Python (`pip install apify-client`):

```python
import os
from decimal import Decimal

from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fairfetch/amazon-product-scraper").call(
    run_input={"bestSellerUrls": ["https://www.amazon.com/gp/bestsellers/electronics"], "maxItemsPerChart": 100},
    max_total_charge_usd=Decimal("0.20"),
)
for row in client.dataset(run.default_dataset_id).iterate_items():
    print(row["chartRank"], row["asin"], row["price"], row["rating"], row["title"][:60])
```

The Actor runs with limited permissions and pay-per-event pricing without usage fees. Each run also writes a `SUMMARY` record (per-input rows, errors, notes and request statistics, including how many pages Amazon blocked and were retried) to its key-value store.

### Performance and limits

- From our test runs on Apify (512 MB, 10 parallel requests, 19 Oct 2026): the prefilled input took 6-19 seconds (longer when Amazon blocks and pages are retried); 34 inputs on all 11 marketplaces (451 rows) 21-57 seconds; 3 US search terms x 100 results with full details (300 product pages) 3.7 minutes; 4 searches on amazon.de, .in, .ca and .com x 15 results with full details 53 seconds. Search and chart pages take about 1-3 seconds each, product pages 2-5 seconds (Amazon's response time). Peak memory 244 MB.
- **Blocking** changes with the time of day and the marketplace. On 21 Oct 2026 amazon.com started to block sessions that arrive without Amazon's own cookies (a search straight away got a 503 page, product pages a CAPTCHA): in three test runs without the session warm-up, 63 of 75 amazon.com requests were blocked. With the warm-up (every new session opens Amazon's help page first, since build 1.0.26), 16 runs the same afternoon (searches, 150 product pages, all 11 marketplaces) had 1 of 407 direct requests blocked. On 19 Oct, before that change, 27 of 661 requests were blocked in the morning (UTC) and many more on amazon.com and amazon.in in the afternoon (8 of 179 valid inputs ended as `blocked`). Because a CAPTCHA or bot-check page gets only one retry, a bad hour shows up as `blocked` inputs (free), not as longer runs. Blocked attempts per page type and per marketplace are listed in `SUMMARY.http`.
- The price is empty when Amazon shows it only in the cart ("add to cart to see the price") or when there is no new offer (see `usedPrice`). A subscription or service page without a normal product page keeps its search / chart card data.
- Search: Amazon shows up to about 7 result pages per search (16-60 products per page, depending on the category's layout). Best Sellers charts have 100 ranks; Movers & Shakers and Most Wished For are sometimes empty on Amazon itself.
- The Best Sellers rank is missing for products where Amazon hides it (e.g. Apple and Amazon devices). `description` was filled for 65% of 300 US products and about half of the German, Indian and Canadian ones in our tests; it is empty when the product description and the brand's A+ content are images only. Books have no `brand` (the author is in `specifications` where Amazon lists it).
- Reviews are not included: Amazon shows full reviews only to signed-in customers, and they would mean collecting reviewers' personal data.
- The proxy is only a fallback for amazon.com and amazon.in, where it was measured to help. The other marketplaces, and any marketplace with your own postcode, always use direct requests: in our tests (19 Oct 2026) the proxy did worse than direct requests on amazon.ca and .com.mx, and through Apify's data-center proxy Amazon answered the delivery-address form with a bot check every time (without the postcode, prices would be those of another country). A proxy page that shows a delivery location abroad (some proxy IPs make amazon.com show "Deliver to Germany") is fetched again with another IP. Residential proxies are not supported (Amazon blocks them on search and product pages, and they cost more than a row); you can use your own proxy URLs instead of Apify Proxy.

### FAQ

**Do I need an Amazon account, a seller account or an API key?**
No. The Actor reads the public pages any visitor sees. It never signs in.

**Which marketplaces are supported?**
amazon.com (US), .co.uk (UK), .de (DE), .fr (FR), .it (IT), .es (ES), .ca (CA), .in (IN), .co.jp (JP), .com.au (AU) and .com.mx (MX). Each was tested on 18 Oct 2026 with search, product and Best Sellers pages, its own currency and a local delivery address.

**Why do prices sometimes differ from what I see in my browser?**
Amazon prices depend on the delivery address, the currency and sometimes on Prime membership. The Actor uses a central postcode of each country, or Amazon's own domestic default location on amazon.com, .ca, .com.mx and .in (shown in `deliveryLocation`). Enter your own postcode in **Delivery postcode** to see the prices for that address. Prime-only prices are in `primePrice`.

**What is the difference between a listing and a product row?**
A listing row comes from a search result or chart card: title, price, list price, rating, ratings, badges, image, position or rank. A product row is read from the product page and has every field (seller, stock, images, bullets, description, Best Sellers rank, specifications, variations). Turn on **Full product details for search and chart results** to get product rows for search and chart results.

**What happens if Amazon blocks a request?**
A rate-limit or error page (503, empty page) is retried with a fresh session, up to 8 attempts by default (a failed delivery-address setup gets extra tries of its own). A CAPTCHA, bot-check, JavaScript-challenge or 403 "forbidden" page is retried only once, from another session; if it comes again, the page is reported as `blocked`. Requests go out directly from Apify; on amazon.com and amazon.in, when the marketplace blocks three of its last ten direct requests, it switches to Apify Proxy for 10 minutes (every retry there uses a new IP address), and back to direct requests if the proxy is blocked even more. A blocked input is listed in the status message and `SUMMARY`, costs nothing, and the other inputs continue.

**When does a run fail?**
Only when every input failed for a reason on our side (for example Amazon blocked every attempt) and nothing was returned. Wrong inputs (an ASIN that doesn't exist, an invalid URL, an unsupported marketplace, an empty input) end the run as SUCCEEDED, with the reason in the status message and in `SUMMARY`.

**What if Amazon rejects my delivery postcode?**
The format is checked before the run starts ("Invalid input" for e.g. "ABCDE" on amazon.co.uk). If Amazon rejects a well-formed postcode, every input of that marketplace fails with the reason (`invalid_postcode`, free) instead of returning prices and availability for another location.

**How long can a run take?**
At the default 10 parallel requests, about 4,000-5,000 product pages per hour; search and chart pages are much faster. Apify stops runs after their timeout (1 hour by default): for bigger runs, raise **Timeout** in the run options. 90 seconds before the timeout the Actor stops starting new pages (queued product pages included: those results come back with their search / chart card data) and still writes its summary.

**What if an ASIN doesn't exist?**
Amazon answers "page not found". The Actor checks it a second time with a fresh session, then reports the input as `not_found` (free).

**What does "Return each product once per run" do?**
A product found by several inputs (two search terms, a chart and a search...) is returned and charged once, with the context of the first input. Turn it off for keyword rank tracking. Within one search, a product shown as an ad and organically is always returned twice (`sponsored` true and false).

**Does it collect personal data?**
No reviews, reviewer names or profile pictures. Phone numbers, emails and postal addresses are removed, where recognisable, from titles, bullet points, descriptions and specifications (on amazon.in, for example, the manufacturer field keeps only the company name, and a seller's mobile number there is dropped). Recognition is automatic, so an unusual format can slip through. The seller is the store name shown in the buy box, which Amazon shows publicly; for a sole trader that can be a person's name.

### Legal

This Actor reads only public product pages that Amazon shows to every visitor, at a moderate request rate. It does not sign in and does not solve CAPTCHAs. When Amazon answers with a CAPTCHA, bot-check, JavaScript-challenge or 403 "forbidden" page, that page is retried at most once from another session; if it comes again, the page is reported as `blocked` and nothing is charged. Rate-limit and error pages are retried with a fresh session. It collects no reviews and removes addresses, emails and phone numbers, where recognisable, from what it returns. Amazon's Conditions of Use restrict automated access; you are responsible for how you use the Actor and the data and for complying with Amazon's terms and the laws that apply to you. This Actor is not affiliated with, endorsed or sponsored by Amazon; "Amazon" is a trademark of Amazon.com, Inc. or its affiliates and is used here only to describe where the data comes from.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on the selected marketplace, like typing them into Amazon's search box. Every result is one row with its position, page and a sponsored flag. Up to "Max results per search" rows per term.

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

One product per line, returned with every detail field (one product-page request each):

- ASIN: B0BTYCRJSS (uses the marketplace selected below)
- Product URL from any supported marketplace: https://www.amazon.de/dp/B0BTYCRJSS (the URL's marketplace is used)
  Amazon search or Best Sellers URLs pasted here are recognized too. ASINs that don't exist are reported in the run summary and cost nothing.

## `bestSellerUrls` (type: `array`):

Amazon's ranked charts, top 100 per category (2 pages of 50):

- Paste the URL of any Best Sellers, New Releases, Movers & Shakers, Most Wished For or Gift Ideas page, e.g. https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics
- Or type a category as it appears in such URLs ("electronics", "books", "electronics/172541"); it is opened on the selected marketplace as the chart chosen in "Chart type". Category names differ per marketplace (amazon.de electronics is "ce-de"), so URLs are the safest.
  A chart page without a category returns the top 6 of every department.

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

Amazon site for search terms, plain ASINs and category names. Prices are in its currency, texts in its main language. URLs always use their own marketplace.

## `maxResultsPerSearch` (type: `integer`):

Results to return for each search term (or search URL), read page by page (16-60 per page). Amazon shows at most about 7 result pages, so a term returns up to roughly 100-400 results; it stops early when Amazon has no more pages.

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

Amazon's own "Sort by" options (search terms only; for search URLs, sort in the browser before copying the URL).

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

Only search results at or above this price, in the marketplace currency (Amazon's own price filter; search terms only). Leave empty for no limit.

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

Only search results at or below this price, in the marketplace currency (search terms only). Leave empty for no limit.

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

Search pages you set up in your browser with any filters (brand, rating, department, Prime...). Paste the URL of the first results page; it is read like a search term.

## `chartType` (type: `string`):

Which chart a category name in "Best Sellers / New Releases" opens. Pasted URLs keep their own chart.

## `maxItemsPerChart` (type: `integer`):

Products to return from each chart, in rank order (Amazon lists 100). On a department overview page (a Best Sellers URL without a category) the limit applies to each department, which shows its top 6.

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

Search and chart rows have the card fields (title, price, list price, rating, ratings, badges, position or rank, image). Turn this on to open every result's product page and return all fields (brand, seller, availability, images, bullet points, description, Best Sellers rank, specifications, variations). Each such row is charged as a product row instead of a listing row, and runs are slower.

## `deduplicate` (type: `boolean`):

Skip a product that an earlier input of the same run already returned (e.g. found by two search terms, or listed as a product and also in a chart). Charts and searches can then have gaps in their ranks / positions. Turn off to keep every position, e.g. for rank tracking. Within one search, a product that appears both as an ad and organically is always kept twice (sponsored flag).

## `setDeliveryLocation` (type: `boolean`):

Amazon shows prices, availability and delivery for a delivery location. Requests from abroad see foreign currencies and "cannot be delivered" pages, so the Actor sets a central postcode of the marketplace's country (e.g. 10115 Berlin, EC1A 1BB London, 100-0001 Tokyo, 2000 Sydney) with the same "Deliver to" form a shopper uses. amazon.com, .ca, .com.mx and .in already give a visitor from abroad a domestic location, which is kept unless you enter a postcode below. If you turn this off, prices and availability are those of the location Amazon picks from the server's IP address (`deliveryLocation` shows it).

## `deliveryPostcode` (type: `string`):

Optional. A postcode of the selected marketplace's country (e.g. 90210 for amazon.com, M5V 2T6 for amazon.ca, SW1A 1AA for amazon.co.uk). Prices and availability are then those for that address. The format is checked before the run; if Amazon rejects the postcode, that marketplace's inputs fail with the reason (nothing is charged) instead of returning prices for another location.

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

Fallback for amazon.com and amazon.in only. Requests go out directly from Apify; when Amazon blocks direct requests to one of these two marketplaces, it switches to this proxy (US IP addresses) for 10 minutes, and back to direct requests if the proxy is blocked even more. A proxy page that shows a delivery location abroad is fetched again with another IP. All other marketplaces, and any marketplace with your own postcode, always use direct requests: in our tests (19 Oct 2026) the proxy did worse than direct requests on amazon.ca and .com.mx, and through Apify's data-center proxy Amazon answered the delivery-address form with a bot check every time. A session that gets an error page is replaced; a CAPTCHA, challenge or 403 page is retried only once. Residential proxies are not supported. You can use your own proxy URLs instead of Apify Proxy.

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

How many pages are fetched at the same time, each on its own session. At 10, a run reads about 4,000-5,000 product pages per hour (product pages take 2-5 seconds on Amazon's side); search and chart pages are much faster. For more product pages than that, raise the run timeout (default 1 hour): 90 seconds before its timeout the run stops starting new pages (queued product pages included; their search / chart card data is returned instead) and still writes its summary.

## `maxAttempts` (type: `integer`):

How often a page is tried when Amazon answers with a rate-limit or error page (503, empty page, network error), each time with a fresh session. A CAPTCHA, bot-check, JavaScript-challenge or 403 "forbidden" page is retried only once, from another session; if it comes again, the page is reported as blocked. Blocked pages are never charged.

## Actor input object example

```json
{
  "searchTerms": [
    "wireless earbuds",
    "standing desk"
  ],
  "productUrls": [
    "B0BTYCRJSS",
    "https://www.amazon.co.uk/dp/B0FQF32239"
  ],
  "bestSellerUrls": [
    "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics",
    "books"
  ],
  "marketplace": "US",
  "maxResultsPerSearch": 10,
  "sort": "relevance",
  "searchUrls": [
    "https://www.amazon.com/s?k=coffee+grinder&rh=p_72%3A1248882011"
  ],
  "chartType": "best-sellers",
  "maxItemsPerChart": 100,
  "includeDetails": false,
  "deduplicate": true,
  "setDeliveryLocation": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 10,
  "maxAttempts": 8
}
```

# Actor output Schema

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

All rows as JSON, the same fields for every row (null where the source page has no value).

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

Main fields of every row: image, ASIN, title, brand, price, list price, rating, ratings, bought last month.

## `search` (type: `string`):

Search rows with term, page, position, organic position and sponsored flag.

## `charts` (type: `string`):

Best Sellers / New Releases rows in rank order.

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

Per-input rows, errors and notes, plus request statistics (blocked pages retried, delivery locations set).

# 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 = {
    "searchTerms": [
        "wireless earbuds"
    ],
    "productUrls": [
        "https://www.amazon.co.uk/dp/B0FQF32239"
    ],
    "marketplace": "US",
    "maxResultsPerSearch": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fairfetch/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 = {
    "searchTerms": ["wireless earbuds"],
    "productUrls": ["https://www.amazon.co.uk/dp/B0FQF32239"],
    "marketplace": "US",
    "maxResultsPerSearch": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fairfetch/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 '{
  "searchTerms": [
    "wireless earbuds"
  ],
  "productUrls": [
    "https://www.amazon.co.uk/dp/B0FQF32239"
  ],
  "marketplace": "US",
  "maxResultsPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fairfetch/amazon-product-scraper --silent --output-dataset

```

## MCP server setup

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