# MercadoLibre Scraper - Products & Prices, 18 LATAM Countries (`recordsdata/mercadolibre-scraper`) Actor

Scrape MercadoLibre product listings and prices across Argentina, Mexico, Brazil, Colombia, Chile and 13 more LATAM countries. Export CSV, Excel, JSON.

- **URL**: https://apify.com/recordsdata/mercadolibre-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 94.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

## 🛒 MercadoLibre Product & Price Scraper: 18 LATAM Countries

![Category](https://img.shields.io/badge/Category-Ecommerce-ffe600) ![Coverage](https://img.shields.io/badge/Coverage-15%20of%2018%20LATAM%20countries-blue) ![Proxy](https://img.shields.io/badge/Proxy-Residential-blueviolet) ![Status](https://img.shields.io/badge/Cloud%20verified-✅-brightgreen)

> 🚀 **MercadoLibre Product & Price Scraper** is an Apify Actor that
> searches MercadoLibre and returns structured product data in seconds:
> price, discount, shipping, official-store status, and ratings across
> Argentina, Mexico, Brazil and 15 more LATAM countries.

> 🕒 **Last updated:** 2026-08-28 · **📊 26+ fields** per record · 15 of 18
> countries individually cloud-verified · by **RecordsData**

MercadoLibre is the largest marketplace in Latin America, but every country
runs on its own domain and its search pages actively block plain scrapers.
This Actor drives a real stealth browser through a residential proxy
matched to the country you pick, so you get real prices and real listings,
not a bot-check page.

### 📚 Table of Contents

- [🎯 Who this is for](#-who-this-is-for)
- [📋 What it does](#-what-the-mercadolibre-scraper-does)
- [🌎 Countries covered](#-countries-covered)
- [⚙️ Input](#️-input)
- [📊 Output](#-output)
- [🧾 Sample records](#-sample-records-real-data)
- [🚀 How to use](#-how-to-use)
- [💼 Business use cases](#-business-use-cases)
- [🔌 Integrate with any app](#-integrate-with-any-app)
- [💰 Cost](#-cost)
- [❓ FAQ](#-frequently-asked-questions)
- [🗺️ Roadmap](#️-roadmap)

### 🎯 Who this is for

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| 📊 Price intelligence / analysts | Competitor price tracking across LATAM |
| 🛍️ E-commerce & brand teams | Monitoring resellers, official-store compliance |
| 📈 Market researchers | Category and demand analysis per country |
| 🧾 Procurement teams | Sourcing and price comparison |

### 📋 What the MercadoLibre Scraper does

- 🔍 Searches by **keyword** on any of the **18 supported countries**
- 💵 Returns **price, original price, discount %,** and **installments**
- 🚚 Flags **free shipping** and captures the shipping note
- 🏪 Detects **official store** listings (vs. third-party sellers)
- ⭐ Captures the **star rating** shown on the search card
- 🗓️ Optional **price, condition and free-shipping filters**
- 📄 Optional **full product detail enrichment**. Description, brand, sold
  count, image gallery. One extra page visit per listing

### 🌎 Countries covered

**15 of 18 confirmed working** with live cloud runs (real listings, real
prices):

| ✅ Working | ✅ Working | ✅ Working |
|---|---|---|
| 🇦🇷 Argentina | 🇪🇨 Ecuador | 🇸🇻 El Salvador |
| 🇲🇽 Mexico | 🇧🇴 Bolivia | 🇵🇦 Panama |
| 🇨🇴 Colombia | 🇵🇾 Paraguay | 🇩🇴 Dominican Republic |
| 🇨🇱 Chile | 🇬🇹 Guatemala | |
| 🇵🇪 Peru | 🇳🇮 Nicaragua | |
| 🇺🇾 Uruguay | | |
| 🇻🇪 Venezuela | | |

> ⚠️ **Not currently working:** 🇧🇷 **Brazil**, 🇨🇷 **Costa Rica**, 🇭🇳
> **Honduras**. The residential proxy connection is refused for these
> three countries on repeated, isolated tests (not a code or site-blocking
> issue; confirmed via `NS_ERROR_PROXY_CONNECTION_REFUSED`, most likely an
> account/proxy-pool allocation gap for those specific countries). The
> other 15 use the exact same code path and work reliably.

### ⚙️ Input

| Field | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | array | None | Keywords to search, e.g. `iphone 15` |
| `country` | string | `AR` | Which MercadoLibre site to search, proxy is auto-matched |
| `maxListings` | integer | `20` | Listings to collect per search term. **Free plan:** capped at 10 |
| `condition` | string | `any` | `any` / `new` / `used` |
| `priceMin` / `priceMax` | integer | None | Filter by price (local currency) |
| `freeShipping` | boolean | `false` | Only free-shipping listings |
| `sort` | string | `relevance` | `relevance` / `price_asc` / `price_desc` |
| `withDetails` | boolean | `false` | Visit each product page for description, brand, sold count, gallery |
| `proxyConfiguration` | object | `RESIDENTIAL` | Required, the Actor matches it to `country` automatically |

```json
{
  "searchTerms": ["iphone 15"],
  "country": "AR",
  "maxListings": 40
}
```

```json
{
  "searchTerms": ["zapatillas running"],
  "country": "MX",
  "maxListings": 20,
  "freeShipping": true,
  "withDetails": true
}
```

> ⚠️ **Good to know:** filters are applied after collecting results, so a
> strict `priceMin`/`priceMax`/`freeShipping` combination may return fewer
> items than `maxListings` for a given search term. That's expected, not a
> bug.

### 📊 Output

| Field | Description |
|---|---|
| 🖼 `imageUrl` | Product image |
| 🆔 `id` | MercadoLibre listing ID (e.g. `MLA1027172677`) |
| 📌 `title` | Listing title |
| 🔗 `url` | Canonical listing URL |
| 💵 `price` / `originalPrice` / `discountPercentage` | Current price, pre-discount price, discount % |
| 💱 `currency` | ISO currency for the selected country |
| 💳 `installmentsText` | Raw installment-plan text as shown on the site |
| 🚚 `freeShipping` / `shippingText` | Free-shipping flag + raw shipping note |
| 🏪 `officialStore` / `officialStoreName` | Official-store flag + badge text |
| 🎯 `promoLabel` | Any other promo badge on the listing (e.g. "Last one!") |
| 👤 `sellerName` | Seller/brand name, when shown |
| ⭐ `ratingAverage` | Star rating shown on the card |
| 📢 `isSponsored` | Whether the listing is a paid/sponsored result |
| 🔢 `position` | Rank within this search |
| 🔍 `searchQuery` / 🌎 `country` | Which search produced this record |
| 📝 `description` / `brand` / `soldText` / `images` | Only when `withDetails` is on |
| 🕒 `scrapedAt` | When this record was scraped |
| ❌ `error` | Present only on failed items |

Download the dataset as **JSON, CSV, Excel, or XML** from the Apify
Console, or pull it via the API.

### 🧾 Sample records (real data)

<details>
<summary><b>▶️ Click to expand. Real listings from Argentina and Mexico, 2026-08-28</b></summary>

```json
{
  "imageUrl": "https://http2.mlstatic.com/D_Q_NP_2X_784557-MLA95493924244_102025-E.webp",
  "id": "MLA1027172677",
  "title": "Apple iPhone 15 128 GB Negro - Distribuidor Autorizado",
  "url": "https://www.mercadolibre.com.ar/apple-iphone-15-128-gb-negro-distribuidor-autorizado/p/MLA1027172677",
  "price": 1987439,
  "originalPrice": 2183999,
  "discountPercentage": 9,
  "currency": "ARS",
  "installmentsText": "Mismo precio 12 cuotas de $165.619",
  "freeShipping": true,
  "shippingText": "Llega gratis mañana",
  "officialStore": true,
  "officialStoreName": "APPLE TIENDA OFICIAL",
  "sellerName": "Apple",
  "ratingAverage": 4.9,
  "isSponsored": false,
  "position": 1,
  "searchQuery": "iphone 15",
  "country": "AR",
  "scrapedAt": "2026-08-28T20:38:57.000Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://http2.mlstatic.com/D_NQ_NP_2X_...",
  "id": "MLM1027172667",
  "title": "Apple iPhone 15 (128 GB) - Azul - Distribuidor Autorizado",
  "url": "https://www.mercadolibre.com.mx/apple-iphone-15-128-gb-azul-distribuidor-autorizado/p/MLM1027172667",
  "price": 14998,
  "currency": "MXN",
  "freeShipping": true,
  "position": 1,
  "searchQuery": "iphone 15",
  "country": "MX",
  "scrapedAt": "2026-08-28T20:40:41.000Z",
  "error": null
}
```

</details>

### 🚀 How to use

1. Sign up or log in at [console.apify.com](https://console.apify.com)
2. Open **MercadoLibre Scraper** and go to the **Input** tab
3. Add a keyword to `searchTerms` and pick a `country`
4. Set `maxListings` and click **▶️ Start**
5. Download results as JSON, CSV, Excel, or XML. Or pull them via the API

### 💼 Business use cases

| 📊 Competitor price tracking | 🏪 Official-store compliance |
|---|---|
| Search your category across countries weekly, export to your BI tool, and spot who's undercutting on price. | Use `officialStore` to see who's selling as an authorized reseller vs. a third party, flag unauthorized listings. |

| 🌎 Cross-country market research | 🎯 Deal & discount monitoring |
|---|---|
| Compare pricing for the same product across Argentina, Mexico, Brazil and more to find your best-margin market. | Filter by `discountPercentage` and `promoLabel` to catch flash sales and low-stock urgency listings. |

### 🔌 Integrate with any app

Pull results via the [Apify API](https://docs.apify.com/api/v2), or connect
to Make, Zapier, Google Sheets, Airbyte, n8n, or any webhook-based tool from
the Apify Console **Integrations** tab. Schedule recurring runs with
Apify's built-in **Scheduler**.

```bash
curl "https://api.apify.com/v2/acts/RecordsData~mercadolibre-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{ "searchTerms": ["iphone 15"], "country": "AR", "maxListings": 20 }'
```

### 💰 Cost

| Plan | What you get |
|---|---|
| 🆓 Free | Up to 10 items per run (preview) |
| 💳 Paid | Up to 1,000,000 items per run, billed on Apify usage (compute + residential proxy) |

Cost is dominated by **one page visit per search term**, not by how many
items you keep. A single search page typically returns 40+ listings.
Setting `maxListings` closer to that natural page size (instead of many
separate low-`maxListings` searches) gives the best cost per item.
`withDetails` adds one extra page visit per listing and costs meaningfully
more. Enable it only when you need the extra fields.

### ❓ Frequently Asked Questions

**Does this work without a proxy?**
No. MercadoLibre blocks plain scrapers and even generic proxies on search
pages. `RESIDENTIAL`, matched to the target country, is required.

**Why did a search return 0 items?**
The site's anti-bot defenses are occasionally inconsistent. Retry the run.
If it persists for a specific country, open an issue.

**Can I filter by price or shipping?**
Yes: `priceMin`, `priceMax`, `condition`, `freeShipping`. These are
applied after collection, so a strict filter can return fewer than
`maxListings` items.

**Does it download product images?**
It returns image URLs, not the files themselves.

**Is this affiliated with MercadoLibre?**
No. See disclaimer below.

**Can I run this on a schedule?**
Yes, use Apify's built-in Scheduler.

**What happens on the free plan?**
Results are capped at 10 items per run.

### 🗺️ Roadmap

- 🔎 Category and seller-ID direct filtering
- 🔗 Raw start-URL passthrough (search / category / seller pages)
- 🤖 AI-generated listing summaries
- 💬 Reviews content (not just the star rating)

***

> **⚠️ Disclaimer:** This is an independent tool, not affiliated with,
> endorsed by, or sponsored by MercadoLibre. It only collects data that is
> publicly visible on MercadoLibre's website.

**🆘 Need help or want a custom scraper?** Contact RecordsData at
<contact.punkrecordsdata@gmail.com>.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search, e.g. `iphone 15`, `zapatillas running`. One search per term.

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

Which MercadoLibre site to search. The proxy is automatically matched to this country for reliable results.

## `maxListings` (type: `integer`):

How many product listings to collect per search term. **Free plan:** capped at 10. **Paid:** up to 1,000,000.

## `condition` (type: `string`):

Filter by product condition.

## `priceMin` (type: `integer`):

Only listings priced at or above this amount (in the local currency of the selected country).

## `priceMax` (type: `integer`):

Only listings priced at or below this amount (in the local currency of the selected country).

## `freeShipping` (type: `boolean`):

Only include listings with free shipping.

## `sort` (type: `string`):

Order search results before collecting.

## `withDetails` (type: `boolean`):

Visit each product's own page for description, brand, stock, sold count and reviews. Costs one extra page visit per listing — worth it for price/attribute monitoring, skip it for a quick price scan.

## `proxyConfiguration` (type: `object`):

MercadoLibre blocks datacenter IPs and generic proxies on search pages — **Residential** is required for reliable results and is already selected below. The Actor automatically matches the proxy's country to the **Country** field above.

## Actor input object example

```json
{
  "searchTerms": [
    "iphone 15"
  ],
  "country": "AR",
  "maxListings": 20,
  "condition": "any",
  "freeShipping": false,
  "sort": "relevance",
  "withDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchTerms": [
        "iphone 15"
    ],
    "maxListings": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/mercadolibre-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 = {
    "searchTerms": ["iphone 15"],
    "maxListings": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/mercadolibre-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 '{
  "searchTerms": [
    "iphone 15"
  ],
  "maxListings": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call recordsdata/mercadolibre-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/mercadolibre-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/3o5jmYWsIOH6OvBzZ/builds/2OesYoPbEIzBsuUfH/openapi.json
