# Zonaprop Argentina Property Scraper (`parsebird/zonaprop-scraper`) Actor

Scrape Zonaprop.com.ar real estate listings by URL or search filters: price, surface, rooms, features, location, coordinates, publisher, photos, and WhatsApp contact. Export to JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/zonaprop-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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 Argentina Property Scraper

Extract real estate listings from **[Zonaprop.com.ar](https://www.zonaprop.com.ar/)**, Argentina's largest property portal, without writing a single line of scraping code. Paste a Zonaprop search URL — or build a search from simple filters — and get structured data on price, surface, rooms, location, publisher, photos, and WhatsApp contact for every listing.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Scrape any Zonaprop.com.ar search results page or individual listing URL — price, m², rooms, bathrooms, coordinates, publisher, and photos come out as clean, ready-to-use JSON, CSV, or Excel rows.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Use the Apify actor `parsebird/zonaprop-scraper` via `ApifyClient` — example: `client.actor("parsebird/zonaprop-scraper").call(run_input={"startUrls":[{"url":"https://www.zonaprop.com.ar/departamentos-venta-palermo.html"}],"maxItems":100})` — key inputs are `startUrls` (array of Zonaprop search or clasificado URLs), `maxItems` (integer, default 100), `fetchDetailPage` (boolean, default false), and the `filterOperation`/`filterPropertyType`/`filterPriceMin`/`filterPriceMax`/`filterBedroomsMin`/`filterBathroomsMin`/`filterLocation` fields to build a search without a URL — output rows have `source: "zonaprop_listing"` with `priceAmount`, `priceCurrency`, `totalAreaM2`, `coveredAreaM2`, `rooms`, `bedrooms`, `bathrooms`, `locationName`, `latitude`/`longitude`, `publisherName`, `whatsApp`, `pictureUrls`, and `propertyUrl` — full API spec at `https://apify.com/parsebird/zonaprop-scraper/api` and get a token at `https://console.apify.com/account/integrations`.

### What does Zonaprop Argentina Property Scraper do?

**Zonaprop Argentina Property Scraper** pulls structured data out of Zonaprop.com.ar, the Navent-owned property portal that covers sale, rental, and short-term rental (alquiler temporal) listings across Argentina — Capital Federal, GBA, Córdoba, Rosario, and beyond. It works as a **Zonaprop API alternative**: no account, no manual copy-pasting, no browser extension.

- 🔗 **URL mode** — paste any Zonaprop search-results URL (with whatever filters you already applied on the site) or a direct listing (`/propiedades/clasificado/...`) URL, and the actor collects every listing it shows, across pages.
- 🔍 **Filter mode** — skip the URL entirely and build a search from simple fields: operation (venta/alquiler/alquiler temporal), property type, price range and currency, bedrooms, bathrooms, covered area, garages, agency-only listings, and how recently the listing was published.
- 📍 **Rich per-listing data** — price, surface (total and covered), rooms, bedrooms, bathrooms, garages, age, address, neighborhood/city/province hierarchy, latitude/longitude, publisher name and WhatsApp number, photo URLs, and Zonaprop's own feature tags — all pulled from the same data the site itself renders, no separate detail-page scrape needed for most fields.
- 📄 **Optional detail-page fetch** — turn on `fetchDetailPage` to also open each listing's own page for its meta title/description.
- ⏱️ **Automation-ready** — run it on a schedule, trigger it via the Apify API, or wire it into Make, Zapier, or n8n to monitor new Zonaprop listings automatically.
- 📤 **Export anywhere** — download results as JSON, CSV, Excel, or HTML table straight from the Apify Console, or pull them via API/webhook.

### What data can you extract from Zonaprop?

| Field | Description |
|-------|-------------|
| `title`, `description` | Listing headline and full description text |
| `priceAmount`, `priceCurrency`, `priceFormatted` | Price and currency (USD or ARS) |
| `operationName` | Venta, Alquiler, or Alquiler temporal |
| `totalAreaM2`, `coveredAreaM2` | Total and covered surface in m² |
| `rooms`, `bedrooms`, `bathrooms`, `garages` | Room counts |
| `ageYears`, `antiquity` | Property age |
| `address`, `locationName`, `locationChain` | Street address and neighborhood → city → province hierarchy |
| `latitude`, `longitude` | Geolocation |
| `publisherName`, `publisherType`, `whatsApp` | Agency/owner name, type, and WhatsApp contact number |
| `pictureUrls`, `additionalPicturesCount` | Photo URLs |
| `propertyUrl` | Canonical public listing URL |
| `mainFeatures`, `generalFeatures`, `highlightedFeatures` | Zonaprop's own structured feature tags (disposición, orientation, amenities, etc.) |

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| startUrls | array | One of startUrls/filterOperation | — | Zonaprop search or clasificado (listing) URLs |
| maxItems | integer | No | 100 | Maximum listing rows to save |
| fetchDetailPage | boolean | No | false | Also fetch each listing's own page for meta title/description |
| filterOperation | string | One of startUrls/filterOperation | — | venta / alquiler / alquiler-temporal — activates filter-based search |
| filterPropertyType | string | No | departamentos | departamentos / casas / ph / terrenos / locales-comerciales |
| filterLocation | string | No | — | Free-text city/neighborhood, matched client-side against results |
| filterPriceMin / filterPriceMax | integer | No | — | Price range |
| filterPriceCurrency | string | No | — | USD or ARS |
| filterBedroomsMin | integer | No | — | Minimum bedrooms |
| filterBathroomsMin | integer | No | — | Minimum bathrooms (1–5) |
| filterGaragesMin | integer | No | — | Minimum garages (0–4) |
| filterCoveredAreaMin / filterCoveredAreaMax | integer | No | — | Covered area range, m² |
| filterAgenciesOnly | boolean | No | false | Only agency-published listings |
| filterPublishedWithin | string | No | — | today / yesterday / week / 15days / 30days / 45days |
| maxPages | integer | No | 50 | Max result pages per search (30 listings/page) |
| proxy | object | No | RESIDENTIAL, country AR | Apify proxy configuration |

### Output example

```json
{
    "source": "zonaprop_listing",
    "listingId": "60126728",
    "title": "Venta Departamento 3 Ambientes con Cochera Altos Porteños",
    "propertyUrl": "https://www.zonaprop.com.ar/propiedades/clasificado/veclapin-venta-departamento-3-ambientes-con-cochera-altos-60126728.html",
    "realEstateType": "Departamentos",
    "operationName": "Venta",
    "priceAmount": 195000,
    "priceCurrency": "USD",
    "priceFormatted": "195.000",
    "totalAreaM2": "62",
    "coveredAreaM2": "58",
    "rooms": "3",
    "bedrooms": "1",
    "bathrooms": "2",
    "garages": "1",
    "ageYears": "11",
    "address": "Carlos Calvo 3000",
    "locationName": "Boedo",
    "locationChain": ["Boedo", "Capital Federal", "Argentina"],
    "latitude": -34.6225406,
    "longitude": -58.4084786,
    "publisherId": "17749932",
    "publisherName": "Salaya Romera",
    "whatsApp": "54 9 1165643204",
    "pictureUrls": ["https://imgar.zonapropcdn.com/avisos/1/00/60/12/67/28/720x532/2077831564.jpg"],
    "scrapedAt": "2026-09-11T09:51:26.163Z"
}
```

### Use cases

- **Market research** — compare prices per m² across neighborhoods or cities in Argentina.
- **Lead generation** — build a list of agency-published listings with WhatsApp numbers for outreach.
- **Portfolio monitoring** — run on a schedule to catch new listings matching your criteria as soon as they're published.
- **Feeding a real estate app or CRM** — pipe structured JSON straight into your own database via the Apify API.
- **Investment analysis** — export to Excel/CSV and cross-reference surface, price, and location.

### How to scrape Zonaprop.com.ar

1. Go to [Zonaprop.com.ar](https://www.zonaprop.com.ar/), search and filter as you normally would.
2. Copy the resulting URL from your browser's address bar.
3. Paste it into this actor's **Start URLs** field (or set the **Search filters** fields instead).
4. Set **Max listings** and, optionally, a **Proxy** country (Argentina residential is the default and recommended).
5. Click **Start** and download results as JSON, CSV, or Excel once the run finishes.

### How much does it cost to scrape Zonaprop?

This actor uses **pay-per-event (PPE)** pricing — you pay only for what you get, not for compute time.

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| listing-scraped | $0.00099 | **$0.99** |
| contact-info-scraped (optional) | $0.019 | **$19.00** |

`listing-scraped` fires once per listing row saved. `contact-info-scraped` is optional (off by default, enable with `chargeForContactInfo`) and only fires for listings that include a WhatsApp number. Scraping 1,000 listings without the contact add-on costs about **$0.99**.

### Input / Output

Full field-by-field documentation is on the [Input tab](https://apify.com/parsebird/zonaprop-scraper/input-schema). Download results in JSON, CSV, Excel, or HTML from the **Storage** tab of any run, or pull them programmatically via the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/zonaprop-scraper").call(run_input={
    "startUrls": [{"url": "https://www.zonaprop.com.ar/departamentos-venta-palermo.html"}],
    "maxItems": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["priceFormatted"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/zonaprop-scraper').call({
    startUrls: [{ url: 'https://www.zonaprop.com.ar/departamentos-venta-palermo.html' }],
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Is it legal to scrape Zonaprop?

Yes — this actor only collects publicly available listing data that Zonaprop.com.ar itself shows to any visitor, without logging in or bypassing paywalls. You're responsible for how you use the extracted data; review [Zonaprop's Terms of Service](https://www.zonaprop.com.ar/) and applicable data-protection law (e.g. Argentina's Ley 25.326) before republishing personal data such as WhatsApp numbers. See Apify's [guide on the legality of web scraping](https://www.apify.com/blog/is-web-scraping-legal) for more detail.

### Other real estate scrapers

- [Immobiliare.it Scraper](https://apify.com/parsebird/immobiliare-it-scraper) — Italy
- [Homegate.ch Swiss Real Estate Scraper](https://apify.com/parsebird/homegate-ch-scraper) — Switzerland
- [Imovelweb Scraper](https://apify.com/parsebird/imovelweb-scraper) — Brazil
- [Pincali Mexico Real Estate Scraper](https://apify.com/parsebird/pincali-scraper) — Mexico

### FAQ

**Do I need a Zonaprop account?**
No. The actor scrapes public search results and listing pages only.

**Can I search by neighborhood, like Palermo or Belgrano?**
Yes — either paste a Zonaprop URL that already includes the neighborhood (most accurate), or set `filterLocation` to match results client-side after fetching.

**Why do some filters not narrow the results?**
Zonaprop assigns internal numeric codes to each operation and property type combination. Only `venta` (sale) and `departamentos` (apartments) have verified codes for the price/room/bathroom filters; other combinations still build a valid Zonaprop URL, but should be pasted directly into **Start URLs** for guaranteed filtering.

**Does it get blocked by Cloudflare?**
Zonaprop runs Cloudflare. The actor uses a browser-matching TLS fingerprint and defaults to residential proxies in Argentina, which is the combination that reliably passes it. If a run comes back empty, try increasing **Max retries** or confirm the proxy country is set to Argentina.

**Can I schedule recurring runs?**
Yes — use Apify's built-in [Scheduler](https://docs.apify.com/platform/schedules) to run this actor daily, hourly, or on any cron interval, and combine it with a webhook or integration (Make, Zapier, n8n) to get notified of new listings.

**Something looks wrong or missing — how do I report it?**
Open an issue on the actor's **Issues** tab in Apify Console. Include the input you used and, if possible, the run ID.

# Actor input Schema

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

Zonaprop search-result URLs (e.g. https://www.zonaprop.com.ar/departamentos-venta-palermo.html) or direct listing URLs (https://www.zonaprop.com.ar/propiedades/clasificado/...html). Optional when Search filters below are used instead.

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

Maximum number of listing rows to save across all Start URLs and filter searches combined. This is the number of billed 'listing-scraped' events.

## `fetchDetailPage` (type: `boolean`):

When enabled, also opens each listing's own page (one extra request per listing) to pull its meta title/description. Most fields (price, address, features, photos, publisher, WhatsApp) are already included from the search results without this. Off by default to keep runs fast and cheap.

## `chargeForContactInfo` (type: `boolean`):

When enabled, listings that include a WhatsApp number also trigger the optional 'contact-info-scraped' event (priced separately in Monetization). Off by default.

## `filterOperation` (type: `string`):

Required to activate filter-based search. Only 'Venta' has a verified numeric filter code for price/room/etc. refinement — 'Alquiler' and 'Alquiler temporal' still build a valid Zonaprop search URL, but the extra filters below may return unfiltered results for those operations.

## `filterPropertyType` (type: `string`):

Only 'Departamentos' has a verified numeric filter code. Other types build a valid Zonaprop URL but the price/room/etc. filters below may not narrow the results for them.

## `filterLocation` (type: `string`):

Free-text location, e.g. 'Palermo' or 'Córdoba'. Not sent to Zonaprop as a filter (no verified location-id codes) — matched client-side against each result's location name after fetching, so a broad search may need a higher 'Max pages' to find enough matches. For exact results, paste a Zonaprop URL for that neighborhood into Start URLs instead.

## `filterPriceMin` (type: `integer`):

Minimum price, in the currency set below.

## `filterPriceMax` (type: `integer`):

Maximum price, in the currency set below.

## `filterPriceCurrency` (type: `string`):

USD or ARS. Leave empty to let Zonaprop use its default (USD for sale, ARS for rent).

## `filterBedroomsMin` (type: `integer`):

Minimum number of bedrooms (Zonaprop's 'habitaciones').

## `filterBathroomsMin` (type: `integer`):

Minimum number of bathrooms.

## `filterGaragesMin` (type: `integer`):

Minimum number of garages/parking spaces. Use 0 for 'no garage required'.

## `filterCoveredAreaMin` (type: `integer`):

Minimum covered area, in square meters.

## `filterCoveredAreaMax` (type: `integer`):

Maximum covered area, in square meters.

## `filterAgenciesOnly` (type: `boolean`):

When true, only listings published by real-estate agencies (inmobiliarias) rather than private owners.

## `filterPublishedWithin` (type: `string`):

How recently the listing was published.

## `zonapropRawFilters` (type: `object`):

Advanced. A JSON object merged directly into the Zonaprop rplis-api/postings request body, for filter fields not exposed above (e.g. {"comodidades": "1000079"} for 'Pileta'). Overrides any field set by the inputs above.

## `maxPages` (type: `integer`):

Maximum number of result pages to fetch per search (30 listings per page on Zonaprop).

## `requestDelayMs` (type: `integer`):

Delay between requests, in milliseconds.

## `maxRequestRetries` (type: `integer`):

Retries per request when Zonaprop blocks or errors. Each retry rotates to a new proxy IP.

## `proxy` (type: `object`):

Zonaprop is protected by Cloudflare. Residential proxies with country Argentina are strongly recommended.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.zonaprop.com.ar/departamentos-venta-con-apto-credito-y-permite-mascotas-y-solarium-y-lavadero-publicado-hace-menos-de-2-dias-orden-visitas-descendente.html"
    }
  ],
  "maxItems": 100,
  "fetchDetailPage": false,
  "chargeForContactInfo": false,
  "filterOperation": "",
  "filterPropertyType": "departamentos",
  "filterPriceCurrency": "",
  "filterAgenciesOnly": false,
  "filterPublishedWithin": "",
  "maxPages": 50,
  "requestDelayMs": 800,
  "maxRequestRetries": 6,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AR"
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://www.zonaprop.com.ar/departamentos-venta-con-apto-credito-y-permite-mascotas-y-solarium-y-lavadero-publicado-hace-menos-de-2-dias-orden-visitas-descendente.html"
        }
    ],
    "maxItems": 100,
    "maxPages": 50,
    "requestDelayMs": 800,
    "maxRequestRetries": 6,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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": [{ "url": "https://www.zonaprop.com.ar/departamentos-venta-con-apto-credito-y-permite-mascotas-y-solarium-y-lavadero-publicado-hace-menos-de-2-dias-orden-visitas-descendente.html" }],
    "maxItems": 100,
    "maxPages": 50,
    "requestDelayMs": 800,
    "maxRequestRetries": 6,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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": [
    {
      "url": "https://www.zonaprop.com.ar/departamentos-venta-con-apto-credito-y-permite-mascotas-y-solarium-y-lavadero-publicado-hace-menos-de-2-dias-orden-visitas-descendente.html"
    }
  ],
  "maxItems": 100,
  "maxPages": 50,
  "requestDelayMs": 800,
  "maxRequestRetries": 6,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AR"
  }
}' |
apify call parsebird/zonaprop-scraper --silent --output-dataset

```

## MCP server setup

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