# Zonaprop Scraper (`solidcode/zonaprop-scraper`) Actor

\[💰 $0.9 / 1K] Extract real estate listings from Zonaprop, Argentina's largest property marketplace. Search by location, transaction type, property type, price range, bedrooms, and more. Returns listings with prices in ARS and USD, photos, amenities, and contact info.

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

## Pricing

from $0.90 / 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.

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

## Zonaprop Scraper

Pull real estate listings from Zonaprop — Argentina's largest property marketplace — at scale, with dual-currency prices (ARS and USD), GPS coordinates, publisher contact details, and full property specs for every for-sale, long-term-rent, and temporary-rent listing across the country. Built for real estate investors, brokerage analysts, and relocation consultants who need a clean, structured Argentine property dataset without hand-building search URLs or stitching together pesos and dollar listings.

### Why This Scraper?

- **Dual-currency pricing on every listing** — both `priceArs` and `priceUsd` captured separately, plus monthly `expensesArs` (expensas) and the originally posted currency. No collapsed single-price field, no dollar/peso guesswork.
- **11 property types covered** — Apartment, House, PH, Land, Office, Commercial, Garage, Warehouse, Country / Gated Community, Hotel, and full Building. Multi-select to fan out across categories in one run.
- **Three transaction modes in one actor** — Buy (Venta), long-term Rent (Alquiler), and Temporary furnished Rent (Alquiler Temporal). Flip a single dropdown.
- **Full publisher contact block** — agency name, WhatsApp number (digits-only, ready for click-to-chat links), public profile URL, and agency-vs-particular flag on every row. One-shot lead list for any barrio.
- **GPS coordinates wherever Zonaprop publishes them** — latitude and longitude pulled straight from the listing geolocation, ready to plot on a map or feed into a heatmap. Coverage is effectively complete in CABA and Gran Buenos Aires; sparser in interior land and special-use listings.
- **National coverage from CABA to Patagonia** — search any Argentine barrio, city, or province by name (e.g. "Palermo", "Mar del Plata", "Mendoza"), or paste any Zonaprop search URL and every filter in the slug carries over.
- **Half-bath precision** — bathrooms returned as a float (1.0, 1.5, 2.5) to match how Zonaprop displays them, not floored to integer.
- **A-estrenar and condition tags surfaced** — "A estrenar" (brand-new), "Usado", and "En construcción" exposed as their own field so you can isolate new builds vs resale stock.
- **Up to 8 high-resolution photos per listing** — zonapropcdn URLs at 720×532 ready for thumbnail grids and image pipelines.

### Use Cases

**Real Estate Investment**

- Compare USD asking prices across Buenos Aires barrios for cap-rate underwriting
- Track new-build (A estrenar) inventory by neighborhood for off-plan opportunity sourcing
- Pull rental yields by combining `priceUsd` (sale) and `priceUsd` (alquiler) at the same address

**Brokerage Intelligence**

- Map competitor inventory across CABA, Gran Buenos Aires, and the interior
- Identify which agencies dominate a given barrio with publisher-name aggregation
- Track listing velocity by re-running the same search and comparing `lastUpdatedAt`

**Relocation Services**

- Build a curated apartment list for an inbound expat with bedroom, bathroom, and area filters
- Surface temporary-furnished options (Alquiler Temporal) for stays under six months
- Combine ARS and USD pricing in one view for clients comparing local vs imported rates

**Market Research**

- Aggregate per-square-meter pricing by province for macro Argentine real estate trends
- Track expensas (monthly building fees) growth across CABA neighborhoods
- Monitor commercial inventory (Local, Oficina, Galpón) for retail and logistics analysts

**Lead Generation**

- Build agency contact lists with WhatsApp numbers ready for cold outreach
- Identify "particular" (FSBO) listings by filtering `publisherType` for direct-to-owner contact
- Power CRM imports with publisher profile URLs and agency websites

### Getting Started

#### Apartments for Sale in Capital Federal

The simplest run — defaults to apartments for sale in CABA, 100 results:

```json
{
    "location": "Capital Federal",
    "maxResults": 100
}
```

#### Houses for Rent in Palermo Under USD 2,000

```json
{
    "location": "Palermo",
    "transactionType": "alquiler",
    "propertyTypes": ["casa", "ph"],
    "currency": "USD",
    "priceMax": 2000,
    "maxResults": 200
}
```

#### Investment Apartments — 2+ Bedrooms, 50–100 m², USD 100k–300k

```json
{
    "location": "Capital Federal",
    "transactionType": "venta",
    "propertyTypes": ["departamento"],
    "currency": "USD",
    "priceMin": 100000,
    "priceMax": 300000,
    "bedroomsMin": 2,
    "coveredAreaMin": 50,
    "coveredAreaMax": 100,
    "maxResults": 500
}
```

#### Use a Zonaprop URL Directly

Paste any search URL — every filter in the slug is preserved:

```json
{
    "startUrls": [
        "https://www.zonaprop.com.ar/departamentos-venta-palermo-3-habitaciones.html"
    ],
    "maxResults": 300
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Paste one or more Zonaprop search URLs directly. Filters built into the URL (price, rooms, type) are honored automatically. When provided, these override the Location and filter fields below. |
| `location` | string | `"Capital Federal"` | Free-text location: a barrio, city, or province in Argentina — e.g. "Palermo", "Capital Federal", "Mar del Plata", "Córdoba". Ignored when Start URLs are provided. |

#### Search Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `transactionType` | select | `Buy (Venta)` | Buy, Rent, or Temporary Rent. Maps to Zonaprop's venta / alquiler / alquiler-temporal. |
| `propertyTypes` | select\[] | `[]` (all) | Multi-select from 11 types — Apartment, House, PH, Land, Office, Commercial, Garage, Warehouse, Country / Gated Community, Hotel, Building. Leave empty for all. |

#### Price

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `currency` | select | `Argentine Peso (ARS)` | Currency the price filter is in — Zonaprop publishes most listings in both ARS and USD. |
| `priceMin` | integer | (none) | Minimum price in the chosen currency. |
| `priceMax` | integer | (none) | Maximum price in the chosen currency. |

#### Rooms & Size

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `bedroomsMin` | integer (0–10) | (none) | Minimum number of bedrooms (dormitorios). |
| `bathroomsMin` | integer (0–10) | (none) | Minimum number of bathrooms. |
| `coveredAreaMin` | integer (m²) | (none) | Minimum covered area in square meters. |
| `coveredAreaMax` | integer (m²) | (none) | Maximum covered area in square meters. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum total listings to return across all searches and URLs. Set to 0 to collect every available result. Tip: start with 50–200 to test, then increase. |

### Output

One flat row per listing — easy to drop straight into a spreadsheet or database. Here's a representative result:

```json
{
    "listingId": "59026595",
    "url": "https://www.zonaprop.com.ar/propiedades/clasificado/alclapin-departamento-en-nunez-venta-59026595.html",
    "title": "Departamento en Nuñez Venta",
    "description": "Departamento en el barrio de Nuñez, 2 ambientes...",
    "transactionType": "alquiler",
    "propertyType": "Apartment",
    "priceArs": null,
    "priceUsd": 790.0,
    "priceDisplayCurrency": "USD",
    "expensesArs": 150000.0,
    "address": "Amenabar al 3200",
    "neighborhood": "Núñez",
    "city": "Capital Federal",
    "province": "Buenos Aires",
    "latitude": -34.553517,
    "longitude": -58.4673992,
    "totalAreaM2": 45,
    "coveredAreaM2": 35,
    "rooms": 2,
    "bedrooms": 1,
    "bathrooms": 1.0,
    "parkingSpaces": null,
    "age": "18",
    "condition": "usado",
    "amenities": [],
    "photos": [
        "https://imgar.zonapropcdn.com/avisos/1/00/59/02/65/95/720x532/2050540556.jpg",
        "https://imgar.zonapropcdn.com/avisos/1/00/59/02/65/95/720x532/2050540578.jpg"
    ],
    "videos": [],
    "publisherName": "Diego Pablo Novello Bienes Raíces",
    "publisherType": "agency",
    "publisherPhone": null,
    "publisherWhatsapp": "541126885078",
    "publisherWebsite": null,
    "publisherUrl": "https://www.zonaprop.com.ar/inmobiliarias/diego-pablo-novello-bienes-raices_30040503-inmuebles.html",
    "publishedAt": "2018-05-28T03:00:00+00:00",
    "lastUpdatedAt": "2026-05-05T00:00:00-0400",
    "scrapedAt": "2026-05-09T13:51:42.572897+00:00"
}
```

A note on nulls: every field below marked **Yes** under "Nullable?" can be `null` or empty when Zonaprop omits the data on a particular listing. Always defensive-check these on the consumer side. Always-present fields are marked **No**.

#### Core Fields

| Field | Type | Nullable? | Description |
|-------|------|-----------|-------------|
| `listingId` | string | No | Zonaprop posting ID — stable across runs, use for deduplication. |
| `url` | string | No | Public listing URL on zonaprop.com.ar. |
| `title` | string | Yes | Listing title as displayed on Zonaprop (rare cases use `generatedTitle`). |
| `description` | string | Yes | Full posting description in Spanish. Some listings have only a title. |
| `transactionType` | string | No | `venta` / `alquiler` / `alquiler-temporal`. |
| `propertyType` | string | No | Apartment, House, PH, Land, Office, Commercial, Garage, Warehouse, Country, Hotel, Building. |

#### Pricing

| Field | Type | Nullable? | Description |
|-------|------|-----------|-------------|
| `priceArs` | number | Yes | Price in Argentine pesos. `null` when the listing is posted only in USD. |
| `priceUsd` | number | Yes | Price in US dollars. `null` when the listing is posted only in ARS. |
| `priceDisplayCurrency` | string | No | The currency the listing actually advertises in (`ARS` or `USD`). |
| `expensesArs` | number | Yes | Monthly building expenses (expensas), in ARS. `null` when not advertised. |

#### Location

| Field | Type | Nullable? | Description |
|-------|------|-----------|-------------|
| `address` | string | Yes | Street and number when published; many listings only expose neighborhood-level. |
| `neighborhood` | string | Yes | Barrio (e.g. Palermo, Recoleta, Núñez). |
| `city` | string | Yes | City (e.g. Capital Federal, Tigre, Rosario). |
| `province` | string | Yes | Province (e.g. Buenos Aires, Córdoba, Mendoza). |
| `latitude` | number | Yes | Listing latitude. Effectively always present in CABA / GBA, sparser elsewhere. |
| `longitude` | number | Yes | Listing longitude. Paired with `latitude` (both or neither). |

#### Property Specs

| Field | Type | Nullable? | Description |
|-------|------|-----------|-------------|
| `totalAreaM2` | number | Yes | Total area in square meters. |
| `coveredAreaM2` | number | Yes | Covered area in square meters. |
| `rooms` | integer | Yes | Number of rooms (ambientes). |
| `bedrooms` | integer | Yes | Number of bedrooms (dormitorios). |
| `bathrooms` | number | Yes | Number of bathrooms — float to support 1.5, 2.5. |
| `parkingSpaces` | integer | Yes | Number of garage / parking spaces. `null` for units without parking. |
| `age` | string | Yes | "A estrenar" / "1 año" / "5 a 10 años" — Zonaprop's antigüedad bucket. |
| `condition` | string | Yes | Listing condition (`a estrenar`, `usado`, `en construcción`). |
| `amenities` | string\[] | No | Always returned. Empty list (`[]`) when the search payload doesn't carry amenities. |

#### Publisher Contact

| Field | Type | Nullable? | Description |
|-------|------|-----------|-------------|
| `publisherName` | string | Yes | Inmobiliaria or particular's display name. |
| `publisherType` | string | Yes | `agency` or `particular`. |
| `publisherPhone` | string | Yes | Publisher phone number. Often `null` — most agencies route through WhatsApp. |
| `publisherWhatsapp` | string | Yes | WhatsApp number, digits-only, ready for `wa.me/` links. `null` for "particular" listings without WhatsApp. |
| `publisherWebsite` | string | Yes | Publisher's external website URL. Generally `null` — search payload doesn't expose it. |
| `publisherUrl` | string | Yes | Publisher's profile page on zonaprop.com.ar. `null` for FSBO. |

#### Media & Timestamps

| Field | Type | Nullable? | Description |
|-------|------|-----------|-------------|
| `photos` | string\[] | No | Photo URLs (high-resolution, up to 8 per listing). Empty list when none uploaded. |
| `videos` | string\[] | No | Always returned. Empty list (`[]`) — search payload doesn't expose videos. |
| `publishedAt` | string | Yes | Original publish time as ISO 8601 UTC. `null` when Zonaprop didn't ship a timestamp. |
| `lastUpdatedAt` | string | Yes | Last update timestamp from Zonaprop. |
| `scrapedAt` | string | No | ISO 8601 timestamp of when this row was captured. |

### Tips for Best Results

- **Pick the currency that matches your filter** — set `currency: "USD"` for sale listings (most CABA sales are dollar-denominated) and `currency: "ARS"` for long-term rents (almost always in pesos). The dataset always returns both `priceArs` and `priceUsd` when posted, regardless of which currency you filtered on.
- **`country` means rural estate, not nationality** — the `country` property type is Zonaprop's term for gated communities and rural ranches (quintas), not a country-of-residence filter.
- **Paste a Zonaprop URL to inherit every filter** — copy a search URL from your browser address bar after applying filters in the UI. Every slug filter (price ranges, rooms, type) carries over and you skip the input-form work entirely.
- **Use `bedroomsMin: 5` for "5 or more"** — Zonaprop's slug grammar caps exact bedroom matching at 4 and switches to "más de 5" beyond that. The actor handles this automatically.
- **Combine `propertyTypes` for multi-category sweeps** — picking `["departamento", "casa", "ph"]` returns all three home categories (apartment, house, PH) in one run, deduplicated.
- **Multi-type + price/area filters: run separate searches per type** — when `priceMin`, `priceMax`, `coveredAreaMin`, or `coveredAreaMax` is set together with two or more `propertyTypes`, the result is limited to the first type (Zonaprop's filter API only accepts one type at a time when prices are involved). Run one search per property type for full coverage.
- **Start small, then scale** — set `maxResults` to 30–100 on your first run to verify the data matches your needs, then bump to thousands.
- **`expensas` are almost always ARS** — the `expensesArs` field captures monthly building fees in pesos. There is no `expensesUsd` field because Zonaprop publishers virtually never post expenses in dollars.

### Pricing

**$0.90 per 1,000 listings** — pay-per-result, 10% under the next-cheapest Zonaprop actor on Apify.

| Listings | Cost |
|----------|------|
| 100 | $0.09 |
| 1,000 | $0.90 |
| 10,000 | $9.00 |
| 100,000 | $90.00 |

**No compute charges — you only pay per listing returned.** A "listing" is any property row in the output dataset. Platform storage fees are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate real estate research, market analysis, and lead generation. Users are responsible for complying with applicable laws and Zonaprop's Terms of Service. Do not use extracted data for spam, harassment, or any illegal purpose. Be mindful of personal data and consumer protection regulations (Ley 25.326 in Argentina, GDPR for EU residents) when processing publisher contact information.

# Actor input Schema

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

Paste one or more Zonaprop search URLs directly (e.g. https://www.zonaprop.com.ar/departamentos-venta-palermo.html). Filters built into the URL (price, rooms, type) are honored automatically. When provided, these override the Location and filter fields below.

## `location` (type: `string`):

Free-text location: a barrio, city, or province in Argentina — e.g. 'Palermo', 'Capital Federal', 'Mar del Plata', 'Córdoba'. Ignored when Start URLs are provided.

## `transactionType` (type: `string`):

What you want — properties for sale, long-term rent, or temporary rent (Zonaprop calls these venta, alquiler, and alquiler temporal).

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

Property types to include. Leave empty for all types.

## `currency` (type: `string`):

Currency for the price-range filter below. Zonaprop publishes most listings in both ARS and USD — pick the one your filter range is in.

## `priceMin` (type: `integer`):

Only include listings at or above this price (in the currency you picked above). Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only include listings at or below this price (in the currency you picked above). Leave empty for no maximum.

## `bedroomsMin` (type: `integer`):

Only include listings with at least this many bedrooms (dormitorios). Zonaprop groups 5+ bedrooms into a single bucket — selecting 5 or higher returns the same set. Leave empty for any.

## `bathroomsMin` (type: `integer`):

Only include listings with at least this many bathrooms. Zonaprop groups 1+ bathrooms ('mas-de-1-bano') and 2+, 3+, etc. — values above 10 are not supported. Leave empty for any.

## `coveredAreaMin` (type: `integer`):

Only include listings with at least this much covered area, in square meters. Leave empty for no minimum.

## `coveredAreaMax` (type: `integer`):

Only include listings with at most this much covered area, in square meters. Leave empty for no maximum.

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

Maximum total listings to return across all searches and URLs. Set to 0 to collect every available result. Tip: start with 50–200 to test, then increase.

## Actor input object example

```json
{
  "startUrls": [],
  "location": "Capital Federal",
  "transactionType": "venta",
  "propertyTypes": [],
  "currency": "ARS",
  "maxResults": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped listings with key columns — price, location, rooms, area.

## `details` (type: `string`):

Full details of each listing including amenities, publisher contact, photos, and coordinates.

# 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": [],
    "location": "Capital Federal",
    "transactionType": "venta",
    "propertyTypes": [],
    "currency": "ARS",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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": [],
    "location": "Capital Federal",
    "transactionType": "venta",
    "propertyTypes": [],
    "currency": "ARS",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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": [],
  "location": "Capital Federal",
  "transactionType": "venta",
  "propertyTypes": [],
  "currency": "ARS",
  "maxResults": 10
}' |
apify call solidcode/zonaprop-scraper --silent --output-dataset

```

## MCP server setup

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