# Mercado Libre Inmuebles Scraper: Argentina, Mexico & Chile API (`automatic/ml-inmuebles-scraper`) Actor

MercadoLibre Inmuebles scraper and real estate API for Argentina, Mexico & Chile (Portal Inmobiliario), at $0.40 per 1,000 listings. Paste any search URL or filter by region, city and property type; get one record per listing with price, currency, location, rooms, surface, photos and URL.

- **URL**: https://apify.com/automatic/ml-inmuebles-scraper.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Categories:** Real estate
- **Security:** Limited permissions
- **Stats:** 2 total users, 2 monthly users, 99.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Inmuebles Scraper: Argentina, Mexico & Chile Real Estate API

Turn any MercadoLibre Inmuebles search into a clean dataset for
**$0.40 per 1,000 listings** ($0.0004 per listing, plus $0.00005 per
run start). Paste a search URL from `inmuebles.mercadolibre.com.ar`,
`inmuebles.mercadolibre.com.mx` or `www.portalinmobiliario.com`
(MercadoLibre's property site for Chile), with every filter you set in
the browser, or pick a country, property type, operation and location. Each
listing comes back as one record with price and currency, location,
rooms, bedrooms, bathrooms, surface in m², photos and the listing URL.

Use it as a MercadoLibre real estate API for Argentina, Mexico & Chile:
schedule it, call it from your code, or download the results as JSON,
CSV or Excel. A 50-listing run costs about two cents.

### What you can do with it

- **Build a market index.** Re-run the same searches every day or week
  and track asking prices, price per m² and stock by neighborhood,
  property type and operation. Rooms, bathrooms and surface come from
  each search card, so you can compare like with like (for example,
  2-room apartments under 60 m² in Palermo).
- **Monitor agencies and developments.** Paste the search page of a
  neighborhood, price band or new-development filter and get every new
  listing in a fixed format. The stable `listing_key` lets you spot new,
  removed and repriced listings between runs.
- **Feed a valuation or lead model.** Price, currency, surface and room
  counts are typed numbers, ready for a spreadsheet, BI tool or
  database without manual cleanup.
- **Research rentals and sales side by side.** Run sale and rental
  searches for the same area and compare yields.

### Quick start

1. Open [Mercado Libre Inmuebles Argentina](https://inmuebles.mercadolibre.com.ar/),
   [Mexico](https://inmuebles.mercadolibre.com.mx/) or
   [Portal Inmobiliario Chile](https://www.portalinmobiliario.com/) and
   set the filters you want.
2. Copy the address bar and paste it into **Search URLs**.
3. Set **Maximum results** and run.

```json
{
  "startUrls": [
    {"url": "https://inmuebles.mercadolibre.com.ar/departamentos/alquiler/capital-federal/palermo/"}
  ],
  "maxPages": 2,
  "maxResults": 100
}
```

Prefer not to paste URLs? The original input still works exactly as
before:

```json
{"country": "ar", "propertyType": "departamentos", "operation": "venta", "maxResults": 50}
```

### Input

| Name | Type | Default | What it does |
| --- | --- | --- | --- |
| `startUrls` | array | empty | Optional. One or more Mercado Libre Inmuebles search URLs (Argentina or Mexico) or Portal Inmobiliario search URLs (Chile) with any filters. When set, these searches run instead of the fields below. |
| `country` | string | `ar` | Argentina (`ar`, `inmuebles.mercadolibre.com.ar`), Mexico (`mx`, `inmuebles.mercadolibre.com.mx`) or Chile (`cl`, `www.portalinmobiliario.com`). |
| `propertyType` | string | `departamentos` | Every country: `departamentos`, `casas`, `terrenos`, `oficinas`, `locales`. Argentina and Mexico: `campos`, `quintas`, `galpones`, plus `ph` in Argentina only. Chile only: `parcelas`, `sitios`, `bodegas`, `industriales`, `agricolas`, `estacionamientos`. A type the country does not have fails at once. |
| `operation` | string | `venta` | Sale (`venta`) or rental (`alquiler`; Mexico's `renta`, Chile's `arriendo`). |
| `province` | string | empty | Optional province, state or region (`capital-federal`, `distrito-federal`, `nuevo-leon`, `metropolitana`, `valparaiso`…). Names such as "Capital Federal" work too. In Chile, use one of the 16 region slugs. When the site redirects an unknown or misspelled slug to a broader search, that search is reported in `OUTPUT.failedSearches` instead of returning the wider listings. MercadoLibre sometimes corrects a misspelling itself, so check the slug. |
| `city` | string | empty | Optional city, neighborhood or Chilean comuna (`palermo`, `polanco`, `las-condes`…); needs `province`. A slug the site redirects to a broader search is reported in `OUTPUT.failedSearches` instead. |
| `maxPages` | integer | `1` | Result pages per search, 1 to 10 (about 48 listings per page). |
| `maxResults` | integer | `50` | Maximum listings per search, 1 to 200. |
| `requestDelaySecs` | number | `1.0` | Pause between pages, 0.5 to 10 seconds. |

With `startUrls`, `maxPages` and `maxResults` apply to each URL, and a
listing that appears in two of your searches is returned once.

### Input recipes

**Argentina, any filter (pasted URL).** Two-room rentals in Palermo, a
price band in Belgrano and houses in Nordelta in one run:

```json
{
  "startUrls": [
    {"url": "https://inmuebles.mercadolibre.com.ar/departamentos/alquiler/capital-federal/palermo/"},
    {"url": "https://inmuebles.mercadolibre.com.ar/departamentos/venta/capital-federal/belgrano/_PriceRange_80000USD-150000USD"},
    {"url": "https://inmuebles.mercadolibre.com.ar/casas/venta/bs-as-g-b-a-norte/tigre/nordelta/"}
  ],
  "maxPages": 3,
  "maxResults": 150
}
```

**Mexico, any filter (pasted URL).** Rentals in Polanco and houses for
sale in Monterrey:

```json
{
  "startUrls": [
    {"url": "https://inmuebles.mercadolibre.com.mx/departamentos/renta/distrito-federal/miguel-hidalgo/polanco/"},
    {"url": "https://inmuebles.mercadolibre.com.mx/casas/venta/nuevo-leon/monterrey/"}
  ],
  "maxPages": 2,
  "maxResults": 100
}
```

**Chile, any filter (pasted URL).** Apartments for sale in Las Condes
and houses for rent in Viña del Mar:

```json
{
  "startUrls": [
    {"url": "https://www.portalinmobiliario.com/venta/departamento/las-condes-metropolitana"},
    {"url": "https://www.portalinmobiliario.com/arriendo/casa/vina-del-mar-valparaiso"}
  ],
  "maxPages": 2,
  "maxResults": 100
}
```

**Argentina, form fields.** PH for sale in Capital Federal:

```json
{"country": "ar", "propertyType": "ph", "operation": "venta", "province": "capital-federal", "maxPages": 4, "maxResults": 200}
```

**Mexico, form fields.** Apartments for rent in Mexico City:

```json
{"country": "mx", "propertyType": "departamentos", "operation": "alquiler", "province": "distrito-federal", "maxResults": 100}
```

**Chile, form fields.** Apartments for rent in Providencia (Santiago):

```json
{"country": "cl", "propertyType": "departamentos", "operation": "alquiler", "province": "metropolitana", "city": "providencia", "maxResults": 100}
```

**Daily market index.** Save one of the inputs above as a task and add
a schedule (for example, every morning). Each run returns that day's
listings with the same fields, so the datasets line up over time.

### Output example

Each item includes `id`, `listing_key`, `url`, `name`, `price`,
`currency`, `country`, `type`, `operation`, `location`, `images`,
`source`, `rooms`, `bedrooms`, `bathrooms`, `surface_total_m2`,
`surface_covered_m2`, the version 1 range companions `rooms_min`,
`rooms_max`, `rooms_is_range`, `bedrooms_min`, `bedrooms_max`,
`bedrooms_is_range`, `bathrooms_min`, `bathrooms_max`,
`bathrooms_is_range`, `surface_total_m2_min`, `surface_total_m2_max`,
`surface_total_m2_is_range`, `surface_covered_m2_min`,
`surface_covered_m2_max`, `surface_covered_m2_is_range`,
`listing_kind`, `unit_correspondence`, `range_fields_version`,
`attributes`, and `scraped_at`.

Example record (from a pasted Belgrano search with a USD price band):

```json
{"id":"MLA2200883605","listing_key":"inmuebles.mercadolibre.com.ar:MLA2200883605","url":"https://departamento.mercadolibre.com.ar/MLA-2200883605-av-cabildo-al-1700-_JM","name":"Av. Cabildo Al 1700","price":95000,"currency":"USD","country":"AR","type":"departamentos","operation":"venta","location":"Av. Cabildo Al 1700, Belgrano, Capital Federal","images":["http://http2.mlstatic.com/D_957262-MLA119575417155_102026-C.jpg"],"source":"inmuebles.mercadolibre.com.ar","rooms":2,"rooms_min":2,"rooms_max":2,"rooms_is_range":false,"bedrooms":null,"bedrooms_min":null,"bedrooms_max":null,"bedrooms_is_range":false,"bathrooms":1,"bathrooms_min":1,"bathrooms_max":1,"bathrooms_is_range":false,"surface_total_m2":null,"surface_total_m2_min":null,"surface_total_m2_max":null,"surface_total_m2_is_range":false,"surface_covered_m2":28,"surface_covered_m2_min":28,"surface_covered_m2_max":28,"surface_covered_m2_is_range":false,"listing_kind":"unknown","unit_correspondence":"matched","range_fields_version":1,"attributes":["2 ambs.","1 baño","28 m² cubiertos"],"scraped_at":"2026-10-20T00:58:35.679387+00:00"}
```

What the fields mean:

- `price` and `currency`: the advertised price as a number, in ARS, MXN,
  CLP or USD as shown on the listing. Chilean prices in UF (unidades de
  fomento) keep their decimals and have currency `CLF`, the UF's ISO
  code; they are not converted to pesos. Listings without a public price
  have an empty price and currency.
- `rooms`, `bedrooms` and `bathrooms`: the counts printed on the search
  card (ambientes, dormitorios or recámaras, baños). A studio
  (monoambiente) is 1 room and 0 bedrooms. Argentine cards usually
  print rooms (ambientes) and Mexican cards usually print bedrooms
  (recámaras), so expect the other field to be empty more often.
  Chilean cards print bedrooms (dormitorios) and built surface (m²
  útiles).
- `surface_total_m2` and `surface_covered_m2`: total (or lot) surface
  and covered (or built) surface in m², when the card shows them. Most
  cards print only the covered surface, so `surface_total_m2` is often
  empty.
- For new developments with several unit sizes, the card shows a range
  such as "1 a 2 ambs." or "37 - 50 m²". The scalar `rooms`, `bedrooms`,
  `bathrooms`, `surface_total_m2` and `surface_covered_m2` values hold
  one value from that range (the smallest); the matching `_min` and
  `_max` fields show the whole span, and `_is_range` is true when the
  span is wider than one value. For a single printed value the minimum
  and maximum both equal the scalar and `_is_range` is false. Missing
  details stay empty. This additive shape is version 1, identified by
  `range_fields_version`, and `attributes` keeps the card text exactly as
  shown.
- `listing_kind`: unit, development or unknown. The search card's own
  badge decides first: an EMPRENDIMIENTO (Argentina) or PROYECTO
  (Chile) badge means development, even when the title reads like one
  property. Without a badge, only a singular common noun in the title
  states a kind (for example "Edificio" or "Torre" for development,
  "Departamento", "Casa" or "PH" for unit), and the first such noun
  decides. A plural such as "Departamentos", or a development word that
  is part of a name ("Tower Sky", "Barrio Proyecto Norte"), states
  nothing. A range alone never sets it, and no development or project
  identity is ever inferred, so unknown is common for titles that are
  only an address or a building name.
- `unit_correspondence`: matched or unknown. It says whether the card
  shows a single value for each detail it prints; it does not mean the
  unit was verified. It is matched only when none of the five
  measurements is a range, the price is not a "Desde" (from) price, the
  kind is not development, no count is reversed or non-whole, and at
  least one measurement is present. It is unknown when any of that is
  otherwise. A missing individual detail does not make it unknown. On a
  "Desde" price or a range row the price is not tied to a specific unit,
  so do not calculate a price per square metre from the range bounds;
  this Actor does not publish a per-m² field.
- `type` and `operation`: the searched property type and operation. A
  pasted URL that covers every type gives "inmuebles", and one that
  covers sale and rental gives "todas".
- `location`: the address or neighborhood line of the listing.
- `listing_key`: a stable unique key, ideal for de-duplication and for
  tracking a listing across runs.

### More of the Argentina & Mexico market

Mercado Libre is one of several large property portals in each country.
For wider coverage, combine this dataset with
[ZonaProp Argentina Property Scraper](https://apify.com/automatic/zonaprop-ar-scraper)
and
[Inmuebles24 Mexico Property Scraper](https://apify.com/automatic/inmuebles24-mx-scraper).
Every record names its `source`, so merged datasets stay easy to
filter.

### FAQ

**Is this the same as MercadoLibre?** Yes. Mercado Libre (also written
MercadoLibre) runs its real estate section, Mercado Libre Inmuebles, on
`inmuebles.mercadolibre.com.ar` and `inmuebles.mercadolibre.com.mx`. In
Chile, its property listings live on Portal Inmobiliario
(`www.portalinmobiliario.com`). This Actor reads those search pages.

**Can I use any search URL?** Yes, any search results page on
`inmuebles.mercadolibre.com.ar`, `inmuebles.mercadolibre.com.mx` or
`www.portalinmobiliario.com`:
property type, operation, province, city, neighborhood, price range,
rooms, surface, new developments and sort order all carry over. Single
listing pages are not search pages and are rejected with a clear
message.

**Do my saved inputs still work?** Yes. The country, type, operation,
province and city fields behave exactly as before. Search URLs are an
optional extra.

**How fresh are the results?** Every run reads the live search pages, so
you get the listings that are online at that moment.

**Which markets are supported?** Argentina, Mexico and Chile. Uruguay
and Colombia are not supported yet.

**Can I collect rentals?** Yes. Set `operation` to `alquiler` in any
country, or paste a rental search URL (`alquiler` in Argentina, `renta`
in Mexico, `arriendo` in Chile).

**Why is a room or surface value empty?** Some cards do not print every
detail (land plots rarely show rooms, for example). The field is empty
instead of guessed.

**How many listings can I get?** Up to 10 pages and 200 listings per
search. Add more search URLs, for example one per neighborhood, to cover
a larger area in one run.

**Is `ph` supported in Mexico or Chile?** No. This property category is
available only in Argentina.

**Why does a Chilean search fail with "site dropped filter(s)"?** Portal
Inmobiliario does not reject an unknown comuna or type; it quietly shows
a wider search instead. The Actor checks which filters the page applied
and fails that search rather than return listings from somewhere else.
Check the spelling of the comuna (for example `nunoa` for Ñuñoa).

**What if Mercado Libre asks for a sign-in?** If the site shows a
sign-in page instead of results, that search may be unavailable. If some searches remain
unavailable, the run succeeds with listings from the completed searches
only. The status message warns you, and `OUTPUT.walledSearches` names the
unavailable searches. You pay only for delivered listings. If every
search remains unavailable, the run fails clearly with no listings
returned and no result charges.

**What happens when the run times out partway?** The listings already
collected are still delivered. The status message says the run stopped at
its time limit with partial results, and `OUTPUT.budgetExhaustedSearches`
names each search that ended early with its reason. Raise the run timeout or
lower `maxPages`/`maxResults` to collect more.

For help, contact Apify Support and include the run URL.

### Pricing

You pay **$0.0004 per listing returned ($0.40 per 1,000 listings)**
plus **$0.00005 per run start**. The start event is charged
per GB of memory, so the default 512 MB run is one start event.

| Run | Listings | Cost |
| --- | ---: | ---: |
| Example input | 20 | about $0.008 |
| One full page | 48 | about $0.02 |
| Largest single search | 200 | about $0.08 |
| 10 searches a day for 30 days, 50 listings each | 15,000 | about $6 |

The Actor's Pricing tab on Apify always shows the current rates. Start
with a small `maxResults` value and check the run cost before
scheduling larger collections.

# Actor input Schema

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

Paste one or more search pages from inmuebles.mercadolibre.com.ar, inmuebles.mercadolibre.com.mx or www.portalinmobiliario.com (Chile), with any filters you set in the browser (neighborhood, price range, rooms, surface, sort order). When given, these searches run instead of the country, type, operation, province and city fields below; Maximum pages and Maximum results apply to each URL. Leave empty to use the fields below.

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

Country site to search: Argentina (inmuebles.mercadolibre.com.ar, ARS prices), Mexico (inmuebles.mercadolibre.com.mx, MXN prices) or Chile (www.portalinmobiliario.com, MercadoLibre's Chilean property site: CLP prices, or CLF for prices in UF). USD-marked listings stay USD everywhere. Uruguay and Colombia are not supported yet.

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

Property type to search. 'ph', 'campos', 'quintas' and 'galpones' exist on Argentina/Mexico only ('ph' on Argentina only); 'parcelas', 'sitios', 'bodegas', 'industriales', 'agricolas' and 'estacionamientos' exist on Chile only. An unsupported type for the selected country fails fast.

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

Sale or rental search.

## `province` (type: `string`):

Optional province (AR), state (MX) or region (CL) slug to scope the search, e.g. 'capital-federal', 'distrito-federal', 'nuevo-leon', 'metropolitana', 'valparaiso'. Free text is slugified ('Capital Federal' -> 'capital-federal'). Chile takes one of its 16 region slugs (metropolitana, valparaiso, biobio, bernardo-ohiggins, ...); any other value fails fast. On Argentina and Mexico, a slug the site redirects to a broader search is reported in OUTPUT.failedSearches instead of returning the wider listings; MercadoLibre sometimes corrects a misspelling itself, so check the slug. Empty searches the whole country.

## `city` (type: `string`):

Optional city to scope the search, e.g. 'palermo', 'polanco', or a Chilean comuna such as 'las-condes'. Requires a province. A slug the site redirects to a broader search is reported in OUTPUT.failedSearches instead.

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

Search-result pages to fetch (about 48 listings per page on the ML grid).

## `maxResults` (type: `integer`):

Stop after this many listings.

## `requestDelaySecs` (type: `number`):

Minimum 0.5 seconds between fetches.

## `proxy` (type: `object`):

Optional proxy. Defaults to the selected country when Apify Proxy is used.

## `apifyProxyGroups` (type: `array`):

Optional platform proxy groups.

## `apifyProxyCountry` (type: `string`):

Optional two-letter country override. Defaults to the selected country.

## Actor input object example

```json
{
  "startUrls": [],
  "country": "ar",
  "propertyType": "departamentos",
  "operation": "venta",
  "province": "",
  "city": "",
  "maxPages": 1,
  "maxResults": 20,
  "requestDelaySecs": 1
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

OUTPUT record with listingCount (delivered listings) and walledSearches (unavailable searches, each with url, country, propertyType and operation). An empty walledSearches array means no search was unavailable due to verification.

# 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": "ar",
    "propertyType": "departamentos",
    "operation": "venta",
    "province": "",
    "city": "",
    "maxPages": 1,
    "maxResults": 20,
    "requestDelaySecs": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/ml-inmuebles-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 = {
    "country": "ar",
    "propertyType": "departamentos",
    "operation": "venta",
    "province": "",
    "city": "",
    "maxPages": 1,
    "maxResults": 20,
    "requestDelaySecs": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("automatic/ml-inmuebles-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 '{
  "country": "ar",
  "propertyType": "departamentos",
  "operation": "venta",
  "province": "",
  "city": "",
  "maxPages": 1,
  "maxResults": 20,
  "requestDelaySecs": 1
}' |
apify call automatic/ml-inmuebles-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automatic/ml-inmuebles-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/HlaC2SvvktquO0RJh/builds/OMd0f4H4buwvNl3iT/openapi.json
