# Portalinmobiliario Scraper (`normdata/portalinmobiliario-scraper`) Actor

Apartments, houses, offices, land and new projects on Portal Inmobiliario Chile, with price in UF and pesos, price per m² vs area average, common expenses, amenities, GPS and nearby metro/schools. Search comunas by name, 19 filters, past the 2,000 limit, alerts on new listings and price changes.

- **URL**: https://apify.com/normdata/portalinmobiliario-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Stats:** 2 total users, 0 monthly users, 77.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.30 / 1,000 full detail listings

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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm.png)

## 🏠 Portal Inmobiliario Chile Real Estate Scraper

Get property listings from **Portal Inmobiliario**, Chile's biggest real estate portal: apartments, houses, offices, commercial premises, warehouses, parking, industrial property, plots, and land, for sale, for rent, or for seasonal rent. Each listing comes with its full record: price in **both UF and pesos**, the area's average price per m², common expenses, every spec, amenities, exact coordinates, and the metro stations, schools, and parks nearby with walking time. No login, no account.

Built for real estate professionals, investors, and proptech teams working the Chilean market, with more than 180,000 properties for sale alone.

### 🎯 Who uses it?

#### 💰 Property investors

Compare each apartment's price per m² with its area's average, filter by common expenses and building age, and spot the deals in any comuna.

#### 🏗️ Developers and new project analysts

Every new development project with its unit models, units still available, delivery date, builder, and parking and storage prices.

#### 🤝 B2B sales to real estate agencies

List the agencies and developers active in a comuna, with their verified status, reputation, official store link, and logo.

#### 📊 Market analysts and proptech

Track supply and asking prices by region, comuna, and neighborhood, with coordinates on every listing, and get alerts on new listings and price changes.

### ✨ What it does

- **Every property type and operation:** 14 property types, for sale, rent, or seasonal rent, existing properties or new development projects.
- **Any place by name:** comunas as you would write them (Las Condes, Viña del Mar, Puerto Varas), whole regions, or all of Chile.
- **19 filters:** price in UF or pesos, bedrooms, bathrooms, parking, usable and total area, building age, common expenses, 29 must-have amenities, seller type, and official stores.
- **Complete results:** big searches are split automatically, so you get every match and not just the first 2,000 the site shows.
- **Alerts:** schedule the same search and each run returns only new listings, or new listings plus price changes with the price before.
- **Fast mode for big pulls:** search result fields only (price in UF and pesos, bedrooms, bathrooms, areas, address, project info, photo, and link), many times quicker for tens of thousands of listings.
- **Paste links:** any search link from the site, with its filters, or single listing links.
- **Place check:** a misspelled comuna stops the run with suggestions instead of quietly searching somewhere else.

Missing source values are returned as `null`, never invented.

### Why this scraper

- **Price in UF and pesos on every row,** converted with the day's UF rate when the listing shows only one, so every price compares fairly.
- **Price intelligence:** the listing's price per m² next to its area's average, plus common expenses.
- **Nearby places:** metro stations, bus stops, schools, kindergartens, parks, and more, each with walking minutes and distance in metres.
- **New development projects in full:** unit models with their bedrooms, bathrooms, and area range, units available, total units, delivery date, builder, and parking and storage prices.
- **Every spec the listing has:** 40+ values such as terrace area, floor, orientation, floors in the building, and units per floor, plus the complete spec sheet as the site shows it.
- **Private sellers stay private:** their listings are included, with no name or personal details.

### How it compares

| Capability | This actor | Other Portal Inmobiliario scrapers |
|---|:--:|:--:|
| Price, area, bedrooms, bathrooms, location | yes | yes |
| **Price in both UF and pesos on every row** | **yes** | partial |
| **Comuna by name, several comunas, or all of Chile** | **yes** | one location slug |
| **Every match past the 2,000 the site shows** | **yes** | no |
| **Price, area, parking, age, common expenses filters** | **yes** | no |
| **29 must-have amenities** | **yes** | no |
| **Price per m² next to the area average** | **yes** | no |
| **Nearby places with walking time and distance** | **yes** | no |
| **Project unit models, units available, builder** | **yes** | no |
| **Alerts on new listings and price changes** | **yes** | no |

### 📦 What data you get

| Entity | Useful fields |
| --- | --- |
| Listing | ID, title, description, operation, property type, subtype, existing or project, listing tier, how long ago it was published, and every photo. |
| Price | Price and currency, price in UF and in pesos, "from" price flag, price per m², area average per m², and common expenses. |
| Property | Bedrooms, bathrooms, usable, total, and terrace area, parking spaces, storage units, age, orientation, floors in the building, units per floor, unit floor, amenities, and the full spec sheet. |
| Project | Unit models, units available, total units, delivery date, builder, and parking and storage prices. |
| Location | Address, full address, neighborhood, comuna, region, coordinates, and nearby places with walking minutes and distance. |
| Seller | Seller type, name, verified status, official store flag, reputation, property code, store link, and logo. Private sellers have no name. |
| Alerts | What changed since the last run (new listing, price drop, price rise) and the price before. |

Every record includes `scraped_at` (UTC). Download your dataset from Apify as CSV, JSON, Excel, or XML.

### 💡 Use cases

#### 💰 Apartments in Las Condes under UF 8,000 with 2 bedrooms

```json
{ "comunas": ["Las Condes"], "bedrooms": ["2-dormitorios"], "maxPrice": 8000 }
```

#### 🏗️ Every new development project in the Santiago Metropolitan region

```json
{ "regions": ["metropolitana"], "modality": "proyectos", "propertyType": "" }
```

#### 🏊 Rentals in Providencia with pool and gym under $900,000

```json
{ "operation": "arriendo", "comunas": ["Providencia"], "priceCurrency": "CLP", "maxPrice": 900000, "amenities": ["POOL", "GYM"] }
```

#### 🔔 New listings and price changes in Viña del Mar, on a daily schedule

```json
{ "comunas": ["Viña del Mar"], "alertMode": "newOrPriceChanged" }
```

#### 🌲 Plots in Puerto Varas and Frutillar

```json
{ "propertyType": "parcela", "comunas": ["Puerto Varas", "Frutillar"] }
```

#### 🏢 Offices for rent from official stores in all of Chile

```json
{ "operation": "arriendo", "propertyType": "oficina", "officialStoresOnly": true }
```

### ⚙️ How the input is organised

**Maximum results** sits at the very top, since it applies no matter what you're doing. It is 10 (prefilled) so a first run is a quick sample; clear it to collect every match. Below it, the form is split into six numbered sections:

| Section | What it's for |
| --- | --- |
| **1 · What** | Buy or rent, property type, and existing properties or new projects. |
| **2 · Where** | Comunas by name, whole regions, or links pasted from the site. Leave all empty for all of Chile. |
| **3 · Price and size** | Price in UF or pesos, bedrooms, bathrooms, parking, and usable and total area. |
| **4 · Building and amenities** | Building age, common expenses, and must-have amenities. |
| **5 · Seller** | Agencies or private sellers, and official stores. |
| **6 · Alerts and detail** | Every match, only new listings, or new listings plus price changes, and full detail or fast mode. |

**A few things worth knowing:**

- **Comunas** is prefilled with Las Condes as an example. Replace it, or clear it and pick **Regions**, or leave both empty for all of Chile. If you pick a region and forget to clear it, the run stops and tells you how to fix it.
- **Bedrooms** works as a pick list: for 2 bedrooms or more, pick 2, 3, and 4 or more.
- **Comunas and Regions together:** only the comunas are searched. The region only settles a name that exists in two regions.
- **Pasted links** take over: when you paste links, only they are used and Comunas and Regions are ignored. Filters apply to search links; single listing links always come back in full.
- **Price filter currency** sets whether your minimum and maximum price are in UF or pesos. Listings in the other currency are converted with the day's UF rate, so nothing is left out.
- **Fast mode** can't check bathrooms, parking, areas, age, common expenses, or amenities, because those live on each listing's own page. The run tells you if you combine them.

> **Apify Free plan:** every run is limited to a fixed 10-row sample. Upgrade your Apify plan to run your own settings.

### ❓ FAQ

**Why is a price in both UF and pesos?**
Sales are mostly priced in UF and rentals in pesos. Each row carries both, using the site's own conversion when it shows one and the day's UF rate otherwise, so a single price filter works across all listings.

**What does "from" price mean?**
New development projects show the price of their cheapest unit. Those rows have `price_is_from` set to true, and their bedrooms, bathrooms, and areas are ranges (the `_max` fields hold the top of the range).

**Why is the publication date approximate, and sometimes empty?**
The site shows it as "published 4 months ago", so `published_days_ago` counts a month as 30 days. New development projects do not show it at all.

**Why is a bedroom or bathroom count sometimes empty?**
Some sellers leave the count unfilled. The site then hides it, and this actor returns `null` instead of a misleading 0.

**Full detail or fast mode?**
Full detail (the default) opens every listing and fills every field. Fast mode returns what the search results show and skips the rest, so it suits market-wide counts and price pulls. About 1,000 listings take around a minute in full detail, while fast mode covers several thousand in the same time. A fast row is charged at a lower price than a full detail row, since it carries fewer fields.

**How do alerts work?**
The first run of a search returns its matches and remembers every listing with its price. Each later run of the exact same search returns only what is new, or also what changed price, with the price before.

### 🛡️ Limits & responsible use

This Actor reads only public Portal Inmobiliario listings. It never signs in and never contacts sellers.

Agency and developer details are business information. Listings from private sellers are included without their name or any personal details. Contact phone numbers and emails are not public on the site, so they are not included. Use the data for relevant business purposes, respect Portal Inmobiliario's terms, and do not republish listings.

Price, bathroom, parking, area, age, common expenses, and amenity filters are checked on each listing's own page. Strict filters on a large area mean checking many listings, so a run can take several minutes to find a few rare matches. The log shows how many listings have been checked so far.

Runs are paced to stay gentle on the site. About 1,000 listings load in full detail in around a minute. The site limits how many listing pages one visitor opens in a short time, so on larger full detail runs it asks for a pause of about a minute and a half now and then; the run waits and continues on its own, and the log says so. Fast mode opens far fewer pages and rarely needs a pause.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

### Local development

```bash
bun install
bun test
bun run src/main.ts
```

# Changelog

This Actor's version history is a separate document: https://apify.com/normdata/portalinmobiliario-scraper/changelog.md

# Actor input Schema

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

Caps how many listings this run writes. 10 is a quick sample; clear it to collect every match.

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

Listings for sale, for long term rent, or for seasonal (holiday) rent.

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

Apartments, houses, offices, commercial premises, warehouses, parking, industrial, plots, land, and more.

## `modality` (type: `string`):

Existing properties only, or new development projects only. Projects come with their unit models, units still available, delivery date, and builder.

## `comunas` (type: `array`):

Comunas as you would write them, e.g. "Las Condes", "Providencia", "Viña del Mar", "Puerto Varas". Accents and capitals do not matter. Add the region after a comma when a name exists in two regions. An unknown name stops the run with suggestions.

## `regions` (type: `array`):

Search whole regions (clear the prefilled Comunas example first). When Comunas are filled too, only those comunas are searched, and the region settles a comuna name that exists in two regions. Leave both empty to search all of Chile.

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

Optional. Paste search result links (any filters you set on the site are kept) or single listing links. When links are pasted, only the links are used and Comunas and Regions are ignored. The filters below apply to search links; single listing links are always returned in full. A listing link that no longer opens is reported in the NOT\_FOUND record and never charged.

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

The currency of the price filter below. Listings in the other currency are converted with the day's UF rate, so both kinds are compared fairly.

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

Lowest asking price, in the currency chosen above (monthly rent when renting). New development projects are compared by their "from" price.

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

Highest asking price, in the currency chosen above (monthly rent when renting).

## `bedrooms` (type: `array`):

Only these bedroom counts. Pick every count you want: for 2 bedrooms or more, pick 2, 3, and 4 or more. Leave empty for any.

## `minBathrooms` (type: `string`):

Fewest bathrooms.

## `minParking` (type: `string`):

Fewest parking spaces included.

## `minCoveredArea` (type: `integer`):

Smallest usable (útil) area in square metres.

## `maxCoveredArea` (type: `integer`):

Largest usable (útil) area in square metres.

## `minTotalArea` (type: `integer`):

Smallest total area in square metres, terraces and land included.

## `maxTotalArea` (type: `integer`):

Largest total area in square metres.

## `maxAgeYears` (type: `string`):

How old the building may be. New development projects count as brand new.

## `maxMaintenanceFee` (type: `integer`):

Highest monthly common expenses (gastos comunes) in pesos. Listings that do not state them are left out when this is set.

## `amenities` (type: `array`):

Every amenity chosen must be present, e.g. swimming pool, gym, lift, concierge, pets allowed, furnished.

## `sellerType` (type: `string`):

Agencies and developers come with their name, logo, store link, and property code. Private sellers are listed without any personal details.

## `officialStoresOnly` (type: `boolean`):

Only listings from the site's verified official stores of agencies and developers.

## `alertMode` (type: `string`):

Every match, or only what changed since the last run of this same search: new listings, or new listings plus price changes with the price before. The first run returns matches and sets the starting point.

## `detailLevel` (type: `string`):

Full detail opens every listing for all fields. Fast returns the search result fields only (price in UF and pesos, bedrooms, bathrooms, areas, address, project info, photo, and link) and is many times quicker for large market pulls. The bathroom, parking, area, age, common expenses, and amenity filters need full detail.

## Actor input object example

```json
{
  "maxItems": 10,
  "operation": "venta",
  "propertyType": "departamento",
  "modality": "",
  "comunas": [
    "Las Condes"
  ],
  "priceCurrency": "UF",
  "minBathrooms": "",
  "minParking": "",
  "maxAgeYears": "",
  "sellerType": "",
  "officialStoresOnly": false,
  "alertMode": "all",
  "detailLevel": "full"
}
```

# Actor output Schema

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

One dataset row per listing.

# 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 = {
    "maxItems": 10,
    "operation": "venta",
    "propertyType": "departamento",
    "comunas": [
        "Las Condes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/portalinmobiliario-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 = {
    "maxItems": 10,
    "operation": "venta",
    "propertyType": "departamento",
    "comunas": ["Las Condes"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/portalinmobiliario-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 '{
  "maxItems": 10,
  "operation": "venta",
  "propertyType": "departamento",
  "comunas": [
    "Las Condes"
  ]
}' |
apify call normdata/portalinmobiliario-scraper --silent --output-dataset

```

## MCP server setup

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