Mercado Libre Scraper & API — 17 Countries avatar

Mercado Libre Scraper & API — 17 Countries

Pricing

Pay per event

Go to Apify Store
Mercado Libre Scraper & API — 17 Countries

Mercado Libre Scraper & API — 17 Countries

Scrape Mercado Libre listings and product pages across 17 Latin American marketplaces. No API key and no quota. Every price carries its own currency — six markets mix local and US dollars on the same page — plus the Venezuelan USD/local pair.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Oswaldo Carabano

Oswaldo Carabano

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Scrape Mercado Libre listings and product pages across 17 Latin American marketplaces with a single parser. Search by keyword, by category URL, or feed it product URLs directly.

Built on a browser with a coherent fingerprint and a residential proxy that exits in each marketplace's own country, because nothing else reaches the data: plain HTTP, a Chrome TLS fingerprint and even a solved proof-of-work all end at the anti-bot wall.


Why this one

Per-row currency. On six marketplaces — Uruguay, Paraguay, Dominican Republic, Nicaragua, Guatemala and Panama — the local currency and US$ appear in the same results page. Summing prices without reading each row's currency produces a meaningless number. Every row carries its own currency.

The dual-price pair, which nobody else returns. Venezuelan product pages show US$ 580.80 and Bs. 476,314. This Actor returns both plus exchange_rate_implied, derived from the page's structured data — not from the rendered price, which splits the cents into a separate element and shifts the rate by 0.14%. Measured across product pages on one day, the derived rate came out identical on every single one.

A primary key that does not lie. item_id comes from the page's embedded search results array. Three link shapes coexist on one results page — articulo.…/MLA-…, /p/MLA… and /up/MLAU… — and a URL pattern silently drops the third, which can be 40% of the page.

Blocking is reported, not hidden. The anti-bot wall answers HTTP 200 with a well-formed page and zero listings. Every run reports wall_hits, captcha_hits, retries and robots-policy counters, and a run that scraped nothing because every page was blocked fails instead of reporting success with zero rows.


Coverage

SiteCountryCurrencyiphone results measuredMixed currenciesCatalog pagesInstallments
MLAArgentinaARS5078NoYesYes
MLMMexicoMXN6372NoYesYes
MCOColombiaCOP5305NoYesYes
MLCChileCLP3496NoYesYes
MLUUruguayUYU1882YesYesYes
MPEPeruPEN2229NoYesYes
MLVVenezuelaVES436NoNoNo
MECEcuadorUSD358NoYesYes
MBOBoliviaBOB27NoNoNo
MPYParaguayPYG65YesNoNo
MRDDominican RepublicDOP40YesNoNo
MCRCosta RicaCRC60NoNoNo
MNINicaraguaNIO42YesNoNo
MGTGuatemalaGTQ30YesNoNo
MHNHondurasHNL31NoNoNo
MSVEl SalvadorUSD29NoNoNo
MPAPanamaPAB26YesNoNo

Two different marketplaces in one platform. The large ones return thousands of results per query and use catalog product pages; the small ones return dozens, have no catalog pages, and one page is the entire result set — there is nothing to paginate. The Actor detects this: it requests the next page only when the previous one came back full, so a query in Panama costs exactly one page load.

Not available: Brazil (MLB) and Cuba (MCU). Brazil is out until there is a documented LGPD basis; Cuba is unreviewed and its proxy route is unverified. The Actor refuses those inputs with a clear error instead of silently accepting them.


Input

FieldTypeDefaultWhat it does
siteIdstringMLAWhich marketplace. One of the 17 above
searchQueriesarray[]Free-text searches, e.g. iphone
categoryUrlsarray[]Category listing URLs to scrape directly
startUrlsarray[]Listing or product URLs. Product URLs are scraped as detail pages
maxItemsinteger100Hard cap on rows
scrapeDetailbooleanfalseOpen every product page. Multiplies page loads by ~40
allowPaginationbooleantrueFollow _Desde_ pagination. See the note below
respectRobotsbooleanfalseSkip every path robots.txt disallows
categorySlicingbooleantrueAlso fetch page 1 of each allowed sub-category
maxSlicesinteger20Cap on sub-category pages per query
maxConcurrencyinteger2Parallel pages. Each listing page is 2.4-4.5 MB
useCachebooleantrueReuse listings seen in the last 24 hours
{
"siteId": "MLV",
"searchQueries": ["iphone"],
"maxItems": 500,
"scrapeDetail": false
}

Pagination and robots.txt — read this before running

Mercado Libre's robots.txt allows page 1 of a search and disallows page 2 (Disallow: /*_Desde_).

  • allowPagination is on by default, and with it on the Actor requests paths robots.txt disallows. You are the one running it.
  • respectRobots: true stays inside the allowed paths. Coverage drops to page 1 per query plus category slices, and skipped pages are counted as pages_truncated_by_robots_policy.
  • Either way there is a hard ceiling of roughly 2,000 items per query. Paginating to the very end of an Argentine iphone search reaches about 39% of what the site itself says it has. categorySlicing is the only route past that ceiling; how much extra coverage it gives has not been measured and is not promised.

Output

One row per listing, in snake_case. Product text stays in the marketplace's own language — Envío gratis, Frete grátis, Reacondicionado — because that is data, not interface.

From listing pages

FieldNotes
item_idPrimary key, cache key, dedupe key
title · url · thumbnail
price · currency · currency_symbolPer row, never per marketplace
price_originalOnly when a struck-through price is shown
seller_name · condition · shipping_text · installments_textFill rates vary widely by marketplace
variations_text
link_kind · is_catalogpublication, catalog or user_product
position · query · source_urlWhere the row came from
site_id · scraped_at · from_cache · data_age_hoursEvery row declares its age

Only with scrapeDetail: true

rating · reviews_count · location · sold_quantity_text · available_quantity_text · attributes · seller_id · description · images · brand · sku · availability · breadcrumb · warranty_text · price_local · currency_local · exchange_rate_implied

None of these appear on listing pages on any marketplace. Competing Actors that promise them from listings return null.

Stock and sales figures are ranges, not numbers. Mercado Libre publishes +25 vendidos, never 25 — its own API returns RANGO_1_50 for the same data. This Actor returns the text as served in sold_quantity_text. Any derived number is named _min, because a minimum is what it is. No exact integer is invented from a range.

Run statistics

Written to the log and to the RUN_STATS key-value record:

queries · pages_fetched · items_pushed · items_from_cache
wall_hits · captcha_hits · shell_hits · degraded_hits · retries · sessions_retired
pages_truncated_by_robots_policy · pages_disallowed_by_robots_fetched
detail_pages_fetched · pages_skipped_resumed · errors

Failed pages go to a separate ERRORS dataset, never mixed into the results.


Pricing

Pay per result, in two events, because opening a product page costs about 40 times what a listing row costs:

EventWhat it is
item-scrapedOne listing delivered
item-detail-scrapedOne listing enriched with its product page

What is never charged:

  1. Results that were not delivered.
  2. Pages that hit the anti-bot wall. The wall costs a full browser load and the Actor absorbs it. You pay for data, not for attempts.
  3. A product page that was not opened. If the detail fetch fails, you get the listing row and are charged the listing rate.

Cached rows are charged normally and always declare their agefrom_cache, scraped_at, data_age_hours. In a marketplace, serving a cached price without saying how old it is would be selling a possibly false number.


Reliability

The site returns an anti-bot wall on a fraction of requests, and it answers HTTP 200 with a well-formed page. The Actor separates six different responses: a page with data, an exhausted page, the wall, a CAPTCHA, a page that had not finished rendering, and a page that returns a plausible but nearly empty result set. Only the first is treated as data. A wall retires the proxy session and retries with a fresh one.

A sustained CAPTCHA rate stops the run. This Actor never solves CAPTCHAs, by any method.


What this Actor does not do

  • It never signs in. No account, no session cookies, no OAuth, no API key.
  • It never solves CAPTCHAs.
  • It does not scrape buyer questions or reviews. That is text written by identifiable people.
  • It does not return seller phone numbers or email addresses. Some Actors in this category do. This one does not.
  • It does not touch seller profile pages (/perfil/), which robots.txt disallows.
  • It does not rehost images. Rows carry image URLs.
  • It does not run on Brazil or Cuba.

Data removal

Listings are cached for at most 24 hours and every row declares its age. To request removal of a listing or of seller data, write to privacy@actorstack.dev with the item_id. Requests are actioned on receipt.