# Zonaprop Scraper - Argentina Real Estate (`benthepythondev/zonaprop-scraper`) Actor

Scrape Zonaprop Argentina property listings with prices, dimensions, location, coordinates, agency, phone, WhatsApp, images and lead scores.

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

## Pricing

from $4.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

Collect structured property listings from **Zonaprop**, one of Argentina's main real-estate marketplaces. Paste any Zonaprop search-results URL after selecting sale or rent, property type, location, price and other filters. The Actor follows the source's own pagination and returns clean property, location, agency and public contact data.

Each result can include USD or ARS price, operation, expenses, total and covered area, rooms, bedrooms, bathrooms, parking, address, neighborhood, city, province, coordinates, description, images, agency name, agency phone, WhatsApp and a transparent lead-completeness score. Export the dataset to JSON, CSV, Excel or XML, run it on a schedule, or consume it through the Apify API.

### What can you use this Actor for?

- Monitor homes, apartments, land and commercial properties for sale or rent.
- Build listing feeds for research, relocation, investment or brokerage workflows.
- Compare asking prices by neighborhood, city, property type and floor area.
- Find public agencies, phones and WhatsApp numbers attached to listings.
- Track new inventory, changed prices and removed listings over time.
- Map listings from source-provided latitude and longitude coordinates.
- Analyze agency portfolios and identify active local real-estate businesses.
- Feed spreadsheets, dashboards, databases, CRMs, Make, Zapier or n8n.

### Why use Zonaprop data?

Zonaprop covers a broad share of Argentina's online property market and exposes both individual listings and professional-agency inventory. Search pages support operation, property-type, location, price, room, area and feature filters, so a copied URL can represent a very specific market segment.

The public page embeds a structured state object for the visible results. It includes more information than a simple card-text parser: numeric price, currency, feature identifiers, coordinates, full picture lists, publisher metadata, public phones, WhatsApp and the source-provided next-page URL. The Actor reads that state directly and normalizes it into stable English fields.

### Input

The default run uses the broad Argentina sale page and saves up to 10 listings. For useful production data, open Zonaprop, select the exact operation, property type and location, then paste the resulting search URL into `searchUrls`. The bounded default is intentionally small so automated quality checks complete quickly.

| Field | Purpose |
|---|---|
| `searchUrls` | One or more public Zonaprop Argentina results URLs. |
| `maxResultsPerSearch` | Maximum unique listings saved for each URL. |
| `maxPagesPerSearch` | Safety cap for source-provided pagination. |

#### Example input

```json
{
  "searchUrls": [
    {
      "url": "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
    },
    {
      "url": "https://www.zonaprop.com.ar/casas-alquiler-gba-norte.html"
    }
  ],
  "maxResultsPerSearch": 50,
  "maxPagesPerSearch": 5
}
```

Filters remain encoded in each search URL. This keeps the Actor aligned with the live website and avoids an incomplete duplicate of Zonaprop's filter interface.

### Output

Each dataset row represents one public property listing. Common fields include:

- `id`, `code`, `url`, `title`, `generated_title`, `description`
- `property_type`, `posting_type`, `operation`, `status`
- `price`, `currency`, `formatted_price`, `prices`
- `expenses`, `expenses_currency`
- `total_area_m2`, `covered_area_m2`, `land_area_m2`
- `rooms`, `bedrooms`, `bathrooms`, `parking_spaces`, `age`
- `address`, `neighborhood`, `city`, `province`, `country`, `location_path`
- `latitude`, `longitude`
- `agency_id`, `agency`, `agency_url`, `agency_logo`, `agency_type`, `agency_license`
- `agency_phones`, `whatsapp`, `lead_score`
- `image`, `images`, `has_video`, `has_tour`, `has_plans`
- `modified_at`, `search_url`, `source_page`, `search_rank`, `source_total_results`, `scraped_at`

#### Example result

```json
{
  "id": "56953546",
  "title": "Venta Departamento 2 Amb. en Palermo - a Estrenar C/terraza Propia",
  "property_type": "Departamentos",
  "operation": "Venta",
  "price": 110000,
  "currency": "USD",
  "total_area_m2": "68",
  "covered_area_m2": "38",
  "rooms": "2",
  "bedrooms": "1",
  "bathrooms": "2",
  "address": "Castillo al 1200",
  "neighborhood": "Palermo",
  "city": "Capital Federal",
  "agency": "Inmobiliaria Gilges",
  "agency_phones": ["46540505", "54 1158501333"],
  "latitude": -34.5891752516,
  "longitude": -58.4400929488
}
```

This example shows the shape of a real public listing, but live inventory changes continuously. Some owners or agencies omit exact coordinates, expenses, dimensions or contact information. Missing fields remain empty rather than being inferred.

### Prices and property features

A listing can expose more than one operation and price. The top-level `operation`, `price` and `currency` fields use the first source price for easy tables. The full `prices` array preserves every operation/currency pair returned by Zonaprop.

Feature labels are normalized into common keys such as total area, covered area, land area, rooms, bedrooms, bathrooms and parking. The source can add or rename features, so the original description and generated title remain useful when a specialist field is absent.

### Agency contacts and lead score

The Actor returns only contact values already embedded in the public listing state. Depending on the publisher, `agency_phones` can contain the agency's public main number and the listing's WhatsApp number. It does not guess emails, log into an account or buy private enrichment data.

`lead_score` is a transparent completeness score. It rewards named agency, public contact, WhatsApp, price, description, coordinates, images, area and canonical URL. It helps sort research rows, but it does not predict whether an agency will respond and should not replace human qualification.

### Reliable extraction design

Zonaprop's public results page includes `window.__PRELOADED_STATE__`. The Actor decodes that JSON with a structured parser, reads the `listPostings` array, follows `paging.pagesUrl.nextPage`, and deduplicates by the official posting ID. It does not rely on fragile visual coordinates or card-class names.

Requests use Chrome-compatible TLS impersonation. The Actor tries a direct datacenter request first. If Zonaprop's edge protection blocks that route, it opens one sticky Argentina residential session and continues with the same parser. This keeps routine runs inexpensive while preserving a reliable fallback. Retries and page/result limits are bounded, and a zero-result response fails visibly instead of appearing healthy.

### Scheduling and integrations

For inventory monitoring, schedule the same URL daily and use `id` as the external primary key. Compare `price`, `modified_at` and `status` between snapshots, then alert only on new or changed records. For market analysis, group by `neighborhood`, `city`, `property_type`, `operation`, `currency`, `total_area_m2` or `agency`.

Apify webhooks can route completed datasets into Make, Zapier, n8n or custom services. CSV and Excel work well for analyst review; JSON is better for recurring pipelines and geospatial applications.

### Pricing

The Actor uses transparent pay-per-event pricing. A very small start event covers initialization, and each unique property written to the default dataset is billed as one `result`. Public agency phone and WhatsApp fields are included in the result price rather than charged as a separate contact event. Duplicate postings discarded before output are not billed again.

### Responsible use

This Actor collects public property and business-listing data. Use it for legitimate market research, monitoring, brokerage, relocation and analytics. Follow applicable privacy, database, real-estate and marketing rules. Verify time-sensitive price, availability and contact details on the canonical Zonaprop page before making decisions or contacting a publisher.

### FAQ

#### Is a Zonaprop account required?

No. The Actor reads public search-result data without a user login.

#### Can it scrape rentals and sales?

Yes. Paste the corresponding results URL after selecting `Alquiler`, `Venta` or another available operation on Zonaprop.

#### Can I target a neighborhood or province?

Yes. Apply the location on Zonaprop and paste the resulting URL. The location path in each row preserves the available neighborhood, city, province and country hierarchy.

#### Why is a phone or coordinate missing?

Publishers choose which fields to expose. The Actor returns source-visible values only and never fabricates missing contacts or locations.

#### How do I prevent duplicates across scheduled runs?

Use `id` as the stable source key. The Actor deduplicates within a run; your destination can use the same ID across daily snapshots.

#### What should I include in a support issue?

Include a small input, the Apify run URL and the expected behavior. Never include login credentials or private customer data.

### You might also like

- [MagicBricks Scraper](https://apify.com/benthepythondev/magicbricks-scraper) for Indian property listings and agency leads.
- [Idealista Scraper](https://apify.com/benthepythondev/idealista-scraper) for Spanish real estate.
- [Immobiliare Scraper](https://apify.com/benthepythondev/immobiliare-scraper) for Italian properties and agencies.
- [Funda Scraper](https://apify.com/benthepythondev/funda-scraper) for Dutch property listings.
- [Craigslist Real Estate Scraper](https://apify.com/benthepythondev/craigslist-real-estate-scraper) for US real-estate listings.

If this Actor saves you time, please leave a review on its Apify Store page. Reviews help prioritize reliability work and requested features.

**Keywords:** Zonaprop scraper, Argentina real estate API, Argentina property scraper, Buenos Aires apartments, Zonaprop listings, Argentina homes for sale, Argentina rentals, real estate agency leads, property prices Argentina, WhatsApp real estate leads, Apify real estate scraper

# Actor input Schema

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

Paste Zonaprop Argentina search-results URLs after selecting sale/rent, property type, location, price and other filters.

## `maxResultsPerSearch` (type: `integer`):

Maximum unique property rows saved for each search URL.

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

Safety cap for source pagination. Zonaprop normally embeds 30 listings per page.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
    }
  ],
  "maxResultsPerSearch": 3,
  "maxPagesPerSearch": 1
}
```

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
        }
    ],
    "maxResultsPerSearch": 3,
    "maxPagesPerSearch": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = {
    "searchUrls": [{ "url": "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html" }],
    "maxResultsPerSearch": 3,
    "maxPagesPerSearch": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/zonaprop-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    {
      "url": "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
    }
  ],
  "maxResultsPerSearch": 3,
  "maxPagesPerSearch": 1
}' |
apify call benthepythondev/zonaprop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=benthepythondev/zonaprop-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ztHYzMoW2ykNN0udL/builds/6d6KGUzBvUbwvWAAo/openapi.json
