# Portal Inmobiliario Scraper — Chile Real Estate (`fabrikit/portal-inmobiliario-scraper`) Actor

Scrape Chilean real estate listings from Portal Inmobiliario: prices in CLP/UF, size, bedrooms, location with lat/lon, photos and seller type. Filter by operation, property type, comuna and price. US$1 per 1,000 properties.

- **URL**: https://apify.com/fabrikit/portal-inmobiliario-scraper.md
- **Developed by:** [Fabrikit](https://apify.com/fabrikit) (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 $1.00 / 1,000 property results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Portal Inmobiliario Scraper — Chile Real Estate Data

Scrape property listings from **Portal Inmobiliario (portalinmobiliario.com)** — Chile's largest real estate marketplace, operated by Mercado Libre — into clean, analysis-ready JSON. Filter by operation (rent or sale), property type, **comuna**, price in **CLP or UF** and bedrooms, and get back every listing with price, surface, rooms, **GPS coordinates**, seller type, publication date and photos. This is a **Chile real estate data** and **Santiago property listings API** in one Actor: no browser, no login, plain HTTP — fast and cheap.

What you get from a single run:

- **Every core field a property analyst needs**: price with its real currency (CLP / UF / USD), total and useful surface in m², bedrooms, bathrooms, parking, comuna, neighborhood, street address and latitude/longitude.
- **Both market segments**: used properties from agencies ("corredoras") and private sellers, and new **multifamily / development projects** (flagged with `isProject`, with min–max ranges for surface and rooms).
- **Monitoring-ready**: sort by `newest`, schedule the Actor daily, and diff against yesterday's dataset — new listings, price cuts and delistings for any comuna in Chile.

Example output item:

```json
{
    "id": "MLC4375133420",
    "url": "https://www.portalinmobiliario.com/MLC-4375133420-departamento-entrega-inmediata-_JM",
    "title": "Departamento Entrega Inmediata, Vista Norte Y Despejada",
    "operation": "arriendo",
    "propertyType": "departamento",
    "isProject": false,
    "price": 400000,
    "currency": "CLP",
    "priceIsFrom": false,
    "bedrooms": 2,
    "bathrooms": 1,
    "parkingLots": 0,
    "totalAreaM2": 42,
    "usefulAreaM2": 42,
    "address": "Zenteno 1482, Santiago, Parque O'Higgins, Santiago, RM (Metropolitana)",
    "neighborhood": "Parque O'Higgins",
    "comuna": "Santiago",
    "region": "RM (Metropolitana)",
    "latitude": -33.465678,
    "longitude": -70.6498242,
    "photos": ["https://http2.mlstatic.com/D_NQ_NP_944496-MLC116438397103_082026-O.jpg"],
    "publishedAgo": "Publicado hoy",
    "publishedAt": "2026-08-21",
    "sellerType": "real_estate_agency",
    "condition": "used",
    "commonExpenses": "65.000 CLP",
    "attributes": { "Admite mascotas": "Sí", "Número de piso de la unidad": "11" },
    "scrapedAt": "2026-08-21T01:01:21.074Z"
}
```

### How to scrape Portal Inmobiliario

1. Pick the **operation** (`arriendo` = rent, `venta` = sale) and a **property type** (apartment, house, office, land, plot, retail, warehouse, parking).
2. Type a **location** — any comuna (`Las Condes`, `Providencia`, `Ñuñoa`), city or region. Outside the Metropolitan Region you can disambiguate as `comuna, region` (`Viña del Mar, Valparaíso`; `Pucón, La Araucanía`). Leave empty for all of Chile.
3. Optionally set a **price band** (in CLP, UF or USD — the site converts, so a UF band also matches CLP-listed properties), **bedrooms** and a **sort order**, and press **Start**.

#### Example input

```json
{
    "operation": "venta",
    "propertyType": "casa",
    "location": "Las Condes",
    "priceMin": 5000,
    "priceMax": 20000,
    "currency": "UF",
    "bedrooms": "any",
    "maxItems": 200,
    "sort": "price_asc",
    "fetchDetails": true
}
```

- **operation** — `arriendo` (rent) or `venta` (sale).
- **propertyType** — `departamento`, `casa`, `oficina`, `terreno`, `sitio`, `parcela`, `comercial`, `bodega`, `estacionamiento`.
- **location** — free text; the Actor resolves it to the site's own location slug and **fails loudly if it can't** (it never silently falls back to nationwide results).
- **priceMin / priceMax** + **currency** — price band; `0` = open end. UF is the inflation-indexed unit used for most Chilean sale prices.
- **bedrooms** — `any`, `studio` (monoambiente), `1`, `2`, `3`, `4+`.
- **maxItems** — cap on properties returned (the site serves at most ~2,000 per search — segment by comuna or price band to cover more).
- **sort** — `relevance`, `price_asc`, `price_desc`, `newest`, `oldest`.
- **fetchDetails** — visit each listing's page (default on) to add coordinates, publication date, seller type, exact specs, description and the full photo gallery. Turn off for listing-card data at roughly double speed per credit.

### Output fields

| Field | Type | Description |
|---|---|---|
| `id` | string | Mercado Libre listing ID (`MLC...`), stable across runs — use it for diffing |
| `url` | string | Direct link to the listing |
| `title` | string | Listing title |
| `operation` | string | `arriendo` or `venta` (echo of the search) |
| `propertyType` | string | Property type (echo of the search) |
| `isProject` | boolean | `true` for new development / multifamily projects |
| `price` | number | Listed price |
| `currency` | string | `CLP`, `UF` or `USD` — the currency the listing itself uses |
| `priceIsFrom` | boolean | `true` when the price is a project's "from" price |
| `bedrooms` / `bedroomsMax` | number | null | Bedrooms (min–max range on projects; `0` = studio) |
| `bathrooms` / `bathroomsMax` | number | null | Bathrooms (min–max range on projects) |
| `parkingLots` | number | null | Parking spaces |
| `totalAreaM2` / `totalAreaM2Max` | number | null | Total surface in m² |
| `usefulAreaM2` / `usefulAreaM2Max` | number | null | Useful (interior) surface in m² |
| `address` | string | null | Street-level address as published |
| `neighborhood` | string | null | Barrio (detail pages) |
| `comuna` | string | null | Comuna — Chile's key market-segmentation unit |
| `region` | string | null | Region (e.g. `RM (Metropolitana)`) |
| `latitude` / `longitude` | number | null | Map pin of the listing (detail pages) |
| `photos` | string\[] | Full-size photo URLs |
| `publishedAgo` / `publishedAt` | string | null | "Publicado hace 19 días" + approximate ISO date (used listings) |
| `sellerName` | string | null | Agency / store name when shown |
| `sellerType` | string | null | `real_estate_agency`, `normal` (private seller) or `developer_project` |
| `condition` | string | null | `new` or `used` |
| `commonExpenses` | string | null | Monthly building fees, e.g. `65.000 CLP` |
| `attributes` | object | null | Everything else: age, furnished, orientation, pets, floor, amenities, ... |
| `description` | string | null | Listing description (first 5,000 chars) |
| `scrapedAt` | string | ISO 8601 timestamp of this run |

A run summary (resolved location slug, pages fetched, per-item detail errors) is stored in the run's key-value store under `SUMMARY`.

### What can you do with Chilean property data?

- **Market analysis:** median price per m² by comuna, rent vs. sale yield estimates, UF vs. CLP pricing patterns — the dataset carries surface, price and currency for every listing.
- **Lead generation for brokers (corredores):** filter `sellerType = "normal"` to find **for-sale-by-owner properties** — the classic corredor prospecting list, refreshed daily.
- **Price monitoring:** schedule daily with `sort: newest`, diff on `id`, and alert on new listings or price changes in the comunas you track.
- **Investment screening:** land (`terreno`, `sitio`, `parcela`) searches in emerging regions, with GPS coordinates ready for mapping.
- **Real estate portals & prop-tech:** feed listings with photos, coordinates and full attributes into your own product via the Apify API, webhooks, Google Sheets, Zapier or Make.

### Export to CSV, Excel or Google Sheets

Every Apify dataset exports to CSV, Excel, JSON, XML or HTML with one click, or syncs to Google Sheets automatically. The output is one flat table — ready for pivot tables, BI dashboards or an LLM prompt.

### Pricing — US$1 per 1,000 properties

This Actor uses Apify's **pay-per-event** model and charges **per property delivered** (event `property-result`, **US$0.001 per property = US$1 per 1,000 properties**) plus a small run-start fee, on top of standard Apify platform usage. No subscription, no rental fee. You only pay for properties actually pushed to your dataset.

### FAQ

**Is there a Portal Inmobiliario API?**
Not a public one. Portal Inmobiliario runs on Mercado Libre's platform, and MELI's search API requires OAuth and is not open for the real-estate vertical. This Actor reads the same data from the public listing pages over plain HTTP — no browser, no login — and normalizes it into one schema.

**Which locations work?**
Any comuna, city or region in Chile that exists on portalinmobiliario.com. The Actor resolves your free-text location against the site and **fails with a clear error** if it can't find it — it never silently returns nationwide results. For comunas outside Greater Santiago, `comuna, region` (`Viña del Mar, Valparaíso`) resolves fastest.

**What's the difference between CLP and UF prices?**
Chilean sales are usually listed in **UF** (Unidad de Fomento, an inflation-indexed unit), rentals in **CLP**. Each result reports its own listed `currency`; your price filter can be in either (the site converts internally, so a UF band also matches CLP-listed properties).

**How many results can one search return?**
The site caps any single search at about **2,000 results** (42 pages × 48). To cover a whole region exhaustively, run one input per comuna or per price band — the stable `id` field makes merging trivial.

**Can I tell agency listings from private owners?**
Yes — `sellerType` is `real_estate_agency`, `normal` (private seller) or `developer_project`. Filtering `normal` on `venta` searches is the standard corredor lead-gen play.

**Do I get coordinates for mapping?**
Yes — with `fetchDetails` on (the default), each property carries the listing's own map pin (`latitude`/`longitude`). Listings without a real pin return `null` instead of a fake city-center point.

**Is it legal to scrape real estate listings?**
The Actor only reads listings that Portal Inmobiliario publishes publicly, at a polite request rate. Standard practice for market-research and valuation tooling; how you use the data is up to your own compliance requirements.

**Why is `publishedAt` approximate?**
The site only shows relative dates ("Publicado hace 19 días"). The Actor converts them to an approximate ISO date and keeps the raw string in `publishedAgo`. Projects don't display a publication date.

### More scrapers by Fabrikit

- **[App Reviews Scraper — App Store & Google Play](https://apify.com/fabrikit/app-reviews-unified)** — reviews from both mobile stores in one normalized dataset: rating, text, author, version and developer reply.
- **[ATS Jobs Scraper — Greenhouse, Lever, Ashby & SmartRecruiters](https://apify.com/fabrikit/ats-jobs-api)** — job postings from any company on the four biggest ATS platforms, with ATS auto-detection and a built-in remote filter.

### Technical details

- Data source: the server-rendered pages of portalinmobiliario.com, which embed the complete search/listing state as JSON. No browser, no HTML-class parsing — resilient to CSS redesigns.
- The official Mercado Libre API (`api.mercadolibre.com/sites/MLC/search`) returns HTTP 403 without an OAuth token (locked down in 2024), which is why this Actor scrapes the public pages instead.
- Pagination: 48 listings per page, deduplicated by `id` within a run.
- With `fetchDetails`, listing pages are fetched 5 at a time; a failed detail fetch never drops the item — you keep the listing-card data and the error is noted in `SUMMARY`.
- Proxies are optional (`proxyConfiguration`); plain requests work, but enable RESIDENTIAL if your runs hit 403s.

# Actor input Schema

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

`arriendo` = for rent, `venta` = for sale.

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

Property category on Portal Inmobiliario.

## `location` (type: `string`):

Free text: a comuna (`Las Condes`, `Providencia`), a city, or a region (`Valparaíso`). Outside the Metropolitan Region you can disambiguate with `comuna, region` (e.g. `Viña del Mar, Valparaíso` or `Pucón, La Araucanía`). Leave empty to search all of Chile. If the location cannot be matched the run fails with a clear error instead of silently returning nationwide results.

## `priceMin` (type: `integer`):

Minimum price in the selected currency. 0 = no minimum.

## `priceMax` (type: `integer`):

Maximum price in the selected currency. 0 = no maximum.

## `currency` (type: `string`):

Currency the price filter is expressed in. UF (Unidad de Fomento) is the inflation-indexed unit used for most Chilean sale prices; CLP is common for rentals. This only affects the filter — each result reports its own listed currency.

## `bedrooms` (type: `string`):

Exact number of bedrooms. `studio` = monoambiente (0 bedrooms), `4+` = four or more.

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

Stop after this many properties. The site serves 48 listings per page and caps any single search at roughly 2,000 results — narrow the filters (comuna, price band) to cover a large market exhaustively.

## `sort` (type: `string`):

`relevance` is the site default. `newest` is the right choice for monitoring/alerting pipelines.

## `fetchDetails` (type: `boolean`):

Visit each listing's own page (1 extra request per property) to add: GPS coordinates, approximate publication date, seller type (real-estate agency vs. private), exact bedrooms/bathrooms/parking, full spec table (age, common expenses, furnished, orientation, ...), description and the full photo gallery. Turn off for faster, cheaper runs with listing-card data only.

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

Portal Inmobiliario responds to plain requests, but Mercado Libre may block datacenter IP ranges. If runs start failing with 403s or empty pages, enable Apify RESIDENTIAL proxies here.

## Actor input object example

```json
{
  "operation": "arriendo",
  "propertyType": "departamento",
  "location": "Santiago",
  "priceMin": 0,
  "priceMax": 0,
  "currency": "CLP",
  "bedrooms": "any",
  "maxItems": 50,
  "sort": "relevance",
  "fetchDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `properties` (type: `string`):

All property listings collected during the run

# 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 = {
    "location": "Santiago",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/portal-inmobiliario-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 = {
    "location": "Santiago",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/portal-inmobiliario-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 '{
  "location": "Santiago",
  "maxItems": 50
}' |
apify call fabrikit/portal-inmobiliario-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fabrikit/portal-inmobiliario-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/o8Z9u2zq750lIDTnl/builds/fFUNb2AEqWncf1HRM/openapi.json
