# Properati Scraper | LATAM Real Estate Listings & Property API (`scrapers_lat/properati-scraper`) Actor

Scrape Properati real estate listings in Argentina, Colombia, Peru and Ecuador. Export price in USD and local currency, price per m2, beds, baths, area, coordinates, amenities, images, agency and agent phone and WhatsApp. Any search URL, sale or rent. Datos inmobiliarios to JSON, CSV, Excel.

- **URL**: https://apify.com/scrapers\_lat/properati-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 4 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 4.00 out of 5 stars

## Pricing

from $6.15 / 1,000 results

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?

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

[![Properati Real Estate Listings Scraper (LATAM)](https://scrapers.lat/banners/properati-scraper.png)](https://console.apify.com/actors/QslRATdbY3RLCezFl/input)

## Properati Scraper: LATAM Real Estate Listings and Property Data API

Scrape **Properati** property listings across Latin America and export clean, structured real estate data. This Properati scraper turns any Properati search URL into a dataset of **propiedades en venta o alquiler**: price in USD and local currency, price per m2, bedrooms, bathrooms, area, exact coordinates, amenities, the full image gallery, the publishing agency, and agent phone and WhatsApp. It covers Argentina, Colombia, Peru and Ecuador, and exports to JSON, CSV or Excel.

Built for real estate analysts, investors, proptech teams, lead generation and market research who need **datos inmobiliarios** and **property listings** at scale, without a browser.

**📥 [Input](https://apify.com/scrapers_lat/properati-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/properati-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/properati-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/properati-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Latin%20America-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Why this scraper](#why-this-scraper)
- [How it compares](#how-it-compares)
- [Use cases](#use-cases)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

You paste one or more Properati search results URLs. The actor walks the results page by page (about 30 listings per page), reads each listing card, and writes one normalized record per property to the dataset. Every record carries the listing-level fields: title, price, currency, price in USD and local currency, price per m2, operation (sale or rent), property type, bedrooms, bathrooms, total area, neighborhood, region or province, country, exact coordinates, the publishing agency and the publish date.

When `withDetails` is on (paying plans), each listing's detail page is opened to add the full description, the complete amenities list, the full image gallery, the publishing agency and the agent phone and WhatsApp, plus built area, lot area, half bathrooms, construction year, the maintenance or HOA fee, and the "apto credito" flag. Missing source values are returned as `null`, never guessed.

It works on any Properati country domain, including Argentina (`.com.ar`), Colombia (`.com.co`), Peru (`.com.pe`) and Ecuador (`.com.ec`). Apply any filters you want on the site (operation, property type, location, price, days published) and paste the resulting URL.

### Why this scraper

- **The most complete Properati field set.** Beyond the basics, it returns dual currency (USD and local), price per m2, built vs lot area, half bathrooms, construction year, maintenance fee, the "apto credito" flag, principal amenity, and video and virtual-tour availability.
- **Real contacts.** Agent phone and WhatsApp plus the publishing agency name and profile URL, so listings become leads.
- **Exact geolocation.** Latitude and longitude on every listing, straight from the source, for mapping and geo analysis.
- **Multi country, multi operation.** One actor for Argentina, Colombia, Peru and Ecuador, sale or rent, houses or apartments.
- **Batch friendly.** Pass a list of search URLs and refine further with built-in price, bedroom, bathroom and area filters.
- **Honest billing.** Pay per result, no charge on failed runs, and a spend cap you control.

### How it compares

| Capability | This actor | lentic\_clockss/properati-scraper | unfenced-group/properati-scraper |
|---|---|---|---|
| Any Properati search URL as input | Yes | No (builds URL from params) | Partial (startUrls) |
| Batch multiple search URLs | Yes | No | Yes |
| Country, operation, property type, location | Yes (in the URL) | Yes | Yes |
| Price, bedroom, bathroom, area filters | Yes | Partial (price, beds) | Partial (price) |
| Price in USD and local currency | Yes | No | No |
| Price per m2 | Yes | No | No |
| Built area and lot area | Yes | No | Partial |
| Half bathrooms, construction year | Yes | No | No |
| Maintenance / HOA fee | Yes | No | No |
| Apto credito flag | Yes | No | No |
| Exact coordinates | Yes | Yes | Yes |
| Amenities list and image gallery | Yes | Partial | Yes |
| Agent phone and WhatsApp | Yes (both) | Phone only | No |
| Publishing agency name and URL | Yes | Yes | Name only |
| Video / virtual-tour availability | Yes | No | No |
| Pay per result, no charge on failure | Yes | Pay per result | Pay per result |

Every input the other actors accept is available here through the search URL plus the optional filters, and every output field they return is included, plus the extra fields above.

### Use cases

- **Real estate market research.** Track price per m2, inventory and days on market across cities and neighborhoods.
- **Lead generation.** Collect agency names, agent phone and WhatsApp from active listings.
- **Investment and valuation.** Compare built vs lot area, maintenance fees and asking prices to spot opportunities.
- **Proptech and portals.** Feed listings, images and coordinates into your own app, CRM or map.
- **Price monitoring.** Re-run on a schedule and watch how prices and supply move over time.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns up to 10 houses for sale in Argentina with full details.

```json
{
  "startUrl": "https://www.properati.com.ar/s/casa/venta",
  "maxListings": 10,
  "withDetails": true
}
```

Change the domain and path to target another market or operation, for example `https://www.properati.com.co/s/apartamento/arriendo`. Turn `withDetails` off for a faster listing-only run.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrl` | string | one URL required | `https://www.properati.com.ar/s/casa/venta` | A Properati search results URL. Apply any filters on the site and paste the resulting URL. Works on any country domain (`.com.ar`, `.com.co`, `.com.pe`, `.com.ec` and more). |
| `startUrls` | array | no | `[]` | Optional list of extra Properati search URLs to scrape in one run. Plain strings or `{ "url": "..." }` objects. |
| `maxListings` | integer | no | `10` | Maximum listings to collect across all search URLs. Leave empty for all results on paying plans. Free plans are capped at 10 per run. |
| `withDetails` | boolean | no | `true` | When on, opens each listing detail page for description, amenities, gallery, agent contacts, areas, year, maintenance fee and more. Runs on paying plans only. |
| `minPrice` / `maxPrice` | integer | no | | Keep only listings within this price range. |
| `priceCurrency` | string | no | | Currency the price filter uses (`USD`, `ARS`, `COP`, `PEN`, `MXN`). |
| `minBedrooms` / `maxBedrooms` | integer | no | | Keep only listings within this bedroom range. |
| `minBathrooms` | integer | no | | Keep only listings with at least this many bathrooms. |
| `minAreaM2` / `maxAreaM2` | integer | no | | Keep only listings within this total area range. |

### Output reference

One dataset item per listing. Types: `string`, `integer`, `number`, `boolean`, `string[]`, `object`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `imageUrl` | string | Main listing image URL. |
| `title` | string | Listing title. |
| `price` | number | Asking price, or `null` when hidden. |
| `currency` | string | Price currency, for example `USD`, `ARS`, `COP`, `PEN`. |
| `priceUsd` | number | Price in USD when the listing is in USD, else `null`. |
| `priceLocal` | number | Price in the local currency when the listing is not in USD, else `null`. |
| `priceLocalCurrency` | string | The local currency code for `priceLocal`. |
| `pricePerM2` | number | Price per square meter, when computable. |
| `pricePerM2Currency` | string | Currency of `pricePerM2`. |
| `operationType` | string | Operation, for example `Venta`, `Alquiler`. |
| `propertyType` | string | Property type, for example `Casa`, `Departamento`. |
| `bedrooms` | number | Number of bedrooms, or `null`. |
| `bathrooms` | number | Number of bathrooms, or `null`. |
| `halfBathrooms` | number | Half bathrooms (toilette), or `null`. |
| `totalAreaM2` | number | Total area in m2, or `null`. |
| `builtAreaM2` | number | Built / covered area in m2 (detail), or `null`. |
| `lotAreaM2` | number | Lot / plot area in m2 (detail), or `null`. |
| `yearBuilt` | number | Construction year (detail), or `null`. |
| `maintenanceFee` | number | Maintenance / HOA fee (detail), or `null`. |
| `maintenanceFeeCurrency` | string | Currency of the maintenance fee. |
| `suitableForCredit` | boolean | `true` when the listing is marked "apto credito". |
| `principalAmenity` | string | Headline amenity shown on the card. |
| `amenities` | string\[] | Full amenities list (detail). |
| `hasVideo` | boolean | `true` when the listing has a video (detail). |
| `hasVirtualTour` | boolean | `true` when the listing has a virtual tour (detail). |
| `publishDate` | string | Listing publish date (ISO when parseable). |
| `location` | string | Location text as published. |
| `address` | string | Street address (structured). |
| `neighborhood` | string | Neighborhood or locality. |
| `region` | string | Region or province. |
| `country` | string | Country code. |
| `coordinates` | object | Map coordinates, `{ lat, lng }`. |
| `description` | string | Full description (detail). |
| `images` | string\[] | Full image gallery URLs (detail). |
| `publisher` | object | Publishing agency, `{ name, url }` (detail). |
| `publisherName` | string | Publishing agency name. |
| `agentPhone` | string | Agent phone number when published, else `null`. |
| `agentWhatsapp` | string | Agent WhatsApp number when published, else `null`. |
| `url` | string | Direct listing URL. |
| `listingId` | string | Properati listing ID. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `detailError` | string | `null` on success. Set when only the detail page failed while the listing row is still valid. |
| `error` | string | `null` on success. On a failed run, an item with a populated `error` field is written instead. |

### Example output record

Real record from a live run (input `{"startUrl":"https://www.properati.com.ar/s/casa/venta","withDetails":true}`). Long image URLs are truncated with `...`, the `images` gallery is trimmed to two entries, and the `description` is shortened; every other value is unchanged from the live record:

```json
{
  "title": "Casa en Venta en Lácar",
  "price": 620000,
  "currency": "USD",
  "priceUsd": 620000,
  "priceLocal": null,
  "pricePerM2": 1717,
  "pricePerM2Currency": "USD",
  "operationType": "Venta",
  "propertyType": "Casa",
  "bedrooms": 4,
  "bathrooms": 4.5,
  "totalAreaM2": 361,
  "builtAreaM2": 279,
  "lotAreaM2": 5180,
  "yearBuilt": 2015,
  "maintenanceFee": 100000,
  "maintenanceFeeCurrency": "ARS",
  "suitableForCredit": true,
  "principalAmenity": "Garage",
  "amenities": ["Garage", "Balcón", "Calefacción", "Jacuzzi", "Patio", "Parrilla", "Gimnasio", "Cancha de tenis"],
  "hasVideo": true,
  "hasVirtualTour": true,
  "location": "Lácar, Neuquén",
  "address": "Vallescondido - Club de Campo, Neuquén, Argentina",
  "neighborhood": "Lácar",
  "region": "Neuquén",
  "country": "AR",
  "coordinates": { "lat": -40.1637181, "lng": -71.3026999 },
  "publisherName": "Inmobiliaria Grupo Patagonia",
  "agentPhone": "+542996229443",
  "agentWhatsapp": "+542996229443",
  "publishDate": "2025-09-07",
  "url": "https://www.properati.com.ar/detalle/...",
  "listingId": "019925fb-4f9d-73fa-9aae-0a8a62003b7b",
  "observedAt": "2026-09-04T17:54:15.248Z",
  "detailError": null,
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~properati-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.properati.com.ar/s/casa/venta","maxListings":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~properati-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.properati.com.co/s/apartamento/arriendo","maxListings":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/properati-scraper \
  --input '{"startUrl":"https://www.properati.com.pe/s/departamento/venta"}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per listing returned (`result` event). Enabling `withDetails` adds a small per-listing `details` add-on, charged only when the detail page is fetched successfully. See the [pricing tab](https://apify.com/scrapers_lat/properati-scraper/pricing) for current prices.
- **No charge on failure.** If a run finds nothing or errors, the actor writes a single item with an `error` field and does not charge for it. Empty runs cost nothing.
- **No charge when only detail enrichment fails.** If the listing is collected but its detail page fails, the row is delivered with `detailError` set and the `details` add-on is not charged.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 listings per run, listing-level only. Upgrade for the full result set and detail enrichment.
- **Live data.** Listings are read at run time, so each record reflects what is published at the moment of the run (see `observedAt`).

### FAQ and troubleshooting

**Which countries and Properati sites does this cover?**
Any Properati country domain, including Argentina (`.com.ar`), Colombia (`.com.co`), Peru (`.com.pe`) and Ecuador (`.com.ec`). Paste a search URL from the market you want.

**How do I control which listings are scraped?**
Apply any filters (operation, property type, location, price, days published) on the Properati website and paste the resulting search URL into `startUrl`. The actor reads exactly that search, in the same order the site shows it. You can also add the built-in price, bedroom, bathroom and area filters, or pass several URLs in `startUrls`.

**What extra data does the detail option add?**
With `withDetails` on, each listing detail page is opened to add the full description, amenities, complete image gallery, the publishing agency and agent contacts, built and lot area, half bathrooms, construction year, the maintenance fee, the "apto credito" flag and video and virtual-tour availability.

**What happens to listings with missing prices or room counts?**
Some listings hide the price or omit bedroom, bathroom or area figures. Those fields are returned as `null` for that record while every other available field is still filled.

**Do I get agent contact details?**
When the listing publishes them, `agentPhone` and `agentWhatsapp` are captured, along with the `publisher` agency name and URL. They are `null` when the site does not expose them.

**Is this an official Properati tool?**
No. This actor is independent and has no affiliation with Properati. It accesses only data that is publicly available on the platform.

***

## Properati Scraper: API de Datos y Avisos Inmobiliarios en LATAM

Extrae avisos de **propiedades de Properati** en toda Latinoamerica y exporta **datos inmobiliarios** limpios y estructurados. Este scraper de Properati convierte cualquier URL de busqueda de Properati en un conjunto de datos de **propiedades en venta o alquiler**: precio en USD y en moneda local, precio por m2, dormitorios, banos, superficie, coordenadas exactas, comodidades, galeria completa de imagenes, la inmobiliaria y el telefono y WhatsApp del agente. Cubre Argentina, Colombia, Peru y Ecuador, y exporta a JSON, CSV o Excel.

Pensado para analistas inmobiliarios, inversores, equipos proptech, generacion de leads e investigacion de mercado que necesitan **datos inmobiliarios** y **avisos de propiedades** a escala, sin navegador.

**📥 [Entrada](https://apify.com/scrapers_lat/properati-scraper/input-schema) · 📤 [Salida](https://apify.com/scrapers_lat/properati-scraper/output-schema) · 💰 [Precios](https://apify.com/scrapers_lat/properati-scraper/pricing) · ▶️ [Ejemplos](https://apify.com/scrapers_lat/properati-scraper/examples)**

### Indice

- [Que hace](#que-hace)
- [Por que este scraper](#por-que-este-scraper)
- [Como se compara](#como-se-compara)
- [Casos de uso](#casos-de-uso)
- [Inicio rapido](#inicio-rapido)
- [Referencia de entrada](#referencia-de-entrada)
- [Referencia de salida](#referencia-de-salida)
- [Registro de ejemplo](#registro-de-ejemplo)
- [Uso por API y CLI](#uso-por-api-y-cli)
- [Obtener resultados](#obtener-resultados)
- [Facturacion y limites](#facturacion-y-limites)
- [Preguntas frecuentes](#preguntas-frecuentes)

### Que hace

Pegas una o varias URLs de resultados de busqueda de Properati. El actor recorre los resultados pagina por pagina (unos 30 avisos por pagina), lee cada tarjeta y escribe un registro normalizado por propiedad en el dataset. Cada registro incluye los campos de nivel de aviso: titulo, precio, moneda, precio en USD y en moneda local, precio por m2, operacion (venta o alquiler), tipo de propiedad, dormitorios, banos, superficie total, barrio, region o provincia, pais, coordenadas exactas, la inmobiliaria y la fecha de publicacion.

Cuando `withDetails` esta activado (planes de pago), se abre la pagina de detalle de cada aviso para agregar la descripcion completa, la lista de comodidades, la galeria completa de imagenes, la inmobiliaria y el telefono y WhatsApp del agente, ademas de superficie cubierta, superficie del lote, medios banos, ano de construccion, el gasto de mantenimiento o expensas y la marca "apto credito". Los valores ausentes en la fuente se devuelven como `null`, nunca se inventan.

Funciona en cualquier dominio de pais de Properati, incluidos Argentina (`.com.ar`), Colombia (`.com.co`), Peru (`.com.pe`) y Ecuador (`.com.ec`). Aplica los filtros que quieras en el sitio (operacion, tipo de propiedad, ubicacion, precio, dias publicados) y pega la URL resultante.

### Por que este scraper

- **El conjunto de campos de Properati mas completo.** Ademas de lo basico, devuelve doble moneda (USD y local), precio por m2, superficie cubierta y del lote, medios banos, ano de construccion, gasto de mantenimiento, la marca "apto credito", comodidad principal y disponibilidad de video y tour virtual.
- **Contactos reales.** Telefono y WhatsApp del agente mas el nombre y la URL de la inmobiliaria, para convertir avisos en leads.
- **Geolocalizacion exacta.** Latitud y longitud en cada aviso, directo de la fuente, para mapas y analisis geografico.
- **Multipais y multioperacion.** Un solo actor para Argentina, Colombia, Peru y Ecuador, venta o alquiler, casas o departamentos.
- **Ideal para lotes.** Pasa una lista de URLs de busqueda y refina con filtros integrados de precio, dormitorios, banos y superficie.
- **Facturacion honesta.** Pago por resultado, sin cargo en corridas fallidas, y un limite de gasto que controlas.

### Como se compara

| Capacidad | Este actor | lentic\_clockss/properati-scraper | unfenced-group/properati-scraper |
|---|---|---|---|
| Cualquier URL de busqueda de Properati como entrada | Si | No (arma la URL con parametros) | Parcial (startUrls) |
| Varias URLs de busqueda en lote | Si | No | Si |
| Pais, operacion, tipo, ubicacion | Si (en la URL) | Si | Si |
| Filtros de precio, dormitorios, banos, superficie | Si | Parcial (precio, dorm.) | Parcial (precio) |
| Precio en USD y en moneda local | Si | No | No |
| Precio por m2 | Si | No | No |
| Superficie cubierta y del lote | Si | No | Parcial |
| Medios banos, ano de construccion | Si | No | No |
| Gasto de mantenimiento / expensas | Si | No | No |
| Marca apto credito | Si | No | No |
| Coordenadas exactas | Si | Si | Si |
| Comodidades y galeria de imagenes | Si | Parcial | Si |
| Telefono y WhatsApp del agente | Si (ambos) | Solo telefono | No |
| Nombre y URL de la inmobiliaria | Si | Si | Solo nombre |
| Disponibilidad de video / tour virtual | Si | No | No |
| Pago por resultado, sin cargo en fallo | Si | Pago por resultado | Pago por resultado |

Toda entrada que aceptan los otros actores esta disponible aqui mediante la URL de busqueda mas los filtros opcionales, y todo campo de salida que devuelven esta incluido, mas los campos extra de arriba.

### Casos de uso

- **Investigacion de mercado inmobiliario.** Sigue el precio por m2, el inventario y los dias en el mercado por ciudad y barrio.
- **Generacion de leads.** Reune nombres de inmobiliarias, telefono y WhatsApp del agente de avisos activos.
- **Inversion y valuacion.** Compara superficie cubierta y del lote, gastos de mantenimiento y precios de lista para detectar oportunidades.
- **Proptech y portales.** Alimenta avisos, imagenes y coordenadas en tu app, CRM o mapa.
- **Monitoreo de precios.** Vuelve a correr en un horario y observa como se mueven los precios y la oferta.

### Inicio rapido

Abre el actor, pega esto en la entrada y presiona Run. Devuelve hasta 10 casas en venta en Argentina con detalle completo.

```json
{
  "startUrl": "https://www.properati.com.ar/s/casa/venta",
  "maxListings": 10,
  "withDetails": true
}
```

Cambia el dominio y la ruta para apuntar a otro mercado u operacion, por ejemplo `https://www.properati.com.co/s/apartamento/arriendo`. Desactiva `withDetails` para una corrida mas rapida solo de avisos.

### Referencia de entrada

| Campo | Tipo | Requerido | Predet. | Descripcion |
|---|---|---|---|---|
| `startUrl` | string | una URL requerida | `https://www.properati.com.ar/s/casa/venta` | Una URL de resultados de busqueda de Properati. Aplica filtros en el sitio y pega la URL resultante. Funciona en cualquier dominio de pais. |
| `startUrls` | array | no | `[]` | Lista opcional de URLs de busqueda de Properati adicionales. Strings o objetos `{ "url": "..." }`. |
| `maxListings` | integer | no | `10` | Maximo de avisos a recolectar en todas las URLs. Deja vacio para todos los resultados en planes de pago. Los planes gratuitos se limitan a 10 por corrida. |
| `withDetails` | boolean | no | `true` | Si esta activado, abre la pagina de detalle para descripcion, comodidades, galeria, contactos del agente, superficies, ano, expensas y mas. Solo en planes de pago. |
| `minPrice` / `maxPrice` | integer | no | | Conserva solo avisos dentro de este rango de precio. |
| `priceCurrency` | string | no | | Moneda del filtro de precio (`USD`, `ARS`, `COP`, `PEN`, `MXN`). |
| `minBedrooms` / `maxBedrooms` | integer | no | | Conserva solo avisos dentro de este rango de dormitorios. |
| `minBathrooms` | integer | no | | Conserva solo avisos con al menos esta cantidad de banos. |
| `minAreaM2` / `maxAreaM2` | integer | no | | Conserva solo avisos dentro de este rango de superficie total. |

### Referencia de salida

Un item de dataset por aviso. Tipos: `string`, `integer`, `number`, `boolean`, `string[]`, `object`, o `null` cuando el valor no esta en la fuente.

| Campo | Tipo | Descripcion |
|---|---|---|
| `imageUrl` | string | URL de la imagen principal. |
| `title` | string | Titulo del aviso. |
| `price` | number | Precio de lista, o `null` si esta oculto. |
| `currency` | string | Moneda del precio, por ejemplo `USD`, `ARS`, `COP`, `PEN`. |
| `priceUsd` | number | Precio en USD cuando el aviso esta en USD, si no `null`. |
| `priceLocal` | number | Precio en moneda local cuando el aviso no esta en USD, si no `null`. |
| `priceLocalCurrency` | string | Codigo de la moneda local de `priceLocal`. |
| `pricePerM2` | number | Precio por metro cuadrado, cuando se puede calcular. |
| `pricePerM2Currency` | string | Moneda de `pricePerM2`. |
| `operationType` | string | Operacion, por ejemplo `Venta`, `Alquiler`. |
| `propertyType` | string | Tipo de propiedad, por ejemplo `Casa`, `Departamento`. |
| `bedrooms` | number | Cantidad de dormitorios, o `null`. |
| `bathrooms` | number | Cantidad de banos, o `null`. |
| `halfBathrooms` | number | Medios banos (toilette), o `null`. |
| `totalAreaM2` | number | Superficie total en m2, o `null`. |
| `builtAreaM2` | number | Superficie cubierta en m2 (detalle), o `null`. |
| `lotAreaM2` | number | Superficie del lote en m2 (detalle), o `null`. |
| `yearBuilt` | number | Ano de construccion (detalle), o `null`. |
| `maintenanceFee` | number | Gasto de mantenimiento / expensas (detalle), o `null`. |
| `maintenanceFeeCurrency` | string | Moneda del gasto de mantenimiento. |
| `suitableForCredit` | boolean | `true` cuando el aviso esta marcado "apto credito". |
| `principalAmenity` | string | Comodidad principal mostrada en la tarjeta. |
| `amenities` | string\[] | Lista completa de comodidades (detalle). |
| `hasVideo` | boolean | `true` cuando el aviso tiene video (detalle). |
| `hasVirtualTour` | boolean | `true` cuando el aviso tiene tour virtual (detalle). |
| `publishDate` | string | Fecha de publicacion (ISO cuando se puede interpretar). |
| `location` | string | Ubicacion tal como se publica. |
| `address` | string | Direccion (estructurada). |
| `neighborhood` | string | Barrio o localidad. |
| `region` | string | Region o provincia. |
| `country` | string | Codigo de pais. |
| `coordinates` | object | Coordenadas, `{ lat, lng }`. |
| `description` | string | Descripcion completa (detalle). |
| `images` | string\[] | URLs de la galeria completa (detalle). |
| `publisher` | object | Inmobiliaria, `{ name, url }` (detalle). |
| `publisherName` | string | Nombre de la inmobiliaria. |
| `agentPhone` | string | Telefono del agente cuando se publica, si no `null`. |
| `agentWhatsapp` | string | WhatsApp del agente cuando se publica, si no `null`. |
| `url` | string | URL directa del aviso. |
| `listingId` | string | ID del aviso en Properati. |
| `observedAt` | string | Marca de tiempo ISO 8601 de la recoleccion. |
| `detailError` | string | `null` en exito. Se completa cuando solo fallo la pagina de detalle pero el aviso es valido. |
| `error` | string | `null` en exito. En una corrida fallida se escribe un item con `error` en su lugar. |

### Registro de ejemplo

Registro real de una corrida en vivo (entrada `{"startUrl":"https://www.properati.com.ar/s/casa/venta","withDetails":true}`). Las URLs largas de imagen se recortan con `...`, la galeria `images` se recorta a dos entradas y la `description` se acorta; el resto es igual al registro real:

```json
{
  "title": "Casa en Venta en Lácar",
  "price": 620000,
  "currency": "USD",
  "priceUsd": 620000,
  "pricePerM2": 1717,
  "operationType": "Venta",
  "propertyType": "Casa",
  "bedrooms": 4,
  "bathrooms": 4.5,
  "totalAreaM2": 361,
  "builtAreaM2": 279,
  "lotAreaM2": 5180,
  "yearBuilt": 2015,
  "maintenanceFee": 100000,
  "maintenanceFeeCurrency": "ARS",
  "suitableForCredit": true,
  "principalAmenity": "Garage",
  "amenities": ["Garage", "Balcón", "Calefacción", "Jacuzzi", "Parrilla", "Gimnasio"],
  "hasVideo": true,
  "hasVirtualTour": true,
  "location": "Lácar, Neuquén",
  "region": "Neuquén",
  "country": "AR",
  "coordinates": { "lat": -40.1637181, "lng": -71.3026999 },
  "publisherName": "Inmobiliaria Grupo Patagonia",
  "agentPhone": "+542996229443",
  "agentWhatsapp": "+542996229443",
  "publishDate": "2025-09-07",
  "listingId": "019925fb-4f9d-73fa-9aae-0a8a62003b7b",
  "detailError": null,
  "error": null
}
```

### Uso por API y CLI

Inicia una corrida y espera a que termine, luego lee el dataset. Reemplaza `<TOKEN>` con tu token de API de Apify.

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~properati-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.properati.com.ar/s/casa/venta","maxListings":25,"withDetails":true}'
```

Con la CLI de Apify:

```bash
apify call scrapers_lat/properati-scraper \
  --input '{"startUrl":"https://www.properati.com.pe/s/departamento/venta"}'
```

### Obtener resultados

Cada corrida escribe en un dataset. Obtiene los items como JSON, CSV o Excel cambiando `format`:

```bash
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"
```

`<DATASET_ID>` se devuelve como `defaultDatasetId` en el objeto de la corrida. Usa `offset` y `limit` para paginar. `clean=true` elimina campos vacios e internos.

### Facturacion y limites

- **Pago por resultado.** Se cobra por aviso devuelto (evento `result`). Activar `withDetails` agrega un pequeno complemento `details` por aviso, cobrado solo cuando la pagina de detalle se obtiene con exito. Consulta la pestana de precios.
- **Sin cargo en fallo.** Si una corrida no encuentra nada o falla, se escribe un item con `error` y no se cobra. Las corridas vacias no cuestan nada.
- **Sin cargo cuando solo falla el detalle.** Si el aviso se recolecta pero su pagina de detalle falla, la fila se entrega con `detailError` y no se cobra el complemento `details`.
- **Se respeta el limite de gasto.** Configura `maxTotalChargeUsd` en la corrida; al alcanzarlo, el actor deja de emitir y cobrar resultados.
- **Los planes gratuitos** se limitan a 10 avisos por corrida, solo a nivel de aviso. Mejora tu plan para el conjunto completo y el detalle.
- **Datos en vivo.** Los avisos se leen en el momento de la corrida (ver `observedAt`).

### Preguntas frecuentes

**Que paises y sitios de Properati cubre?**
Cualquier dominio de pais de Properati, incluidos Argentina (`.com.ar`), Colombia (`.com.co`), Peru (`.com.pe`) y Ecuador (`.com.ec`). Pega una URL de busqueda del mercado que quieras.

**Como controlo que avisos se extraen?**
Aplica filtros (operacion, tipo, ubicacion, precio, dias publicados) en el sitio de Properati y pega la URL resultante en `startUrl`. Tambien puedes usar los filtros integrados de precio, dormitorios, banos y superficie, o pasar varias URLs en `startUrls`.

**Que datos extra agrega la opcion de detalle?**
Con `withDetails` activado, se abre cada pagina de detalle para agregar la descripcion completa, comodidades, galeria de imagenes, la inmobiliaria y contactos del agente, superficie cubierta y del lote, medios banos, ano de construccion, expensas, la marca "apto credito" y disponibilidad de video y tour virtual.

**Que pasa con avisos sin precio o sin ambientes?**
Algunos avisos ocultan el precio u omiten dormitorios, banos o superficie. Esos campos se devuelven como `null` mientras el resto de los datos disponibles igual se completa.

**Obtengo datos de contacto del agente?**
Cuando el aviso los publica, se capturan `agentPhone` y `agentWhatsapp`, junto con el nombre y la URL de la inmobiliaria en `publisher`. Son `null` cuando el sitio no los expone.

**Es una herramienta oficial de Properati?**
No. Este actor es independiente y no tiene afiliacion con Properati. Accede solo a datos disponibles publicamente en la plataforma.

### Example tasks

Preconfigured templates for common scenarios. Open one and press Run, or use it as a starting point:

- [Properati Bogota Apartments for Sale Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-bogota-apartments-for-sale)
- [Properati Bogota Apartments for Rent Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-bogota-apartments-for-rent)
- [Properati Medellin Apartments for Rent Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-medellin-apartments-for-rent)
- [Properati Medellin Houses for Sale Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-medellin-houses-for-sale)
- [Properati Cali Houses for Rent Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-cali-houses-for-rent)
- [Properati Buenos Aires Apartments for Rent Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-buenos-aires-apartments-rent)
- [Properati Buenos Aires Houses for Sale Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-buenos-aires-houses-sale)
- [Properati Lima Apartments for Sale Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-lima-apartments-for-sale)
- [Properati Lima Apartments for Rent Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-lima-apartments-for-rent)
- [Properati Quito Houses for Sale Scraper](https://apify.com/scrapers_lat/properati-scraper/examples/properati-quito-houses-for-sale)

### Related scrapers

- [InfoCasas Real Estate Listings Scraper](https://apify.com/scrapers_lat/infocasas-scraper): listings across Uruguay, Paraguay and more.
- [Urbania Peru Property Listings Scraper](https://apify.com/scrapers_lat/urbania-scraper): Peru property listings and agents.
- [AdondeVivir Peru Property Listings Scraper](https://apify.com/scrapers_lat/adondevivir-scraper): Peru property listings and agents.
- [Portal Inmobiliario Chile Real Estate Scraper](https://apify.com/scrapers_lat/portalinmobiliario-chile-scraper): Chile property listings.
- [MercadoLibre Product Listings Scraper](https://apify.com/scrapers_lat/mercadolibre-scraper): products, prices and sellers across LATAM.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with Properati. Accesses only data that is publicly available on the platform. Use it in accordance with Properati's terms of service.

# Actor input Schema

## `startUrl` (type: `string`):

A Properati search results URL. Apply any filters on the Properati site (operation, property type, location, price, days published) and paste the resulting URL, for example https://www.properati.com.ar/s/casa/venta or https://www.properati.com.co/s/apartamento/arriendo. Works on any country domain (.com.ar, .com.co, .com.pe, .com.ec ...).

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

Optional list of Properati search URLs to scrape in one run (in addition to Search URL). Accepts plain strings or {"url": "..."} objects.

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

Maximum number of listings to collect across all search URLs. Leave empty for all results (paying plans). Free Apify plans are capped at 10 per run.

## `withDetails` (type: `boolean`):

When enabled, each listing's detail page is fetched to add the full description, amenities, complete image gallery, publisher/agent phone and WhatsApp, built/lot area, half bathrooms, construction year, maintenance fee and the 'apto crédito' flag. Detail enrichment runs on paying Apify plans only; free runs return the listing-level fields.

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

Only keep listings at or above this price (in the currency set below, or the listing currency).

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

Only keep listings at or below this price.

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

Currency the min/max price filter is expressed in.

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

Only keep listings with at least this many bedrooms.

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

Only keep listings with at most this many bedrooms.

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

Only keep listings with at least this many bathrooms.

## `minAreaM2` (type: `integer`):

Only keep listings with total area at or above this many square meters.

## `maxAreaM2` (type: `integer`):

Only keep listings with total area at or below this many square meters.

## Actor input object example

```json
{
  "startUrl": "https://www.properati.com.ar/s/casa/venta",
  "startUrls": [],
  "maxListings": 10,
  "withDetails": true
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrl": "https://www.properati.com.ar/s/casa/venta",
    "startUrls": [],
    "maxListings": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/properati-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 = {
    "startUrl": "https://www.properati.com.ar/s/casa/venta",
    "startUrls": [],
    "maxListings": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/properati-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 '{
  "startUrl": "https://www.properati.com.ar/s/casa/venta",
  "startUrls": [],
  "maxListings": 10
}' |
apify call scrapers_lat/properati-scraper --silent --output-dataset

```

## MCP server setup

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