# MercadoLibre Inmuebles Scraper - Mexico & Argentina (`neverempty/mercadolibre-real-estate-listings`) Actor

Property listings from MercadoLibre Inmuebles (Mexico and Argentina) as clean JSON: price and currency, bedrooms, bathrooms, built and land m², city, state, development ranges, posting date. Monitoring mode returns only new listings, so you never pay twice for the same property. Unofficial.

- **URL**: https://apify.com/neverempty/mercadolibre-real-estate-listings.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.20 / 1,000 listing 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

## MercadoLibre Inmuebles Scraper - Mexico & Argentina

Get property listings from **MercadoLibre Inmuebles** in **Mexico** and **Argentina** as clean, ready-to-use rows: price as a number with its currency, bedrooms, bathrooms, rooms (ambientes), built, total and land area in m², address, city, state, posting date, development price ranges and unit counts, and the main photo. Search by country, operation, property type and state or city, or paste any results page you already filtered on the site.

Turn on **monitoring mode** and schedule the Actor: each run returns only the listings that appeared since the last run, so a daily schedule becomes a feed of new Mexican or Argentine listings. The first monitoring run only remembers what is listed today and is free, and you are never charged twice for the same property.

### What you can do with it

- **Track new listings** in a state, city or neighbourhood every day and send them to a sheet, CRM or alert.
- **Compare prices** per city, property type and size with numbers you can sort and chart, in MXN, ARS or USD.
- **Follow new developments** (desarrollos / emprendimientos) with their "from" price, size ranges and available units.
- **Build a market dataset** for Guadalajara, Monterrey, Mexico City, Buenos Aires, Córdoba or any area MercadoLibre covers.

### What you get for each listing

| Field | Example |
|---|---|
| `listingId` | `MLM1234567890` (MercadoLibre item id) |
| `country` / `source` | `MX` / `mercadolibre.com.mx` |
| `url` | link to the listing on MercadoLibre |
| `title` / `headline` | `Casa con jardín en Zapopan` / `Casa en venta` |
| `propertyType` / `operation` | `house`, `apartment`, `land`, ... / `sale` or `rent` |
| `price` / `currency` / `isFromPrice` | `4250000` / `MXN` / `false` (`true` when the price is a development's "desde" price) |
| `bedrooms`, `bathrooms`, `rooms` | `3`, `2`, `null` (Argentine listings usually give `rooms` = ambientes) |
| `builtAreaSqm`, `totalAreaSqm`, `landAreaSqm` | `180`, `null`, `220` |
| `bedroomsMax`, `builtAreaSqmMax`, ... | upper end of a development's range, else `null` |
| `isDevelopment`, `availableUnits`, `possession` | `true`, `5`, `Venta en verde` |
| `address`, `city`, `region` | street and neighbourhood as published, city, state or province |
| `datePosted` | `2026-10-08` |
| `agencyName` / `isOfficialStore` | name of an official-store seller / `true` |
| `mainImageUrl` | main photo |
| `categoryId` | MercadoLibre category id |
| `searchUrl`, `scrapedAt` | the search the row came from, and when it was read |

Values MercadoLibre does not show are `null`, never guessed.

### How to use it

**Build a search from fields.** Choose the country, operation (for sale, for rent, vacation rental in Mexico), property type and one or more locations. A location is a state, or state/city/neighbourhood as it appears in MercadoLibre addresses: `jalisco`, `jalisco/guadalajara`, `nuevo-leon/monterrey`, `cdmx`, `capital-federal/palermo`, `cordoba`. Accents and spaces are fine. Each location is its own search, and a property that shows up in two searches is returned once.

**Or paste search URLs.** Filter on inmuebles.mercadolibre.com.mx or inmuebles.mercadolibre.com.ar in your browser and paste the address from the address bar into **Search URLs**. Everything you set on the site stays in the address.

**Monitoring.** Switch on **Monitoring mode** and add a schedule (daily works well). Run 1 remembers every listing the search shows and returns one free summary row. From run 2 on, only listings not seen before are returned and charged. Listings your filters removed are remembered too. Listings that did not fit under `maxListings` or your spending limit are not remembered, so they are still waiting on the next run. **Reset monitoring memory** starts over for that input.

#### Filters

Price range (sent to MercadoLibre and checked again on every row, comparing only prices in the same currency), bedrooms, bathrooms, area in m², keywords and excluded keywords, agency names, posting date, developments only or excluded, official stores only.

#### Order

MercadoLibre's relevance order, lowest price first or highest price first. Monitoring reads lowest price first unless you choose another order, so the same listings stay in view from run to run.

### Input

| Field | What it does |
|---|---|
| `searchUrls` | Results pages from inmuebles.mercadolibre.com.mx or .com.ar. When set, the search fields below are ignored. |
| `country` | `mx` (Mexico) or `ar` (Argentina). |
| `operation` | `sale`, `rent`, `vacation-rent` (Mexico only). |
| `propertyType` | `apartment`, `house`, `land`, `office`, `commercial`, `warehouse`, `building` (Mexico), `ph` and `parking` (Argentina), `other`. Empty = all types. |
| `locations` | States or state/city paths. Empty = the whole country. |
| `sortBy` | Empty (relevance), `price-asc`, `price-desc`. |
| `maxListings` | How many listing rows to return (default 50). |
| `maxPages` | Cap on result pages per search (48 listings each, up to 42). 0 = as many as needed. |
| `keywords`, `keywordMatch`, `excludeKeywords` | Text filters on title, headline, type, address, city, state, agency and possession. |
| `agencyNames` | Keep listings from these agencies or developers (part of the name is enough). |
| `minPrice`, `maxPrice`, `priceCurrency` | Price range and its currency (empty = MXN in Mexico, ARS in Argentina). |
| `minBedrooms`, `maxBedrooms`, `minBathrooms` | Room filters (-1 / 0 = off). |
| `minAreaSqm`, `maxAreaSqm` | Area filters (built area, else total area, else land area). |
| `excludeDevelopments`, `onlyDevelopments`, `onlyOfficialStores` | Seller and project filters. |
| `postedWithinDays` | Keep listings posted in the last N days. |
| `monitoringMode`, `resetMonitoringState` | Return only new listings on each run / forget what was remembered. |

Example input:

```json
{
  "country": "mx",
  "operation": "sale",
  "propertyType": "house",
  "locations": ["jalisco"],
  "maxListings": 50
}
```

### Pricing

Pay per result: you are charged for each listing row you receive, and nothing else. Reading pages is free. Rows that explain an empty result (no listings, unknown place, filters that matched nothing, 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.

### FAQ

**How do I scrape MercadoLibre real estate listings in Mexico?**
Set `country` to `mx`, pick the operation and property type, and add a state or city such as `jalisco/guadalajara` in `locations`. Each listing comes back as one row with price, currency, rooms, area and location.

**Can I get only the new listings every day?**
Yes. Turn on `monitoringMode` and schedule the Actor. After the free first run, every run returns only listings that were not there before, and you are never charged twice for the same property.

**Does it work for Argentina (inmuebles.mercadolibre.com.ar)?**
Yes. Set `country` to `ar`, or paste any Argentine results page. Prices come in ARS or USD as published, and `rooms` carries the ambientes count.

**Can I paste a MercadoLibre search I already filtered?**
Yes. Paste the address from your browser into `searchUrls`. The filters and order in that address are kept and the Actor pages through the results.

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

### Good to know

- Countries: Mexico and Argentina. Other MercadoLibre countries answer Apify's servers with a "verify you are a person" page, so they are not offered. That check is never solved or bypassed; when it appears, the search returns a free row saying the page could not be read.
- MercadoLibre shows at most 42 pages (2,016 listings) for one search. For bigger areas, split the search by city, property type or price range; the log tells you when a search is larger.
- `agencyName` is filled for sellers MercadoLibre marks as official stores, as the results page shows the name only for them. The Actor returns no personal contact details, and phone numbers written in titles or addresses are replaced with `[phone removed]`.
- Values come from the results pages. Fields that appear only on a listing's own page (full description, amenities, all photos) are not included.
- A place name MercadoLibre does not know returns a free row asking you to paste the address from the site; it is not reported as "no properties".
- This Actor is not affiliated with or endorsed by MercadoLibre.

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

## `searchUrls` (type: `array`):

Paste one or more result pages from inmuebles.mercadolibre.com.mx or inmuebles.mercadolibre.com.ar, e.g. https://inmuebles.mercadolibre.com.mx/casas/venta/jalisco/guadalajara/ . Filters and sort set on the site stay in the address. When this list is filled, the country, operation, property type and location fields below are ignored.

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

mx = Mexico (prices in MXN or USD), ar = Argentina (prices in ARS or USD). Used to build the search when no search URL is given.

## `operation` (type: `string`):

For sale, for rent, or (Mexico only) vacation rental. Empty means for sale.

## `propertyType` (type: `string`):

The MercadoLibre category to search. Empty searches every property type. ph (Argentine horizontal property) and parking exist only in Argentina; building exists only in Mexico.

## `locations` (type: `array`):

State, or state/city/neighbourhood as written in MercadoLibre addresses: jalisco, jalisco/guadalajara, nuevo-leon/monterrey, cdmx, capital-federal/palermo, cordoba. Accents and spaces are fine (Querétaro becomes queretaro). One search runs per location. Empty searches the whole country.

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

Order in which MercadoLibre lists the results. Empty = MercadoLibre's relevance order. Monitoring mode uses lowest price first unless you choose another order.

## `maxListings` (type: `integer`):

How many listing rows to return across all searches. You are charged only for the listing rows you receive. MercadoLibre shows 48 listings per page.

## `maxPages` (type: `integer`):

Cap on result pages read for each search (48 listings per page, up to 42 pages). 0 = read as many pages as needed to reach maxListings. Reading pages is free; only returned listings are charged.

## `keywords` (type: `array`):

Keep only listings whose title, headline, property type, address, city, state, agency or possession text contains these words (not case-sensitive). Empty = no keyword filter.

## `keywordMatch` (type: `string`):

any = a listing needs one of the keywords; all = it needs every keyword.

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

Drop listings whose text contains any of these words, e.g. preventa or remate. Empty = nothing is excluded.

## `agencyNames` (type: `array`):

Keep only listings published by these agencies or developers (part of the name is enough). Only listings where MercadoLibre shows the seller's name can match. Empty = every seller.

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

Lowest price, in the currency chosen below (MXN for Mexico and ARS for Argentina when it is empty). Sent to MercadoLibre and checked again on every row. Listings priced in another currency are kept. 0 = no minimum.

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

Highest price, in the same currency as the minimum. 0 = no maximum.

## `priceCurrency` (type: `string`):

Currency of the price range. Empty = MXN in Mexico, ARS in Argentina. USD matches listings priced in US dollars.

## `minBedrooms` (type: `integer`):

Keep listings with at least this many bedrooms (recámaras / dormitorios). -1 = no filter. Listings that do not show a bedroom count are kept.

## `maxBedrooms` (type: `integer`):

Keep listings with at most this many bedrooms. -1 = no filter.

## `minBathrooms` (type: `integer`):

Keep listings with at least this many bathrooms. 0 = no filter. Listings that do not show bathrooms are kept.

## `minAreaSqm` (type: `integer`):

Keep listings with at least this many square metres (built area, else total area, else land area). 0 = no filter.

## `maxAreaSqm` (type: `integer`):

Keep listings with at most this many square metres, measured the same way. 0 = no filter.

## `excludeDevelopments` (type: `boolean`):

Drop development projects (desarrollos / emprendimientos) and keep single properties only.

## `onlyDevelopments` (type: `boolean`):

Keep only development projects, with their price range and unit count.

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

Keep only listings from sellers MercadoLibre marks as official stores (tienda oficial).

## `postedWithinDays` (type: `integer`):

Keep listings posted in the last N days, using the posting date MercadoLibre gives for each listing. 0 = any date.

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

Turn this on and schedule the Actor. The first run remembers every listing the search shows and is free. Each later run returns only listings it has not seen before, so you are never charged twice for the same property. Listings removed by your filters are remembered too; listings that did not fit under maxListings or your spending limit are not, so they come back on the next run.

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

One-shot: forget every listing remembered for this exact input. With monitoring on, this run becomes a new free first run.

## Actor input object example

```json
{
  "country": "mx",
  "operation": "sale",
  "propertyType": "house",
  "locations": [
    "jalisco"
  ],
  "maxListings": 50,
  "maxPages": 0,
  "keywordMatch": "any",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": -1,
  "maxBedrooms": -1,
  "minBathrooms": 0,
  "minAreaSqm": 0,
  "maxAreaSqm": 0,
  "excludeDevelopments": false,
  "onlyDevelopments": false,
  "onlyOfficialStores": false,
  "postedWithinDays": 0,
  "monitoringMode": false,
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per MercadoLibre Inmuebles listing (Mexico or Argentina): listing id and link, title and headline, property type and operation, price as a number with its currency (and whether it is a development's starting price), bedrooms, bathrooms, rooms, built, total and land area in m² with the upper end of a development's range, address, city, state or province, posting date, development flag with available units and possession, official-store seller name, main image and category id. Searches with no results, unknown places, filters that matched nothing, the first monitoring run, monitoring runs with nothing new 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 = {
    "country": "mx",
    "operation": "sale",
    "propertyType": "house",
    "locations": [
        "jalisco"
    ],
    "maxListings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/mercadolibre-real-estate-listings").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 = {
    "country": "mx",
    "operation": "sale",
    "propertyType": "house",
    "locations": ["jalisco"],
    "maxListings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/mercadolibre-real-estate-listings").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 '{
  "country": "mx",
  "operation": "sale",
  "propertyType": "house",
  "locations": [
    "jalisco"
  ],
  "maxListings": 50
}' |
apify call neverempty/mercadolibre-real-estate-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/mercadolibre-real-estate-listings"
        }
    }
}
```

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/TMlZ9NNmlycQQCJgV/builds/ewUeeMt4sSDPgPAdQ/openapi.json
