Mercado Libre looks like one site with seventeen flags on it. Underneath, the large marketplaces and the small ones behave so differently that a run configuration tuned for Argentina is close to meaningless in Panama.
What a Mercado Libre run actually needs
A browser with a coherent fingerprint, and a residential proxy that exits in the marketplace's own country. Not one of those is optional. Plain HTTP, a Chrome TLS fingerprint and even a solved proof-of-work all end at the same anti-bot wall — a wall that answers HTTP 200 and is therefore invisible to anything checking status codes.
What you do not need is an account. No API key, no OAuth, no cookies and no sign-in at any point, which also means no account to lose — though it does mean the official API, closed to anonymous callers, is not the route being taken.
Step 1 — pick the marketplace, and expect it to differ
siteId selects one of seventeen, from MLA (Argentina) to MPA (Panamá). The choice decides far more than a domain name:
| Marketplace | iphone results | Catalog pages | Pagination useful? |
|---|---|---|---|
| MLM — Mexico | 6,372 | Yes | Yes |
| MLA — Argentina | 5,078 | Yes | Yes |
| MLV — Venezuela | 436 | No | Barely |
| MPA — Panamá | 26 | No | No — one page is everything |
The full table, with currency and installments per market, is in the marketplace reference.
Step 2 — searches, categories or URLs
Three ways in, and they are not interchangeable. searchQueries takes free text and returns up to 48 listings on page 1. categoryUrls goes straight at a category listing when you already know the category rather than the phrase. startUrls accepts listing or product URLs — and a product URL is scraped as a detail page, which means it is billed at the detail rate.
Step 3 — decide about pagination deliberately
This is the decision most runs get wrong by not making it. Pagination is on by default, it reaches roughly 2,000 items per query, and it requests a URL form that Mercado Libre's own robots.txt disallows by name — because that is the only form the site still serves.
Step 4 — decide whether you need product pages
scrapeDetail multiplies browser page loads by about 40. What it buys is a set of fields that exist on no marketplace's listing pages at all — rating, reviews, location, stock ranges, attributes, seller identity and the Venezuelan dual price. If you do not need those, leaving it off is the single largest saving available.
Reading the output
{
"siteId": "MLV",
"searchQueries": ["iphone"],
"maxItems": 500,
"scrapeDetail": false
}Rows arrive in snake_case with product text left in the marketplace's own language, because Envío gratis is data rather than interface. Two fields deserve attention before anything else: currency, which belongs to the row and not the country, and item_id, which comes from the page's embedded results array rather than from the URL — for a reason worth knowing.
Reading the run statistics
RUN_STATS is part of the output. wall_hits and captcha_hits say how much of the run met resistance; pages_disallowed_by_robots_fetched and pages_truncated_by_robots_policy say which side of the robots decision the run actually landed on; items_from_cache says how much of the dataset is up to 24 hours old. Failed pages go to a separate ERRORS dataset rather than mixing into results.
Four mistakes that waste a run
Leaving scrapeDetail on by habit. Forty times the page loads and a separate charge per row, for fields many jobs never read.
Expecting Argentina's numbers in Panama. Twenty-six results is the whole market, not a failed run.
Raising concurrency. Each listing page is 2.4 to 4.5 MB. The default of 2 is measured, not conservative by reflex.
Reading an empty dataset as an empty market. A fully blocked run fails on purpose so those two outcomes stay distinguishable.


