# Zonaprop.com.ar API Scraper (`shahidirfan/zonaprop-com-ar-api-scraper`) Actor

Extract real estate listings from Zonaprop.com.ar with property prices, locations, addresses, bedrooms, bathrooms, floor areas, amenities, images, and listing URLs. Ideal for Argentina property market research, real estate analytics, price tracking, and investment insights.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does Zonaprop Scraper do?

Zonaprop Scraper collects property listings from Zonaprop, a major property portal in Argentina. Paste a Zonaprop search URL, or pick a location and filters, and the Actor returns a structured dataset with prices, expenses, area, rooms, address, neighborhood, publisher details, photos, and listing URLs.

Use it to compare asking prices in CABA and Greater Buenos Aires, follow rental inventory in Córdoba or Rosario, or feed Argentine property data into a spreadsheet, dashboard, or AI workflow. Results arrive as one clean record per listing, deduplicated across pages, with empty fields removed.

### Why use Zonaprop Scraper?

- **Two ways to search** - Start from any Zonaprop search URL, or build the same search from a location and filters.
- **Argentina-wide coverage** - Search the whole country, a province, a city, a neighborhood, or a Zonaprop zone such as GBA Norte.
- **Sale and rent** - Collect apartments, houses, PHs, land, offices, commercial spaces, parking, and rural properties.
- **Analysis-ready numbers** - Prices, expenses, rooms, bedrooms, bathrooms, parking, total area, covered area, and coordinates are saved as numbers when Zonaprop publishes them.
- **Publisher context** - Agency or owner name, publisher type, profile URL, and logo are included when available.
- **Clean output** - Duplicate listings are skipped, and null, empty, or missing values are left out of each record instead of being saved as placeholders.
- **Repeatable runs** - Schedule the Actor to track new listings and price changes over time.

### What data can you extract from Zonaprop?

Each dataset item is one property listing. Zonaprop does not publish every attribute for every property, so fields appear only when the source provides a usable value.

| Field                                                             | Description                                                     |
| ----------------------------------------------------------------- | --------------------------------------------------------------- |
| `id`                                                              | Zonaprop posting identifier, used to remove duplicates          |
| `title`                                                           | Listing headline, such as "Departamento 2 ambientes en Palermo" |
| `url`                                                             | Public listing page                                             |
| `description`                                                     | Full description as plain text                                  |
| `operationType`                                                   | `venta`, `alquiler`, or `temporal`                              |
| `propertyType`                                                    | `departamentos`, `casas`, `ph`, `terrenos`, and similar         |
| `priceAmount`                                                     | Numeric asking price                                            |
| `priceCurrency`                                                   | `USD` or `ARS`                                                  |
| `priceFormatted`                                                  | Price as shown on Zonaprop                                      |
| `expensesAmount`                                                  | Monthly building expenses when published                        |
| `address`                                                         | Street address when the publisher exposes it                    |
| `neighborhood`                                                    | Neighborhood or zone                                            |
| `city`                                                            | City                                                            |
| `province`                                                        | Province                                                        |
| `latitude`, `longitude`                                           | Listing coordinates                                             |
| `rooms`, `bedrooms`, `bathrooms`, `toilets`, `garages`            | Room and parking counts                                         |
| `totalArea`, `coveredArea`                                        | Surface in square meters                                        |
| `age`                                                             | Property age in years when published as a number                |
| `features`                                                        | Every published feature as a label and value pair               |
| `publisherName`, `publisherType`, `publisherUrl`, `publisherLogo` | Agency, owner, or developer details                             |
| `images`, `mainImage`, `imageCount`, `totalImages`                | Photos, returned photo count, and real photo count              |
| `isPremier`, `hasVideos`, `hasTour`, `hasPlans`                   | Promotion and media flags                                       |
| `status`, `lastModified`                                          | Listing status and last update date                             |

### How to scrape Zonaprop property listings

1. Open Zonaprop and run the search you need: operation, property type, location, price range, rooms, and sort order.
2. Copy the search results URL, for example `https://www.zonaprop.com.ar/departamentos-venta-palermo.html`.
3. Open this Actor in Apify Console and paste the URL into `startUrl`.
4. Optionally add a `location` or filters. Explicit values override the matching parts of the URL.
5. Set `maxResults` and `maxPages` for the run size.
6. Start the Actor and review the dataset preview.
7. Download the dataset or connect it to Google Sheets, a database, or your own API.

You can skip the URL and fill only `location` plus filters. The Actor then builds the search for you. If you provide both, the URL sets the base search and the filter fields replace the values they cover.

### Input Parameters

| Parameter            | Type    | Required | Default                                                        | Description                                                                                                                                                        |
| -------------------- | ------- | -------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `startUrl`           | String  | No       | `https://www.zonaprop.com.ar/departamentos-venta-palermo.html` | Zonaprop search results URL. Defines operation, property type, location, filters, and sort. Leave empty to build the search from `location` and the filter fields. |
| `location`           | String  | No       | -                                                              | Neighborhood, city, or province, for example `Palermo`, `Cordoba`, `Rosario`, or `GBA Norte`. Overrides the URL location. Leave empty to search all of Argentina.  |
| `operationType`      | String  | No       | From URL, otherwise `venta`                                    | `venta`, `alquiler`, or `temporal`.                                                                                                                                |
| `propertyType`       | String  | No       | From URL, otherwise `departamentos`                            | `departamentos`, `casas`, `ph`, `terrenos`, `locales-comerciales`, `oficinas`, `cocheras`, or `campos`.                                                            |
| `minPrice`           | Integer | No       | -                                                              | Lowest price to include.                                                                                                                                           |
| `maxPrice`           | Integer | No       | -                                                              | Highest price to include.                                                                                                                                          |
| `currency`           | String  | No       | -                                                              | `USD` or `ARS`, applied only when a price bound is set. Leave empty to include both currencies.                                                                    |
| `roomsMin`           | Integer | No       | -                                                              | Minimum rooms (ambientes).                                                                                                                                         |
| `bedroomsMin`        | Integer | No       | -                                                              | Minimum bedrooms (dormitorios).                                                                                                                                    |
| `sortBy`             | String  | No       | From URL, otherwise `relevance`                                | `relevance`, `low_price`, or `high_price`.                                                                                                                         |
| `maxResults`         | Integer | No       | `20`                                                           | Maximum listings saved to the dataset.                                                                                                                             |
| `maxPages`           | Integer | No       | `10`                                                           | Safety cap on result pages. Each page holds up to 30 listings.                                                                                                     |
| `proxyConfiguration` | Object  | No       | Apify Proxy                                                    | Proxy settings for the run.                                                                                                                                        |

### Output Data

| Field                   | Type    | Description                                               |
| ----------------------- | ------- | --------------------------------------------------------- |
| `id`                    | String  | Zonaprop posting identifier                               |
| `code`                  | String  | Agency reference code                                     |
| `url`                   | String  | Public listing page                                       |
| `title`                 | String  | Listing headline                                          |
| `description`           | String  | Description as plain text                                 |
| `operationType`         | String  | Sale, rent, or temporary rent                             |
| `propertyType`          | String  | Property type                                             |
| `priceAmount`           | Number  | Numeric asking price                                      |
| `priceCurrency`         | String  | `USD` or `ARS`                                            |
| `priceFormatted`        | String  | Price as displayed                                        |
| `expensesAmount`        | Number  | Monthly expenses                                          |
| `expensesCurrency`      | String  | Expenses currency                                         |
| `address`               | String  | Street address                                            |
| `neighborhood`          | String  | Neighborhood or zone                                      |
| `city`                  | String  | City                                                      |
| `province`              | String  | Province                                                  |
| `latitude`, `longitude` | Number  | Coordinates                                               |
| `rooms`                 | Integer | Rooms (ambientes)                                         |
| `bedrooms`              | Integer | Bedrooms                                                  |
| `bathrooms`             | Integer | Bathrooms                                                 |
| `toilets`               | Integer | Half bathrooms                                            |
| `garages`               | Integer | Parking spaces                                            |
| `totalArea`             | Number  | Total surface in m²                                       |
| `coveredArea`           | Number  | Covered surface in m²                                     |
| `age`                   | Integer | Property age in years                                     |
| `features`              | Object  | Every published feature as label and value                |
| `publisherName`         | String  | Agency or owner name                                      |
| `publisherType`         | String  | `inmobiliaria`, `particular`, `desarrollista`, or similar |
| `publisherUrl`          | String  | Publisher profile page                                    |
| `publisherLogo`         | String  | Publisher logo                                            |
| `status`                | String  | Listing status reported by Zonaprop                       |
| `isPremier`             | Boolean | Promoted listing                                          |
| `hasVideos`             | Boolean | Listing includes a video                                  |
| `hasTour`               | Boolean | Listing includes a virtual tour                           |
| `hasPlans`              | Boolean | Listing includes floor plans                              |
| `imageCount`            | Integer | Number of photo URLs returned                             |
| `totalImages`           | Integer | Photos on the listing, including the ones not returned    |
| `mainImage`             | String  | Cover photo                                               |
| `images`                | Array   | Photo URLs returned by the search API, up to 8            |
| `lastModified`          | String  | Last update reported by Zonaprop                          |

### Usage Examples

#### Scrape a Zonaprop search URL

Collect up to 50 apartments for sale in Palermo using a saved search URL.

```json
{
    "startUrl": "https://www.zonaprop.com.ar/departamentos-venta-palermo.html",
    "maxResults": 50,
    "maxPages": 3
}
```

#### Search a location without a URL

Collect rental houses in Rosario. The Actor resolves the city and builds the search itself.

```json
{
    "location": "Rosario",
    "operationType": "alquiler",
    "propertyType": "casas",
    "maxResults": 100,
    "maxPages": 5
}
```

#### Filter by price, rooms, and sort order

Find apartments for sale in Belgrano between USD 150,000 and USD 300,000 with at least two bedrooms, cheapest first.

```json
{
    "startUrl": "https://www.zonaprop.com.ar/departamentos-venta-belgrano.html",
    "minPrice": 150000,
    "maxPrice": 300000,
    "currency": "USD",
    "bedroomsMin": 2,
    "sortBy": "low_price",
    "maxResults": 80
}
```

#### Override the URL with a location and filters

Start from a general Zonaprop URL, then replace its location and narrow the property type. Explicit fields win over the URL.

```json
{
    "startUrl": "https://www.zonaprop.com.ar/departamentos-venta.html",
    "location": "Nunez",
    "propertyType": "ph",
    "roomsMin": 3,
    "maxResults": 40
}
```

### Sample Output

```json
{
    "id": "60315979",
    "code": "AHO11174204",
    "url": "https://www.zonaprop.com.ar/propiedades/clasificado/alclcain-casa-1-dormitorio-c-patio-y-parrillero-60315979.html",
    "title": "Casa 1 Dormitorio C/ Patio y Parrillero",
    "description": "Casa de 1 dormitorio con patio, parrillero y pileta. 114 m2 cubiertos y 42 m2 de patio. Doble ingreso.",
    "operationType": "alquiler",
    "propertyType": "casas",
    "priceAmount": 700000,
    "priceCurrency": "ARS",
    "priceFormatted": "700.000",
    "expensesAmount": 0,
    "address": "Regimiento 11 al 1400",
    "neighborhood": "Tiro Suizo",
    "city": "Rosario",
    "province": "Santa Fe",
    "latitude": -32.9987763,
    "longitude": -60.6546912,
    "rooms": 3,
    "bedrooms": 1,
    "bathrooms": 1,
    "totalArea": 156,
    "coveredArea": 114,
    "age": 20,
    "features": {
        "Luminoso": "Muy luminoso",
        "Orientación": "S",
        "Superficie total": "156 m²",
        "Superficie cubierta": "114 m²",
        "Ambientes": "3",
        "Dormitorio": "1",
        "Baño": "1",
        "Antigüedad": "20"
    },
    "publisherName": "Alsedá Inmuebles",
    "publisherType": "inmobiliaria",
    "publisherUrl": "https://www.zonaprop.com.ar/inmobiliarias/alseda-inmuebles_30012128-inmuebles.html",
    "status": "ONLINE",
    "isPremier": true,
    "imageCount": 8,
    "totalImages": 29,
    "mainImage": "https://imgar.zonapropcdn.com/avisos/1/00/60/31/59/79/720x532/2082575050.jpg?isFirstImage=true",
    "images": [
        "https://imgar.zonapropcdn.com/avisos/1/00/60/31/59/79/720x532/2082575050.jpg?isFirstImage=true",
        "https://imgar.zonapropcdn.com/avisos/1/00/60/31/59/79/720x532/2082575038.jpg"
    ],
    "lastModified": "2026-10-08T00:00:00-0400"
}
```

### Tips for Best Results

- **Start with one URL** - Copy the URL after applying the filters you need on Zonaprop; the Actor reads operation, property type, location, and sort from it.
- **Use exact location names** - `Palermo`, `Belgrano`, `Caballito`, `Rosario`, `Cordoba`, and `Mendoza` resolve to Zonaprop locations. Accents are optional, so `Nunez` works for Núñez.
- **Expect fewer results near the end** - A neighborhood may have fewer listings than `maxResults`. The Actor stops when Zonaprop runs out of pages.
- **Keep `maxPages` realistic** - Each page holds up to 30 listings, so 100 results need about 4 pages.
- **Check hidden prices** - Some publishers hide the asking price. Those listings still appear, but `priceAmount` and `priceCurrency` are omitted.
- **Expect 8 photos per listing** - The Zonaprop search API returns the first 8 photos and reports the real count in `totalImages`. The remaining photos are only on each listing page, which this Actor does not open.
- **Use `features` for extras** - Amenities such as `Pileta`, `Balcón`, or `Apto crédito` vary by listing, so they are stored in the `features` object.
- **Schedule recurring runs** - Compare `id`, `priceAmount`, and `lastModified` between runs to spot new listings and price changes.
- **Report source changes** - Zonaprop can change its pages at any time. Use the Issues tab if fields suddenly go missing.

### Integrations

- **Google Sheets** - Review listings and prices in a shared spreadsheet.
- **Airtable** - Build a searchable property database with views by city, operation, or agency.
- **Webhooks** - Trigger downstream processing when a run finishes.
- **Make or Zapier** - Send new listings to a CRM, notification, or reporting workflow.
- **Apify API** - Read dataset items from your own application, dashboard, or AI pipeline.
- **JSON, CSV, Excel, XML** - Export the dataset in the format your tools accept.

### Frequently Asked Questions

#### What does Zonaprop Scraper collect?

It collects public property listings with price, currency, expenses, address, neighborhood, city, province, coordinates, rooms, bedrooms, bathrooms, parking, area, age, features, publisher details, photos, and the listing URL.

#### Can I scrape both sale and rental listings?

Yes. Use a sale URL such as `departamentos-venta-palermo.html`, a rental URL such as `departamentos-alquiler-palermo.html`, or set `operationType` to `venta`, `alquiler`, or `temporal`.

#### Can I search without a Zonaprop URL?

Yes. Set `location` and optionally `operationType`, `propertyType`, price bounds, rooms, and `sortBy`. The Actor resolves the location and builds the search. Leave `location` empty to search all of Argentina.

#### Which locations are supported?

Provinces, cities, neighborhoods, and Zonaprop zones are supported. Examples include CABA, Buenos Aires, Córdoba, Santa Fe, Mendoza, Palermo, Belgrano, Rosario, Bariloche, and GBA Norte. Unrecognized names are used as keywords, and the run log warns you.

#### Why are some listings missing a price?

Some publishers hide the asking price. The Actor leaves `priceAmount`, `priceCurrency`, and `priceFormatted` out for those listings instead of saving a zero or a placeholder.

#### Why did I get fewer results than requested?

The location may have less inventory, the URL may include narrow filters, duplicate listings are skipped, or the page cap was reached. Check the run log for the page-by-page count.

#### Can I export the dataset to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other supported formats, or read through the Apify API.

#### Can I run the Actor on a schedule?

Yes. Create an Apify schedule to refresh the same search daily, weekly, or at another interval. Scheduled runs use the same input and produce a new dataset each time.

#### Is it legal to scrape Zonaprop?

Collecting public property data can be legal, but you are responsible for following Zonaprop's terms, applicable laws, and privacy rules. Use the data responsibly and do not overload the site.

### Related Actors

- [Zoopla Property Scraper](https://apify.com/shahidirfan/zoopla-scraper) - Collect UK property listings with prices, property types, agent details, and images.
- [Propertyfinder Scraper](https://apify.com/shahidirfan/propertyfinder-scraper) - Collect UAE property listings with prices, amenities, agent details, and RERA permits.
- [Fotocasa Property Scraper](https://apify.com/shahidirfan/fotocasa-property-scraper) - Collect Spanish property ads with prices, surface area, location, and agency data.
- [Lamudi.ph Property Scraper](https://apify.com/shahidirfan/lamudi-ph-property-scraper) - Collect Philippine property listings with prices, bedrooms, area, and agency details.

### Support

For issues, missing fields, or feature requests, use the Issues tab on the Actor page. Include the input URL or location, the run ID, and one example of the unexpected output.

### Legal Notice

This Actor is designed for legitimate collection of publicly available property data. It is not affiliated with or endorsed by Zonaprop. Users are responsible for complying with applicable laws, website terms, and privacy rules, and for using the collected data responsibly.

# Actor input Schema

## `startUrl` (type: `string`):

A Zonaprop search results URL, for example https://www.zonaprop.com.ar/departamentos-venta-palermo.html. When set, it defines the search (operation, property type, location, price, rooms, sort). Filters you fill in below still override it. Leave empty to build the search from Location and the filters.

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

Neighbourhood, city or province, for example "Palermo", "Cordoba" or "GBA Norte". Overrides the location in the search URL. Leave empty to scrape all of Argentina.

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

Sale, rent or temporary rent. Empty means the value from the search URL, or sale.

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

Property type to search. Empty means the value from the search URL, or apartments.

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

Lowest price to include. Leave empty for no minimum.

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

Highest price to include. Leave empty for no maximum.

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

Currency used by the price filters. Only applied when a minimum or maximum price is set. Leave empty to include both currencies.

## `roomsMin` (type: `integer`):

Minimum number of rooms (ambientes), from 1 to 5.

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

Minimum number of bedrooms (dormitorios).

## `sortBy` (type: `string`):

Order of the results. Empty means the value from the search URL, or relevance.

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

How many listings to save to the dataset.

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

Safety cap on result pages. Each page holds up to 30 listings.

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

Proxy settings. Residential Argentine proxies are the most reliable if Zonaprop starts rate limiting.

## Actor input object example

```json
{
  "startUrl": "https://www.zonaprop.com.ar/departamentos-venta-palermo.html",
  "maxResults": 20,
  "maxPages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.zonaprop.com.ar/departamentos-venta-palermo.html"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/zonaprop-com-ar-api-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 = { "startUrl": "https://www.zonaprop.com.ar/departamentos-venta-palermo.html" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/zonaprop-com-ar-api-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 '{
  "startUrl": "https://www.zonaprop.com.ar/departamentos-venta-palermo.html"
}' |
apify call shahidirfan/zonaprop-com-ar-api-scraper --silent --output-dataset

```

## MCP server setup

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