# Amazon Product Scraper ($0.5/1K) — URLs, Search & Details (`memo23/amazon-search`) Actor

$0.50/1K. Paste Amazon category or product URLs (or a keyword / ASIN) — numeric prices, Choice / Best Seller flags, Prime, ratings across 21 markets. A /dp/ link opens that product page (BSR, buy box, variants, estimated sales). Search enrich is optional. Monitor POSTs Slack/Zapier alerts.

- **URL**: https://apify.com/memo23/amazon-search.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, AI, Agents
- **Stats:** 16 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.30 / 1,000 product scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Amazon Product Scraper ($0.5/1K) — URLs, Search & Details

**$0.50 / 1,000 products** on Bronze (numeric prices, ratings, Prime, Choice / Best Seller flags — not just title/price/image). A product URL opens that `/dp/` page. Search enrich is optional. Store URL: [`memo23/amazon-search`](https://apify.com/memo23/amazon-search).

Paste a category URL, a product URL, or a keyword — the same starting point buyers use on the Store’s default Amazon crawler, at a fraction of $4/1K. Each row is analysis-ready: numeric prices, real list prices, discounts, ratings, review counts, Choice / Best Seller / sponsored flags and Prime — across 21 marketplaces. A `/dp/` link or bare ASIN fetches BSR, variants, buy box, bullets and estimated monthly sales. Turn on `enrichDetails` to do the same after a search crawl. Point the scheduler at the same input and monitor mode returns **only new or changed products**, so a price watch costs nothing on quiet days.

No Amazon account, no Product Advertising API key, no browser runtime.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-amazon-products.png)

### Why use this Amazon scraper?

- **21 marketplaces** — US, UK, DE, FR, IT, ES, CA, AU, JP, IN, NL, SE, PL, BE, AE, MX, TR, SG, **BR, SA, EG**. Prices come back in the marketplace currency with the ISO code attached. Several marketplaces can run in one job.
- **Numbers, not strings** — `priceValue`, `listPriceValue`, `discountPercentage`, `ratingValue`, `reviewsCount` are parsed numerics; no spreadsheet cleanup.
- **SERP flags** — `isAmazonChoice`, `isBestSeller`, `isSponsored`, `isPrime`, `positionOverall`, `prevPurchased`, `variantHint`, `fastDeliveryText`. Set `includeSponsored: false` to drop ads after ranks are assigned.
- **Product URLs and ASINs open the product page** — title, price, BSR, variants, buy box, bullets, images, stock and `estimatedMonthlySales`. Same job as pasting `/dp/` into the official crawler.
- **Optional search enrich** — `enrichDetails: true` fetches `/dp/` for each listing-card ASIN after a category or keyword crawl.
- **Incremental monitoring** — schedule the same input and receive only new ASINs and price/rating/review movements. Changed rows can POST to Slack / Zapier. Quiet days publish **no billable rows**.
- **Cheap by construction** — listing mode is one HTTP fetch per page (20–48 cards). Product-page fetches run for `/dp/` / ASIN inputs, or when enrich is on.

### Overview

Built for e-commerce analysts, sellers, arbitrage hunters and price-tracking teams. Feed it product URLs, ASINs, category/best-seller URLs or keywords. A `/dp/` or ASIN row is the product page; a search/category row is the listing card (plus the product page if `enrichDetails` is on).

### Supported inputs

- **Keywords** — `"usb c cable"` — runs a paginated search on every selected marketplace.
- **Bare ASINs** — `"B082Z1YYRK"` — opens `amazon.{marketplace}/dp/ASIN`.
- **Search URLs** — `https://www.amazon.com/s?k=gaming+mouse&rh=...` — any filters/sort the URL carries are kept.
- **Best-seller lists** — `https://www.amazon.com/gp/bestsellers/electronics/172282`.
- **Category browse pages** — `https://www.amazon.de/b?node=3468301`.
- **Product URLs** — `https://www.amazon.com/dp/B082Z1YYRK` — fetches that product page.

Not supported: seller storefront profile pages (use the [Amazon Seller Contact Scraper](https://apify.com/memo23/amazon-sellers-scraper)) and review-thread text (use the [Amazon Reviews Scraper](https://apify.com/memo23/amazon-reviews-scraper)). Search-result cards need `enrichDetails: true` for full PDP fields.

### Use cases

| Who | What |
|---|---|
| E-commerce sellers | competitor & MAP price monitoring, repricing inputs |
| Arbitrage / deal hunters | discount discovery with real list-price math |
| Marketers & agencies | sponsored-vs-organic share of shelf, badge tracking |
| Product researchers | niche validation via monthly-bought + review velocity |
| Data teams | cross-marketplace price comparison feeds |

### How it works

1. Each query/URL is classified: product URLs and ASINs go to `/dp/`; search, category and best-seller URLs stay on listing pages.
2. Pages are fetched in parallel over residential exit IPs matching the marketplace country (a `.de` page from a DE exit, etc.).
3. Listing cards become typed rows (prices, rating, Choice / Best Seller / sponsored flags, rank). A product page becomes one full row (BSR, variants, buy box, sales estimate).
4. Rows are deduped by ASIN per marketplace and capped by your `maxItems`.
5. If `enrichDetails` is on, listing rows that are not already enriched get a `/dp/` fetch.
6. In monitor mode, rows are diffed against the named baseline and only changes are published; the baseline advances only after a fully clean scrape (fail-closed).

### Input configuration

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Category, search, best-seller or product `/dp/` URL. A product URL fetches that page. Domain picks the marketplace. |
| `queries` | array | Keywords or bare ASINs. Each entry crawls every selected marketplace. |
| `marketplaces` | array | Marketplace TLDs: `"com"`, `"co.uk"`, `"de"`, … Default `["com"]`. Used by `queries` only. |
| `sortBy` | string | `relevance` (default), `price-asc`, `price-desc`, `rating`, `newest`, `bestSellers`. |
| `minPrice` / `maxPrice` | integer | Price bounds in the marketplace currency (keyword queries). |
| `primeOnly` | boolean | Keep only cards Amazon marks as Prime (post-filter). |
| `brand` | string | Keyword searches restricted to one brand (e.g. `"Anker"`). |
| `fourStarsAndUp` | boolean | Keyword searches restricted to 4★+ (major marketplaces). |
| `deals` | string | `off` (default), `all-discounts`, `todays-deals` (amazon.com). |
| `includeSponsored` | boolean | Keep sponsored cards (default true). False drops them after ranks are assigned. |
| `enrichDetails` | boolean | Fetch each `/dp/` page for BSR, variants, buy box and sales estimates (default false). |
| `maxOffers` | integer | Attach up to N marketplace offers on each product. 0 skips. |
| `maxProductVariantsAsSeparateResults` | integer | Emit other variant ASINs as their own rows. 0 keeps them on the parent. |
| `scrapeProductVariantPrices` | boolean | Write price onto each entry in `variants[]`. |
| `countryCode` / `zipCode` | string | Delivery location (glow + cookie). Availability and ship-to prices follow this address when Amazon honours it. |
| `locationDeliverableRoutes` | array | Apply zip on `PRODUCT`, `SEARCH`, and/or `OFFERS`. |
| `maxSearchPagesPerStartUrl` | integer | Cap listing pages per URL (best-sellers still stop at 2). |
| `language` | string | Accept-Language hint (`en`, `de`, …). |
| `proxyCountry` | string | Override exit country. Leave empty to pin from the domain. |
| `maxItems` | integer | Hard ceiling of product rows for the whole run. |
| `maxItemsPerQuery` | integer | Per-query/per-URL row cap. One page yields ~20–48 rows. |
| `monitorMode` | string | `off` (default), `price-changes`, `all-changes`. |
| `monitorName` | string | Stable baseline name for a scheduled watch (e.g. `"competitor-asins-us"`). |
| `webhookUrl` | string | Optional HTTPS endpoint — changed rows are POSTed as JSON on monitor runs with changes. |
| `concurrency` | integer | Parallel page fetches (1–20, default 6). |
| `proxy` | object | Optional override; leave unset for the built-in residential setup. |

#### Paste a category or product URL

```json
{
  "startUrls": [
    { "url": "https://www.amazon.com/s?k=keyboard" },
    { "url": "https://www.amazon.com/dp/B0B3BVWJ6Y" }
  ],
  "maxItems": 50
}
```

#### Search by keyword

```json
{
  "queries": ["usb c charger", "portable monitor"],
  "marketplaces": ["com", "de"],
  "sortBy": "bestSellers",
  "minPrice": 10,
  "maxPrice": 250,
  "primeOnly": true,
  "brand": "Anker",
  "fourStarsAndUp": true,
  "maxItems": 200
}
```

#### Enrich from the product page (BSR, buy box, sales)

```json
{
  "startUrls": [{ "url": "https://www.amazon.com/s?k=usb+c+cable" }],
  "enrichDetails": true,
  "includeSponsored": false,
  "maxItems": 30
}
```

#### Monitor prices on a schedule

Use the same `monitorName` (and same queries/marketplaces/filters) on every scheduled run. The first run publishes the full baseline; later runs publish only new ASINs and price moves.

```json
{
  "queries": ["B0C3HCD34R", "B082Z1YYRK"],
  "marketplaces": ["com"],
  "maxItems": 40,
  "monitorMode": "price-changes",
  "monitorName": "competitor-asin-prices-us"
}
```

`all-changes` additionally emits rating and review-count movement. The baseline is stored per `monitorName` in a named key-value store; a blocked or partial scrape never overwrites healthy state, and rows are published before the baseline advances, so a retry can duplicate an alert but never lose one.

#### Push alerts to Slack / Zapier / your backend

Add `webhookUrl` and every monitor run that finds changes POSTs them to your endpoint as JSON — no dataset polling, no Zapier-triggered actor runs. The first baseline run is never sent (you asked for changes, not the initial dump), and a webhook failure can only lose the ping, never the data (rows are already in the dataset).

```json
{
  "queries": ["B0C3HCD34R"],
  "monitorMode": "price-changes",
  "monitorName": "my-asin-watch",
  "webhookUrl": "https://hooks.zapier.com/hooks/catch/123/abc"
}
```

Payload: `{ "event": "amazon-products.changes", "monitorName", "runId", "datasetId", "totalChanges", "countsByChangeType", "rows": [...] }` (rows capped at 500 per POST; `truncated: true` flags overflow).

### Output overview

One dataset row per product card. Display strings (`price`, `listPrice`, `monthlyBought`) are kept alongside normalized numerics (`priceValue`, `listPriceValue`, `monthlyBoughtValue`). Fields Amazon omits from a card (typical for some variants or unavailable offers) are `null`, never fabricated.

### Output sample

Keyword search `"usb c cable"` on amazon.com (trimmed):

```json
{
  "asin": "B0CG1LGWR6",
  "title": "LISEN USB C to USB C Cable, 240W Fast Charging Type C Charger Cord (6.6FT, 2Pack)",
  "url": "https://www.amazon.com/dp/B0CG1LGWR6",
  "price": "$8.99",
  "priceValue": 8.99,
  "listPrice": "$9.99",
  "listPriceValue": 9.99,
  "pricePerUnit": "$4.50",
  "discountPercentage": 10.01,
  "onSale": true,
  "currencyCode": "USD",
  "ratingValue": 4.6,
  "reviewsCount": 10214,
  "monthlyBought": "10K+",
  "monthlyBoughtValue": 10000,
  "isPrime": false,
  "isSponsored": false,
  "isAmazonChoice": false,
  "isBestSeller": true,
  "positionOverall": 3,
  "badge": "Best Seller",
  "page": 1,
  "position": 3,
  "imageUrl": "https://m.media-amazon.com/images/I/81afg0W0O8L._AC_UY218_.jpg",
  "query": "usb c cable",
  "marketplace": "amazon.com",
  "scrapedAt": "2026-07-22T21:07:50.376Z"
}
```

In monitor mode, changed rows additionally carry `changeType`, `changedFields`, `previousPriceValue`, `priceDelta`, `priceDeltaPercentage`, `previousRatingValue` and `previousReviewsCount`.

### Key output fields

- **Identity** — `asin`, `title`, `url`, `imageUrl`, `marketplace`, `query`, `sourceUrl`, `scrapedAt`
- **Pricing** — `price` / `priceValue`, `listPrice` / `listPriceValue`, `pricePerUnit`, `discountPercentage`, `onSale`, `currencyCode`, `couponText`
- **Social proof** — `ratingValue`, `reviewsCount`, `monthlyBought` / `monthlyBoughtValue`, `badge`, `isAmazonChoice`, `isBestSeller`
- **Placement** — `page`, `position`, `positionOverall`, `isSponsored`, `isPrime`, `deliveryText`, `fastDeliveryText`, `prevPurchased`, `variantHint`
- **Enrich (`enrichDetails`)** — `brand`, `bestsellerRanks`, `variants`, `soldBy`, `shipsFrom`, `isFba`, `features`, `description`, `images`, `breadcrumbs`, `availability`, `inStock`, `estimatedMonthlySales`, `estimatedMonthlyRevenue`
- **Monitoring** — `changeType`, `changedFields`, `previousPriceValue`, `priceDelta`, `priceDeltaPercentage`, `previousRatingValue`, `previousReviewsCount`

### Pricing

| Plan | Per 1,000 products |
|---|---|
| Free | $1.00 |
| Bronze | **$0.50** |
| Silver | $0.40 |
| Gold / Platinum / Diamond | $0.30 |

One small actor-start fee per run. Monitor runs that find no changes publish **no billable rows**. Each listing row includes numeric prices, ratings, Prime, Choice / Best Seller flags and marketplace. `enrichDetails` adds a `product-details` event at **$1 / 1,000** enriched rows (live from 29 Sep 2026).

### FAQ

**Which URLs work?** Search results, best-seller lists, category browse pages and product URLs on any of the 21 supported marketplaces (including Brazil, Saudi Arabia and Egypt). Seller storefront profiles are out of scope.

**Does it fetch product-detail pages?** Yes for `/dp/` URLs and bare ASINs. Search and category crawls stay on listing cards unless `enrichDetails` is true. Review text and seller contact data stay on the dedicated actors.

**Why is a price sometimes `null`?** Amazon omits the price from some search cards — typically products with variants ("Options" cards), no featured offer, or offers unavailable in the marketplace region. The row still carries everything else.

**Are monthly-bought numbers exact?** No — Amazon publishes thresholds ("1K+", "10K+"). Both the raw string and the normalized floor value are returned.

**How current is monitor-mode data?** As current as your schedule. Each run re-scrapes live search pages and diffs against the stored baseline.

**Do I need proxies?** No — residential routing per marketplace country is built in. The optional `proxy` input exists only if you want to route through your own Apify proxy groups instead.

### Support

- **Issues tab** of this actor for bugs and feature requests — response usually within 24h.
- Custom fields, exports or private variants: message via the actor's contact options.
- **Finding the actor useful?** A quick rating on this page genuinely helps other buyers find it — thank you! ⭐

### Additional services

Need seller contact data behind these products, review threads, or a tailored feed (custom fields, delivery to S3/webhook/DB)? Open an issue or reach out — custom versions are a routine request.

### Explore more scrapers

More e-commerce and lead-gen actors: [apify.com/memo23](https://apify.com/memo23) — including the [Amazon Seller Contact Scraper](https://apify.com/memo23/amazon-sellers-scraper) (the sellers behind these products, with emails/VAT/ratings). Just want a quick sample? Try the [Free Amazon Product Scraper](https://apify.com/memo23/free-amazon-product-scraper) — same engine, up to 50 rows per run, completely free.

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/amazon-search`).

**Purpose:** turn Amazon searches (keywords, ASINs, category/best-seller URLs) into typed product rows with numeric prices, discounts, ratings, Choice / Best Seller flags and rank across 21 marketplaces; optional `enrichDetails` adds BSR / sales estimates; optional monitor mode emits only changes.

**Minimal input:**

```json
{ "startUrls": [{ "url": "https://www.amazon.com/s?k=usb+c+cable" }], "maxItems": 30 }
```

Keyword alternative: `{ "queries": ["usb c cable"], "marketplaces": ["com"], "maxItems": 30 }`

**Output:** one dataset row per product — listing fields plus `isAmazonChoice`, `isBestSeller`, `positionOverall` (+ BSR / variants / buy box / `estimatedMonthlySales` when `enrichDetails` is true; + change fields in monitor mode).

**Behaviors an agent should know:**

- Always set `maxItems`; an uncapped multi-query, multi-marketplace run can return thousands of rows.
- `primeOnly`, `brand`, `fourStarsAndUp`, `deals` apply to keyword `queries` only (Amazon `rh=` facets). Start URLs keep the filters already in the URL. A filter with no known id for that marketplace is skipped, not guessed.
- `queries` and `startUrls` are additive — both run if both are set. Bare 10-char alphanumerics in `queries` open that product page.
- `monitorMode` ≠ `off` keeps a baseline keyed by `monitorName`; the first run returns everything (`changeType: "new"`), later runs return only changes. Reuse the exact same `monitorName` + input for a watch.
- `webhookUrl` (optional) receives a JSON POST of changed rows on monitor runs with changes — push-style alerts without polling the dataset.
- `includeSponsored: false` drops ads after `positionOverall` is stamped.
- `enrichDetails: true` fetches each `/dp/` page after the listing crawl.
- Billing: one `apify-default-dataset-item` event per published row; `enrichDetails` also charges `product-details` at $1/1K from 29 Sep 2026. Monitor runs with no changes publish nothing.
- `priceValue` can be `null` on variant/optionless cards — handle it.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Amazon.com, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Amazon search-results and product pages — no authenticated endpoints, paid features, or content behind the Amazon login wall. Users are responsible for ensuring their use complies with Amazon's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

amazon product scraper, scrape amazon products, amazon price scraper, amazon price monitoring, amazon search results scraper, amazon scraper without api, amazon product data extraction, amazon asin scraper, amazon deals scraper, amazon discount tracker, amazon price tracker, competitor price monitoring amazon, amazon best sellers scraper, amazon's choice scraper, amazon BSR scraper, amazon estimated monthly sales, amazon sponsored products data, amazon marketplace scraper, amazon brazil scraper, amazon de scraper, amazon uk scraper, e-commerce price intelligence, MAP monitoring amazon, amazon product research tool

# Actor input Schema

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

Paste a category / search URL (amazon.com/s?k=…) or a product URL (amazon.com/dp/ASIN). Best-seller lists and /b?node= category pages work too. A /dp/ link fetches that product page. The domain picks the marketplace.

## `queries` (type: `array`):

Keywords run a paginated search on every selected marketplace. A bare ASIN (e.g. "B082Z1YYRK") opens that product page — same as pasting /dp/ASIN above.

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

Which Amazon marketplaces the keyword / ASIN queries run on. Prices come back in the marketplace currency with the ISO code attached. Start URLs ignore this and use the domain in the URL.

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

Result ordering for keyword queries (start URLs keep whatever sort their URL carries).

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

Lower price bound in the marketplace currency (applies to keyword queries).

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

Upper price bound in the marketplace currency (applies to keyword queries).

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

Keep only listings Amazon marks as Prime. Applied after the page is parsed (Amazon no longer exposes a stable anonymous Prime URL filter — using the old one returns zero results).

## `brand` (type: `string`):

Restrict keyword searches to one brand (e.g. "Anker", "Samsung"). Uses Amazon's brand facet — works across marketplaces. Leave empty for any brand.

## `fourStarsAndUp` (type: `boolean`):

Restrict keyword searches to products rated 4 stars and above. Supported on .com, .co.uk, .de, .fr, .it, .es, .ca; omitted (not guessed) on other marketplaces.

## `deals` (type: `string`):

Restrict keyword searches to deal listings. All discounts / Today's Deals are currently encoded for amazon.com (other marketplaces skip this filter rather than apply a wrong id).

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

When false, sponsored cards are dropped after positions are assigned — page / positionOverall still match what a shopper sees.

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

For search / category crawls, fetch each kept product's /dp/ page (BSR, variants, buy box, sales estimate). Product URLs and bare ASINs already open the product page — you do not need this for those. Extra product-details event per enriched row ($1/1K from 29 Sep 2026).

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

How many marketplace offers to attach on each product (price, seller, ships-from, condition, FBA). 0 skips the offer list. Charged as an offer event once that price is live.

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

Fetch other colour/size ASINs and emit each as its own row (parentAsin set). 0 keeps variants only on the parent. Each extra row is a normal product result.

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

Fetch each variant's /dp/ page and write price / priceValue onto the parent's variants\[] list. Extra fetches — leave off unless you need those prices.

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

ISO country for Amazon's delivery location (e.g. US, DE, GB). Combined with zip code. Prices and availability follow this address when Amazon honours it.

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

Postal code for Amazon's delivery location (e.g. 10001). Uses Amazon glow address-change plus an sp-cdn cookie. Delivery-location billing starts when that event is priced.

## `locationDeliverableRoutes` (type: `array`):

Which page types get the zip/country. Default is product pages, search, and offers.

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

Stop after this many listing pages per URL. Also stops at max products per query. Best-seller lists still cap at 2.

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

Accept-Language hint (en, de, fr, es, it, ja, nl, pl, pt, sv, tr, ar). If the marketplace does not speak it, Amazon falls back to the domain default.

## `proxyCountry` (type: `string`):

Override the residential exit country (ISO2, e.g. us, de, gb). Leave empty to pin the exit to the Amazon domain (recommended).

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

Hard ceiling of product rows across the whole run. Also capped by your plan and charge limit.

## `maxItemsPerQuery` (type: `integer`):

Upper bound of product rows per search query or start URL. One search page yields ~20–48 products.

## `monitorMode` (type: `string`):

Schedule the same input to receive only what changed. "Price changes" emits new products and price moves; "All changes" also emits rating and review-count moves. The first run builds the baseline and returns all products. Runs that find no changes publish no billable rows.

## `monitorName` (type: `string`):

Stable name for the monitoring baseline — use the same name (with the same queries/marketplaces) on every scheduled run of the same watch. Example: "competitor-asins-us".

## `webhookUrl` (type: `string`):

HTTPS endpoint that receives a JSON POST with the changed rows whenever a monitor run finds changes (never on the first baseline run). Works with Slack incoming webhooks, Zapier/Make catch hooks, or your own backend. Payload: { event: "amazon-products.changes", monitorName, totalChanges, countsByChangeType, rows }. Example: "https://hooks.zapier.com/hooks/catch/123/abc".

## `concurrency` (type: `integer`):

How many listing pages to fetch in parallel (1–20). The default is safe for any memory size.

## `proxy` (type: `object`):

Leave unset for the built-in residential setup (recommended — Amazon blocks datacenter IPs). Set only to route traffic through your own Apify proxy groups instead.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.amazon.com/s?k=keyboard"
    },
    {
      "url": "https://www.amazon.com/dp/B0B3BVWJ6Y"
    }
  ],
  "queries": [],
  "marketplaces": [
    "com"
  ],
  "sortBy": "relevance",
  "primeOnly": false,
  "fourStarsAndUp": false,
  "deals": "off",
  "includeSponsored": true,
  "enrichDetails": false,
  "maxOffers": 0,
  "maxProductVariantsAsSeparateResults": 0,
  "scrapeProductVariantPrices": false,
  "locationDeliverableRoutes": [
    "PRODUCT",
    "SEARCH",
    "OFFERS"
  ],
  "maxItems": 100,
  "maxItemsPerQuery": 100,
  "monitorMode": "off",
  "concurrency": 6
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.amazon.com/s?k=keyboard"
        },
        {
            "url": "https://www.amazon.com/dp/B0B3BVWJ6Y"
        }
    ],
    "queries": [],
    "marketplaces": [
        "com"
    ],
    "maxOffers": 0,
    "maxProductVariantsAsSeparateResults": 0,
    "locationDeliverableRoutes": [
        "PRODUCT",
        "SEARCH",
        "OFFERS"
    ],
    "maxItems": 100,
    "maxItemsPerQuery": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/amazon-search").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 = {
    "startUrls": [
        { "url": "https://www.amazon.com/s?k=keyboard" },
        { "url": "https://www.amazon.com/dp/B0B3BVWJ6Y" },
    ],
    "queries": [],
    "marketplaces": ["com"],
    "maxOffers": 0,
    "maxProductVariantsAsSeparateResults": 0,
    "locationDeliverableRoutes": [
        "PRODUCT",
        "SEARCH",
        "OFFERS",
    ],
    "maxItems": 100,
    "maxItemsPerQuery": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/amazon-search").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 '{
  "startUrls": [
    {
      "url": "https://www.amazon.com/s?k=keyboard"
    },
    {
      "url": "https://www.amazon.com/dp/B0B3BVWJ6Y"
    }
  ],
  "queries": [],
  "marketplaces": [
    "com"
  ],
  "maxOffers": 0,
  "maxProductVariantsAsSeparateResults": 0,
  "locationDeliverableRoutes": [
    "PRODUCT",
    "SEARCH",
    "OFFERS"
  ],
  "maxItems": 100,
  "maxItemsPerQuery": 100
}' |
apify call memo23/amazon-search --silent --output-dataset

```

## MCP server setup

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

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/7gA1xBQyhaBJ3sjbA/builds/L82AhxLF2mTAEYmzC/openapi.json
