MercadoLibre Product Scraper
Pricing
from $1.00 / 1,000 results
MercadoLibre Product Scraper
Scrape products from MercadoLibre across Mexico. Returns product title, price, currency, condition, seller, thumbnail, and permalink.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(11)
Developer
Crawler Bros
Actor stats
9
Bookmarked
26
Total users
15
Monthly active users
4 days ago
Last modified
Categories
Share
MercadoLibre Mexico Product Scraper
Scrape products from MercadoLibre Mexico. Returns product ID, title, URL, price (MXN), original price, discount, condition (new/used), seller, brand, rating, thumbnail, and shipping info. Supports condition + price-range filters.
What it does
- Scrapes MercadoLibre Mexico (
listado.mercadolibre.com.mx) search results - Filter by
condition(new / used) andpriceMin/priceMax(in MXN) - Hardcoded MX-residential proxy handles MercadoLibre's account-verification block wall
- Automatic session rotation across 5 chrome/firefox impersonate profiles — up to 6 retries on flagged sessions
- Clean, non-null output — empty fields are omitted from records
Why only Mexico? MercadoLibre's anti-bot is country-specific. Argentina, Brazil, and the smaller LatAm markets (CL/CO/PE/UY/VE/EC/DO/CR) reliably block every retry from Apify's residential proxy pool — they were removed from this actor's input rather than ship a country option that always fails.
Input
| Field | Type | Default | Description |
|---|---|---|---|
country | enum | MX | Always MX (Mexico — only supported country) |
searchQuery | string | "iphone" | Free-text keyword (required unless startUrls is set) |
condition | enum | any | any / new / used |
priceMin | integer | — | Minimum price in MXN |
priceMax | integer | — | Maximum price in MXN |
startUrls | array | — | Direct MercadoLibre Mexico search URLs (override structured filters) |
maxItems | integer | 50 | Maximum results to return (1–1000) |
Example input
{"country": "MX","searchQuery": "iphone","condition": "new","priceMin": 10000,"priceMax": 30000,"maxItems": 20}
Output
Each product is a JSON record with the following fields (missing fields are omitted, never null):
| Field | Type | Always present | Description |
|---|---|---|---|
id | string | ✓ | MercadoLibre item ID (e.g. MLM1018500855) |
title | string | ✓ | Product title |
url | string | ✓ | Full product URL |
countryCode | string | ✓ | Always MX |
scrapedAt | string | ✓ | UTC ISO 8601 scrape timestamp |
price | number | — | Current price in MXN |
originalPrice | number | — | Strikethrough / original price (before discount) |
currency | string | — | Always MXN |
currencySymbol | string | — | Currency symbol as displayed on the site |
discountPercentage | number | — | Percentage off (0–100) |
condition | string | — | new or used (refurbished items are mapped to used) |
thumbnail | string | — | Product image URL |
sellerName | string | — | Seller / brand name |
brand | string | — | Brand attribute |
shippingLabel | string | — | Shipping badge text (e.g. Envío gratis) |
rating | number | — | Seller or product star rating |
reviewsCount | number | — | Number of reviews |
Sample output
{"id": "MLM3681392425","title": "Apple iPhone 16 (128 GB) - Rosa - Distribuidor Autorizado","url": "https://www.mercadolibre.com.mx/apple-iphone-16-128-gb-rosa/...","countryCode": "MX","price": 16999,"currency": "MXN","currencySymbol": "$","condition": "new","thumbnail": "https://http2.mlstatic.com/D_Q_NP_2X_...webp","sellerName": "Apple","shippingLabel": "Envío gratis","scrapedAt": "2026-05-01T07:00:00Z"}
FAQ
Do I need a proxy? No configuration needed — an Apify residential MX proxy is applied automatically. MercadoLibre blocks direct datacenter access and even many residential sessions, so the scraper rotates proxy session IDs up to 6 times per run with 5 different curl_cffi browser-impersonate profiles (Chrome 133/131/124/120, Firefox 133). The first half of attempts use Mexico residential IPs; the second half falls back to any residential IP for resilience.
Why only Mexico? MercadoLibre's anti-bot is country-specific, and Apify's residential proxy pool quotas vary heavily by country. Argentina, Brazil, Chile, Colombia, Peru, Uruguay, Venezuela, Ecuador, Dominican Republic, and Costa Rica all returned hard-block stub responses on every residential session in our testing — they were removed from the input rather than ship a country option that always degrades to a sentinel record. Mexico is currently the only LatAm market with a reliable residential pool for MercadoLibre scraping.
How do condition and priceMin / priceMax filters work?
The actor first attempts MercadoLibre's path-based filter URLs (_PriceRange_min-max, _ITEM*CONDITION_<id>) and then re-applies the same filters client-side after parsing, since MercadoLibre's server-rendered HTML returns the unfiltered listing and applies filters in client JS. So filters always work on the output regardless of MercadoLibre's rendering path.
How many results can I get per run? Up to 1,000 items. Each search page returns 40–50 cards; for filter-narrowed queries the page may yield fewer matches.
Does the scraper call MercadoLibre's public API?
No. api.mercadolibre.com now returns 403 for anonymous traffic. The scraper uses the HTML search listings page at listado.mercadolibre.com.mx/<query> and parses the poly-card server-rendered product tiles.
What happens if the residential pool is fully blocked?
On rare days when every retry returns a stub page, the actor emits a single mercadolibre_blocked sentinel record (with type, reason, message, scrapedAt) and exits successfully. Re-run a few minutes later for fresh residential IPs.
How fresh is the data? Every run hits the live search page. Prices and availability are always current.
Use cases
- Price monitoring — daily runs to track Mexico market prices
- Trend research — ingest product names and prices across major keywords
- Refurbished-market analysis — filter
condition=usedto map the secondary market - Inventory alerts — monitor specific SKUs via the
startUrlsoverride
Notes
- Pricing is configured in the Apify UI (pay-per-result).
- MercadoLibre's HTML can change; if the scraper starts returning 0 items, check the
poly-cardclass markers insrc/main.py:parse_search_html. - The daily Apify test run uses
country=MX,searchQuery=iphone,maxItems=5.