# Zonaprop Argentina Real Estate Scraper & Monitor (`datamole/zonaprop-scraper`) Actor

Extract Zonaprop listings in Argentina for rent and sale with price in pesos and dollars at the blue, MEP or official rate, expensas, monthly cost, price per m², GPS, WhatsApp and photos. Filter by barrio, amenities, pets or owner listings, and track new listings and price drops.

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

## Pricing

from $10.00 / 1,000 result scrapeds

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

![DataMole](https://raw.githubusercontent.com/YoiderD/datamole-assets/main/banner.png)

## 🏙️ Zonaprop Argentina Real Estate Scraper & Monitor

> **Extraé avisos de Zonaprop (alquiler y venta) con precio en pesos y en dólares al blue, MEP u oficial, expensas, costo mensual total, precio por m², GPS, WhatsApp del anunciante y fotos.** Filtrá por barrio, comodidades, mascotas o dueño directo, y recibí solo los avisos nuevos y las bajas de precio.

> 🕒 **Last updated:** 2026-10-20 · **50+ campos** por aviso · **25 filtros reales de Zonaprop** · **todo el país** (CABA, GBA, Córdoba, Mendoza, Rosario...)

**Zonaprop Argentina Real Estate Scraper** convierte las búsquedas de Zonaprop, el portal inmobiliario más grande de Argentina, en una base de datos lista para analizar. Escribí barrios o ciudades como `Palermo`, `Belgrano`, `Nordelta` o `Córdoba`, o pegá una URL de búsqueda de zonaprop.com.ar. El actor usa los mismos filtros que la web, convierte los precios con la cotización del día y puede **monitorear** una búsqueda para traerte solo lo nuevo.

| 🎯 Para quién | 💡 Para qué |
|---|---|
| Inversores, inmobiliarias y corredores, desarrolladores, tasadores, proptech, bancos, investigadores | Estudios de mercado, precio por m² por barrio, alertas de avisos nuevos, captación de dueños directos, seguimiento de bajas de precio, modelos de valuación |

### 📋 Qué hace

- 💵 **Pesos y dólares en todos los avisos:** `priceUSD` y `priceARS` calculados con el **dólar blue, MEP u oficial** del día (DolarApi), con la cotización usada en cada fila.
- 🧾 **Expensas y costo mensual total:** en alquileres, `totalMonthlyCostARS` suma alquiler + expensas en pesos.
- 📐 **Precio por m² en USD**, calculado sobre la superficie cubierta.
- 📍 **GPS, dirección, barrio y ciudad** de cada aviso.
- 📲 **WhatsApp del anunciante** cuando Zonaprop lo publica, sin costo extra.
- 🔎 **25 filtros reales de Zonaprop:**
  - Operación, tipo y subtipo (monoambiente, dúplex, PH, penthouse...).
  - Precio en USD o ARS (con o sin expensas), expensas mínimas y máximas.
  - Ambientes, dormitorios, baños, cocheras, superficie, antigüedad y disposición.
  - **Comodidades:** pileta, parrilla, gimnasio, seguridad...
  - **Requisitos:** permite mascotas, apto profesional, acepta seguro de caución o recibo de sueldo como garantía...
  - **Dueño directo**, fecha de publicación y palabra clave.
- 📉 **Orden "Bajaron de precio"** y el porcentaje que bajó cada aviso (`priceReducedPercent`).
- 👀 **Modo monitoreo:** corré la misma búsqueda todos los días y recibí solo los avisos **nuevos** y los que **cambiaron de precio**, con el precio anterior y el % de cambio.
- 🔍 **Detalle completo (opcional):** todas las comodidades, antigüedad, medios baños, dirección exacta, teléfono del anunciante, descripción completa y fecha de publicación.
- 🛡️ **Errores claros:** si Zonaprop no reconoce una ubicación, lo avisa en vez de traer avisos de todo el país.

> ℹ️ **Plan gratis de Apify:** cada corrida devuelve una muestra de hasta 10 avisos. Cualquier plan pago de Apify desbloquea todos los resultados.

### ⚙️ Input

| Campo | Qué hace |
|---|---|
| `locations` | Barrios, ciudades o provincias como aparecen en Zonaprop (Palermo, Belgrano, Nordelta, Córdoba...). |
| `operation` | `alquiler`, `venta` o `alquiler-temporal`. |
| `propertyTypes` | Departamento, casa, PH, local, oficina, terreno, cochera y más. |
| `searchUrls` | URLs de búsqueda de zonaprop.com.ar con tus filtros ya aplicados. |
| `minPrice` / `maxPrice` / `priceCurrency` | Rango de precio en USD o ARS. `includeExpensesInPrice` suma las expensas. |
| `minExpenses` / `maxExpenses` | Rango de expensas en pesos. |
| `minRooms`, `minBedrooms`, `minBathrooms`, `minParking`, `minArea`, `maxArea` | Características mínimas. |
| `antiquity`, `propertySubtypes`, `disposition` | Antigüedad, subtipo y disposición. |
| `amenities`, `propertyFeatures`, `roomTypes` | Comodidades, requisitos (mascotas, caución, apto profesional...) y ambientes especiales (balcón, terraza, suite...). |
| `publisherType` | Todos, inmobiliaria o **dueño directo**. |
| `publishedWithin`, `keyword`, `sort` | Fecha de publicación, palabra clave (el buscador de Zonaprop, que es estricto) y orden (recientes, precio, bajaron de precio). |
| `includeDetails` | Suma el detalle completo de cada aviso (costo adicional). |
| `exchangeRateType` | Dólar blue, MEP u oficial para las conversiones. |
| `monitorMode` / `monitorName` | Devuelve solo avisos nuevos y cambios de precio entre corridas. |
| `maxItems` / `maxPagesPerSearch` | Límites de la corrida. |

**Ejemplo: departamentos de 2+ ambientes en alquiler en Palermo que aceptan mascotas, hasta $1.500.000 con expensas**

```json
{
    "locations": ["Palermo"],
    "operation": "alquiler",
    "propertyTypes": ["departamento"],
    "minRooms": 2,
    "propertyFeatures": ["permite-mascotas"],
    "maxPrice": 1500000,
    "priceCurrency": "ARS",
    "includeExpensesInPrice": true
}
```

**Ejemplo: monitoreo diario de departamentos en venta de dueño directo en Belgrano con pileta**

```json
{
    "locations": ["Belgrano"],
    "operation": "venta",
    "amenities": ["pileta"],
    "publisherType": "dueno-directo",
    "monitorMode": true
}
```

**Ejemplo: las mayores bajas de precio en venta en Palermo, valuadas al dólar MEP**

```json
{
    "locations": ["Palermo"],
    "operation": "venta",
    "sort": "most_lowered_price",
    "exchangeRateType": "mep",
    "maxItems": 100
}
```

### 📊 Output

Aviso real de una corrida (sin detalle completo):

```json
{
    "imageUrl": "https://imgar.zonapropcdn.com/avisos/1/00/55/18/47/62/720x532/1950210480.jpg",
    "id": "55184762",
    "url": "https://www.zonaprop.com.ar/propiedades/clasificado/alclapin-2-amb-c-bano-toilette-totalmente-equipado-55184762.html",
    "title": "2 Amb C/ Baño + Toilette - Totalmente Equipado",
    "operationType": "Alquiler",
    "propertyType": "Departamentos",
    "price": 1450000,
    "currency": "ARS",
    "priceUSD": 924,
    "priceARS": 1450000,
    "exchangeRate": 1570,
    "exchangeRateType": "Blue",
    "expenses": 346000,
    "expensesCurrency": "ARS",
    "totalMonthlyCostARS": 1796000,
    "pricePerM2USD": 16,
    "areaTotal": 58,
    "areaCovered": 58,
    "rooms": 2,
    "bedrooms": 1,
    "bathrooms": 1,
    "orientation": "N",
    "disposition": "Frente",
    "address": "El Salvador 4100",
    "neighborhood": "Palermo",
    "city": "Capital Federal",
    "latitude": -34.5927814,
    "longitude": -58.420781000000034,
    "imageCount": 8,
    "publisherName": "Marcela Amongero Propiedades",
    "publisherType": "Inmobiliaria",
    "whatsapp": "+541164645156",
    "modifiedAt": "2026-10-20T15:18:34.000Z"
}
```

Con `includeDetails` se suman `ageYears`, `halfBathrooms`, `streetAddress`, `publisherPhone`, `publishedAt`, la descripción completa y todas las comodidades (por ejemplo "Apto crédito", "Permite mascotas", "Pileta", "Gimnasio"). En modo monitoreo cada fila trae además `isNewListing`, `previousPrice`, `priceChangePercent` y `firstSeenAt`.

Campos que pueden venir vacíos:

- `expenses` cuando el aviso no las informa.
- `whatsapp` cuando el anunciante no lo publica.
- `publisherPhone` en avisos de dueño directo, porque Zonaprop muestra solo los primeros dígitos y el actor no inventa el resto.
- `priceUSD` y `priceARS` si la cotización del día no está disponible.

En alquileres, `pricePerM2USD` es el alquiler mensual por m².

### ✨ Por qué este

- ✅ **Pesos y dólares a la cotización que elijas,** algo clave en Argentina, con la tasa usada en cada fila para que puedas recalcular.
- ✅ **Costo mensual real** (alquiler + expensas) y **precio por m² en USD** listos para comparar barrios.
- ✅ **WhatsApp incluido** en el resultado, sin pagar aparte por cada contacto.
- ✅ **Filtros que otros scrapers no tienen:** mascotas, seguro de caución, apto profesional, dueño directo, comodidades y antigüedad.
- ✅ **Monitoreo de avisos nuevos y bajas de precio** para correrlo programado todos los días.
- ✅ **Datos reales:** si un dato no está en Zonaprop, queda vacío. Nunca se inventa.

### 🚀 Cómo usarlo

1. Creá una cuenta gratis en Apify.
2. Abrí el actor, escribí los barrios o ciudades y elegí los filtros.
3. Hacé clic en **Start**.
4. Descargá los resultados o conectalos con Google Sheets, Make, Zapier, n8n o la API. Para alertas, activá el **modo monitoreo** y programalo todos los días.

### 💼 Casos de uso

- **Inversores:** comparar precio por m² en USD entre barrios y detectar las mayores bajas de precio.
- **Inmobiliarias y corredores:** captar avisos de dueño directo y seguir a la competencia.
- **Inquilinos y relocation:** filtrar por mascotas, garantías aceptadas y costo mensual total.
- **Desarrolladores y tasadores:** armar comparables con superficie, antigüedad, comodidades y ubicación.
- **Proptech y bancos:** alimentar modelos de valuación con datos frescos cada día.

### ❓ Preguntas frecuentes

**¿Qué cotización usa para convertir?** La de venta del día del dólar que elijas (blue, MEP u oficial), tomada de DolarApi. Cada fila trae `exchangeRate` y `exchangeRateType`.

**¿Cómo funciona el modo monitoreo?** La primera corrida guarda todos los avisos de tu búsqueda. Las siguientes devuelven solo los nuevos y los que cambiaron de precio. La memoria se guarda en tu cuenta de Apify y se identifica por tus filtros, o por `monitorName` si le ponés un nombre.

**¿Por qué algunos teléfonos vienen vacíos?** En avisos de dueño directo Zonaprop oculta parte del teléfono hasta iniciar sesión. El actor no devuelve números incompletos. El WhatsApp, cuando está publicado, sí viene completo.

**¿Qué ubicaciones acepta?** Las mismas del buscador de Zonaprop: barrios (Palermo, Caballito), zonas (Palermo Soho, Nordelta), ciudades (Córdoba, Rosario, Mar del Plata) y provincias.

**¿Necesito proxy?** Zonaprop protege su sitio, así que el actor usa por defecto proxy residencial de Argentina de Apify. No hace falta configurar nada.

**¿Es lento el detalle completo?** El detalle abre cada aviso, así que tarda más. La búsqueda sola ya trae precio, expensas, GPS, WhatsApp, fotos y descripción.

### 🔌 Integraciones

Funciona con la API de Apify, schedules, webhooks, Google Sheets, Make, Zapier, n8n, Slack y cualquier herramienta que lea JSON.

### 🕳️ Más de DataMole

| Actor | Qué hace |
|---|---|
| [Urbania Peru Real Estate Scraper](https://apify.com/datamole/urbania-scraper-pro) | Avisos de Urbania (Perú) con precio en soles y dólares, GPS y detalle |
| [Company Enrichment](https://apify.com/datamole/company-enrichment) | Perfil de empresa a partir de su dominio: contactos, redes y tecnologías |
| [Domain Intelligence](https://apify.com/datamole/domain-intel-scraper) | WHOIS, DNS, seguridad de email y SSL de cualquier dominio |

**¿Necesitás un campo o filtro que no está?** Abrí un issue en este actor. Leemos todo.

### ⚖️ Disclaimer

Este actor recopila información pública de zonaprop.com.ar y cotizaciones públicas de DolarApi. No está afiliado ni respaldado por Zonaprop, Navent ni DolarApi. Usá los datos de forma responsable y conforme a las leyes aplicables (incluida la Ley 25.326 de Protección de Datos Personales de Argentina) y a los términos del sitio.

# Actor input Schema

## `locations` (type: `array`):

Barrios, ciudades o provincias tal como aparecen en Zonaprop, por ejemplo Palermo, Belgrano, Nordelta, Córdoba o Mendoza. Cada una se busca por separado.

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

Alquiler, venta o alquiler temporario.

## `propertyTypes` (type: `array`):

Uno o varios tipos. Si lo dejás vacío se buscan departamentos.

## `searchUrls` (type: `array`):

Opcional. Pegá cualquier búsqueda de zonaprop.com.ar con tus filtros ya aplicados. Se recorren todas sus páginas.

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

Tope para toda la corrida. Vacío = sin tope.

## `maxPagesPerSearch` (type: `integer`):

Cada página trae 30 avisos. Vacío = todas.

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

Precio mínimo en la moneda elegida.

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

Precio máximo en la moneda elegida.

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

Moneda en la que aplicás el precio mínimo y máximo.

## `includeExpensesInPrice` (type: `boolean`):

El filtro de precio considera alquiler + expensas, como en la web de Zonaprop.

## `minExpenses` (type: `integer`):

Expensas mínimas en pesos.

## `maxExpenses` (type: `integer`):

Expensas máximas en pesos.

## `minRooms` (type: `integer`):

Cantidad mínima de ambientes, como se cuentan en Argentina.

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

Cantidad mínima de dormitorios.

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

Cantidad mínima de baños.

## `minParking` (type: `integer`):

Cantidad mínima de cocheras.

## `minArea` (type: `integer`):

Superficie cubierta mínima en metros cuadrados.

## `maxArea` (type: `integer`):

Superficie cubierta máxima en metros cuadrados.

## `antiquity` (type: `string`):

Antigüedad máxima del inmueble.

## `propertySubtypes` (type: `array`):

Por ejemplo monoambiente, dúplex o penthouse.

## `disposition` (type: `string`):

Frente, contrafrente, interior o lateral.

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

Pileta, parrilla, gimnasio, seguridad y más. Se exigen todas las elegidas.

## `propertyFeatures` (type: `array`):

Permite mascotas, apto profesional, acepta seguro de caución o recibo de sueldo como garantía, amoblado y más.

## `roomTypes` (type: `array`):

Balcón, terraza, jardín, dormitorio en suite y más.

## `publisherType` (type: `string`):

Todos, solo inmobiliarias o solo dueño directo.

## `publishedWithin` (type: `string`):

Solo avisos publicados en este período.

## `keyword` (type: `string`):

Buscador de palabras de Zonaprop. Es estricto y devuelve pocos avisos: para comodidades como pileta o quincho usá el filtro de comodidades.

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

Más recientes recorre la búsqueda completa sin repetidos. Bajaron de precio muestra primero las rebajas.

## `includeDetails` (type: `boolean`):

Abre cada aviso para sumar todas las comodidades, antigüedad, teléfono del anunciante, dirección exacta, descripción completa y fecha de publicación. Es más lento y tiene un costo adicional por aviso.

## `exchangeRateType` (type: `string`):

Cotización de venta del día (DolarApi) para calcular priceUSD, priceARS, costo mensual y precio por m² en USD.

## `monitorMode` (type: `boolean`):

Recuerda los avisos entre corridas y devuelve solo los nuevos y los que cambiaron de precio, con el precio anterior y el % de cambio. La primera corrida devuelve todo.

## `monitorName` (type: `string`):

Opcional. Usá el mismo nombre para que distintas configuraciones compartan la memoria. Vacío = se identifica por los filtros.

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

Zonaprop exige IP residencial de Argentina. Dejalo como está.

## Actor input object example

```json
{
  "locations": [
    "Palermo"
  ],
  "operation": "alquiler",
  "propertyTypes": [
    "departamento"
  ],
  "priceCurrency": "USD",
  "includeExpensesInPrice": false,
  "publisherType": "todos",
  "sort": "more_recent",
  "includeDetails": false,
  "exchangeRateType": "blue",
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AR"
  }
}
```

# 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 = {
    "locations": [
        "Palermo"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datamole/zonaprop-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 = {
    "locations": ["Palermo"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("datamole/zonaprop-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 '{
  "locations": [
    "Palermo"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AR"
  }
}' |
apify call datamole/zonaprop-scraper --silent --output-dataset

```

## MCP server setup

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