# Amazon Product, Pricing & Buy Box Monitor API (`hoang_minh_quan/amazon-product-buybox-monitor`) Actor

Monitor Amazon product price, availability, and Buy Box winner by ASIN or URL. Public marketplace data only — no buyer PII.

- **URL**: https://apify.com/hoang\_minh\_quan/amazon-product-buybox-monitor.md
- **Developed by:** [Hoang Minh Quan](https://apify.com/hoang_minh_quan) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 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/platform/actors/running/actors-in-store#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 Buy Box & Price Monitor API — Catch Buy Box Loss Before Revenue Bleeds Out

**Stop checking ASINs by hand. Get Buy Box flips, price drops, and OOS alerts the moment they happen.**

***

### The problem

On Amazon, the **Buy Box is the business**. Lose it for a few hours and you don’t just lose rank — you lose the majority of conversion on that ASIN.

Yet most sellers and brand teams still operate like this:

- Someone “spot-checks” the PDP when they remember — **hours (or a day) too late**.
- Spreadsheets track yesterday’s price, not **who owns the Buy Box right now**.
- A hijacker or aggressive 3P seller flips the offer; your PPC keeps spending while **organic + paid traffic buys from them**.
- Price wars and MAP violations show up in weekly reports — after margin is already gone.
- Multi-marketplace catalogs (US, UK, DE…) don’t scale with manual refreshes.

If your ops Slack only learns about Buy Box loss in the next standup, you’re already paying for it.

***

### The solution

This Actor turns public Amazon product pages into a **revenue-protection monitor**:

1. **Scrape** — Pull price, availability, Buy Box winner, Amazon-vs-3P signal, and key PDP fields by ASIN or product URL.
2. **Snapshot** — Store the last known state per marketplace in Apify Key-Value Store (durable across runs).
3. **Delta** — Diff every scheduled run: **Buy Box flipped**, **price changed**, **went OOS**, **back in stock**, or combinations.
4. **Alert** — Push only material changes to **Webhook** (Slack / Discord / Zapier) or **Telegram** so your team reacts in minutes — not after the weekly audit.

You don’t buy another “Amazon scraper.” You buy **early warning** that protects sales velocity and ad spend.

> Public marketplace listing data only. **No buyer / reviewer personal PII.**

***

### Key features

- **ASIN & URL watchlists** — batch monitor your catalog or competitors
- **Buy Box winner tracking** — seller name + `buyBoxIsAmazon` flag
- **Price change detection** — current vs previous price on every run
- **Stock signals** — `went_oos` / `back_in_stock` for fulfillment risk
- **Multi-marketplace** — US, UK, DE, FR, IT, ES, CA, JP, IN, AU, MX, BR, AE, SG
- **Webhook + Telegram alerts** — quiet when stable, loud when money is at risk
- **Residential proxy + retries** — built for Amazon bot defenses
- **Developer-ready JSON** — dataset rows with `changeType` + `OUTPUT` summary for pipelines

***

### Quick start (Try for free)

1. Open the Actor in [Apify Console](https://console.apify.com/actors/JZ8kx7RkfhLF4uLUl).
2. Prefill ASIN is ready — click **Start** with residential proxy on (match `proxyCountry` to marketplace).
3. First run = **baseline** (snapshot saved). Schedule hourly/daily = **deltas + alerts**.

```json
{
  "asins": ["B0D1XD1ZV3"],
  "marketplace": "US",
  "enableMonitor": true,
  "useApifyProxy": true,
  "proxyCountry": "US",
  "webhookUrl": "https://hooks.slack.com/services/YOUR/WEBHOOK",
  "notifyOnlyOnChanges": true
}
```

**Pro tip:** Schedule every **1–6 hours** for hero ASINs. Wire Slack once. When Buy Box flips, ops gets the ping — not a spreadsheet surprise.

***

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `asins` | `string[]` | `[]` | Amazon ASINs to monitor (e.g. `B0D1XD1ZV3`) |
| `productUrls` | `string[]` | `[]` | Product URLs — ASIN extracted automatically |
| `marketplace` | `string` | `"US"` | Storefront: `US` `UK` `DE` `FR` `IT` `ES` `CA` `JP` `IN` `AU` `MX` `BR` `AE` `SG` |
| `maxAttempts` | `integer` | `3` | Retries per ASIN with fresh residential session |
| `delayBetweenMs` | `integer` | `1500` | Delay between ASINs (ms) to reduce blocks |
| `useApifyProxy` | `boolean` | `true` | **Strongly recommended** — Amazon blocks most datacenter IPs |
| `proxyCountry` | `string` | `"US"` | Residential exit country (match marketplace: UK→`GB`) |
| `includeErrors` | `boolean` | `true` | Push failed ASINs with an `error` field |
| `enableMonitor` | `boolean` | `true` | Snapshot diff → price / Buy Box / stock change types |
| `snapshotStoreName` | `string` | `"amazon-buybox-snap-v1"` | Named KVS for durable ASIN snapshots |
| `webhookUrl` | `string` | — | POST JSON when price, Buy Box, or stock changes |
| `telegramBotToken` | `string` | — | Telegram bot token (secret) |
| `telegramChatId` | `string` | — | Telegram chat / channel ID |
| `notifyOnlyOnChanges` | `boolean` | `true` | Skip alerts when nothing changed |
| `dryRunNotify` | `boolean` | `false` | Log alert payload without sending |

***

### Output

#### Dataset row (per ASIN)

```json
{
  "asin": "B0D1XD1ZV3",
  "marketplace": "US",
  "title": "Demo Wireless Earbuds",
  "brand": "DemoBrand",
  "price": 29.99,
  "currency": "USD",
  "listPrice": 39.99,
  "discountPercent": 25,
  "availability": "In Stock",
  "inStock": true,
  "buyBoxWinner": "OtherSeller LLC",
  "buyBoxIsAmazon": false,
  "shipsFrom": "OtherSeller LLC",
  "sellerCount": 12,
  "rating": 4.5,
  "reviewCount": 1204,
  "productUrl": "https://www.amazon.com/dp/B0D1XD1ZV3",
  "changeType": "buybox_flipped",
  "previousPrice": 29.99,
  "previousBuyBoxWinner": "Amazon.com",
  "changeDetails": "buybox Amazon.com → OtherSeller LLC",
  "monitoredAt": "2026-08-06T15:00:00.000Z",
  "scrapedAt": "2026-08-06T15:00:00.000Z"
}
```

**`changeType` values:** `baseline` · `new` · `unchanged` · `price_changed` · `buybox_flipped` · `price_and_buybox_changed` · `went_oos` · `back_in_stock` · `error`

#### `OUTPUT` key-value summary

```json
{
  "total": 25,
  "changes": 3,
  "isBaseline": false,
  "buyboxFlips": 1,
  "priceChanges": 2,
  "oos": 0,
  "succeeded": 24,
  "failed": 1,
  "marketplace": "US",
  "changes": [
    {
      "changeType": "BUYBOX_FLIPPED",
      "asin": "B0D1XD1ZV3",
      "title": "Demo Wireless Earbuds",
      "details": "buybox Amazon.com → OtherSeller LLC",
      "productUrl": "https://www.amazon.com/dp/B0D1XD1ZV3"
    }
  ],
  "notifyResult": { "sent": true, "results": { "webhook": { "ok": true, "status": 200 } } },
  "scrapedAt": "2026-08-06T15:00:00.000Z"
}
```

Scheduled runs build a **practical price / Buy Box history** in your dataset exports — each row is a point-in-time snapshot you can trend in Sheets, BigQuery, or your BI tool.

***

### Use cases

#### 1. Brand / 1P seller — revenue protection

Monitor hero ASINs every few hours. The second a 3P seller or Amazon itself takes the Buy Box, Slack wakes ops and pricing. Recover the offer before a full day of paid traffic converts to someone else.

#### 2. Amazon agency managing multi-brand catalogs

One Schedule, dozens of ASINs per client. Alerts route to the right channel. Sell “Buy Box SLA monitoring” as a retainer line item — not “we scrape Amazon sometimes.”

#### 3. Competitive intelligence & MAP watch

Track rival ASINs for aggressive price cuts and Buy Box ownership shifts. Feed `changeType` + `previousPrice` into MAP violation workflows or weekly competitive decks without manual PDP refreshes.

***

### How monitoring works

```
Run 1  →  scrape ASINs  →  save snapshot  →  changeType = baseline  (no alerts)
Run 2+ →  scrape ASINs  →  diff vs snapshot  →  BUYBOX / PRICE / OOS  →  webhook / Telegram
         →  write next snapshot
```

| Cadence | Best for |
|---|---|
| Every 1–2 hours | Hero SKUs, hijacker risk, high ad spend |
| Every 6–12 hours | Mid-tail catalog |
| Daily | Broad competitive price board |

Keep `notifyOnlyOnChanges: true` so stable catalogs stay silent.

***

### Compliance & ethics

- Sources **public** Amazon product listing pages only.
- Does **not** collect buyer accounts, order data, or personal PII.
- You are responsible for lawful use under your jurisdiction and Amazon’s terms.

***

### Call to action

**Try it free on Apify** → run the prefill ASIN once, then Schedule a second run within a few hours.

Protecting Buy Box is cheaper than replacing lost sales. Add your `webhookUrl` or Telegram credentials, set an **hourly or daily schedule**, and let the monitor watch while your team sells.

**Actor:** [Amazon Buy Box & Price Change Monitor](https://console.apify.com/actors/JZ8kx7RkfhLF4uLUl)\
**ID:** `JZ8kx7RkfhLF4uLUl`

# Actor input Schema

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

List of Amazon ASINs to monitor (10-character codes, e.g. B0D1XD1ZV3).

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

Optional Amazon product URLs — ASIN is extracted automatically.

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

Amazon storefront country.

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

Retries per ASIN with a fresh residential proxy session.

## `delayBetweenMs` (type: `integer`):

Polite delay between product scrapes to reduce bot detection.

## `useApifyProxy` (type: `boolean`):

Strongly recommended. Amazon blocks most datacenter IPs.

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

Residential proxy exit country (ISO 2-letter). Should match marketplace (US→US, UK→GB).

## `includeErrors` (type: `boolean`):

If true, failed scrapes are pushed with an error field.

## `enableMonitor` (type: `boolean`):

Compare price / Buy Box / stock vs prior KVS snapshot and tag changeType.

## `snapshotStoreName` (type: `string`):

Named KVS for durable ASIN snapshots across scheduled runs.

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

POST JSON when price, Buy Box, or stock changes.

## `telegramBotToken` (type: `string`):

Optional Telegram BotFather token.

## `telegramChatId` (type: `string`):

Chat / channel ID for alerts.

## `notifyOnlyOnChanges` (type: `boolean`):

Skip webhook/Telegram when nothing changed.

## `dryRunNotify` (type: `boolean`):

Log alert payload without sending.

## Actor input object example

```json
{
  "asins": [
    "B0D1XD1ZV3"
  ],
  "productUrls": [],
  "marketplace": "US",
  "maxAttempts": 3,
  "delayBetweenMs": 1500,
  "useApifyProxy": true,
  "proxyCountry": "US",
  "includeErrors": true,
  "enableMonitor": true,
  "snapshotStoreName": "amazon-buybox-snap-v1",
  "notifyOnlyOnChanges": true,
  "dryRunNotify": false
}
```

# Actor output Schema

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

Dataset of ASIN Buy Box snapshots

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

OUTPUT JSON summary in the default key-value store

# 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": [
        "B0D1XD1ZV3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hoang_minh_quan/amazon-product-buybox-monitor").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": ["B0D1XD1ZV3"] }

# Run the Actor and wait for it to finish
run = client.actor("hoang_minh_quan/amazon-product-buybox-monitor").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": [
    "B0D1XD1ZV3"
  ]
}' |
apify call hoang_minh_quan/amazon-product-buybox-monitor --silent --output-dataset

```

## MCP server setup

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

```

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/JZ8kx7RkfhLF4uLUl/builds/gGOAudntkPbdPKtiZ/openapi.json
