# Mercado Libre Product Scraper - Prices, Discounts & Sales (`neverempty/mercado-libre-product-search`) Actor

For price tracking, best-seller research and dropshipping: Mercado Libre products by search or category in Mexico, Brazil, Argentina, Colombia, Chile, Peru and Uruguay. Price, discount, units sold, rating, Full. Export as Excel, CSV or JSON. Monitoring returns new products and price drops.

- **URL**: https://apify.com/neverempty/mercado-libre-product-search.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.90 / 1,000 product returneds

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 Libre Product Scraper - Prices, Discounts & Sales

**For price tracking, best-seller research, discount hunting and dropshipping on Mercado Libre (Mercado Livre in Brazil):** products for any search term or category in **Mexico, Brazil, Argentina, Colombia, Chile, Peru and Uruguay** as flat rows with price as a number with its currency, original price and discount %, units sold, star rating and number of reviews, free shipping, **Full**, new or used, official store, brand, installments, link and image. Export as Excel, CSV or JSON. Each product comes back once, even when several search terms find it.

Turn on **monitoring mode** and schedule it: each run returns only products that are new in your search and, if you want, products whose **price went down**, with the previous price and the drop in percent. The first monitoring run only remembers today's products and is free.

### What you can do with it

- **Track competitors' prices** for your products in Mexico, Brazil or Argentina and get an alert row the day a price drops.
- **Find best sellers** in a niche: sort by units sold, rating and number of reviews, and see who sells with Full and free shipping.
- **Watch discounts**: keep only products at least 20% (or any %) below their original price, from official stores only if you like.
- **Build a product dataset** for market research, dropshipping or pricing across seven Latin American countries, in each country's own currency.

### What you get for each product

| Field | Example |
|---|---|
| `itemId` / `catalogProductId` | `MLM2242307497` / `MLM1046217031` |
| `title` | `Apple iPhone 16e (128 GB) - Blanco` |
| `price` / `currency` | `13422.46` / `MXN` (with cents, as on the product page) |
| `originalPrice` / `discountPercent` | `14799` / `9` (when Mercado Libre shows a crossed-out price) |
| `soldQuantityApprox` | `1000` (Mercado Libre shows rounded counts such as "+1000 vendidos") |
| `rating` / `reviewCount` | `4.9` / `1919` |
| `freeShipping` / `fulfilledByMercadoLibre` | `true` / `true` (the Full badge) |
| `shippingText` / `internationalShipping` | `Llega gratis mañana` / international seller note when shown |
| `condition` | `new`, `used` or `refurbished` |
| `officialStore` / `brand` | `Apple` / `Apple` |
| `installments` | `15 meses sin intereses de 894.83` |
| `coupon` / `priceNote` | coupon or price note when shown |
| `isSponsored` | `true` for ads placed among the results |
| `url` / `imageUrl` | product link / main image |
| `categoryId` / `domainId` | `MLM1055` / `MLM-CELLPHONES` |
| `position` | place in the results (1 = first) |
| `country`, `searchTerm`, `searchUrl`, `scrapedAt` | where the row came from and when it was read |

In monitoring mode each row also has `change` (`new` or `price-drop`), `previousPrice` and `priceDropPercent`. Values Mercado Libre does not show are `null`, never guessed.

### How to use it

1. Type one or more **search terms** the way you would on Mercado Libre, in the country's language: `iphone 15`, `licuadora`, `geladeira frost free`, `notebook lenovo`.
2. Pick the **country**. Prices come in that country's currency.
3. Set **Maximum products** and, if you want, a sort order (most relevant, lowest or highest price), new or used, a price range, free shipping, Full, official stores, minimum rating, minimum discount or words to leave out.
4. Run it and download the results as Excel, CSV or JSON, or send them to Google Sheets with an Apify integration.

You can also paste **Mercado Libre list or category addresses** (for example `https://lista.mercadolivre.com.br/geladeira`). The country is taken from the address, and each search term is searched inside that category.

**Monitoring.** Switch on **Monitoring mode** and add a schedule (daily works well). Run 1 remembers every product and its price and returns one free summary row. From run 2 on, only products not seen before, and price drops if you keep **Also return price drops** on, are returned and charged. Price drops are compared only in the same currency, and differences under one whole unit (cents only) are not reported as drops. Products your filters removed are remembered too, so they do not come back as "new" later. Products that did not fit under your maximum or your spending limit are not remembered and come back on the next run. **Forget what monitoring remembered** starts over for that input.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | What you would type in the Mercado Libre search box, one per line. |
| `categoryUrls` | Optional Mercado Libre list or category addresses. |
| `country` | `mx`, `br`, `ar`, `co`, `cl`, `pe` or `uy`. |
| `maxProducts` | Total product rows across all searches (default 100). |
| `sortBy` | `relevance`, `price-asc`, `price-desc`. |
| `condition` | `any`, `new`, `used`. |
| `minPrice` / `maxPrice` | Price range in the country's own currency. 0 = no limit. |
| `onlyFreeShipping`, `onlyFull`, `onlyOfficialStores`, `excludeSponsored` | Keep only those products / leave out ads. |
| `minRating`, `minDiscountPercent`, `excludeKeywords` | Rating from 0 to 5, discount in %, words that remove a product from the results. |
| `maxPagesPerSearch` | Stop each search after this many pages (48 products per page). 0 = as needed. |
| `monitoringMode`, `watchPriceDrops`, `minPriceDropPercent`, `resetMonitoringState` | Monitoring settings above. |

Example:

```json
{
  "searchTerms": ["iphone 15", "licuadora"],
  "country": "mx",
  "maxProducts": 500,
  "condition": "new",
  "minDiscountPercent": 10
}
```

### Pricing

Pay per product: you are charged for each product row you receive, plus a small fee when a run starts. Rows that explain an empty result (no products, filters that matched nothing, a page that is not a product list, a page that could not be read, the first monitoring run, a monitoring run with nothing new) are free and say so in their `note` field. You can set a maximum cost per run in the run options, and the Actor stops at that amount.

### FAQ

**How do I scrape Mercado Libre product prices in Mexico?**
Add your search terms, set `country` to `mx` and run. Each product comes back as one row with price in MXN, original price, discount, units sold, rating, shipping and link.

**Does it work for Mercado Livre Brazil?**
Yes. Set `country` to `br` and search in Portuguese, for example `geladeira frost free`. Prices come in BRL.

**Can I get an alert when a product's price drops on Mercado Libre?**
Yes. Turn on `monitoringMode` and schedule the Actor. After the free first run, each run returns new products and price drops, with `previousPrice` and `priceDropPercent`.

**How do I find the best-selling products for a search?**
Run the search and sort the results by `soldQuantityApprox`, `reviewCount` or `rating`. Use `onlyFull` or `onlyOfficialStores` to narrow it down.

**How do I export Mercado Libre products to Excel or Google Sheets?**
Run the Actor and download the dataset as Excel or CSV, or connect it to Google Sheets with an Apify integration.

### Good to know

- Mercado Libre shows at most 42 pages (2,016 products) for one search. For more, add search terms, categories or price ranges; the log tells you when a search is larger.
- Units sold are Mercado Libre's rounded figures ("+1000 vendidos" = `1000`). The original (crossed-out) price is shown without cents, as on the results page; ads among the results also show their price without cents.
- Some listings in Argentina, Peru and Uruguay are priced in USD and keep USD. When you set a price range, they are left out, because USD and the local currency cannot be compared. Prices are never converted or averaged across currencies.
- When Mercado Libre does not serve a sorted or filtered list, the Actor reads the same search in Mercado Libre's relevance order and applies your filters to every row itself. The log says so, and the order is then relevance, not price.
- If a page cannot be read part way through a search, the products already read are returned and a free row says the result may be incomplete.
- Seller names are returned only for official stores. No personal details are collected.
- Values come from the search results. Fields that appear only on a product's own page (full description, specifications, all photos, questions) are not included.
- This Actor is not affiliated with or endorsed by Mercado Libre.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

What you would type in the Mercado Libre search box, one per line, in the language of the country (for example iphone 15, licuadora, geladeira frost free, notebook lenovo). Each term is searched in the country below. Products that appear under several terms are returned once.

## `categoryUrls` (type: `array`):

Paste one or more addresses from a Mercado Libre product list, for example https://listado.mercadolibre.com.mx/celulares-telefonos/celulares-smartphones/ or https://lista.mercadolivre.com.br/geladeira . The country is taken from the address. A category address without a search term is searched once for each search term above.

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

The Mercado Libre site to search for the search terms. Prices come in that country's currency (some listings in Argentina, Peru and Uruguay are priced in USD and keep USD). Ignored for pasted addresses.

## `maxProducts` (type: `integer`):

How many product rows to return in total across all searches. Each returned product is one charged result. Mercado Libre shows up to 2,016 products for one search; to get more, add more search terms, categories or price ranges.

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

The order Mercado Libre lists products in. With a maximum below the number of results, this decides which products you get.

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

Return only new or only used products.

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

Lowest price, in the country's own currency (MXN, BRL, ARS...). 0 = no minimum. Listings priced in another currency (for example USD in Argentina) cannot be compared and are left out when a price range is set.

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

Highest price, in the country's own currency. 0 = no maximum.

## `onlyFreeShipping` (type: `boolean`):

Return only products Mercado Libre shows with free shipping.

## `onlyFull` (type: `boolean`):

Return only products stored and shipped by Mercado Libre (the Full badge).

## `onlyOfficialStores` (type: `boolean`):

Return only products sold by an official store (Tienda oficial / Loja oficial).

## `excludeSponsored` (type: `boolean`):

Leave out the ads Mercado Libre places among the results.

## `minRating` (type: `string`):

Lowest star rating from 0 to 5, for example 4.5. 0 = keep products without a rating too.

## `minDiscountPercent` (type: `integer`):

Return only products whose price is at least this many percent below the original price Mercado Libre shows. 0 = no discount needed.

## `excludeKeywords` (type: `array`):

Words that remove a product when they appear in its title, for example funda, case, capinha, reacondicionado. Not case-sensitive.

## `maxPagesPerSearch` (type: `integer`):

Stop each search after this many result pages (48 products per page). 0 = as many as needed for the maximum above.

## `monitoringMode` (type: `boolean`):

For scheduled runs. The first run with an input remembers every product and its price and returns nothing (not charged). Later runs with the same input return only products that were not there before and, if chosen below, products whose price went down.

## `watchPriceDrops` (type: `boolean`):

In monitoring mode, also return products already seen whose price is now lower (same currency only), with the previous price and the drop in percent.

## `minPriceDropPercent` (type: `integer`):

In monitoring mode, ignore price drops smaller than this percentage. 0 = every drop.

## `resetMonitoringState` (type: `boolean`):

Clear the products remembered for this input. The next monitoring run starts again with a free first run.

## Actor input object example

```json
{
  "searchTerms": [
    "iphone 15"
  ],
  "country": "mx",
  "maxProducts": 100,
  "sortBy": "relevance",
  "condition": "any",
  "minPrice": 0,
  "maxPrice": 0,
  "onlyFreeShipping": false,
  "onlyFull": false,
  "onlyOfficialStores": false,
  "excludeSponsored": false,
  "minRating": "0",
  "minDiscountPercent": 0,
  "maxPagesPerSearch": 0,
  "monitoringMode": false,
  "watchPriceDrops": true,
  "minPriceDropPercent": 0,
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per Mercado Libre product: product id and link, title, price with its currency, original price and discount %, units sold (as Mercado Libre rounds them), rating and number of reviews, free shipping, Full, new or used, official store, brand, sponsored flag, installments, image, category, position and the search it came from. In monitoring mode each row also says whether it is new or a price drop, with the previous price. Searches with no results, filters that matched nothing, the first monitoring run, monitoring runs with nothing new, sign-in pages and pages that could not be read come back as their own rows and are not charged.

# 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 15"
    ],
    "maxProducts": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/mercado-libre-product-search").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 15"],
    "maxProducts": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/mercado-libre-product-search").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": [
    "iphone 15"
  ],
  "maxProducts": 100
}' |
apify call neverempty/mercado-libre-product-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/mercado-libre-product-search"
        }
    }
}
```

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/zeoriII4jaWsItsvc/builds/jDoOYJVeXDraZFVOl/openapi.json
