# Zonaprop Scraper - Argentina Real Estate Listings & Leads (`haketa/zonaprop-scraper`) Actor

Scrape Zonaprop Argentina real estate listings. Extract price (USD/ARS), expenses, surface m2, rooms, bedrooms, bathrooms, address and neighborhood, property type, agency name, WhatsApp/phone contact and photos by search URL. Export JSON, CSV, Excel.

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

## Pricing

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

# README

## Zonaprop Scraper — Argentina Real Estate Listings, Prices & Agency Leads

> **The most complete Zonaprop data extractor on Apify.** Pull live property listings from **Zonaprop — Argentina's #1 real estate marketplace** — with price in **USD or ARS**, expenses, surface m², rooms, bedrooms, bathrooms, full address and neighborhood, property type, the **listing agency**, its **WhatsApp/phone contact**, and every photo. Built for market analysis, price benchmarking, investment research and real-estate lead generation.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/zonaprop-scraper)
[![Live Data](https://img.shields.io/badge/Data-Live%20at%20Run%20Time-orange)]()
[![Pricing](https://img.shields.io/badge/Pricing-Pay%20Per%20Result-yellow)]()
[![Region](https://img.shields.io/badge/Region-Argentina%20%F0%9F%87%A6%F0%9F%87%B7-red)]()
[![Coverage](https://img.shields.io/badge/Coverage-70K%2B%20Listings%2FSearch-purple)]()
[![Leads](https://img.shields.io/badge/Includes-Agency%20%26%20WhatsApp-success)]()
[![Sale & Rent](https://img.shields.io/badge/Venta%20%26%20Alquiler-USD%20%2F%20ARS-brightgreen)]()
[![No Auth](https://img.shields.io/badge/Auth-None%20Required-success)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%C2%B7%20CSV%20%C2%B7%20Excel-lightgrey)]()

***

### 🎯 What this actor does

The **Zonaprop Scraper** extracts live real estate listings from **zonaprop.com.ar** — the largest property portal in Argentina, covering apartments, houses, PH, offices, land and more, for sale (**venta**) and rent (**alquiler**) across Buenos Aires (Capital Federal), Gran Buenos Aires and every province. Paste a Zonaprop search URL and it returns **every listing across all result pages**, one clean row per property.

Each listing arrives fully structured — including the **agency** that published it and its **WhatsApp/phone contact**, making this actor as useful for real-estate lead generation as it is for market and price analysis.

Each record can include:

- 💰 **Price** — amount and currency (**USD** or **ARS**) plus monthly **expenses** (expensas)
- 🏷️ **Operation & type** — Venta / Alquiler and Departamento / Casa / PH / etc.
- 📐 **Features** — total and covered m², ambientes (rooms), dormitorios, baños, cocheras, antigüedad
- 📍 **Location** — street address, neighborhood (barrio), city and province
- 🏢 **Agency lead** — publisher name, agency page URL and **WhatsApp/phone contact**
- 📸 **Media** — every listing photo, with count
- 📝 **Description** — full listing text (optional)
- 🕒 **Metadata** — listing URL and `scrapedAt` timestamp on every row

Whether you run a proptech product, an investment fund, a brokerage or a market-research team, this actor is the **fastest path from Zonaprop to a usable dataset** — no scraping code required.

***

### ✨ Why this actor

| ✅ This actor handles | ❌ What you'd fight doing it yourself |
|---|---|
| **All result pages** — every listing in a search | Searches have tens of thousands of listings across thousands of pages |
| **Agency + WhatsApp contact** extracted | Contact details are buried in the page state |
| **USD & ARS prices** + expenses | Argentine listings mix currencies and formats |
| **Structured m² / rooms / location** | Features are nested and inconsistently labeled |
| **Neighborhood → city → province** hierarchy | Location is a nested tree that needs walking |
| **Clean deduplicated rows** | Listings repeat across pages and need de-duping |
| **JSON / CSV / Excel export** | Raw data needs reshaping for analysis |

***

### 🚀 Quick start

#### One-click run

1. Open the actor on the [Apify Store](https://apify.com/haketa/zonaprop-scraper) and click **Try for free**
2. On **zonaprop.com.ar**, build your search (operation, property type, location, filters) and copy the URL — e.g. `https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html`
3. Paste it into **Search URLs**, set **Max listings** (`0` for unlimited)
4. Hit **Start** — listings stream into your dataset, ready to export as JSON, CSV, Excel, HTML or RSS

#### Run via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "startUrls": [
        "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
    ],
    "maxItems": 500,
    "includeDescription": True,
}

run = client.actor("haketa/zonaprop-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["priceAmount"], item["priceCurrency"], item["neighborhood"], "|", item["publisherName"])
```

#### Run via API (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/zonaprop-scraper').call({
    startUrls: ['https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html'],
    maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

***

### ⚙️ Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `startUrls` | array | – | Zonaprop search/listing URLs. Every listing across all result pages is collected. |
| `maxItems` | integer | `200` | Max listings across all searches. `0` = unlimited. |
| `includeDescription` | boolean | `true` | Include each listing's full text description. |
| `proxyConfiguration` | object | Residential AR | Proxy settings — Argentina residential proxy required and enabled by default. |

#### 📋 How to build a search URL

1. Go to **zonaprop.com.ar** and choose operation (Venta / Alquiler), property type and location
2. Apply any filters (price, m², rooms…)
3. Copy the address-bar URL — e.g. `.../casas-alquiler-gran-buenos-aires.html`
4. Paste it into **Search URLs**. Add as many searches as you like.

***

### 📤 Output

One clean record per listing:

```json
{
  "postingId": "59719191",
  "title": "Venta Depto 1 Amb en Almagro a Estrenar Amenities",
  "operationType": "Venta",
  "propertyType": "Departamentos",
  "priceAmount": "89000",
  "priceCurrency": "USD",
  "expensesAmount": "0",
  "expensesCurrency": "ARS",
  "surfaceTotal": "35 m²",
  "surfaceCovered": "31 m²",
  "rooms": "1",
  "bedrooms": "",
  "bathrooms": "1",
  "garages": "",
  "age": "",
  "address": "Avenida Corrientes 3400",
  "neighborhood": "Almagro",
  "city": "Capital Federal",
  "province": "",
  "publisherName": "RE/MAX Premium",
  "publisherId": "17011992",
  "publisherUrl": "https://www.zonaprop.com.ar/inmobiliarias/re-max-premium_17011992-inmuebles.html",
  "whatsApp": "54 1123845522",
  "imageCount": "8",
  "images": "https://imgar.zonapropcdn.com/... | ...",
  "description": "...",
  "url": "https://www.zonaprop.com.ar/propiedades/clasificado/...-59719191.html",
  "scrapedAt": "2026-08-11T09:31:36.532Z"
}
```

#### 🏠 Fields

| Field | Description |
|-------|-------------|
| `postingId` · `title` · `url` | Listing ID, title and detail-page URL |
| `operationType` | 🏷️ Venta (sale) or Alquiler (rent) |
| `propertyType` | Departamento, Casa, PH, Oficina… |
| `priceAmount` · `priceCurrency` | 💰 Price and currency (USD / ARS) |
| `expensesAmount` · `expensesCurrency` | Monthly expenses (expensas) |
| `surfaceTotal` · `surfaceCovered` | 📐 Total and covered m² |
| `rooms` · `bedrooms` · `bathrooms` · `garages` | Ambientes, dormitorios, baños, cocheras |
| `age` | Antigüedad (years) |
| `address` · `neighborhood` · `city` · `province` | 📍 Full location hierarchy |
| `publisherName` · `publisherId` · `publisherUrl` | 🏢 Listing agency (lead) |
| `whatsApp` | 📱 Agency WhatsApp/phone contact |
| `imageCount` · `images` | 📸 Photo count and URLs ( `|` separated) |
| `description` | Full listing description |

Export everything to **JSON, CSV, Excel, HTML or RSS**, or pull it through the Apify API and integrations.

***

### 💡 Use cases

| Use case | How this actor helps |
|----------|----------------------|
| 📊 **Price & market analysis** | Track asking prices and expenses by neighborhood, m² and property type across Argentina. |
| 💼 **Real-estate lead generation** | Collect listing agencies with WhatsApp/phone contacts for outreach and CRM. |
| 🏦 **Investment research** | Spot undervalued areas, rental yields and inventory trends in USD and ARS. |
| 🏢 **Proptech & portals** | Enrich your own product with structured Zonaprop inventory. |
| 📈 **Competitive intelligence** | Monitor which agencies dominate which neighborhoods and how listings move. |
| 🤖 **ML / analytics pipelines** | Build clean datasets of prices, features and locations for models. |

***

### ❓ FAQ

**How many listings can I get?**
Every listing in a search. Set `maxItems` to `0` for unlimited — a single Zonaprop search can have tens of thousands of listings across thousands of pages.

**Does it include agency contact details?**
Yes. Each listing carries the publishing agency name, its Zonaprop page, and a WhatsApp/phone number where available.

**Are prices in USD or ARS?**
Both — the actor returns the exact `priceAmount` and `priceCurrency` (USD or ARS) as published, plus monthly expenses.

**Can I scrape both sale and rent?**
Yes. Paste a Venta URL, an Alquiler URL, or several of each — the actor handles all of them in one run.

**Do I need a proxy?**
Yes — an Argentina residential proxy is required and enabled by default.

**Which export formats are supported?**
JSON, CSV, Excel, HTML and RSS, plus programmatic access via the Apify API and integrations (Google Sheets, Zapier, Make, Airbyte and more).

***

### 🔗 Integrations

Send results wherever you work: **Google Sheets / Excel**, **Zapier · Make · n8n**, **Airbyte / databases / webhooks**, and the **Apify API** for any language.

***

### ⚖️ Legal & responsible use

This actor collects **publicly available** real estate listing information — the same content any visitor can see on a search page without logging in. It does not access private data and does not require any user account.

You are responsible for how you use the data. Please:

- Use the output for lawful purposes such as market research, analytics and lead generation.
- Respect the source platform's Terms of Service and robots directives.
- Comply with applicable data-protection laws (e.g. GDPR, Argentina's PDPA) when handling personal or contact data — and with marketing/anti-spam rules when contacting agencies.
- Do not republish scraped content in a way that infringes copyright or database rights.

*This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zonaprop or Navent. All product names, logos and brands are property of their respective owners.*

***

### 🛟 Support

Need an extra field or hit a search that won't parse? Open an issue from the actor's **Issues** tab and we'll take a look.

# Actor input Schema

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

Paste Zonaprop search/listing URLs. Build the search on zonaprop.com.ar (operation, property type, location, filters) and copy the URL — e.g. https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html. The scraper collects every listing across all result pages.

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

Maximum number of listings to collect across all search URLs. Set to 0 for unlimited (a search can have tens of thousands).

## `includeDescription` (type: `boolean`):

Include each listing's full text description. Turn off for a lighter, faster dataset.

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

Proxy configuration. Residential proxy (Argentina) is required and enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
  ],
  "maxItems": 200,
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AR"
  }
}
```

# Actor output Schema

## `postingId` (type: `string`):

Zonaprop listing ID

## `title` (type: `string`):

Listing title

## `operationType` (type: `string`):

Venta / Alquiler

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

Departamento, Casa, PH...

## `priceAmount` (type: `string`):

Price amount

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

Price currency (USD / ARS)

## `expensesAmount` (type: `string`):

Monthly expenses (expensas)

## `expensesCurrency` (type: `string`):

Expenses currency

## `surfaceTotal` (type: `string`):

Total surface in m²

## `surfaceCovered` (type: `string`):

Covered surface in m²

## `rooms` (type: `string`):

Ambientes

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

Dormitorios

## `bathrooms` (type: `string`):

Baños

## `garages` (type: `string`):

Cocheras

## `age` (type: `string`):

Antigüedad (years)

## `address` (type: `string`):

Street address

## `neighborhood` (type: `string`):

Barrio

## `city` (type: `string`):

City / partido

## `province` (type: `string`):

Province / region

## `publisherName` (type: `string`):

Publishing agency name

## `publisherId` (type: `string`):

Agency ID

## `publisherUrl` (type: `string`):

Agency page URL

## `whatsApp` (type: `string`):

Contact WhatsApp/phone number

## `imageCount` (type: `string`):

Number of photos

## `images` (type: `string`):

Photo URLs ( | separated)

## `description` (type: `string`):

Listing description

## `url` (type: `string`):

Listing detail page URL

## `scrapedAt` (type: `string`):

Extraction timestamp

# 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 = {
    "startUrls": [
        "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
    ],
    "maxItems": 200,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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 = {
    "startUrls": ["https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"],
    "maxItems": 200,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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 '{
  "startUrls": [
    "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
  ],
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AR"
  }
}' |
apify call haketa/zonaprop-scraper --silent --output-dataset

```

## MCP server setup

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