# Amazon Product Scraper & Price Tracker (`cylindrical_lighthouse/amazon-products`) Actor

Scrape Amazon products, search results and Best Sellers on 10 marketplaces: typed local prices, Buy Box, offers, BSR, stock, variants and a price/rank change monitor.

- **URL**: https://apify.com/cylindrical\_lighthouse/amazon-products.md
- **Developed by:** [Lighthouse Data](https://apify.com/cylindrical_lighthouse) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Amazon Product Scraper & Price Tracker

Scrape Amazon **product pages, search results and Best Sellers lists on 10 marketplaces** and get clean, typed JSON: the local price as a number with its ISO currency, Buy Box seller, all offers, stock status, Best Sellers Rank, rating summary, variants and specs. Turn on **monitoring**, put the Actor on a schedule, and it tells you what changed since the last run: price drops, Buy Box losses, stock-outs and rank moves.

Supported marketplaces: 🇺🇸 amazon.com · 🇬🇧 amazon.co.uk · 🇩🇪 amazon.de · 🇫🇷 amazon.fr · 🇮🇹 amazon.it · 🇪🇸 amazon.es · 🇨🇦 amazon.ca · 🇦🇺 amazon.com.au · 🇯🇵 amazon.co.jp · 🇮🇳 amazon.in

### What does Amazon Product Scraper & Price Tracker do?

- **Products by ASIN or URL:** title, brand, price, list price, discount, currency, Buy Box seller and fulfilment (FBA), stock status and "Only N left", offers count and lowest offer, rating, ratings count, star histogram, Best Sellers Rank in every category, breadcrumbs, variants (parent ASIN and every child's size, colour and so on), bullet points, description, specifications, images, badges and "bought in past month".
- **Search results** for any keyword or search/category URL, with position, price, rating, sponsored flag, badges and "bought in past month".
- **Best Sellers, New Releases, Movers & Shakers, Most Wished For and Most Gifted:** all 100 ranks of a list, including the ranks Amazon loads lazily.
- **All offers (optional):** every seller's price, condition, seller ID, ships-from and delivery promise, with the Buy Box offer flagged.
- **Change monitoring (optional):** remembers the last values per ASIN and marketplace, and outputs a `change` record for each price, list price, stock, Buy Box, BSR, rating or position change above your thresholds.

### Why use it?

- **Correct local prices on every marketplace, at no extra charge.** Amazon hides the Buy Box when an item doesn't ship to the visitor's location, which is a common reason other scrapers return no price. This Actor sets an anonymous "Deliver to" postcode in each marketplace's own country (10115 Berlin, 75001 Paris, EC1A 1BB London and so on) and records the location it used in `deliveryLocation`. You can choose your own postcode.
- **Typed, normalised data.** Prices are numbers (`24.06`, not `"24,06 €"`), currencies are ISO codes (`EUR`, `JPY`, `INR`), stock is an enum (`IN_STOCK`, `LOW_STOCK`, `OUT_OF_STOCK`, `PREORDER`, `UNKNOWN`), and BSR is a number with its category. The field names are the same on all 10 marketplaces. Missing values are `null`, never empty strings or guesses.
- **Built for reliability.** CAPTCHA pages, 503s and bot challenges are detected and retried on a fresh session and IP, with an automatic residential-proxy fallback for stubborn pages (included in the price). We never solve CAPTCHAs. If Amazon changes its page layout, the run fails loudly with a clear message instead of returning empty data.
- **Pay per result, no surprises.** There is no start fee, no per-location fee and no platform-usage add-on. Set a maximum cost per run and the Actor stops cleanly at your limit.
- **Agent- and MCP-friendly.** Every input and output field is documented with examples, so AI agents can call it through the Apify MCP server ("What does ASIN B08T1HR5CS cost on amazon.de?").

### Use cases

- **Price and Buy Box monitoring** for brands, MAP enforcement, and resellers watching competitors.
- **Amazon market research:** Best Sellers across 10 countries, category assortments, price indexes.
- **Keyword share of shelf:** who ranks for your search terms, sponsored against organic.
- **Arbitrage and sourcing:** compare the same ASIN across marketplaces in local currencies, and use "bought in past month" as a demand signal.
- **Catalogue enrichment:** specs, images, variants and category paths for product feeds.
- **AI agents and RAG** that need current Amazon product facts.

### How to use it

1. Click **Try for free**.
2. Enter what you want:
   - **ASINs or product URLs** (e.g. `B085DVHQ57` or `https://www.amazon.de/dp/B08T1HR5CS`)
   - **Search keywords** (e.g. `coffee grinder`) on the marketplace you pick
   - **Amazon URLs** for search, category or Best Sellers pages (e.g. `https://www.amazon.com/gp/bestsellers/kitchen`)
3. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the API. The Output tab has views for **Products**, **Search results**, **Best Sellers** and **Changes**.

Example input:

```json
{
    "asins": ["B085DVHQ57", "https://www.amazon.co.uk/dp/B094D541XW"],
    "searchQueries": ["coffee grinder"],
    "startUrls": [{ "url": "https://www.amazon.de/gp/bestsellers/computers" }],
    "marketplace": "US",
    "maxResultsPerQuery": 20,
    "includeOffers": true
}
```

#### ⏰ Track prices and ranks on a schedule

1. Put your ASINs (or a Best Sellers or search URL) in the input and turn on **Monitor changes between runs**.
2. Give the monitor a name, e.g. `monitorStoreName: "my-brand-de"`. Use one name per list you track.
3. Save the input as a **Task**, then add a **Schedule**, for example every day at 07:00 (`0 7 * * *`).
4. Each run writes one `change` record per detected change. Use the **Changes** view, a webhook, or the Zapier, Make, Slack or Google Sheets integrations to get alerts.

```json
{
    "asins": ["B08T1HR5CS", "B0BR3L78XN", "B0B7NTY2S6"],
    "marketplace": "DE",
    "monitorChanges": true,
    "monitorStoreName": "my-brand-de",
    "monitorFields": ["price", "availability", "buyBoxSeller", "bestSellersRank"],
    "priceChangeThresholdPercent": 2,
    "rankChangeThresholdPercent": 10
}
```

A change record looks like this:

```json
{
    "recordType": "change",
    "asin": "B085DVHQ57",
    "marketplace": "US",
    "title": "Owala FreeSip Stainless Steel Water Bottle 32 oz Very, Very Dark",
    "field": "price",
    "previousValue": 34.99,
    "currentValue": 29.99,
    "changePercent": -14.29,
    "currency": "USD",
    "previousScrapedAt": "2026-09-28T07:00:12.000Z",
    "scrapedAt": "2026-09-29T07:00:09.000Z",
    "url": "https://www.amazon.com/dp/B085DVHQ57"
}
```

With `monitorOutput: "changesOnly"`, only change records go to the dataset. The full check report (new, changed and unchanged per ASIN) is saved as `MONITOR_REPORT` in the run's key-value store.

### Input

| Field | Type | Description | Example |
|---|---|---|---|
| `asins` | array of strings | ASINs (looked up on `marketplace`) or product URLs from any supported marketplace | `["B085DVHQ57", "https://www.amazon.de/dp/B08T1HR5CS"]` |
| `searchQueries` | array of strings | Keywords to search on `marketplace` | `["coffee grinder"]` |
| `startUrls` | array | Product, search/category (`/s?k=…`, `/s?rh=n:…`) or ranking-list URLs (`/gp/bestsellers/…`, `/gp/new-releases/…`, `/gp/movers-and-shakers/…`, `/gp/most-wished-for/…`, `/gp/most-gifted/…`) | `[{"url": "https://www.amazon.com/gp/bestsellers/kitchen"}]` |
| `marketplace` | string | `US`, `UK`, `DE`, `FR`, `IT`, `ES`, `CA`, `AU`, `JP` or `IN`, used for plain ASINs and keywords. Default `US` | `"DE"` |
| `maxResultsPerQuery` | integer | Results per keyword, search URL or list. `0` = all. Default `50` | `100` |
| `scrapeProductDetails` | boolean | Open every search or list result for full product data (charged as `product`). Default `false` | `true` |
| `includeOffers` | boolean | Add all sellers' offers to each product. Default `false` | `true` |
| `maxOffers` | integer | Max offers per product. Default `10` | `20` |
| `monitorChanges` | boolean | Compare with the previous run and output `change` records. Default `false` | `true` |
| `monitorStoreName` | string | Named key-value store that keeps the last values. Default `amazon-products-monitor` | `"my-brand-de"` |
| `monitorOutput` | string | `all` (products + changes) or `changesOnly`. Default `all` | `"changesOnly"` |
| `monitorFields` | array | Fields to watch: `price`, `listPrice`, `availability`, `buyBoxSeller`, `bestSellersRank`, `rating`, `reviewsCount`, `offersCount`, `listRank` | `["price", "buyBoxSeller"]` |
| `priceChangeThresholdPercent` | integer | Ignore smaller price moves. Default `0` | `5` |
| `rankChangeThresholdPercent` | integer | Ignore smaller rank moves. Default `10` | `20` |
| `deliveryPostcodes` | object | Your own "Deliver to" postcode per marketplace | `{"US": "90210", "DE": "80331"}` |
| `maxItems` | integer | Hard cap on product and list records for the whole run. `0` = no cap | `1000` |
| `maxConcurrency` | integer | Parallel requests. Default `8` | `8` |
| `useResidentialFallback` | boolean | Retry stubborn pages through a residential IP in the marketplace's country (included in the price). Default `true` | `true` |

### Output

Every record has `recordType` (`product`, `search`, `bestsellers` or `change`), `asin`, `marketplace`, `url` and `scrapedAt`. A product record, trimmed:

```json
{
    "recordType": "product",
    "asin": "B08T1HR5CS",
    "marketplace": "DE",
    "domain": "amazon.de",
    "url": "https://www.amazon.de/dp/B08T1HR5CS",
    "title": "HP 305 Schwarz/Farbe, Original Druckerpatronen 2er-Pack",
    "brand": "HP",
    "price": 24.06,
    "listPrice": 25.67,
    "currency": "EUR",
    "priceText": "24,06€",
    "savingsPercent": 6,
    "availability": "IN_STOCK",
    "availabilityText": "Auf Lager",
    "stockLeft": null,
    "buyBox": { "sellerName": "Amazon", "sellerId": "A3JWKAKR8XB7XF", "shipsFrom": "Amazon", "isAmazon": true, "isFulfilledByAmazon": true },
    "offersCount": 47,
    "lowestOfferPrice": 24.06,
    "offers": [
        { "price": 24.06, "currency": "EUR", "condition": "Neu", "sellerName": "Amazon", "sellerId": null, "shipsFrom": "Amazon", "isFulfilledByAmazon": true, "isBuyBox": true, "deliveryText": "GRATIS Lieferung Freitag, 2. Oktober" },
        { "price": 29.84, "currency": "EUR", "condition": "Neu", "sellerName": "inkcompany", "sellerId": "A2UOUL8U7ZBPFE", "shipsFrom": "inkcompany", "isFulfilledByAmazon": false, "isBuyBox": false, "deliveryText": "GRATIS Lieferung 1. - 2. Oktober" }
    ],
    "rating": 4.6,
    "reviewsCount": 85723,
    "ratingHistogram": { "fiveStar": 80, "fourStar": 12, "threeStar": 4, "twoStar": 1, "oneStar": 3 },
    "bestSellersRank": 1,
    "bestSellersCategory": "Computer & Zubehör",
    "bestSellersRanks": [
        { "rank": 1, "category": "Computer & Zubehör", "categoryUrl": "https://www.amazon.de/gp/bestsellers/computers" },
        { "rank": 1, "category": "Tintenpatronen für Tintenstrahldrucker", "categoryUrl": "https://www.amazon.de/gp/bestsellers/computers/34253562031" }
    ],
    "categoryPath": ["Computer & Zubehör", "Drucker & Zubehör", "Drucker Zubehör", "Tintenpatronen für Drucker"],
    "parentAsin": "B0HHB4BWH2",
    "variantAttributes": { "style_name": "Vorherige Version" },
    "variantAsins": ["B08T1HR5CS"],
    "variants": [{ "asin": "B08T1HR5CS", "attributes": { "style_name": "Vorherige Version" } }],
    "features": ["Original HP Tintenpatronen: Erstklassige Druckqualität, hohe Zuverlässigkeit und einfache Handhabung"],
    "description": null,
    "images": ["https://m.media-amazon.com/images/I/71Pfo+tfuvL._AC_SL1500_.jpg"],
    "thumbnail": "https://m.media-amazon.com/images/I/71Pfo+tfuvL._AC_SL1500_.jpg",
    "specifications": { "Modellname": "HP 305", "Marke": "HP", "Tintenfarbe": "Schwarz, Dreifarbig" },
    "badges": ["Amazon's Choice"],
    "isAmazonsChoice": true,
    "isBestSeller": false,
    "boughtPastMonth": 20000,
    "deliveryText": "GRATIS Lieferung Freitag, 2. Oktober für qualifizierte Erstbestellung",
    "deliveryLocation": "10115 Berlin",
    "source": null,
    "scrapedAt": "2026-09-29T22:26:01.297Z"
}
```

Search and Best Sellers records carry `position`, `page`, `title`, `price`, `listPrice`, `currency`, `rating`, `reviewsCount`, `thumbnail`, `badges`, `boughtPastMonth`, `isSponsored` and `searchQuery`, or `listName` and `listType`. The full field list with descriptions is on the **Output** tab. Each run also saves a `SUMMARY` record in its key-value store, listing counts, not-found ASINs, keywords with no results and failed pages.

### Pricing

Pay per event. You pay only for results; Apify platform usage is included.

| Event | What it is | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|---|
| `product` | One full product page (or one product checked in monitoring mode) | $0.004 | $0.0036 | $0.0032 | $0.0028 | $0.0028 | $0.0028 |
| `listing-item` | One search or Best Sellers result without opening its page | $0.001 | $0.0009 | $0.0008 | $0.0007 | $0.0007 | $0.0007 |
| `offers` | All sellers' offers for one product (only with `includeOffers`) | $0.001 | $0.001 | $0.0009 | $0.0009 | $0.0009 | $0.0009 |
| Actor start | Apify's standard start event, per GB of memory (1 GB default) | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 |

`change` records are free, and so is the residential-proxy fallback.

**Cost examples (FREE tier):**

- 1,000 products with full details: **$4.00**. With all offers: $5.00.
- Top 100 Best Sellers in 5 categories (500 list results): **$0.50**.
- Daily price tracking of 200 ASINs: 200 × $0.004 = $0.80 a day, about **$24 a month**.
- The default input (2 products, 10 search results and 10 Best Sellers): **about $0.03**.

Set **Maximum cost per run** in the run options and the Actor stops cleanly when it is reached.

### FAQ

**Is it legal to scrape Amazon?** This Actor collects only publicly available product data: prices, ranks, availability and the public rating summary. It never logs in and never collects reviewers' names or review texts. Amazon's Conditions of Use restrict automated access, so check your own use with your lawyers. Your results may contain the names of sellers, which can be personal data if a seller is an individual. Personal data is protected by GDPR and other regulations; do not use it unless you have a legitimate reason. Product descriptions and images may be protected by copyright; don't republish them without permission.

**Why are prices different from what I see in my browser?** Amazon prices depend on the delivery location. We use a central postcode in each marketplace's country (see `deliveryLocation` on every record). Set your own with `deliveryPostcodes`, e.g. `{"US": "90210"}`.

**Can I get full customer reviews?** No. Amazon now shows full review lists only to signed-in customers, and this Actor never logs in. You get the public rating, ratings count and star histogram.

**Why does a product show a different ASIN than I asked for?** Parent ASINs of variation families redirect to a child variant. The record keeps the ASIN you asked for in `inputAsin`, and lists the whole family in `variantAsins` and `variants`.

**What happens with an invalid ASIN or a keyword with no results?** The run still succeeds. Not-found ASINs and keywords with no results are listed in the `SUMMARY` record and the status message, and you aren't charged for them. A search that returns only ads counts as "no results".

**Do I need proxies?** No. The Actor uses Apify Proxy automatically, with a residential fallback for pages that stay blocked.

**Can AI agents use it?** Yes. The input and output schemas are fully documented, so it works as a tool through the [Apify MCP server](https://mcp.apify.com). Keep `maxResultsPerQuery` small for interactive use.

### Limitations

- Customer review texts are not available (sign-in only).
- Amazon shows at most about 7–20 search pages per keyword. For more coverage, split a keyword into narrower keywords or category URLs.
- Best Sellers-type lists have at most 100 ranks.
- Specification labels are in the marketplace's language (e.g. `Marke` on amazon.de).
- Brand store pages (`/stores/…`), deals pages and seller storefronts are not supported yet.
- Prices are for the delivery postcode used. Business (B2B) and Subscribe & Save prices are not collected.
- `listRank` monitoring compares positions only for products seen in both runs. A product that drops out of a list produces no change record.

### Changelog

See the [Changelog](https://apify.com/cylindrical_lighthouse/amazon-products/changelog) tab.

### Support

Found a bug or need a field? Open an issue on the **Issues** tab; we reply within 48 hours. Please include the run ID and one example ASIN or URL.

# Changelog

This Actor's version history is a separate document: https://apify.com/cylindrical\_lighthouse/amazon-products/changelog.md

# Actor input Schema

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

Products to scrape in full (title, price, Buy Box, stock, BSR, variants, specs). Each entry is a 10-character ASIN such as `B085DVHQ57` (looked up on the marketplace chosen below) or a product URL such as `https://www.amazon.de/dp/B08T1HR5CS` (its own marketplace is used). Each product is charged as one `product` event.

## `searchQueries` (type: `array`):

Keywords to search on the chosen marketplace, exactly as you would type them into Amazon's search box, e.g. `coffee grinder`. Each result is charged as one `listing-item` event, or as one `product` event when `scrapeProductDetails` is on. Limit results with `maxResultsPerQuery`.

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

Amazon page URLs from any of the 10 supported marketplaces. Supported pages: product (`/dp/ASIN`), search or category results (`/s?k=…` or `/s?rh=n:…`) and ranking lists (`/gp/bestsellers/…`, `/gp/new-releases/…`, `/gp/movers-and-shakers/…`, `/gp/most-wished-for/…`, `/gp/most-gifted/…`, `/zgbs/…`). Example: `https://www.amazon.com/gp/bestsellers/kitchen`.

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

Amazon site used for plain ASINs and search keywords. URLs always use their own site. Prices come back in that marketplace's currency, for delivery to a default postcode in its country (see `deliveryPostcodes`). Example: `DE` for amazon.de.

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

Stop each search keyword, search URL or ranking list after this many products. Amazon shows about 16–60 results per search page and 100 per Best Sellers list. Example: `50`. Use `0` for no limit (search stops where Amazon stops, usually 7–20 pages).

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

Off (default): search and ranking results come from the list pages only (title, price, rating, rank, badges); fast and charged as `listing-item`. On: each result's product page is also opened, so you get full product records (Buy Box, stock, BSR, variants, specs) charged as `product` instead.

## `includeOffers` (type: `boolean`):

Also load the public "Other sellers on Amazon" panel for each product and return every offer with price, condition, seller and ships-from. Adds one `offers` event per product that has offers. Example: `true` to monitor third-party sellers against the Buy Box.

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

Upper limit of offers returned per product when `includeOffers` is on. Amazon returns about 10 offers per panel page. Example: `10`.

## `monitorChanges` (type: `boolean`):

Remember each product's last price, Buy Box seller, stock and Best Sellers Rank in a named key-value store, and add `change` records (and a `changes` field on each product) when they differ from the previous run. Schedule the Actor (e.g. daily) with the same input to get a price and rank tracker. Change records are free.

## `monitorStoreName` (type: `string`):

Name of the key-value store in your Apify account that keeps the last-seen values. Use a different name per tracked list so that separate schedules don't overwrite each other. Letters, digits and dashes. Example: `amazon-monitor-my-brand`.

## `monitorOutput` (type: `string`):

`all` (default): every product record plus a `change` record per detected change. `changesOnly`: only `change` records are written to the dataset; each product checked is still charged, and the full check report is saved as `MONITOR_REPORT` in the run's key-value store.

## `monitorFields` (type: `array`):

Which values produce a `change` record when they differ from the previous run. Options: `price`, `listPrice`, `availability`, `buyBoxSeller`, `bestSellersRank`, `rating`, `reviewsCount`, `offersCount`, `listRank` (position in a Best Sellers or search list).

## `priceChangeThresholdPercent` (type: `integer`):

Ignore price and list-price moves smaller than this percentage. `0` reports every change. Example: `5` reports only moves of 5% or more.

## `rankChangeThresholdPercent` (type: `integer`):

Ignore Best Sellers Rank and list-position moves smaller than this percentage (BSR moves every hour). Example: `10` reports a rank going from 1,000 to 1,100 or 900, but not to 1,050.

## `deliveryPostcodes` (type: `object`):

Postcode used as the anonymous "Deliver to" location, which decides the prices and offers Amazon shows. Keys are marketplace codes. Defaults: US 10001 (only if you set one), UK EC1A 1BB, DE 10115, FR 75001, IT 20121, ES 28001, CA M5V 3L9, AU 2000, JP 100-0001, IN 110001. Example: `{"US": "90210", "DE": "80331"}`.

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

Hard cap on product and listing records for the whole run, across all inputs. Change records don't count. `0` = no cap. Keeps cost predictable; you can also set a maximum cost per run in the run options.

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

Maximum parallel requests to Amazon. Higher is faster but triggers more CAPTCHAs (which are retried automatically). Example: `8`.

## `useResidentialFallback` (type: `boolean`):

Pages that stay blocked after 3 datacenter attempts are retried through a residential IP in the marketplace's country (capped at 10% of pages per run). Included in the price; no extra charge. Turn off only for testing.

## Actor input object example

```json
{
  "asins": [
    "B085DVHQ57",
    "https://www.amazon.co.uk/dp/B094D541XW"
  ],
  "searchQueries": [
    "coffee grinder",
    "usb c charger"
  ],
  "startUrls": [
    {
      "url": "https://www.amazon.com/gp/bestsellers/kitchen"
    },
    {
      "url": "https://www.amazon.de/s?k=kopfh%C3%B6rer"
    }
  ],
  "marketplace": "US",
  "maxResultsPerQuery": 50,
  "scrapeProductDetails": false,
  "includeOffers": true,
  "maxOffers": 10,
  "monitorChanges": true,
  "monitorStoreName": "amazon-monitor-my-brand",
  "monitorOutput": "all",
  "monitorFields": [
    "price",
    "availability",
    "buyBoxSeller",
    "bestSellersRank"
  ],
  "priceChangeThresholdPercent": 5,
  "rankChangeThresholdPercent": 10,
  "deliveryPostcodes": {
    "US": "90210",
    "DE": "80331"
  },
  "maxItems": 1000,
  "maxConcurrency": 8,
  "useResidentialFallback": true
}
```

# Actor output Schema

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

Full product records (recordType = product): typed price and ISO currency, Buy Box, offers, stock, Best Sellers Rank, variants, specs.

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

Search result records (recordType = search) with position, price, rating and badges.

## `bestsellers` (type: `string`):

Ranking-list records (recordType = bestsellers): rank, list name, price and rating.

## `changes` (type: `string`):

Monitoring mode: one record per detected price, Buy Box, stock or rank change (recordType = change).

## `allItems` (type: `string`):

Every record of the run with all fields.

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

Counts, failed and not-found URLs, zero-result keywords, layout warnings and request statistics.

## `monitorReport` (type: `string`):

Monitoring mode: every product checked with its status (new, changed, unchanged).

# 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 = {
    "asins": [
        "B085DVHQ57",
        "0735211299"
    ],
    "searchQueries": [
        "coffee grinder"
    ],
    "startUrls": [
        {
            "url": "https://www.amazon.com/gp/bestsellers/kitchen"
        }
    ],
    "marketplace": "US",
    "maxResultsPerQuery": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cylindrical_lighthouse/amazon-products").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 = {
    "asins": [
        "B085DVHQ57",
        "0735211299",
    ],
    "searchQueries": ["coffee grinder"],
    "startUrls": [{ "url": "https://www.amazon.com/gp/bestsellers/kitchen" }],
    "marketplace": "US",
    "maxResultsPerQuery": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cylindrical_lighthouse/amazon-products").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 '{
  "asins": [
    "B085DVHQ57",
    "0735211299"
  ],
  "searchQueries": [
    "coffee grinder"
  ],
  "startUrls": [
    {
      "url": "https://www.amazon.com/gp/bestsellers/kitchen"
    }
  ],
  "marketplace": "US",
  "maxResultsPerQuery": 10
}' |
apify call cylindrical_lighthouse/amazon-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cylindrical_lighthouse/amazon-products"
        }
    }
}
```

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/lK2gGHEOdoOjJEskg/builds/zm9Zzak6GgnIQHj2p/openapi.json
