# Mercado Livre Scraper - Brazil Prices, Sales & Sellers (`scrapewise/mercadolivre-scraper`) Actor

Get Mercado Livre Brazil prices, units sold and sellers by search term, category or product link. Price, Pix price, installments, free shipping, Full, rating, sponsored flag and position. Optional product page with seller reputation, stock and specs. Only-new and price-drop tracking for schedules.

- **URL**: https://apify.com/scrapewise/mercadolivre-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 product delivereds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Mercado Livre Scraper: Brazil prices, units sold, Full and sellers

Scrape [Mercado Livre](https://www.mercadolivre.com.br), Latin America's largest marketplace, in Brazil, **without an
account**. Type a search term with price, condition and sort filters, paste any search or category URL, or paste
product links. Every product comes with the price, the price before discount and discount, the **Pix price** note,
installments, **units sold**, rating, free shipping, **Mercado Livre Full**, official store, the **sponsored** flag
and its **position in the results**.

Turn on the full product page and you also get the **seller** (name, ID, reputation, number of sales and
highlights), stock, review count, installment plan, category path, the description and the **full specifications**
table.

Built for **price monitoring and ranking tracking**: schedule the same search every day and get only the products
that are new, or whose price changed, with the previous price and the change in reais and percent.

### Mercado Livre scraper at a glance

- **Price per 1,000 products, Free plan:** US$ 4.00
- **Full product page (optional):** US$ 8.00 per 1,000, on top
- **Fee per run start:** US$ 0.03, only when the run gets through Mercado Livre's security check
- **Search terms, search and category URLs, product links:** Yes
- **Units sold, Full, free shipping, sponsored flag, position:** Yes, on every row
- **Price, condition and sort filters:** Yes, with Mercado Livre's own filters
- **Seller name, ID, reputation and sales:** Yes, with the full product page
- **Only new products since the last run (`onlyNew`):** Yes, free when nothing is new
- **Price tracking between runs (`trackPriceChanges`, `onlyPriceDrops`):** Yes
- **Error rows (bad URL, no results, site refusal):** Free, with an `errorCode`

### Mercado Livre data: real rows

From tests on 2026-10-08. A search row ("iphone", page 2):

```json
{
  "type": "product",
  "itemId": "MLB4763403461",
  "catalogProductId": "MLB2000017029",
  "title": "Apple iPhone 14 (256 Gb) - Meia Noite - Bom (Recondicionado)",
  "url": "https://www.mercadolivre.com.br/apple-iphone-14-256-gb-meia-noite-bom-recondicionado/p/MLB2000017029",
  "price": 2460,
  "originalPrice": 2590,
  "discountPct": 5,
  "currency": "BRL",
  "priceNote": "no Pix",
  "priceOtherPaymentMethods": 2590,
  "installmentsText": "ou R$ 2.590,00 em outros meios",
  "condition": "Recondicionado",
  "soldQuantity": 100,
  "rating": 4.8,
  "freeShipping": true,
  "shippingText": "Frete grátis",
  "fulfillment": false,
  "officialStore": null,
  "isSponsored": false,
  "categoryId": "MLB1055",
  "domainId": "MLB-CELLPHONES",
  "image": "https://http2.mlstatic.com/D_NQ_NP_793103-MLA95689874536_102025-O.webp",
  "position": 50,
  "page": 2,
  "searchInput": "iphone"
}
```

And the extra fields of a full product page (a product link), shortened:

```json
{
  "hasDetails": true,
  "detailCondition": "Novo",
  "detailPrice": 70.9,
  "installments": 12,
  "installmentAmount": 6.98,
  "installmentsTotal": 83.76,
  "sellerId": 1436636826,
  "sellerName": "NEXTBYTESTORE",
  "sellerReputation": "4_light_green",
  "sellerType": "eshop",
  "sellerUrl": "https://www.mercadolivre.com.br/pagina/nextbytestore",
  "sellerSales": "+50",
  "sellerHighlights": ["Bom atendimento", "Entrega no prazo"],
  "sellerIsBusiness": true,
  "isOfficialStore": false,
  "sellerPowerStatus": "platinum",
  "sellerMedal": "MercadoLíder Platinum",
  "sellerReputationRank": 5,
  "sellerSalesCount": 10000,
  "listingType": "classic",
  "listingTypeId": "gold_special",
  "maxInstallments": 12,
  "installmentsInterestFree": false,
  "isFull": true,
  "logisticType": "fulfillment",
  "sellerPaysShipping": false,
  "detailSoldQuantity": 1000,
  "stockText": "+50 disponíveis",
  "availableQuantity": 51,
  "description": "A Máquina de Acabamento Profissional T&Z TZ-154 combina design e tecnologia para cortes precisos...",
  "specifications": {"Cor": "Preto", "Marca": "TZ", "Modelo": "TZ-154"},
  "sku": "MLB7662788792",
  "shipsFrom": "São Paulo",
  "inStock": true,
  "brand": "TZ"
}
```

Seller reputation (`sellerMedal`, `sellerReputationRank` from 1 to 5, `sellerSalesCount`), listing type (`classic` or
`premium`), interest-free installments and Full come from the product page. For sellers that are not a store (private
individuals), only these aggregate numbers are returned: no seller name or profile link.

Catalog products (links with `/p/MLB...`) also bring `reviewCount`, `soldText` ("+100"), `model` and `categoryPath`,
and `itemId` is the listing that currently wins the buy box.

### How to use the Mercado Livre scraper

**By search term**, with Mercado Livre's own filters:

```json
{
  "searchTerms": ["air fryer", "tenis nike"],
  "sortBy": "priceLowToHigh",
  "minPrice": 200,
  "maxPrice": 600,
  "condition": "new",
  "maxItems": 100
}
```

**By URL.** Open Mercado Livre, set any filter (brand, store, Full, shipping, condition...) and paste the address.
Every filter in the URL is kept, and the Actor follows the site's own next-page links (a top-level category link
that opens Mercado Livre's category showcase is read as the full product list of that category):

```json
{
  "startUrls": ["https://lista.mercadolivre.com.br/iphone_PriceRange_2000-4000_NoIndex_True"],
  "maxItems": 200
}
```

**By product link.** Paste product URLs (`/p/MLB...` or `produto.mercadolivre.com.br/MLB-...`). Each comes back with
the full product page.

`skipSponsored` leaves out paid ads, and `onlyFulfillment` keeps only products shipped by Mercado Livre Full. Skipped
rows are not charged.

### Mercado Livre price monitoring

Schedule the Actor with the same input every day and turn on:

- **`onlyNew`**: only products this search never returned before. The first run delivers up to `maxItems` and
  remembers everything it read; later runs deliver only what is new. Products already seen are not charged.
- **`trackPriceChanges`**: every row gets `previousPrice`, `priceChange`, `priceChangePct`, `isPriceDrop`,
  `isNewProduct`, `firstSeenAt` and `previousSeenAt`. With `onlyNew` on too, products whose price changed are
  delivered as well.
- **`onlyPriceDrops`**: with both of the above, of the products seen before, only the ones that got cheaper.
- **Units sold in the period**: with `trackPriceChanges` (or `onlyNew`), rows also get `previousSoldQuantity`,
  `soldSinceLastRun` and `soldPerDaySinceLastRun`. Mercado Livre rounds units sold ("+100", "+5mil"), so the change
  shows up when a product moves to the next bracket.

The memory lives in a key-value store in your own account (`mercadolivre-scraper-state`), one entry per search.
Delete it to start over.

Video guides from Apify: [how to schedule an Actor](https://www.youtube.com/watch?v=1jI7WcVQmwM) and [how to connect it to other apps](https://www.youtube.com/watch?v=bNACk1_S_6w).

### Who uses Mercado Livre data

- **Sellers on Mercado Livre** tracking competitors' prices, units sold and ranking for their key searches.
- **Brands and distributors** checking how resellers price their products and who sells through Full.
- **Market researchers** sizing categories by units sold, average price and share of official stores in Brazil.
- **Price comparison and deal sites** that need fresh Brazilian prices with the Pix and installment conditions.

### Mercado Livre scraper limits and good to know

- Mercado Livre shows **48 products per page and at most 2,000 per search**. Split larger searches by price range
  or category.
- `soldQuantity` is the rounded figure Mercado Livre publishes ("+100" becomes 100), not an exact count.
- The seller's name is on search rows only for official stores; turn on the full product page to get every seller.
- Prices are in **Brazilian reais (BRL)**. Product names, categories and specifications come in Portuguese.
- Mercado Livre asks for a security check. The Actor passes it once per run in a real browser on a Brazilian
  residential IP (two browsers race, the first one through wins), then reads pages with plain HTTP. Some IPs are
  refused and the Actor moves to the next one, so the first products usually arrive in one to two minutes. The
  check is saved in the `mercadolivre-scraper-state` key-value store, so the next run in your account often skips
  the browser. If every attempt is refused, you get a free `BLOCKED` row and the run start is not charged. Keep the
  default proxy (RESIDENTIAL, country BR).

### Mercado Livre scraper pricing

Pay per product: **US$ 4.00 per 1,000 products** on the Free plan (lower on paid Apify plans), plus **US$ 8.00 per
1,000** for products delivered with the full product page, and US$ 0.03 per run that gets through the security
check. Error rows, duplicates and products skipped by filters or `onlyNew` are never charged.

### Mercado Livre scraper error codes

| errorCode | Meaning |
|---|---|
| `INVALID_INPUT` | The URL is not a Mercado Livre search, category or product link, or a filter is wrong |
| `NO_RESULTS` | Mercado Livre found no product for this search and filters |
| `NOT_FOUND` | The product does not exist (paused, removed or a wrong link) |
| `BLOCKED` | The security check refused every attempt on fresh IPs; run again in a few minutes |
| `NOT_REACHED` | The run timeout came before this input |
| `UNEXPECTED` | Anything else; run again, and open an issue if it repeats |

### Mercado Livre scraper FAQ

**Do I need a Mercado Livre account?** No. The Actor reads public pages only.

**Why not the official Mercado Livre API?** Mercado Livre's developer API needs a registered app and an access token, and is built mainly for sellers managing their own listings and orders. This Actor needs no app or token and returns what the site shows to buyers, including the Pix price, units sold, Full, the sponsored flag and the position in the results.

**Other countries (Argentina, Mexico...)?** Not in this version: Mercado Livre Brazil only.

**Can I get reviews and questions?** Not in this version. Rating and review count are included.

### Related scrapers

- [Magalu Scraper](https://apify.com/scrapewise/magalu-produtos): Magazine Luiza prices, Pix prices and sellers.
- [Kabum Scraper](https://apify.com/scrapewise/kabum-produtos): Brazil hardware prices and stock.
- [Shopee Scraper](https://apify.com/scrapewise/shopee-scraper): Shopee products, prices and shops in 8 countries.
- [AliExpress Scraper](https://apify.com/scrapewise/aliexpress-scraper): AliExpress products, sold counts and 40 fields.
- [Google Shopping Scraper](https://apify.com/scrapewise/google-shopping): product prices, offers and EAN lookup from Google Shopping.

# Actor input Schema

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

Words to search on Mercado Livre Brazil, one per line, as you would type them on the site (for example air fryer, iphone 15, tenis nike). Portuguese product names give the best matches. Each term is one search with its own limit, and every row keeps the term and its position in the results. Leave empty to use only the URLs below; with both empty the run searches 'air fryer' as an example. Also accepts 'keywords', 'queries' or 'query'.

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

Search or category URLs from lista.mercadolivre.com.br, one per line, copied after setting any filter on the site (for example https://lista.mercadolivre.com.br/air-fryer_ITEM\*CONDITION_2230284_NoIndex_True). Every filter in the URL is kept and the Actor follows the site's own next-page links. Product URLs (/p/MLB... or produto.mercadolivre.com.br/MLB-...) also work and come back with the full product page, charged as a product plus a full page. Also accepts 'searchUrls', 'productUrls' or 'urls'.

## `sortBy` (type: `string`):

Order of the results for search terms: Relevance (default, Mercado Livre's own ranking), Price low to high or Price high to low. The position is saved on every row, so Relevance also works as a ranking tracker for your products. URLs keep the order already in the URL.

## `minPrice` (type: `integer`):

Only products priced at or above this value, in whole Brazilian reais (for example 200). Uses Mercado Livre's own price filter, so it applies to search terms only. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Only products priced at or below this value, in whole Brazilian reais (for example 800). Uses Mercado Livre's own price filter on search terms only. Must be higher than the minimum price. Leave empty for no maximum.

## `condition` (type: `string`):

Any (default), New or Used, with Mercado Livre's own condition filter. Applies to search terms only; for URLs set the filter on the site before copying the link.

## `skipSponsored` (type: `boolean`):

Leaves out the paid ads (sponsored listings) that Mercado Livre mixes into the results, so positions and prices reflect organic results only. Skipped rows are not delivered and not charged. Off by default; every row has an isSponsored flag either way.

## `onlyFulfillment` (type: `boolean`):

Keeps only products shipped by Mercado Livre's own fulfillment (Full), the fast-delivery listings. Other products are skipped and not charged. Off by default.

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

Stop each search (each term or URL) after this many products (default 50). Mercado Livre shows 48 products per page and at most 2,000 per search; 0 means up to 2,000. With 3 terms and 50 here a run delivers up to 150 products, each charged once. Also accepts 'maxItemsPerSearch', 'maxResults' or 'limit'.

## `includeDetails` (type: `boolean`):

Also opens each product's own page and adds the seller name, ID, reputation and number of sales, stock, review count, units sold, installments, category path, description and the full specifications table. Off by default. When on, each product is charged a second 'Full product page' event and the run is slower, so use it on smaller searches.

## `onlyNew` (type: `boolean`):

For scheduled runs: remembers which products each search already returned, in a named key-value store in your account ('mercadolivre-scraper-state'), and delivers only products not seen before. The first run delivers up to the limit and marks everything it read as seen. Seen products are not delivered and not charged. Delete the store to start over. Also accepts 'onlyNewProducts'.

## `trackPriceChanges` (type: `boolean`):

Compares each product's price with the price seen in your previous runs of the same search and adds previousPrice, priceChange, priceChangePct, isPriceDrop, isNewProduct, firstSeenAt and previousSeenAt. The first run only records prices. With 'Only new products' on too, products whose price changed are delivered as well as new ones. Also accepts 'compareWithPreviousRun'.

## `onlyPriceDrops` (type: `boolean`):

Needs 'Only new products' and 'Track price changes' both on (otherwise the run stops with a free INVALID_INPUT row). Of the products seen before, delivers only those whose price went down, plus new products. Price increases are skipped and not charged.

## `proxyConfiguration` (type: `object`):

Mercado Livre refuses datacenter IPs and asks for a security check. The default is the Apify RESIDENTIAL group with Brazilian IPs (country BR): the Actor passes the check once per session in a real browser, then reads pages with plain HTTP on the same IP. Keep this default; with another group, rows may come back BLOCKED.

## Actor input object example

```json
{
  "searchTerms": [
    "air fryer"
  ],
  "sortBy": "relevance",
  "condition": "any",
  "skipSponsored": false,
  "onlyFulfillment": false,
  "maxItems": 20,
  "includeDetails": false,
  "onlyNew": false,
  "trackPriceChanges": false,
  "onlyPriceDrops": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (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": [
        "air fryer"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/mercadolivre-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": ["air fryer"],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/mercadolivre-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": [
    "air fryer"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call scrapewise/mercadolivre-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/mercadolivre-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/Vhat2KBCAhdhdGcZp/builds/hASJGDFYc9R1dIrWT/openapi.json
