# Mercado Libre Seller Scraper — Every Listing of a Store (`gangary/mercado-libre-seller-scraper`) Actor

Scrape every listing of any Mercado Livre / Mercado Libre seller or official store, past the 2,000-result limit: reputation, MercadoLider level, price, discount, shipping, Full, units sold, rating. BR, MX, AR, CO, CL. $1.50 per 1,000 listings plus $0.01 per seller profile. Blocked pages free.

- **URL**: https://apify.com/gangary/mercado-libre-seller-scraper.md
- **Developed by:** [Gangary](https://apify.com/gangary) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listing scrapeds

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-seller-scraper](https://empresas-por-cnae.vercel.app/covers/mercado-libre-seller-scraper.png)

## Mercado Libre Seller Scraper — Every Listing of a Store

**US$1.50 per 1,000 listings + US$0.01 per seller profile + US$0.02 per run. Residential proxies included; blocked pages and sellers that cannot be found are never charged.**

- **Past the 2,016-result cap:** in a cloud run, Nike's official store in Brazil (2,068 listings) came back with 2,058 listings; the site's own search stops at 2,016.
- **Up to 50 sellers and up to 20,000 listings per seller** in one run, in Brazil, Mexico, Argentina, Colombia and Chile.
- **Seller profile on top:** reputation, MercadoLíder tier, sales tier, followers and official-store data in one `seller` row.

Spy on any **Mercado Livre / Mercado Libre seller or official store**. Give it a seller ID, a nickname, a store link or just one of their listings, and get back the **seller profile (reputation, MercadoLider level, sales tier, official-store data) plus every listing** with price, crossed-out price, discount, installments, shipping and Full flags, sold counts and ratings.

It works in **Brazil, Mexico, Argentina, Colombia and Chile** and goes **past the ~2,000-result cap** of the site's search: big catalogs are split by category and price range, then merged and de-duplicated, so a 40,000-listing store does not stop at page 42.

Built for **competitor research, price positioning, assortment gap analysis, brand/MAP monitoring and lead lists of sellers**.

**Em português:** extraia o perfil e todos os anúncios de qualquer vendedor ou loja oficial do Mercado Livre (Brasil) e do Mercado Libre (México, Argentina, Colômbia, Chile): reputação, nível MercadoLíder, preço, desconto, frete grátis, Full e vendidos. Passa do limite de ~2.000 resultados da busca do site. US$1,50 por 1.000 anúncios mais US$0,01 por perfil de vendedor.

**En español:** extrae el perfil y todas las publicaciones de cualquier vendedor o tienda oficial de Mercado Libre (México, Argentina, Colombia, Chile) y Mercado Livre (Brasil): reputación, nivel MercadoLíder, precios, descuentos, envío gratis y Full. Supera el tope de ~2.000 resultados de la búsqueda. Ideal para espiar a la competencia.

### Use cases

- **Competitor research:** the full assortment of a rival store with price, discount, Full and units sold per listing.
- **Assortment gaps:** compare `categoryId` and `domainId` across your store and a competitor's to see what they sell and you do not.
- **Brand and MAP audits:** list every listing of a reseller or official store and check prices against your policy.
- **Seller lead lists:** reputation, MercadoLíder tier and sales tier per seller, to qualify sellers you want to sell services to.
- **Weekly watch:** schedule the same sellers and compare prices and new listings between runs.

### What you get

Two kinds of rows share one dataset: one `seller` row per seller and one `listing` row per listing (filter on `type`). Real output from a cloud run for seller 3413781093 (Brazil, `maxItemsPerSeller` 150 of 388 listings):

```json
{
  "type": "seller",
  "sellerId": "3413781093",
  "nickname": "ningboxiangcaistore",
  "name": "Ning Boxiangcai Store",
  "country": "BR",
  "url": "https://www.mercadolivre.com.br/pagina/ningboxiangcaistore",
  "totalListings": 388,
  "listingsDelivered": 150,
  "listingsComplete": true,
  "reputation": "5_green",
  "reputationLevel": 5,
  "powerSellerStatus": "silver",
  "isOfficialStore": false,
  "officialStoreId": null,
  "storeSlug": null,
  "salesText": "+1000 vendas",
  "followersText": "+500",
  "inputValue": "3413781093",
  "scrapedAt": "2026-10-28T04:30:00.000Z"
}
```

```json
{
  "type": "listing",
  "position": 1,
  "itemId": "MLB5103948957",
  "productId": "MLB2043925233",
  "title": "Enfeite Natalino Pendente Papai Noel Balão",
  "url": "https://www.mercadolivre.com.br/kit-10-enfeites-de-madeira-penduraveis-de-natal-8-cm/p/MLB2043925233",
  "price": 20.28,
  "originalPrice": null,
  "discountPct": null,
  "currency": "BRL",
  "installments": null,
  "freeShipping": false,
  "isFull": false,
  "sellerName": "Ning Boxiangcai Store",
  "cardSellerLabel": "AIRAY",
  "isOfficialStore": false,
  "rating": 3.7,
  "soldText": null,
  "soldQuantity": 500,
  "isAd": false,
  "categoryId": "MLB117799",
  "domainId": "MLB-CHRISTMAS_DOLLS",
  "thumbnail": "https://http2.mlstatic.com/D_NQ_NP_886641-CBT115126914884_082026-O.webp",
  "country": "BR",
  "sellerId": "3413781093",
  "sellerNickname": "ningboxiangcaistore",
  "officialStoreId": null,
  "inputValue": "3413781093",
  "scrapedAt": "2026-10-28T04:29:41.000Z"
}
```

| Field | Meaning |
|---|---|
| `type` | `seller`, `listing` or (failed input) `error` |
| `sellerId` / `nickname` / `name` | Seller identity. `nickname` is the slug of the seller page (`/pagina/{nickname}`) |
| `totalListings` / `listingsDelivered` | Active listings the site reports for the seller vs rows delivered in this run |
| `listingsComplete` | `false` when the run stopped early: spending limit, a page kept failing, the site stopped serving pages, or a catalog the site would not let us split. The site's own counts are not exact, so a shortfall of up to 10 listings (or 1%) still counts as complete |
| `reputation` / `reputationLevel` | Reputation thermometer as the site names it (`5_green` ... `1_red`) and its 1-5 level |
| `powerSellerStatus` | MercadoLider tier: `silver`, `gold`, `platinum` or empty |
| `isOfficialStore` / `officialStoreId` / `storeSlug` | Official store flag, ID and store address slug (`/loja/...` or `/tienda/...`) |
| `salesText` / `followersText` | Sales tier and followers as shown on the product page (`+1000 vendas`, `+100 mil ventas`) |
| `price` / `originalPrice` / `discountPct` / `currency` | Current price, crossed-out price, discount %, currency (BRL, MXN, ARS, COP, CLP) |
| `installments` / `freeShipping` / `isFull` | Installment plan, free shipping and Fulfillment (Full) flags |
| `soldQuantity` / `soldText` / `rating` | Units sold and rating, when the listing card shows them |
| `itemId` / `productId` / `url` / `categoryId` | IDs and canonical link |
| `sellerId` / `sellerNickname` / `officialStoreId` (listing rows) | The seller of the listing. In an official store, listing rows carry `sellerId: null` plus `officialStoreId` and `sellerNickname` (the store slug); the `sellerId` is on the `seller` row |
| `sellerName` / `cardSellerLabel` | Name of the seller page, and the label printed on the card (a brand or "official store" tag, which can differ) |
| `inputValue` | The line you entered, so rows can be joined back to your list |
| `error` | Only on failed inputs. **Not charged** |

### How to use it

1. Put one seller per line in **Sellers or official stores** (up to 50). Any of these forms works, and countries can be mixed:
   - a numeric **seller ID** (`3413781093`),
   - a **nickname** (`ningboxiangcaistore`; if there is no seller page with that name the actor also tries an official store of that name),
   - a **seller page** link (`.../pagina/ningboxiangcaistore`),
   - an **official store** link (`.../loja/electrolux` in Brazil, `.../tienda/oster-mexico` in the Spanish-language sites),
   - a **listing page** link that contains `_CustId_`,
   - the link or ID of **any listing or product** of the seller (`MLB5258671363`). Product (`/p/...`) links point to the catalog winner unless they carry the listing (`item_id`, `wid`) or the seller (`seller_id`) in the link, so they may resolve to a different seller than the one you meant.
     The same seller entered twice (for example an ID and its nickname, or two of its listings) is read and billed once; the repeat is skipped.
2. Pick the **Country** for plain IDs and nicknames. Links use the country of their domain.
3. Set **Max listings per seller** (default 500, up to 20,000).
4. Keep **Include seller profile** on to get reputation and tier. Turn it off for a listings-only run.
5. Run and export to CSV, Excel or JSON, or schedule it weekly to watch a competitor's assortment and prices.

| Input | Type | Default | Notes |
|---|---|---|---|
| `sellers` | array of strings | — (required) | Up to 50; IDs, nicknames, seller/store links or any listing of the seller |
| `country` | `BR`, `MX`, `AR`, `CO`, `CL` | `BR` | Used only for plain IDs and nicknames |
| `maxItemsPerSeller` | integer | 500 | 1 to 20,000; above ~2,000 the catalog is split |
| `includeProfile` | boolean | `true` | Off = listings plus basic seller fields, no `seller-profile` charge |

### Pricing

Pay per event: a small start fee, one **seller-profile** event per seller whose profile was read, and one **listing** event per listing delivered. Rows with an `error`, invalid input, blocked pages and sellers that could not be found are **never charged**, and the run stops at the `maxTotalChargeUsd` budget you set on Apify. When the budget runs out the actor still writes the `seller` row of every seller it already read (`listingsComplete: false` for the one that was cut) and skips the profile reads. If Apify migrates the run to another server, sellers already finished are not read or billed again. Residential proxies in the chosen country are included.

| Event | Price |
|---|---|
| Actor start | $0.02 per run |
| Listing delivered | $0.0015 each ($1.50 per 1,000) |
| Seller profile read | $0.01 per profile |

| Scenario | Approximate cost |
|---|---|
| 1 seller, 500 listings + profile | $0.78 |
| 10 sellers, 500 listings each + profiles | $7.62 |
| 1 official store with 20,000 listings + profile | $30.03 |

### 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-seller-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"sellers": ["3413781093"], "country": "BR", "maxItemsPerSeller": 500, "includeProfile": true}'
```

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

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("gangary~mercado-libre-seller-scraper").call(
    run_input={"sellers": ["https://www.mercadolibre.com.mx/tienda/oster-mexico"], "maxItemsPerSeller": 500}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item.get("type") == "listing":
        print(item["itemId"], item.get("price"), item.get("title"))
```

**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-seller-scraper').call({
    sellers: ['3413781093'],
    country: 'BR',
    maxItemsPerSeller: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const seller = items.find((row) => row.type === 'seller');
console.log(seller, items.filter((row) => row.type === 'listing').length);
```

The synchronous endpoint waits up to 300 seconds; for big stores (thousands of listings) start the run asynchronously and read the dataset when it finishes.

### Integrations

Everything below is built into Apify, no extra setup on our side:

- **[Schedules](https://docs.apify.com/platform/schedules):** run the same sellers weekly or daily to follow their prices and new listings.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks):** get a call to 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 listings to Google Sheets, a database or your CRM.
- **[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-seller-scraper
```

Then ask in plain words, e.g. *"Get every listing of the Oster official store on Mercado Libre Mexico and tell me which categories they sell most."* Setup details for each client: **[Apify MCP server docs](https://docs.apify.com/platform/integrations/mcp)**.

### FAQ

**How does it get past the 2,000-result limit?**
Mercado Livre never shows more than 2,016 results (42 pages of 48) for any listing. When a seller has more, the actor reads the category and price filters of the seller's own page, splits the catalog into parts that fit under the limit, reads each part page by page and removes duplicates by listing ID. It only splits when you ask for more than the limit, so small runs stay cheap.

**Why does a seller row have fewer listings than `totalListings`?**
Either you set a lower **Max listings per seller**, or the seller changes stock while the run is going (the count is read once at the start). `listingsComplete` tells you whether the run stopped for another reason.

**Is the seller phone, e-mail or address included?**
No. The actor only collects data the site shows publicly on seller pages and listings. Seller location is not part of the public profile any more.

**Why do some inputs come back as `seller-not-found`?**
The nickname, ID or store does not exist in that country (the site silently turns a wrong nickname into a text search, which the actor detects and rejects). Check the country, or paste the seller page link.

**Is proxy included?**
Yes. A residential IP of the seller's country is used automatically. Nothing to configure.

**Does it use any login or API?**
No. It reads the same public pages a shopper sees, with a real browser.

**What if I enter the same seller twice?**
It is read and billed once. An ID and its nickname, or two listings of the same seller, are recognized as the same seller and the repeat is skipped.

**Can I cap what a run costs?**
Yes. The run stops at the **Max total charge** you set on Apify. The `seller` rows of sellers already read are still written, and the seller that was cut comes back with `listingsComplete: false`.

**Can I get only the listings, without the profile?**
Yes. Turn off **Include seller profile**: you get the listings plus basic seller fields and no `seller-profile` charge.

### Honest limitations

- Only listings that are active and visible in the seller's public listing page are returned. Paused listings and private data are not reachable.
- The profile (reputation, tier, followers) comes from one product page of the seller, so it is a snapshot of that moment. Sellers with no active listing come back without a profile.
- Counts and amounts such as `+1000 vendas` are the rounded tiers the site publishes, not exact figures.
- The full list of offers of a catalog product, and anything behind a login, is **not** delivered.
- Official stores that group several seller accounts are returned as a store (`isOfficialStore: true`). Their `listing` rows have `sellerId: null` and carry `officialStoreId` plus `sellerNickname` (the store slug); the `sellerId` is only on the `seller` row, read from one of the store's listings.
- Only Brazil, Mexico, Argentina, Colombia and Chile are supported. Peru, Uruguay and other Mercado Libre sites are not.
- Sellers with a catalog that cannot be split by the site's filters stop at 2,016 listings and are flagged with `listingsComplete: false`.
- Huge catalogs can come back a few listings short of the count the site shows (the site's count moves while the run is going): in a cloud run, Nike's official store (2,068 listings, above the 2,016 cap) returned 2,058 after being split by category.

### Changelog

- **0.1.4 (2026-10-28):** first public release. A seller entered twice is read once, `/p/` links from Argentina, Colombia and Chile find the seller, and a seller that does not exist is an error row with no charge.

### From the same maker

- **[Mercado Libre Price Tracker](https://apify.com/gangary/mercado-libre-price-monitor)** — monitor price, stock and Buy Box of the listings you found here, with what changed since the last run.

- **[Mercado Libre Buy Box Monitor](https://apify.com/gangary/mercado-libre-buy-box-monitor)** — who wins the Buy Box on each catalog product.

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

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

- **[Mercado Libre Product & Reviews Scraper](https://apify.com/gangary/mercado-libre-product-reviews-scraper)** — full product page data and reviews.

***

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 seller scraper, mercado libre vendedor scraper, espiar concorrente mercado livre, scraper loja oficial mercado livre, mercado libre tienda oficial scraper, extraer publicaciones de un vendedor, reputación vendedor mercado libre, competitor analysis mercado libre, mercadolider, latam e-commerce scraper.*

# Actor input Schema

## `sellers` (type: `array`):

Up to 50 sellers. Each line can be: a numeric seller ID, a seller nickname (the name in the seller page address), a seller page URL (/pagina/...), an official store URL (/loja/... in Brazil, /tienda/... in the Spanish-language sites), a listing URL that contains *CustId*, or the URL or ID of any listing/product of the seller (e.g. MLB5258671363). URLs from any of the five countries can be mixed.

## `country` (type: `string`):

Only used for lines that are a plain ID or nickname. Lines with a URL use the country of the URL. A local residential IP is used automatically.

## `maxItemsPerSeller` (type: `integer`):

Collect up to this many listings per seller. Above ~2,000 the actor splits the catalog by category and price range, because the site never shows more than 2,016 results per page set.

## `includeProfile` (type: `boolean`):

Read the seller reputation, MercadoLider level, sales tier and official-store data (one extra product page per seller, billed as a seller-profile event). Turn off to get only the listings plus basic seller fields.

## Actor input object example

```json
{
  "sellers": [
    "3413781093"
  ],
  "country": "BR",
  "maxItemsPerSeller": 500,
  "includeProfile": true
}
```

# 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 = {
    "sellers": [
        "3413781093"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gangary/mercado-libre-seller-scraper").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 = { "sellers": ["3413781093"] }

# Run the Actor and wait for it to finish
run = client.actor("gangary/mercado-libre-seller-scraper").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 '{
  "sellers": [
    "3413781093"
  ]
}' |
apify call gangary/mercado-libre-seller-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gangary/mercado-libre-seller-scraper"
        }
    }
}
```

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/Ag14VxRRA4xDimoIa/builds/DP3FS7YWTTJ4f1rUY/openapi.json
