# Mercado Libre Buy Box Monitor — Who Wins, at What Price (`gangary/mercado-libre-buy-box-monitor`) Actor

See who wins the Buy Box on up to 500 Mercado Livre / Mercado Libre catalog products per run: winning seller, price, Full, free shipping, reputation, official store, offers count and lowest price. Add your own listings and each row says if you are winning. BR, MX, AR, CO, CL. Blocked pages free.

- **URL**: https://apify.com/gangary/mercado-libre-buy-box-monitor.md
- **Developed by:** [Gangary](https://apify.com/gangary) (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 $8.00 / 1,000 product checkeds

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

![mercado-libre-buy-box-monitor](https://empresas-por-cnae.vercel.app/covers/mercado-libre-buy-box-monitor.png)

## Mercado Libre Buy Box Monitor — Who Wins, at What Price

**US$0.008 per product checked + US$0.04 per run. Residential proxies in each product's country are included; blocked pages and unreadable products are never charged.**

See **who is winning the Buy Box** of up to **500 Mercado Livre / Mercado Libre catalog products** in one run: the **winning seller, price, old price, Full and free-shipping flags, reputation level and official-store badge**, plus **how many offers the product has and the lowest price** (Mexico, Argentina, Colombia and Chile). Add your own listings or seller ID and every row tells you **whether you are the one winning**.

- **Up to 500 catalog products per run**, any mix of Brazil, Mexico, Argentina, Colombia and Chile.
- **`isMineWinning` on every row** once you add your listing IDs or seller IDs, with the name and price of whoever is winning instead.
- **Offers count and lowest price** in 4 of the 5 countries (MX, AR, CO, CL), with `winnerAboveMinBy` showing how far the winner is above the cheapest offer.

Built for **sellers, agencies and brands** that need to know, every morning, which products they are winning, which they lost and to whom.

**Em português:** acompanhe quem ganha o Buy Box de até 500 produtos de catálogo do Mercado Livre (e do Mercado Libre no México, Argentina, Colômbia e Chile): vendedor vencedor, preço, Full, reputação, quantidade de ofertas e menor preço. Informe seus anúncios ou seu ID de vendedor e veja se é você quem está ganhando.

**En español:** consulta quién gana el Buy Box de hasta 500 productos de catálogo de Mercado Libre: vendedor ganador, precio, Full, reputación, cantidad de ofertas y precio mínimo. Agrega tus publicaciones o tu ID de vendedor y mira si eres tú quien gana.

### Who it is for

- **Sellers:** add your seller ID and get every morning the list of catalog products where `isMineWinning` is `false`, with the seller who beat you and its price.
- **Agencies:** one run covers the catalog products of several clients; each client's seller IDs go in **My seller IDs**.
- **Brands watching resale:** see which reseller holds the Buy Box of your products, at what price, and whether it is your official store.
- **Pricing analysts:** `winnerAboveMinBy` shows when the Buy Box is not won by the cheapest offer (MX, AR, CO, CL).

### What you get

One row per catalog product. Example from a run on the Apify platform (Mercado Libre Mexico, an Oster air fryer with 31 offers), with a seller ID that is not the winner:

```json
{
  "ok": true,
  "productId": "MLM41514595",
  "country": "MX",
  "title": "Oster Freidora de Aire Digital con Recubrimiento Oster DiamondForce, Ventana y Luz Interna, 4L de Capacidad, con 10 Programas Automáticos, CKSTAF40WDDF",
  "url": "https://www.mercadolibre.com.mx/oster-freidora-de-aire-digital-con-recubrimiento-oster-diamondforce-ventana-y-luz-interna-4l-de-capacidad-con-10-programas-automaticos-ckstaf40wddf/p/MLM41514595",
  "currency": "MXN",
  "winnerItemId": "MLM3421917534",
  "winnerSellerId": 1440328802,
  "winnerSellerName": "Oster México",
  "winnerReputation": "5_green",
  "winnerPowerSellerStatus": "platinum",
  "winnerIsOfficialStore": true,
  "winnerPrice": 999,
  "winnerOriginalPrice": 1436,
  "winnerFreeShipping": true,
  "winnerIsFull": true,
  "offersCount": 31,
  "minPrice": 999,
  "winnerAboveMinBy": 0,
  "isMineWinning": false,
  "checkedAt": "2026-10-28T12:00:00.000Z",
  "inputValue": "https://www.mercadolibre.com.mx/p/MLM41514595"
}
```

| Field | Meaning |
|---|---|
| `productId` / `country` / `title` / `url` | The catalog product and its page |
| `winnerItemId` / `winnerSellerId` / `winnerSellerName` | The listing and seller currently holding the Buy Box |
| `winnerReputation` / `winnerPowerSellerStatus` / `winnerIsOfficialStore` | Reputation color level (`5_green`), seller level (`platinum`, `gold`...) and official-store flag |
| `winnerPrice` / `winnerOriginalPrice` / `currency` | The winner's price and crossed-out price (standard price, before payment-method discounts such as Pix) |
| `winnerFreeShipping` / `winnerIsFull` | Free shipping and Fulfillment (Full) flags of the winning listing |
| `offersCount` | How many new offers the catalog product has, winner included. Mexico, Argentina, Colombia and Chile only; `null` in Brazil, where the site does not show it |
| `minPrice` / `winnerAboveMinBy` | Lowest price among the offers and how far above it the winner is (`0` = the winner is the cheapest). `null` when the site does not show the lowest price |
| `isMineWinning` | `true` if the winner is one of your listings or sold by one of your seller IDs, `false` if not, `null` when you did not provide any |
| `error` rows | `{ "ok": false, "error": "...", "inputValue": "..." }` for products that could not be read (`blocked`, `no-winner`, `no-price`, `not-found`...). They are **never charged** |

### What you can paste

- **Catalog URL:** `https://www.mercadolivre.com.br/.../p/MLB62391404` (any text after the product, such as `?quantity=1`, is ignored).
- **Catalog ID:** `MLB62391404`, `MLM41514595`, `MLA74595470`, `MCO...`, `MLC...`. It is the code after `/p/` in the product URL.
- A catalog URL that also points to a listing (`?pdp_filters=item_id:...`) works: the product is read and the listing is ignored.
- A single-listing link (`produto.mercadolivre.com.br/MLB-...`, `articulo.mercadolibre.com.mx/MLM-...`) is **not** a catalog product: it comes back as `not-a-catalog-product`. Use the **Price Monitor** actor for those.

### How to use it

1. Paste your products into **Catalog products** (up to 500, any mix of countries).
2. Optional: add **My listing IDs** and/or **My seller IDs** so `isMineWinning` is filled in.
3. Run it, or schedule it every few hours, and export to JSON, CSV or Excel. Compare `isMineWinning` between runs to see when you lose or recover a Buy Box.

| Input | Type | Default | Notes |
|---|---|---|---|
| `products` | array of strings | — (required) | Up to 500 catalog URLs or IDs; duplicates removed |
| `myItemIds` | array of strings | empty | Your listing IDs or URLs; fills `isMineWinning` |
| `mySellerIds` | array of strings | empty | Your numeric seller IDs; any winning listing of these sellers counts as yours |

### Pricing

Pay per event: **US$0.04 per run** (`actor-start`), then **US$0.008 per product checked successfully** (`product-checked`, US$8 per 1,000 products). Products that are blocked, have no winner right now, have a winner without a readable price, or cannot be read are **not charged**. Residential proxies in each product's country are included, and the run respects the spend limit you set on Apify.

| Scenario | Approximate cost |
|---|---|
| 100 products | US$0.84 |
| 500 products (the maximum) | US$4.04 |
| 500 products every day for a month | ~US$121 |

### Run it from code

Replace `<YOUR_APIFY_TOKEN>` with your token from **Apify Console → Settings → API & Integrations**.

**cURL** (waits for the run and returns the items):

```bash
curl -X POST "https://api.apify.com/v2/acts/gangary~mercado-libre-buy-box-monitor/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"products": ["MLB62391404", "https://www.mercadolibre.com.mx/p/MLM41514595"], "mySellerIds": ["480263032"]}'
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("gangary~mercado-libre-buy-box-monitor").call(
    run_input={"products": ["MLB62391404", "MLM41514595"], "mySellerIds": ["480263032"]}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item.get("isMineWinning") is False:
        print(item["productId"], "won by", item["winnerSellerName"], item["winnerPrice"])
```

**Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('gangary~mercado-libre-buy-box-monitor').call({
    products: ['MLB62391404', 'MLM41514595'],
    mySellerIds: ['480263032'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((row) => row.isMineWinning === false));
```

The synchronous endpoint waits up to 300 seconds; for long lists start the run asynchronously and read the dataset when it finishes.

### Integrations

A Buy Box check is worth most when it runs on its own every morning, and Apify does that natively:

- **[Schedules](https://docs.apify.com/platform/schedules):** run the same product list daily or every few hours.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks):** call your own endpoint when a run finishes.
- **[Make](https://docs.apify.com/platform/integrations/make), [n8n](https://docs.apify.com/platform/integrations/n8n) and [Zapier](https://docs.apify.com/platform/integrations/zapier):** send the rows where `isMineWinning` is `false` to Google Sheets, Slack or e-mail.
- **[Google Drive](https://docs.apify.com/platform/integrations/drive):** drop each run's export into a shared folder.
- **Exports:** JSON, CSV, Excel, XML or HTML from the dataset, or straight from the API.

### Use with AI agents (MCP)

Apify runs a hosted MCP server, so Claude, Cursor, VS Code and other MCP clients can call this actor as a tool. Add this server URL to your client (it signs in with OAuth on first use, or send `Authorization: Bearer <YOUR_APIFY_TOKEN>`):

```
https://mcp.apify.com?tools=gangary/mercado-libre-buy-box-monitor
```

Then ask in plain words, e.g. *"For these 30 Mercado Libre catalog products, which ones is seller 480263032 not winning, and who is?"* Setup details for each client: **[Apify MCP server docs](https://docs.apify.com/platform/integrations/mcp)**.

### FAQ

**Do I need a Mercado Livre account?**
No. The actor reads the public product page, the same one a visitor sees. No login, no API key.

**How do I find my seller ID?**
It is the number in your seller profile link, and it also comes back in `winnerSellerId` the first time you win a product.

**What if a product has no winner?**
Sometimes a catalog product has offers but none is winning at that moment (for example all out of stock). The row comes back as `error: "no-winner"` and is not charged.

**Why are `offersCount` and `minPrice` empty in Brazil?**
Mercado Livre Brazil does not show them to anonymous visitors. The winner and its details are delivered in all five countries.

**Why do some products come back `blocked`?**
Mercado Libre runs strong anti-bot protection. When a session gets blocked, the actor opens a fresh residential IP in the same country and retries, up to 3 times. If it still fails, you get an error row and no charge. After 5 products in a row are blocked, the actor stops and returns the rest of the list as `blocked` error rows, also free.

**Can I paste a normal listing link?**
No. Only catalog products (`/p/` pages) have a Buy Box. A single-listing link comes back as `not-a-catalog-product`; use the **[Price Monitor](https://apify.com/gangary/mercado-libre-price-monitor)** for those.

**Does the actor remember the previous run?**
No, each run is a fresh snapshot. Schedule it and compare `isMineWinning` and `winnerSellerId` between runs, or use the Price Monitor, which keeps history per listing and reports what changed.

**Can I cap what a run costs?**
Yes. The actor respects the **Max total charge** you set on the run and stops checking products when the limit is reached.

### Honest limitations

- The full list of offers of a catalog product (every seller and price) requires a Mercado Livre login. **We do not deliver it.** You get the winner, the number of offers and the lowest price where the site shows them.
- `offersCount` and `minPrice` are `null` in Brazil, and in the other countries when the page does not show the "other options" block.
- The winner is what an anonymous visitor sees. Logged-in buyers can see a different winner for some products (location, loyalty program).
- Only catalog products have a Buy Box. Listings outside the catalog are not supported here.
- Up to 500 products per run.

### Changelog

- **0.1.3 (2026-10-28):** first public release, checked on the Apify platform in all five countries.

### From the same maker

- **[Mercado Libre Seller Scraper](https://apify.com/gangary/mercado-libre-seller-scraper)** — every listing of a seller or official store, past the 2,000-result limit.

- **[Mercado Livre & Mercado Libre Price Monitor](https://apify.com/gangary/mercado-libre-price-monitor)** — price, stock and changes per listing, with the Buy Box flag.

- **[Mercado Libre Scraper — Search & Prices (MX, AR, CO, CL)](https://apify.com/gangary/mercado-libre-search-scraper)** — search results by keyword for the Spanish-speaking sites.

- **[Mercado Livre Scraper (Brazil)](https://apify.com/gangary/mercado-livre-search-scraper)** — search results by keyword for Brazil.

***

If this actor helped you, a rating on its Store page helps others find it. Something broke or a field is missing? Open an issue on the actor's **Issues** tab.

*Keywords: mercado livre buy box, mercado libre buy box monitor, quem ganha o buy box mercado livre, ganador del buy box mercado libre, catalog winner mercado livre, seller tools mercado libre, buy box tracker latam, mercado livre catálogo.*

# Actor input Schema

## `products` (type: `array`):

Up to 500 catalog products, one per line: the product URL (https://www.mercadolivre.com.br/.../p/MLB62391404) or just the catalog ID (MLB62391404, MLM41514595). The catalog ID is the code after /p/ in the product URL. You can mix Brazil (MLB), Mexico (MLM), Argentina (MLA), Colombia (MCO) and Chile (MLC). Single listings (produto./articulo. links) are not catalog products and are returned as errors.

## `myItemIds` (type: `array`):

Your own listings (IDs like MLB6194539818 or listing URLs). When provided, each row says in isMineWinning whether one of them holds the Buy Box. Leave empty to get isMineWinning = null.

## `mySellerIds` (type: `array`):

Your numeric seller ID(s), for example 480263032. Any winning listing sold by one of these sellers counts as yours in isMineWinning. Leave empty to skip.

## Actor input object example

```json
{
  "products": [
    "MLB62391404",
    "https://www.mercadolibre.com.mx/p/MLM41514595"
  ]
}
```

# Actor output Schema

## `results` (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 = {
    "products": [
        "MLB62391404",
        "https://www.mercadolibre.com.mx/p/MLM41514595"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gangary/mercado-libre-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 = { "products": [
        "MLB62391404",
        "https://www.mercadolibre.com.mx/p/MLM41514595",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("gangary/mercado-libre-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 '{
  "products": [
    "MLB62391404",
    "https://www.mercadolibre.com.mx/p/MLM41514595"
  ]
}' |
apify call gangary/mercado-libre-buy-box-monitor --silent --output-dataset

```

## MCP server setup

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