MercadoLibre Seller Price Monitor – Competitor & Buy Box avatar

MercadoLibre Seller Price Monitor – Competitor & Buy Box

Pricing

from $3.00 / 1,000 seller offer results

Go to Apify Store
MercadoLibre Seller Price Monitor – Competitor & Buy Box

MercadoLibre Seller Price Monitor – Competitor & Buy Box

Monitor MercadoLibre sellers, official stores and competitors: per catalog product, the seller's price, rank, gap to the cheapest competitor, MAP violations and price history. Official API, no proxies. Pay per row.

Pricing

from $3.00 / 1,000 seller offer results

Rating

0.0

(0)

Developer

Miguel Pinzon

Miguel Pinzon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Categories

Features

Limited permissions

Share

MercadoLibre Seller Price Monitor

MercadoLibre seller price monitor for brands, official stores, sellers and agencies. Give it one or more sellers (your own store, your distributors or up to 10 competitors) and, for every MercadoLibre catalog product where they sell, it returns the seller's current price, who is cheapest right now (the price side of the buy box), how far the seller is above or below the best competitor, its rank among all offers, and whether anybody sells below your minimum advertised price (MAP compliance). It is competitor price monitoring without scraping or proxies: data comes from the official MercadoLibre API and from a shared price history database that grows with every run, so each row also tells you how the seller's price moved in the last 24 hours and 7 days. Works for any seller, including official store accounts, in Colombia, Mexico, Argentina, Brazil, Chile, Peru, Uruguay and Ecuador. You pay per row.

Independent tool, not affiliated with MercadoLibre.

Also by pricelatam: MercadoLibre Price Tracker (every product with its best price and full price history) and MercadoLibre Price Drop Alerts & Watchlist (only the products whose price dropped).

Who is it for?

  • An official store watching its distributors. List the distributors as sellers, add your minimum prices in mapPrices, schedule it: every row where a distributor (or anybody else) sells below MAP is flagged with the offending listing.
  • A seller watching 3 competitors. List yourself and them; filter rows with status: "above" to see where you are losing on price and by how much (priceGapPct).
  • An agency reporting to several brands. One run per brand with its stores and price lists, exported to Google Sheets or Excel from the dataset.

What does it return?

One row per seller × catalog product:

FieldMeaning
sellerId, sellerNickname, sellerPermalinkThe monitored seller.
productId, name, domainId, siteId, url, thumbnailThe catalog product (/p/ page).
currencyCurrency of every price in the row.
sellerPrice, sellerItemId, sellerCondition, sellerListingType, sellerFreeShippingThe seller's cheapest offer in the chosen condition.
bestCompetitorPrice, bestCompetitorSellerId, bestCompetitorNickname, bestCompetitorItemIdThe cheapest offer of any other seller.
priceGapPct(seller − best competitor) / best competitor × 100. Positive = the seller is more expensive.
rank1 = cheapest. Competitor offers strictly cheaper than the seller + 1; ties share the rank.
offersCountOffers of all sellers in the chosen condition.
statuscheapest, tied, above, only_seller, no_offer (the product is in our history for this seller, or in your list, but the seller has no active offer now), seller_not_found.
mapPrice, sellerBelowMap, competitorsBelowMap[]MAP checks, when you pass mapPrices: each violation with sellerId, nickname, itemId, price.
sellerPriceChange24h, sellerPriceChange7dChange of the seller's listing price vs 24 h / 7 days earlier. null (never 0) when that listing has no recorded price that old.
sellerLowestSeen, sellerLowestSeenAt, sellerObservations, firstSeenAt, lastSeenAtHistory of the seller's listing in the shared database.
offers[]Only with includeCompetitorOffers: every offer of the product, cheapest first, flagged isMonitoredSeller.
messageOnly on seller_not_found rows: what went wrong and what to provide.
scrapedAtWhen the offers were read (UTC).

About the buy box: MercadoLibre does not expose its buy box winner to API applications (buy_box_winner comes back empty), and the winner also depends on reputation and shipping. This Actor reports the price position, which is what you can act on: cheapest means no other seller is cheaper in that condition.

Which products are monitored?

For each seller, up to maxProductsPerSeller catalog products, in this order:

  1. your discoveryProducts and the products of mapPrices (a MAP is always checked);
  2. results of your queries where the seller has an offer;
  3. products where our shared history has an active offer of the seller, most recently seen first.

With refreshLive on (default), every product is read live and the observation is added to the shared history, so the next run (yours or anybody's) has more history. With it off, the answer comes only from the stored history: faster and with fewer API calls, but prices are as of the last time somebody checked the product (scrapedAt).

How do I get a seller ID?

  1. Open any listing (publication) of the seller on MercadoLibre.
  2. In the seller box on the right, under the seller's name and reputation, click "Ver más productos del vendedor" (Mercado Livre: "Ver mais produtos do vendedor").
  3. The page that opens lists the seller's products, and its address contains _CustId_ followed by digits, for example https://listado.mercadolibre.com.co/_CustId_2923575120. Those digits are the seller ID. You can paste the whole link: the Actor extracts the ID.

A profile link (https://www.mercadolibre.com.co/perfil/NICKNAME) or the bare nickname also works when the seller is already in our database or sells on one of your discoveryProducts / queries products. If a seller cannot be found, the run does not fail: you get a seller_not_found row saying what to add, and it is not charged.

Input examples

One seller, the products we already know for it:

{
"country": "MCO",
"sellers": ["2923575120"],
"maxProductsPerSeller": 20
}

A seller and 3 competitors on the products you compete on:

{
"country": "MCO",
"sellers": [
"https://listado.mercadolibre.com.co/_CustId_2923575120",
"SQUAREDEALSCOF",
"https://www.mercadolibre.com.co/perfil/REDPHONEMOBILE",
"3834040324"
],
"queries": ["ipad 11 256gb"],
"discoveryProducts": ["MCO50912377", "https://www.mercadolibre.com.co/apple-ipad-11/p/MCO52110181"],
"condition": "new",
"maxProductsPerSeller": 30
}

An official store with minimum advertised prices (MAP compliance across all sellers):

{
"country": "MCO",
"sellers": ["2923575120", "3246949102"],
"discoveryProducts": ["MCO50912377", "MCO52110181", "MCO48936856"],
"mapPrices": { "MCO50912377": 2030000, "MCO52110181": 1550000, "MCO48936856": 1550000 },
"includeCompetitorOffers": true
}

Input fields

FieldDefaultDescription
sellers– (required)1–10 sellers: numeric ID, link with _CustId_<id>, /perfil/<nickname> link or nickname.
countryMCOMCO, MLM, MLA, MLB, MLC, MPE, MLU or MEC.
discoveryProducts–Product IDs or /p/ URLs, monitored for every seller and used to find sellers by nickname.
queries–Search keywords; the category is detected automatically.
maxProductsPerSeller501–500.
refreshLivetrueRead live prices (and record them) or answer from the stored history only.
conditionnewnew, used or any: used for rank, best competitor and MAP.
mapPrices–{ "MCO12345": 199900 }, local currency. These products are always monitored for every seller.
includeCompetitorOffersfalseAttach every offer to each row.

Output example

A real row (13 Nov 2026, run with mapPrices: {"MCO50912377": 2030000}):

{
"sellerId": "2923575120",
"sellerNickname": "UNIVERSOELECTRONICOCOF",
"sellerPermalink": "http://perfil.mercadolibre.com.co/UNIVERSOELECTRONICOCOF",
"productId": "MCO50912377",
"name": "Apple iPad 11 con chip A16, WiFi de 256 GB",
"domainId": "MCO-TABLETS",
"siteId": "MCO",
"url": "https://www.mercadolibre.com.co/p/MCO50912377",
"thumbnail": "https://http2.mlstatic.com/D_NQ_NP_780662-MLA96101840367_102025-F.jpg",
"currency": "COP",
"sellerPrice": 2036978,
"sellerItemId": "MCO4125062572",
"sellerCondition": "new",
"sellerListingType": "gold_pro",
"sellerFreeShipping": true,
"bestCompetitorPrice": 2027248,
"bestCompetitorSellerId": "3246949102",
"bestCompetitorNickname": "SQUAREDEALSCOF",
"bestCompetitorItemId": "MCO4059748102",
"priceGapPct": 0.48,
"rank": 2,
"offersCount": 4,
"status": "above",
"mapPrice": 2030000,
"sellerBelowMap": false,
"competitorsBelowMap": [
{ "sellerId": "3246949102", "nickname": "SQUAREDEALSCOF", "itemId": "MCO4059748102", "price": 2027248 }
],
"sellerPriceChange24h": 12897,
"sellerPriceChange7d": null,
"sellerLowestSeen": 2024081,
"sellerLowestSeenAt": "2026-11-12T03:58:07.483398Z",
"sellerObservations": 5,
"firstSeenAt": "2026-11-12T03:58:07.483398Z",
"lastSeenAt": "2026-11-13T20:27:07.486158Z",
"scrapedAt": "2026-11-13T20:27:07.486158Z"
}

The seller is 0.48 % above SQUAREDEALSCOF, which sells below the 2,030,000 MAP; the seller raised its price by 12,897 in the last 24 hours. sellerPriceChange7d is null because the listing was first recorded the day before.

Schedule it every 6 hours with email or Slack alerts

  1. Save your input as a task in Apify Console.
  2. Schedules → Create new → pick the task, cron 0 */6 * * * (docs).
  3. On the task, Integrations: email on run succeeded with a link to the dataset, Slack to post to a channel (docs), or a webhook to Zapier, Make, n8n or your backend; the payload carries defaultDatasetId (docs).
  4. Filter the dataset by status = above (losing on price) or sellerBelowMap = true / non-empty competitorsBelowMap (MAP violations).

Each scheduled run also feeds the shared history, so the 24 h / 7 d changes become available after the first day.

How much does it cost?

Pay per event, no subscription. Platform usage is included.

EventPrice
seller-offer-result: every seller × product row (no_offer rows included)$0.003
map-violation: extra per row where the seller or a competitor is below your MAP (only when you pass mapPrices)$0.002
Actor start (charged by Apify on every run)$0.00005

Example: 50 products checked 4 times a day for 30 days = 6,000 rows = $18 per month, a fraction of a SaaS price monitor. seller_not_found rows are free. Set a maximum cost per run in the run options; the Actor stops cleanly when it is reached.

Use it from AI agents (Apify MCP server)

The Actor is available as a tool through the Apify MCP server, so Claude, Cursor, VS Code or any MCP client can query it:

{
"mcpServers": {
"mercadolibre-seller-price-monitor": {
"url": "https://mcp.apify.com?tools=pricelatam/mercadolibre-seller-price-monitor"
}
}
}

If your client does not support OAuth, send your token instead with "headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }.

Then ask, for example: "¿Quién está vendiendo por debajo de mi precio mínimo el producto MCO50912377 en Colombia? Mi precio mínimo es 2.030.000 COP y mi tienda es 2923575120." ("Who is selling product X below my minimum price in Colombia?")

From code: pip install apify-client, then client.actor("pricelatam/mercadolibre-seller-price-monitor").call(run_input={...}) and iterate the default dataset.

Limits

  • Catalog products only. The API with an application token lists offers per catalog product (/p/ pages). Listings outside the catalog (plain publications without a /p/ page) do not appear, and the seller's full listing search is not available to applications.
  • A nickname is found only if the seller is already in our database or sells on one of your discoveryProducts / queries products; a numeric ID always works.
  • Prices are item prices without shipping; sellerFreeShipping and the offers list tell you whether shipping is free.
  • The 24 h / 7 d changes need history of that same listing; a new listing starts with null.
  • Up to 10 sellers and 500 products per seller per run.

FAQ

Is the "buy box" the real one? It is the price position. MercadoLibre's buy box winner is not available to API applications and also weighs reputation and shipping; cheapest means nobody else is cheaper in the chosen condition.

Why does a seller show no_offer? The product is in your discoveryProducts, or our history had an active offer of the seller there, but the seller has no active offer now. sellerItemId and lastSeenAt show its last listing and when it was last seen.

Are other users' runs mixed with mine? Only the price history is shared (that is what makes the 24 h / 7 d changes and the lowest prices available from the first run). Your input, your MAP list and your dataset are private to your account.

Something does not work. Where do I report it? Open an issue in the Actor's Issues tab with the run ID and the input you used.

Independence notice

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by MercadoLibre. "MercadoLibre" and "Mercado Livre" are trademarks of their owners and are used only to describe the data source. Prices are the ones published through the official MercadoLibre API at the time of each run.


En español

MercadoLibre Seller Price Monitor vigila uno o varios vendedores de MercadoLibre (tu tienda oficial, tus distribuidores o hasta 10 competidores) en 8 países y, por cada ficha de catálogo donde venden, devuelve el precio del vendedor, quién es el más barato (el lado de precio del buy box), la diferencia porcentual con el mejor competidor, su posición entre todas las ofertas y quién vende por debajo de tu precio mínimo autorizado (MAP). Usa la API oficial y la historia de precios compartida, así que cada fila trae también el cambio del precio del vendedor en 24 h y 7 días. El id del vendedor está en el enlace "Ver más productos del vendedor" de cualquier publicación (_CustId_<id>). Se cobra $0.003 por fila y $0.002 adicionales por fila con violación de MAP. Herramienta independiente, sin relación con MercadoLibre.