# Amazon Buy Box Monitor — Seller, Price & FBA by ASIN (`anyprice/amazon-buy-box-monitor`) Actor

Check who holds the Amazon buy box for your ASINs or EANs: buy box seller, price, shipping, FBA and Prime, plus every page-1 seller offer. Schedule it to check the buy box regularly. 23 marketplaces.

- **URL**: https://apify.com/anyprice/amazon-buy-box-monitor.md
- **Developed by:** [Anyprice](https://apify.com/anyprice) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 lookups

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 Buy Box Monitor — Seller, Price & FBA by ASIN

See who holds the Amazon buy box for your ASINs or EANs: the buy box seller, price, shipping, and whether the offer is FBA or Prime, plus every other seller offer on the first page. Run this buy box monitor on a schedule to catch the moment another seller takes over.

It covers 23 Amazon marketplaces and up to 100 ASINs or barcodes per run.

### What it does

You give it a list of ASINs, EANs, UPCs or other barcodes and pick a marketplace. For each product the Actor opens Amazon's offer list and returns:

- the buy box offer: seller name and ID, price, shipping, total, condition, FBA, Prime, stock, delivery estimate
- the other offers on the first page of the offer list (about 10), with the same fields and a buy box flag on each
- Amazon's total offer count across all pages, and a flag when the first page does not show them all

ASINs (and ISBN-10s) go straight to the offer list. Barcodes are searched on Amazon first and matched to the first organic search result, so the row also tells you which ASIN that barcode maps to.

### Who it is for

- Brand owners and private-label sellers who want to know when a reseller or a hijacker wins the buy box on their listing.
- Resellers who share listings with other sellers and need to see whether they still hold the buy box, and at what price.
- Repricing setups that need the current buy box price and seller as input, per ASIN and marketplace.
- Agencies reporting buy box ownership across amazon.de, amazon.fr, amazon.it and amazon.es for a client's catalogue.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `identifiers` | array of strings | (required) | 1 to 100 ASINs or barcodes (EAN-8, EAN-13, UPC-12, GTIN-14, ISBN-13, JAN, ISBN-10), mixed freely |
| `marketplace` | string | `de` | `de`, `us`, `gb` (or `uk`), `fr`, `it`, `es`, `nl`, `be`, `pl`, `se`, `ie`, `tr`, `ca`, `mx`, `br`, `jp`, `in`, `au`, `sg`, `ae`, `sa`, `eg`, `za` |
| `zipcode` | string | empty | Delivery location. Empty means the capital (10115 Berlin on amazon.de) |
| `includeDetail` | boolean | `false` | Also read the product page (brand, bullet points, images, technical details). Charged separately |

Amazon shows prices, shipping and offers for a delivery location, so set `zipcode` if your customers are mostly in one region. ZIP codes work on `de`, `us`, `gb`/`uk`, `fr`, `it`, `es`, `ca`, `jp`, `in`, `ie` and `za`. The Actor checks the format before it starts. A wrong format, or a ZIP code on another marketplace, ends the run with an input error before any lookup.

#### Input example

```json
{
  "identifiers": ["B001AXLDDO", "4006381333931"],
  "marketplace": "de",
  "zipcode": "20095"
}
```

### Output

One row per identifier, in input order.

| Field | Meaning |
|---|---|
| `query`, `status` | Your value and the outcome: `found`, `not_found`, `invalid` or `error` |
| `operation` | `offers-by-asin` for ASINs and ISBN-10s, `search-by-gtin` for barcodes |
| `result.asin` | The ASIN checked (for barcodes: the matched ASIN) |
| `result.buy_box` | The buy box offer, or `null` if no offer holds it |
| `result.buy_box.shop_name`, `.seller_id` | Who holds the buy box |
| `result.buy_box.price`, `.shipping`, `.total` | Buy box price, shipping for the delivery location, and both together |
| `result.buy_box.is_fba`, `.is_prime` | Fulfilled by Amazon, Prime eligible (`null` when Amazon does not say) |
| `result.offers[]` | All page-1 offers; `is_buy_box` marks the winner |
| `result.offers[].ships_from` | Who ships the item |
| `result.offers[].shop_review_rating`, `.shop_review_count` | Seller rating and number of ratings |
| `result.offers_count`, `result.offers_truncated` | Offers across all pages, and whether page 1 shows fewer |

Example row (seller names and prices are illustrative):

```json
{
  "query": "B001AXLDDO",
  "operation": "offers-by-asin",
  "country": "de",
  "status": "found",
  "result": {
    "asin": "B001AXLDDO",
    "name": "Träumeland T014301 - Babymatratze Regenbogen 60 x 120 cm",
    "url": "https://www.amazon.de/dp/B001AXLDDO",
    "image": "https://m.media-amazon.com/images/I/41iYiseYxWL.jpg",
    "rating": 4.6,
    "rating_count": 92,
    "buy_box": { "position": 1, "seller_id": "A1EXAMPLESELLER1", "shop_name": "Example Kindermöbel", "condition": "new", "currency": "EUR", "price": 69.95, "shipping": 0, "total": 69.95, "ships_from": "Amazon", "is_fba": true, "is_prime": true, "is_buy_box": true, "stock": 12 },
    "offers_count": 2,
    "offers_truncated": false,
    "offers": [
      { "position": 1, "seller_id": "A1EXAMPLESELLER1", "shop_name": "Example Kindermöbel", "shop_review_rating": 4.7, "shop_review_count": 310, "condition": "new", "currency": "EUR", "price": 69.95, "shipping": 0, "total": 69.95, "ships_from": "Amazon", "is_fba": true, "is_prime": true, "is_buy_box": true, "stock": 12 },
      { "position": 2, "seller_id": "A2EXAMPLESELLER2", "shop_name": "Example Babywelt", "shop_review_rating": 4.2, "shop_review_count": 58, "condition": "new", "currency": "EUR", "price": 64.9, "shipping": 5.9, "total": 70.8, "ships_from": "Example Babywelt", "is_fba": false, "is_prime": false, "is_buy_box": false, "stock": 4 }
    ],
    "detail": null
  }
}
```

Offers also carry `shop_url` (the seller's page), `condition_text`, `list_price`, `shipping_note`, `availability_text`, `delivery_min_hours` and `delivery_max_hours`. Free shipping on Amazon is often conditional, so `shipping_note` keeps Amazon's own wording. `stock` is how many units Amazon lets a buyer add to the cart, which can be capped below the seller's real stock.

### Scheduling

Each run is one snapshot. The Actor does not keep a history or compare runs on its own. To monitor the buy box:

1. Save your input as a task (one task per marketplace works well).
2. Add an Apify [schedule](https://docs.apify.com/platform/schedules) for the task, for example every few hours.
3. Compare `result.buy_box.seller_id` and `result.buy_box.total` per ASIN between the latest dataset and the one before, in your own system or with an integration that runs after each run.

Keep the task input the same between runs so the rows line up. Stagger schedules for different tasks: up to 100 Amazon lookups from this Actor can be in progress for your account at once, and runs that start together compete for that capacity.

### Billing

Pay per event. See the **Pricing** tab for current rates.

- `ean-lookup`: charged once for every `found` or `not_found` row, whether you gave an ASIN or a barcode.
- `detail`: charged once for every `found` row that includes product page data. It is off by default here; leave it off unless you need it.
- `invalid` and `error` rows are free.

Rows are written before anything is charged. If a run reaches your maximum cost per run, you still get all rows and only the part within budget is charged.

### Statuses and errors

| `status` | Meaning | Charged |
|---|---|---|
| `found` | Offer list read. A listing with no sellers right now is `found` with `offers: []` and `buy_box: null` | yes |
| `not_found` | The ASIN does not exist on this marketplace, or a barcode had no organic search result | yes |
| `invalid` | Not a valid ASIN or barcode. Nothing was looked up | no |
| `error` | Lookup failed; see `errorCode` | no |

| `errorCode` | `statusCode` | Meaning |
|---|---|---|
| `invalid_input` | 400 | Why an `invalid` value was rejected |
| `free_limit_reached` | 402 | The free plan's result allowance does not cover this value |
| `timeout` | 408 | No answer before the run's deadline |
| `concurrency_limit_reached` | 429 | Your other runs held all lookup capacity, and the waits (15 to 240 seconds) ran out |
| `internal_error` | 500 | Amazon could not be fetched for this value right now |

Each run has an 890-second lookup budget; anything unfinished becomes a free `timeout` row. Set the run or task timeout to at least 960 seconds. The run always ends as **Succeeded**, so check each row's `status` rather than the run status.

### FAQ

**Does it alert me when the buy box changes?**
Not by itself. It returns the current buy box on every run. Compare runs on your side, as described under Scheduling.

**Why is `buy_box` null when there are offers?**
None of the offers on page 1 carries Amazon's buy box marker, so there is no winner to report. Amazon does not award a buy box on every listing.

**Should I use ASINs or EANs?**
ASINs, if you have them. They skip the search step, so you always get the exact listing you asked for. With a barcode, the Actor uses Amazon's first organic search result, which is usually but not always the right product.

**Are all sellers included?**
The offers on the first page of Amazon's offer list are included, usually about 10. `offers_count` tells you how many there are in total, and `offers_truncated` is `true` when some are missing from `offers`.

Questions or higher limits: support@anyprice.dev

# Actor input Schema

## `identifiers` (type: `array`):

One barcode or ASIN per line, mixed freely: EAN-8, EAN-13, UPC-12, GTIN-14, ISBN-13, JAN, ISBN-10 or ASIN. The type is detected automatically, barcodes are checked against their check digit, and duplicates are removed. Invalid values come back as free `invalid` items. Up to 100 per run.

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

The Amazon storefront to look up. One marketplace per run.

## `zipcode` (type: `string`):

Delivery location for prices, shipping and offers. Leave empty for the capital (e.g. 10115 Berlin on amazon.de). Only for marketplaces that localize by ZIP code: de, us, gb (or uk), fr, it, es, ca, jp, in, ie, za. Checked against the country's format before the run starts.

## `includeDetail` (type: `boolean`):

Also fetch the product page for every match: brand, description, bullet points, images, categories, technical details (including the GTIN when Amazon prints one), stock and Amazon's Choice / Best Seller flags. Charged as a separate `detail` event on each item that gets details.

## Actor input object example

```json
{
  "identifiers": [
    "B001AXLDDO",
    "4006381333931"
  ],
  "marketplace": "de",
  "includeDetail": false
}
```

# Actor output Schema

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

All items in the default dataset, one per input value.

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

The overview table: query, status, ASIN, name, buy box price and offer count.

# 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 = {
    "identifiers": [
        "B001AXLDDO",
        "4006381333931"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyprice/amazon-buy-box-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 = { "identifiers": [
        "B001AXLDDO",
        "4006381333931",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("anyprice/amazon-buy-box-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 '{
  "identifiers": [
    "B001AXLDDO",
    "4006381333931"
  ]
}' |
apify call anyprice/amazon-buy-box-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,anyprice/amazon-buy-box-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/OX2b69VKmJaA0LgtS/builds/tA6AIQzpQ2bLRKZre/openapi.json
