# Portal Inmobiliario Scraper (Chile) (`automatic/portal-inmobiliario-scraper`) Actor

Chile real estate listings from Portal Inmobiliario: departamentos, casas, parcelas and more, for sale or rent. Filter by region and comuna or paste any search URL; get one record per listing with price, currency, location, bedrooms, bathrooms, surface, photo and the listing URL.

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

## Pricing

from $2.00 / 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

## Portal Inmobiliario Scraper: Chile Real Estate API

Turn any Portal Inmobiliario search into a clean dataset. Paste a search
URL from `portalinmobiliario.com`, with every filter you set in the
browser, or pick a property type, sale or rent, a region and a comuna.
Each listing comes back as one record with price and currency (UF, pesos
or dollars, exactly as advertised), location, bedrooms, bathrooms,
surface in m², photo and the listing URL.

Use it as a Chile real estate API for *departamentos en venta*, *casas en
arriendo*, *parcelas*, *oficinas* and every other property type on Portal
Inmobiliario: schedule it, call it from your code, or download the
results as JSON, CSV or Excel.

### What you can do with it

- **Build a market index.** Re-run the same searches every day or week
  and track asking prices, UF per m² and stock by comuna, property type
  and sale or rent (*venta* or *arriendo*). Bedrooms, bathrooms and
  surface come from each search card, so you can compare like with like
  (for example, 2-bedroom *departamentos* under 60 m² in Ñuñoa).
- **Monitor brokers and new developments.** Paste the search page of a
  comuna, price band or *proyectos* 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.
- **Compare rents and sale prices.** Run sale and rental searches for the
  same comuna (Las Condes, Providencia, Santiago Centro, Viña del Mar…)
  and estimate yields.

### Quick start

1. Open [Portal Inmobiliario](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://www.portalinmobiliario.com/arriendo/departamento/providencia-metropolitana"}
  ],
  "maxPages": 2,
  "maxResults": 96
}
```

Prefer not to paste URLs? Pick the fields instead:

```json
{"propertyType": "departamento", "operation": "venta", "region": "metropolitana", "comuna": "Las Condes", "maxResults": 50}
```

### Input

| Name | Type | Default | What it does |
| --- | --- | --- | --- |
| `startUrls` | array | empty | Optional. One or more Portal Inmobiliario search URLs with any filters. When set, these searches run instead of the fields below. |
| `propertyType` | string | `departamento` | `departamento`, `casa`, `parcela`, `terreno`, `oficina`, `sitio`, `local`, `agricola`, `industrial`, `bodega`, `otros`, `estacionamiento`, `loteo`. |
| `operation` | string | `venta` | Sale (`venta`) or rental (`arriendo`). |
| `region` | string | empty | Optional region, picked from the list (Metropolitana, Valparaíso, Biobío, Los Lagos…). Empty searches all of Chile. |
| `comuna` | string | empty | Optional comuna inside the region, typed as you would say it: "Las Condes", "Ñuñoa", "Viña del Mar", "Concepción". Needs `region`. |
| `maxPages` | integer | `1` | Result pages per search, 1 to 25 (48 listings per page). |
| `maxResults` | integer | `50` | Maximum listings per search, 1 to 1,200. |
| `requestDelaySecs` | number | `1.0` | Pause between pages, 0.5 to 10 seconds. |
| `proxy` | object | Apify Proxy, Chile | Optional. Leave as is; the run uses a Chilean connection by default. |

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

### Input recipes

**Any filter (pasted URL).** Rentals in Providencia, apartments for sale
in Las Condes under a UF price cap and houses for sale in Viña del Mar in
one run:

```json
{
  "startUrls": [
    {"url": "https://www.portalinmobiliario.com/arriendo/departamento/providencia-metropolitana"},
    {"url": "https://www.portalinmobiliario.com/venta/departamento/las-condes-metropolitana/_PriceRange_0CLF-8000CLF"},
    {"url": "https://www.portalinmobiliario.com/venta/casa/vina-del-mar-valparaiso"}
  ],
  "maxPages": 3,
  "maxResults": 144
}
```

**Form fields.** Rural plots (*parcelas*) for sale in Los Lagos:

```json
{"propertyType": "parcela", "operation": "venta", "region": "los-lagos", "maxPages": 4, "maxResults": 192}
```

**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`, `attributes`, and `scraped_at`.

Example record (from an apartments-for-sale search in Santiago):

```json
{"id":"MLC4585667906","listing_key":"portalinmobiliario.com:MLC4585667906","url":"https://portalinmobiliario.com/MLC-4585667906-comodo-departamento-marinstgocentro-_JM","name":"Comodo Departamento Marín/stgo.centro","price":3990,"currency":"CLF","country":"CL","type":"departamento","operation":"venta","location":"Marin 574, Santa Isabel, Santiago","images":["https://http2.mlstatic.com/D_NQ_NP_660048-MLC119476211527_102026-B-comodo-departamento-marinstgocentro.webp"],"source":"portalinmobiliario.com","rooms":null,"bedrooms":2,"bathrooms":2,"surface_total_m2":null,"surface_covered_m2":58,"attributes":["2 dormitorios","2 baños","58 m² útiles"],"scraped_at":"2026-10-21T18:02:11.514000+00:00"}
```

What the fields mean:

- `price` and `currency`: the advertised price as a number, exactly as
  the listing shows it. Most sales are quoted in UF (*unidades de
  fomento*), returned with the ISO code `CLF`: "UF 3.990" is `3990`, and
  a rent of "UF 43,07" is `43.07`. Prices in pesos come back as `CLP`
  and dollar prices as `USD`. Nothing is converted, so you can apply the
  day's UF value yourself. When a listing shows a price drop, `price` is
  the current price. Listings without a public price have an empty price
  and currency.
- `bedrooms` and `bathrooms`: the counts printed on the search card
  (dormitorios, baños). `rooms` is filled only when a card prints a room
  count (ambientes); Chilean cards usually print bedrooms instead.
- `surface_total_m2` and `surface_covered_m2`: total surface and usable
  (*útil* / *construida*) surface in m², when the card shows them.
- For new developments with several unit sizes, the card shows a range
  such as "1 a 3 dormitorios". The number fields hold the smallest value,
  and `attributes` keeps the card text exactly as shown.
- `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 street (when given), neighborhood and comuna of the
  listing.
- `images`: the listing's cover photo from the search results, in the
  largest size offered.
- `listing_key`: a stable unique key, ideal for de-duplication and for
  tracking a listing across runs.

The record has the same fields as our
[Mercado Libre Inmuebles Scraper (Argentina & Mexico)](https://apify.com/automatic/ml-inmuebles-scraper),
so Chilean, Argentine and Mexican datasets can be stacked in one table
and filtered by `country`.

### FAQ

**Can I use any search URL?** Yes, any search results page on
`portalinmobiliario.com`: property type, sale or rent, region, comuna,
neighborhood, price range in UF or pesos, bedrooms, surface, new
projects and sort order all carry over. Single listing pages are not
search pages and are rejected with a clear message.

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

**Which market is supported?** Chile, on Portal Inmobiliario (the same
listings Mercado Libre Chile shows under *inmuebles*). For Argentina and
Mexico use the Mercado Libre Inmuebles Scraper linked above.

**What if my comuna is not found?** Type the comuna's name as Portal
Inmobiliario writes it ("Las Condes", "Ñuñoa", "Puerto Varas") and pick
its region. If the site does not recognise the comuna, the search fails
with a message naming it in `OUTPUT.failedSearches` instead of returning
listings from the rest of Chile. A search URL pasted from the site works
for every comuna.

**Can I collect rentals?** Yes. Set `operation` to `arriendo`, or paste a
rental search URL. Holiday lets (*arriendo de temporada*) pasted as a URL
come back as rentals.

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

**How many listings can I get?** Up to 25 pages and 1,200 listings per
search. Portal Inmobiliario itself shows at most 2,000 results for one
search, so split very large searches by comuna or price band.

**What if Portal Inmobiliario asks for a sign-in?** If the site shows a
sign-in page instead of results, we try again. 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 if my search has no listings?** When Portal Inmobiliario itself
has no listings for a search, the status message says so and
`OUTPUT.emptySearches` names that search. A search with no listings is
not charged per listing.

**What if a search page does not load?** If Portal Inmobiliario answers
with an error page, or with a page that shows neither listings nor its
own "no results" notice, that search fails and `OUTPUT.failedSearches`
gives the reason. The other searches still deliver. If every search
fails, the run fails with a status message saying why.

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

### Pricing

You pay per listing returned plus a small start event for each run.
The start event is charged per GB of memory, so the
default 4096 MB run is four start events. See the Actor's Pricing tab on
Apify for current rates. Total run cost depends on the selected limits and your
Apify plan. 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 www.portalinmobiliario.com, with any filters you set in the browser (comuna, price range in UF or pesos, bedrooms, surface, sort order). When given, these searches run instead of the type, operation, region and comuna fields below; Maximum pages and Maximum results apply to each URL. Leave empty to use the fields below.

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

Property type to search.

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

Sale or rental search.

## `region` (type: `string`):

Optional region to scope the search. Empty searches all of Chile.

## `comuna` (type: `string`):

Optional comuna inside the region, e.g. 'Las Condes', 'Providencia', 'Ñuñoa', 'Viña del Mar', 'Concepción'. Requires a region. A comuna Portal Inmobiliario does not recognise fails the search with a message instead of returning listings from elsewhere.

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

Search-result pages to fetch (48 listings per page).

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

Stop after this many listings per search.

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

Minimum 0.5 seconds between fetches.

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

Optional proxy. Defaults to Chile when Apify Proxy is used.

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

Optional platform proxy groups.

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

Optional two-letter country override. Defaults to CL.

## Actor input object example

```json
{
  "startUrls": [],
  "propertyType": "departamento",
  "operation": "venta",
  "region": "",
  "comuna": "",
  "maxPages": 1,
  "maxResults": 50,
  "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. emptySearches, when present, lists searches for which Portal Inmobiliario itself has no listings; failedSearches, when present, lists searches that failed, each with a reason (for example a comuna the site does not recognise).

# 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 = {
    "propertyType": "departamento",
    "operation": "venta",
    "region": "",
    "comuna": "",
    "maxPages": 1,
    "maxResults": 50,
    "requestDelaySecs": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/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 = {
    "propertyType": "departamento",
    "operation": "venta",
    "region": "",
    "comuna": "",
    "maxPages": 1,
    "maxResults": 50,
    "requestDelaySecs": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("automatic/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 '{
  "propertyType": "departamento",
  "operation": "venta",
  "region": "",
  "comuna": "",
  "maxPages": 1,
  "maxResults": 50,
  "requestDelaySecs": 1
}' |
apify call automatic/portal-inmobiliario-scraper --silent --output-dataset

```

## MCP server setup

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