# MercadoLibre Scraper — Products & Prices, 18 LATAM Countries (`punkrecordsdata/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/punkrecordsdata/mercadolibre-scraper.md
- **Developed by:** [PunkRecordsData](https://apify.com/punkrecordsdata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.82 / 1,000 listing results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner" alt="PunkRecordsData" 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 **PunkRecordsData**

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/PunkRecordsData~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 PunkRecordsData 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("punkrecordsdata/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("punkrecordsdata/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 punkrecordsdata/mercadolibre-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,punkrecordsdata/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/09mtKI31p01wHYr6B/openapi.json
