# MercadoLibre Scraper - Products, Prices & Reviews (`memo23/mercadolibre-scraper`) Actor

Scrape MercadoLibre across 7 LATAM countries — product title, price, condition, rating, images and individual reviews. Search by keyword, category URL or product URL. Solves the proof-of-work bot gate for you. JSON or CSV, pay per result

- **URL**: https://apify.com/memo23/mercadolibre-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, AI, Agents
- **Stats:** 47 total users, 23 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 product results

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/platform/actors/running/actors-in-store#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

## MercadoLibre Scraper

Scrape product data from **MercadoLibre** across Latin America — title, price, condition, rating, review count, seller and images. Search by keyword, paste a category listing URL, or a direct product URL. The actor **solves MercadoLibre's proof-of-work bot gate for you** and returns clean structured rows. Seven country sites, pay per result, no monthly fee.

#### How it works

![How the MercadoLibre Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-mercadolibre.png)

#### ✨ Why use this scraper?

- **Beats the bot gate.** MercadoLibre fronts search/listing pages with a JavaScript proof-of-work challenge; this actor solves it server-side (no browser) and retries across residential IPs until it gets through — you just get the data.
- **7 country sites in one actor.** Mexico, Argentina, Brazil, Colombia, Chile, Uruguay and Peru — prices returned in each site's currency.
- **Three ways in.** Keyword search, category/listing URL, or direct product URL — mixed freely in one run, auto-classified per entry.
- **Clean canonical URLs.** Sponsored/ad cards are de-duplicated to their real `/p/MLM…` product URLs, not click-tracking links.
- **Optional full detail.** Turn on `enrichDetail` to add brand, rating, review count, condition and the image gallery from each product page.
- **Pay per result.** Billed per product row with a strict `maxItems` cap, so a run never collects (or charges) more than you set.

#### 🎯 Use cases

| You are… | Use it to… |
|---|---|
| **Pricing / competitive intelligence** | Track competitor prices and availability across LATAM marketplaces |
| **Resellers & dropshippers** | Source products, monitor prices and stock, sync catalogs |
| **Market research** | Measure assortment, pricing and ratings by country and category |
| **Brand monitoring** | Watch how your products are listed, priced and rated by third-party sellers |
| **Deal / price monitors** | Track price drops on specific products on a schedule |

#### 📥 Supported inputs

| Input | Example | What you get |
|---|---|---|
| Search keyword (`searchTerms`) | `iphone` | Search results on the chosen country site |
| Category / listing URL | `https://listado.mercadolibre.com.mx/celulares` | Every product in that listing |
| Product URL | `https://www.mercadolibre.com.mx/p/MLM123456` | That single product |
| Country | `MLM` / `MLA` / `MLB` / `MCO` / `MLC` / `MLU` / `MPE` | Which site to search |

**Not supported:** seller back-office data, checkout, or anything behind a MercadoLibre account login.

#### 🔄 How it works

1. **Classify** — each entry is tagged as a keyword search, a category listing, or a product URL.
2. **Fetch + solve** — pages are fetched over HTTP with a real Chrome TLS fingerprint; when the proof-of-work gate appears, the actor solves `sha256(nonce + r)` and replays the solution cookies.
3. **Paginate** — listings walk `_Desde_N` pages until empty or `maxItems`.
4. **Parse** — product cards (and, with `enrichDetail`, each product page's JSON-LD) are mapped to one normalized row.
5. **Push** — one row per product to the dataset (JSON or CSV), de-duplicated by canonical URL.

#### ⚙️ Input parameters

| Field | Type | Description |
|---|---|---|
| `searchTerms` | array | Keywords to search on the selected country site. |
| `startUrls` | array | Listing URLs, product URLs, or bare keywords — auto-classified. |
| `country` | string | Country site: `MLM` (default), `MLA`, `MLB`, `MCO`, `MLC`, `MLU`, `MPE`. |
| `enrichDetail` | boolean | Fetch each product page for brand, rating, condition and images (slower). Default `false`. |
| `maxReviews` | integer | Also scrape up to N recent reviews per product (rating, text, date). `0` = off. |
| `maxItems` | integer | Hard cap on products collected (and billed). Default `1000`. |
| `maxConcurrency` | integer | Parallel jobs (kept low — each request solves a challenge). Default `4`. |
| `proxy` | object | Proxy configuration. **Residential strongly recommended.** |

#### 📊 Output overview

One row per product, identical shape across every country site and discovery mode. Search/category rows carry the essentials (title, price, currency, canonical URL, image); with `enrichDetail` each row is enriched from its product page (brand, condition, rating, review count, full images); with `maxReviews` each row also carries up to N recent individual reviews. Export as JSON or CSV.

#### 📦 Output sample

A real row (search on MLM, `enrichDetail` on):

```json
{
  "type": "product",
  "site": "MLM",
  "country": "com.mx",
  "productId": "MLM1018500844",
  "title": "Apple iPhone 13 128 GB Medianoche",
  "url": "https://www.mercadolibre.com.mx/p/MLM1018500844",
  "price": 12999,
  "currency": "MXN",
  "brand": "Apple",
  "available": true,
  "rating": 4.9,
  "reviewCount": 7945,
  "reviews": [
    { "rating": 4, "text": "Es original, llegó rápido y bien empacado.", "date": "Hace 8 meses" }
  ],
  "primaryImage": "https://http2.mlstatic.com/D_NQ_NP_2X_...-F.webp",
  "images": ["https://http2.mlstatic.com/D_NQ_NP_2X_...-F.webp"],
  "discoveryMode": "search",
  "sourceUrl": "https://listado.mercadolibre.com.mx/iphone",
  "scrapedAt": "2026-06-27T06:30:00.000Z"
}
```

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identity** | `productId`, `title`, `url`, `site`, `country` |
| **Pricing** | `price`, `currency` |
| **Detail** (with `enrichDetail`) | `brand`, `condition`, `available`, `rating`, `reviewCount` |
| **Reviews** (with `maxReviews`) | `reviews[]` — each `rating`, `text`, `date` |
| **Media** | `primaryImage`, `images[]` |
| **Provenance** | `discoveryMode`, `sourceUrl`, `scrapedAt` |

#### ❓ FAQ

**Does it get past MercadoLibre's bot protection?** Yes — listing and product pages are gated by a JavaScript proof-of-work challenge. The actor solves it server-side and retries across IPs, so you don't need a browser or a CAPTCHA solver.

**Do I need a proxy?** Yes — use **residential** (the default). MercadoLibre blocks datacenter IPs outright, and the gate is served unevenly across IPs, so the actor relies on residential rotation.

**Which countries are supported?** Mexico, Argentina, Brazil, Colombia, Chile, Uruguay and Peru. Set `country` to the matching site code.

**How do I get brand, rating and condition?** Enable `enrichDetail`. It fetches each product's page (one extra request per product) and reads its structured data.

**Can I scrape individual reviews?** Set `maxReviews` to N — each product then includes up to N recent reviews (`rating`, `text`, `date`). Works with or without `enrichDetail`. Reviews are billed per review grabbed.

**Why are some fields null in search mode?** Without `enrichDetail`, rows come from the fast listing cards (title, price, URL, image). Brand/rating/condition live on the product page.

#### 💬 Support

Hit a country site or page layout that doesn't parse? Open an issue with the URL you tried — most fixes are quick.

#### 🛠 Additional services

Need a custom field, scheduled price monitoring, or another MercadoLibre country/section? Reach out for a tailored build.

#### 🔎 Explore more scrapers

Pairs well with other marketplace and DTC product scrapers for broader e-commerce coverage.

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/mercadolibre-scraper`).

**Purpose:** Scrape MercadoLibre product rows across seven LATAM country sites by keyword, category URL or product URL — one normalized row per product, solving the site's proof-of-work bot gate server-side (no browser).

**Minimal input:**

```json
{
  "searchTerms": ["iphone"],
  "country": "MLM",
  "maxItems": 25
}
```

URL mode (inline): `{ "startUrls": ["https://listado.mercadolibre.com.mx/celulares"], "maxItems": 25 }` — listing, product, or bare-keyword entries are auto-classified.

**Output:** one row per product — type, site, country, productId, title, url, price, currency, discoveryMode, sourceUrl, scrapedAt, primaryImage, images; with `enrichDetail`: brand, condition, available, rating, reviewCount; with `maxReviews`: reviews {rating, text, date}.

**Behaviors an agent should know:**

- Always set `maxItems` (default 1000); each product row is billed. Listings paginate (`_Desde_N`) until empty or the cap.
- `country` selects the site: MLM (Mexico, default), MLA, MLB, MCO, MLC, MLU, MPE; prices are in each site's currency.
- `enrichDetail` (default off) is required for brand, condition, rating, reviewCount and full images — adds one request per product.
- `maxReviews` (0–50, default 0) adds up to N recent reviews per product, billed per review grabbed; works with or without `enrichDetail`.
- Residential proxy is required (the default); datacenter IPs are blocked. No seller-dashboard, checkout, or login-gated data.

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by MercadoLibre, Inc. or any of its subsidiaries. All trademarks are the property of their respective owners.

The scraper accesses only publicly available product and listing pages — no authenticated endpoints, seller dashboards, or account data. Users are responsible for ensuring their use complies with MercadoLibre's Terms of Service, applicable data-protection law (LGPD, GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

mercadolibre scraper, mercado libre scraper, mercadolivre scraper, mercadolibre api, scrape mercadolibre, mercadolibre product scraper, mercadolibre price scraper, mercadolibre mexico scraper, mercadolibre argentina scraper, mercadolibre brasil scraper, mercadolibre colombia scraper, latam ecommerce scraper, marketplace price monitoring, mercadolibre data extraction, apify mercadolibre, product listing scraper, competitor price tracker latam, mercadolibre seller data, ecommerce product scraper, mercadolibre json csv

# Actor input Schema

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

Keywords searched on the selected country site (e.g. `iphone`, `notebook gamer`).

## `startUrls` (type: `array`):

MercadoLibre search or category listing URLs, direct product URLs (…/p/MLM…), or bare keywords. Each entry is auto-classified.

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

Which MercadoLibre country site to search.

## `enrichDetail` (type: `boolean`):

For each result, fetch its product page to add brand, rating, condition and full image gallery. Adds requests, so it's off by default.

## `maxReviews` (type: `integer`):

Also scrape up to this many recent reviews per product (rating, text, date). 0 = off. Adds one request per product.

## `maxItems` (type: `integer`):

Hard cap on products collected (and billed).

## `maxConcurrency` (type: `integer`):

Parallel jobs. Kept low because each request solves a proof-of-work challenge.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "searchTerms": [
    "iphone"
  ],
  "startUrls": [],
  "country": "MLM",
  "enrichDetail": false,
  "maxReviews": 0,
  "maxItems": 1000,
  "maxConcurrency": 4
}
```

# 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"
    ],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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"],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/mercadolibre-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ],
  "startUrls": []
}' |
apify call memo23/mercadolibre-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/mercadolibre-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LzKBo6ojZkW9ZgOyS/builds/nmDGy61XYAkSXlabm/openapi.json
