# Zonaprop.com.ar \[Only $1💰] API Scraper (`memo23/zonaprop-scraper`) Actor

💰$1 per 1,000 results - No limits, no quotas. Scrape ZonaProp (Argentina) from website URLs: list-page rows (counts, parseMeta) plus detail rows with flattened list\_\* fields, full v3 listSummary & v4 posting JSON, merged prices/location/publisher/media/units, and requestResponses for raw API parity

- **URL**: https://apify.com/memo23/zonaprop-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 185 total users, 49 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

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

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

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

### Overview

Extract structured real-estate listings from **[ZonaProp](https://www.zonaprop.com.ar/)** (Argentina). The actor turns **website search URLs** (SERP-style `.html` paths) into calls to ZonaProp’s **mobile listings API** (`GET https://bsre.zonaprop.com.ar/v3/postings`), then fetches **full posting JSON** per result (`GET …/v4/postings/{posting_id}`). You get searchable metadata per API page plus rich **detail** rows merged for analytics or export.

Use it to **monitor filtered markets** (operation, property type, amenities, publication age, sort order), **back up listing snapshots**, or **feed downstream systems** with normalized fields and raw API payloads for custom mapping.

***

### Features

- **Website URL → mobile search API**:
  - Parses paths like `departamentos-venta-con-…-orden-visitas-descendente.html` into `search.parameters` and `sortByName` (not inside `search.parameters`).
  - Supports single listing URLs (`/propiedades/clasificado/…-{id}.html`) and development URLs (`/propiedades/emprendimiento/…-{id}.html`) for **direct detail** scraping without a search step.

- **Search filters (no URL needed)**:
  - Build a search from simple fields — **operation**, **property type**, **location**, **price** range + currency, **bedrooms**, **bathrooms**, **covered area**, **agency-only**, and **published-within** — instead of hand-crafting a URL.
  - Free-text **location** (e.g. `Palermo`, `Córdoba`) is resolved to a ZonaProp `location_id` via the mobile suggestions API.
  - Works **on its own** or **alongside** `startUrls` in the same run.

- **Listings discovery & pagination**:
  - Walks `v3/postings` with **`paging.limit` fixed at 30** and increasing offset.
  - Handles **short first pages** when `paging.total` still indicates more results (fixed step pagination).

- **Per-listing detail**:
  - One `v4/postings/{id}` request per listing (until `maxItems`).
  - Default dataset rows **flatten** the merged export at the **root** (same keys as `buildZonapropFullExport` in `zonaprop-full-export.ts`): **`list_*`** fields from the v3 card, raw **`listSummary`** and **`posting`**, plus **`media`**, **`requestResponses`**, etc. Optional nesting under **`property`** is available when enabled in code.

***

### How to Use

1. **Set Up**: Apify account and this actor (or run locally with `apify run` / `npm run start:dev`).
2. **Provide Input**: Either add one or more **ZonaProp website URLs** under `startUrls` (and optional `url1`, `url2`, … on the same object for multiple starts), **or** use the **Search filters** (set at least **Operation**) to build a search without a URL — or both.
3. **Configure**: Set `maxItems` (cap on **detail** API calls), concurrency and retries. Paying accounts need no proxy setup.
4. **Run & Export**: Download **JSON** / **CSV** from the dataset.

#### Usage Limitations

**Free / non-paying Apify users** may be subject to platform limits on dataset items or charges. **Paid users** typically get higher limits; adjust **`maxItems`** to control how many **detail** postings are fetched per run.

***

### Input Configuration

Example input:

```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,
    "maxConcurrency": 100,
    "minConcurrency": 1,
    "maxRequestRetries": 100,
    "proxy": {
        "useApifyProxy": false,
        "proxyUrls": ["http://user:pass@host:port"]
    }
}
```

#### Input Fields Explanation

- **startUrls** (`startUrls`): Objects whose **`url`**, **`url1`**, **`url2`**, … fields are collected in order. Use **search/listing** URLs on `www.zonaprop.com.ar`, or single listing (`/propiedades/clasificado/…`) and development (`/propiedades/emprendimiento/…`) URLs. **Optional** when you use the Search filters below.
- **maxItems** (`maxItems`): Maximum number of **detail** (`v4`) postings to queue and scrape. Listings API pages still run to discover IDs until this cap is reached. Default **100**.
- **maxConcurrency** / **minConcurrency** / **maxRequestRetries**: Standard Crawlee / actor concurrency and retry behavior.
- **proxy** (`proxy`): Paying Apify accounts go through the actor's own residential proxies and this setting is ignored, unless Apify Proxy is off and custom **`proxyUrls`** are given, which are then used for every request. Free accounts: this proxy carries every request (default: Apify RESIDENTIAL).
- **zonapropSearchParametersOverride** (`zonapropSearchParametersOverride`): *Advanced.* A raw `search.parameters` string (e.g. `operation_type:1;real_estate_type:2;location:V1-B-6`) used **verbatim** for every ZonaProp search URL instead of parsing the path. Use it when a URL carries a filter the actor can't map yet — capture the value from the mobile app/API traffic. A `-pagina-N` suffix in the URL still sets the starting page.
- **Listings page size** is fixed at **30** in code (`v3/postings` `paging.limit`).

#### Search filters (build a search without a URL)

Instead of pasting a URL, set the filter fields and the actor builds the ZonaProp search for you. Setting **Operation** (`filterOperation`) activates this; every other field is optional. Filters can run **alone** or **together with** `startUrls`.

```json
{
    "filterOperation": "venta",
    "filterPropertyType": "departamentos",
    "filterLocation": "Palermo",
    "filterPriceMin": 100000,
    "filterPriceMax": 400000,
    "filterPriceCurrency": "USD",
    "filterBedroomsMin": 2,
    "filterBathroomsMin": 1,
    "filterCoveredAreaMin": 40,
    "filterAgenciesOnly": false,
    "maxItems": 200,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

- **filterOperation**: `venta` (buy), `alquiler` (rent), or `alquiler-temporario` (temporary rent). **Required to activate filter-based search.**
- **filterPropertyType**: `departamentos`, `casas`, `ph`, `terrenos`, `locales-comerciales`, `oficinas`, `cocheras`, `galpones`, `quintas`, `campos`, or empty for **all property types**.
- **filterLocation**: Free-text barrio / city / province (e.g. `Palermo`, `Capital Federal`, `Córdoba`). Resolved to a ZonaProp `location_id` via its suggestions API; if it can't be matched, the search runs **nationwide**.
- **filterPriceMin** / **filterPriceMax**: Price bounds in the selected currency.
- **filterPriceCurrency**: `USD` or `ARS`. Empty = **auto** (USD for sale, ARS for rent — the ZonaProp convention).
- **filterBedroomsMin** (dormitorios) / **filterBathroomsMin**: Minimum room counts.
- **filterCoveredAreaMin** / **filterCoveredAreaMax**: Covered-area (m²) range.
- **filterAgenciesOnly**: When `true`, only listings published by real-estate agencies (inmobiliarias).
- **filterPublishedWithin**: `1` = today, counted from midnight (not the last 24 hours), `2` = since the start of yesterday, `3` = last week. For a daily schedule use `2` and drop repeated listings by their ID.

***

### Output Structure

The dataset contains two logical row types:

1. **`zonaprop_list_page`** — one row per successful **`v3/postings`** response (per offset / page), with counts and parse metadata.
2. **`zonaprop_detail`** — one row per listing after **`v4/postings/{id}`**: raw **`listSummary`** (v3 card), raw **`posting`** (v4), **`list_*`** flattened fields, and the merged export fields from **`zonaprop-full-export.ts`** at the **root** of the row (unless nesting is enabled in code).

Filter with **`source === 'zonaprop_list_page'`** or **`'zonaprop_detail'`** when consuming the dataset.

#### Sample: `zonaprop_detail` (first object in `data.json`)

The JSON below is the **first record** from a real export. Long strings, **`featuresListCard`**, **`listSummary.pictures`**, **`listSummary.features`**, **`posting`** text and URL arrays, and **`media`** URL lists are **shortened** for the README; **`_readme_*`** keys exist only in this doc sample. On disk, **`requestResponses.v3ListingSearchCard`** duplicates **`listSummary`** and **`requestResponses.v4PostingDetail`** duplicates **`posting`**.

```json
{
    "source": "zonaprop_detail",
    "listingId": "58724988",
    "url": "https://bsre.zonaprop.com.ar/v4/postings/58724988",
    "statusCode": 200,
    "originalSearchUrl": "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",
    "parseMeta": {
        "mode": "mapped",
        "webPage": 1,
        "propertyTypeSlug": "departamentos",
        "operationSlug": "venta",
        "locationSlug": null,
        "unmappedPathTail": null,
        "sortByName": "low_price",
        "operationType": 1,
        "realEstateType": 2
    },
    "scrapedAt": "2026-03-31T09:51:26.163Z",
    "list_posting_id": "58724988",
    "list_title": "Venta Dto 3 amb en Ezeiza APTO CREDITO con Baulera",
    "list_description": "Corredor Responsable: Fernando Daniel Tombazzi CUCICBA 7622 / CMCPDJLM 1078 - \nContacto: Ivana Giménez\n DEPARTAMENTO 3 AMBIENTES CENTRO DE EZEIZA APTO",
    "list_public_url": "https://www.zonaprop.com.ar/propiedades/clasificado/veclapin-venta-dto-3-amb-en-ezeiza-apto-credito-con-baulera-58724988.html",
    "list_location_label": "Rafael Ramos Mejía 200, Ezeiza, Ezeiza, GBA Sur",
    "list_postal_code": "B1804",
    "list_latitude": -34.8559068,
    "list_longitude": -58.5215555,
    "list_first_image_url": "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812352.jpg",
    "list_price_label": "USD 98.000",
    "list_price_amount": 98000,
    "list_price_currency": "USD",
    "list_operation_name": "Venta",
    "list_publisher_name": null,
    "list_publisher_id": "30026294",
    "list_publication_begin": "2026-03-30T21:30:22-0400",
    "list_site": "ZPAR",
    "list_statuses": [
        "ONLINE"
    ],
    "list_internal_code": "AR.42.121.131.128.V2",
    "list_has_whatsapp": false,
    "list_premier": false,
    "list_favorite": false,
    "list_units_total_area_range": "59 m2",
    "list_units_rooms_quantity_range": "3 amb.",
    "list_units_bathroom_quantity_range": "1 baño",
    "list_units_garages_quantity_range": null,
    "list_units_quantity": null,
    "list_real_estate_type_label": "Departamento",
    "list_real_estate_subtype_label": "Estándar",
    "listSummary": {
        "title": "Venta Dto 3 amb en Ezeiza APTO CREDITO con Baulera",
        "statuses": [
            "ONLINE"
        ],
        "description": "Corredor Responsable: Fernando Daniel Tombazzi CUCICBA 7622 / CMCPDJLM 1078 - \nContacto: Ivana Giménez\n DEPARTAMENTO 3 AMBIENTES CENTRO DE EZEIZA APTO",
        "pictures": [
            {
                "order": 0,
                "sizes": [
                    {
                        "url": "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812352.jpg"
                    }
                ],
                "multimedia_type": {
                    "name": "imagen",
                    "metadata": {
                        "translation": {
                            "plural": "Fotos",
                            "singular": "Foto"
                        }
                    },
                    "multimedia_type_id": "2"
                }
            }
        ],
        "tags": [
            {
                "metadata": {
                    "translation": {
                        "singular": "Video"
                    }
                },
                "posting_tag_id": 8
            }
        ],
        "favorite": false,
        "location": {
            "address": {
                "name": "Rafael Ramos Mejía 200, Ezeiza, Ezeiza, GBA Sur",
                "visibility": "EXACT"
            },
            "posting_geolocation": {
                "geolocation": {
                    "longitude": -58.5215555,
                    "latitude": -34.8559068
                }
            },
            "postal_code": "B1804"
        },
        "features": [
            {
                "feature": {
                    "category": {
                        "metadata": {
                            "translation": {
                                "plural": "Características generales",
                                "singular": "Caracter&iacute;sticas generales"
                            }
                        },
                        "feature_category_id": "4",
                        "name": "Generales"
                    },
                    "metadata": {
                        "translation": {
                            "singular": "Apto crédito"
                        }
                    },
                    "feature_id": "1000001"
                },
                "value": "0"
            },
            {
                "feature": {
                    "category": {
                        "metadata": {
                            "translation": {
                                "plural": "Características generales",
                                "singular": "Caracter&iacute;sticas generales"
                            }
                        },
                        "feature_category_id": "4",
                        "name": "Generales"
                    },
                    "metadata": {
                        "translation": {
                            "singular": "Permite mascotas"
                        }
                    },
                    "feature_id": "1000002"
                },
                "value": "0"
            }
        ],
        "publisher": {
            "approved": false,
            "logos": [
                {
                    "url": "https://imgar.zonapropcdn.com/empresas/1/00/30/02/62/94/wxh/logo_re-max-legado_1707594159410.jpg"
                }
            ],
            "premier": false,
            "publisher_id": "30026294",
            "tags": [],
            "publisher_type": {
                "publisher_type_id": "2"
            }
        },
        "publication": {
            "publication_plan": {
                "publication_areas": [
                    {
                        "publication_type": "SIMPLE"
                    }
                ]
            },
            "begin_date": "2026-03-30T21:30:22-0400",
            "on_hold": false,
            "first_date_online": "2026-03-30T00:00:00-0400"
        },
        "url": "https://www.zonaprop.com.ar/propiedades/clasificado/veclapin-venta-dto-3-amb-en-ezeiza-apto-credito-con-baulera-58724988.html",
        "posting_id": "58724988",
        "site": "ZPAR",
        "real_estate_type": {
            "metadata": {
                "translation": {
                    "plural": "Departamentos",
                    "singular": "Departamento"
                }
            },
            "real_estate_type_id": "2"
        },
        "real_estate_subtype": {
            "metadata": {
                "translation": {
                    "plural": "Estándar",
                    "singular": "Estándar"
                }
            },
            "real_estate_sub_type_id": "38"
        },
        "units_total_area_range": "59 m2",
        "units_rooms_quantity_range": "3 amb.",
        "units_bathroom_quantity_range": "1 baño",
        "posting_type": {
            "metadata": {
                "translation": {
                    "plural": "Properties",
                    "singular": "Property"
                }
            },
            "posting_type": "PROPERTY"
        },
        "price_operation_types": [
            {
                "prices": [
                    {
                        "amount": 98000,
                        "currency": "USD",
                        "formatted_price": "USD 98.000"
                    }
                ],
                "operation_type": {
                    "name": "Venta",
                    "metadata": {
                        "connector": "en",
                        "translation": {
                            "plural": "Ventas",
                            "singular": "Venta"
                        }
                    },
                    "operation_type_id": "1"
                }
            }
        ],
        "internal_code": "AR.42.121.131.128.V2",
        "has_whatsapp": false,
        "premier": false
    },
    "posting": {
        "id": "58724988",
        "site": "ZPAR",
        "title": "Venta Dto 3 amb en Ezeiza APTO CREDITO con Baulera",
        "url": "https://www.zonaprop.com.ar/propiedades/clasificado/veclapin-venta-dto-3-amb-en-ezeiza-apto-credito-con-baulera-58724988.html",
        "description": "Corredor Responsable: Fernando Daniel Tombazzi CUCICBA 7622 / CMCPDJLM 1078 - \nContacto: Ivana Giménez\n DEPARTAMENTO 3 AMBIENTES CENTRO DE EZEIZA APTO CREDITO HIPOTECARIO \nUbicado en la calle Ramos Me…[truncated in README]",
        "online": true,
        "pills": [
            {
                "id": "ADMITS_PETS",
                "value": "Acepta mascotas"
            },
            {
                "id": "CREDIT",
                "value": "Apto crédito"
            }
        ],
        "features": [
            {
                "name": "Características generales",
                "values": [
                    "Apto crédito",
                    "Permite mascotas",
                    "Cantidad de plantas: 5 o más",
                    "Pileta",
                    "Vigilancia"
                ]
            }
        ],
        "publication": {
            "publication_type": "SIMPLE"
        },
        "prices": [
            {
                "price": "Venta USD 98.000"
            }
        ],
        "publisher": {
            "id": "30026294",
            "name": "RE/MAX Legado",
            "logo": "https://imgar.zonapropcdn.com/empresas/1/00/30/02/62/94/130x70/logo_re-max-legado_1707594159410.jpg",
            "premier": false,
            "by_owner": false,
            "type_id": "2",
            "feedback_statistics": {
                "score": 4,
                "average": "4.4",
                "ratings": [
                    {
                        "title": "Atención",
                        "average": "4.4"
                    },
                    {
                        "title": "Tiempo de respuesta",
                        "average": "4.6"
                    }
                ],
                "new_publisher": false,
                "responded_count": 27
            }
        },
        "location": {
            "location": "Ezeiza, Ezeiza, GBA Sur",
            "address": "Rafael Ramos Mejía 200",
            "visibility": "EXACT",
            "geolocation": {
                "longitude": -58.5215555,
                "latitude": -34.8559068
            }
        },
        "real_estate_type": "Departamento",
        "contact_preferences": {
            "questions": [
                "¿Sigue disponible?",
                "¿Valor de las expensas?",
                "¿En qué piso está?",
                "¿Cuándo puedo visitarlo?"
            ],
            "has_whatsapp": false,
            "dni_required": false
        },
        "pictures_urls": [
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812352.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812331.jpg"
        ],
        "videos_urls": [
            "https://www.youtube.com/embed/ZhID5Nry4Y4"
        ],
        "main_features": [
            {
                "id": "CFT101",
                "value": "55 m² cub."
            },
            {
                "id": "CFT100",
                "value": "59 m² tot."
            },
            {
                "id": "CFT1",
                "value": "3 amb."
            },
            {
                "id": "CFT2",
                "value": "2 dorm."
            },
            {
                "id": "CFT3",
                "value": "1 baño"
            },
            {
                "id": "CFT5",
                "value": "11 años"
            }
        ],
        "posting_codes": "Cód. del anunciante: AR.42.121.131.128.V2 | Cód. Zonaprop: 58724988",
        "publication_statistics": "Publicado ayer"
    },
    "postingId": "58724988",
    "site": "ZPAR",
    "online": true,
    "propertyUrl": "https://www.zonaprop.com.ar/propiedades/clasificado/veclapin-venta-dto-3-amb-en-ezeiza-apto-credito-con-baulera-58724988.html",
    "apiDetailUrl": "https://bsre.zonaprop.com.ar/v4/postings/58724988",
    "title": "Venta Dto 3 amb en Ezeiza APTO CREDITO con Baulera",
    "description": "Corredor Responsable: Fernando Daniel Tombazzi CUCICBA 7622 / CMCPDJLM 1078 - \nContacto: Ivana Giménez\n DEPARTAMENTO 3 AMBIENTES CENTRO DE EZEIZA APTO CREDITO HIPOTECARIO \nUbicado en la calle Ramos Mejia al 200 entre Paso de la Patria y Yatay. Centro de Ezeiza a una cuadra de la …[truncated in README]",
    "listCardFlags": {
        "internal_code": "AR.42.121.131.128.V2",
        "favorite": false,
        "has_whatsapp": false,
        "premier": false
    },
    "hasWhatsapp": false,
    "dniRequired": false,
    "suggestedQuestions": [
        "¿Sigue disponible?",
        "¿Valor de las expensas?",
        "¿En qué piso está?",
        "¿Cuándo puedo visitarlo?"
    ],
    "labels": {
        "realEstateType": "Departamento",
        "realEstateSubtype": "Estándar",
        "postingType": "Property"
    },
    "ids": {
        "real_estate_type_id": "2",
        "real_estate_sub_type_id": "38",
        "posting_type_code": "PROPERTY"
    },
    "location": {
        "neighborhood": "Ezeiza, Ezeiza, GBA Sur",
        "streetAddress": "Rafael Ramos Mejía 200",
        "visibility": "EXACT",
        "latitude": -34.8559068,
        "longitude": -58.5215555,
        "listCardAddressLine": "Rafael Ramos Mejía 200, Ezeiza, Ezeiza, GBA Sur",
        "postalCode": "B1804",
        "mapsUrl": "https://www.google.com/maps?q=-34.8559068,-58.5215555"
    },
    "prices": {
        "displayLines": [
            "Venta USD 98.000",
            "USD 98.000"
        ],
        "amounts": [
            {
                "amount": 98000,
                "currency": "USD"
            }
        ],
        "detailPricesArray": [
            {
                "price": "Venta USD 98.000"
            }
        ],
        "listPriceOperationTypes": [
            {
                "prices": [
                    {
                        "amount": 98000,
                        "currency": "USD",
                        "formatted_price": "USD 98.000"
                    }
                ],
                "operation_type": {
                    "name": "Venta",
                    "metadata": {
                        "connector": "en",
                        "translation": {
                            "plural": "Ventas",
                            "singular": "Venta"
                        }
                    },
                    "operation_type_id": "1"
                }
            }
        ],
        "operationsSummary": [
            {
                "operation_type_id": "1",
                "operation_name": "Venta",
                "operation_singular": "Venta",
                "prices": [
                    {
                        "amount": 98000,
                        "currency": "USD",
                        "formatted_price": "USD 98.000"
                    }
                ]
            }
        ]
    },
    "realEstateType": "Departamento",
    "listRealEstateType": {
        "metadata": {
            "translation": {
                "plural": "Departamentos",
                "singular": "Departamento"
            }
        },
        "real_estate_type_id": "2"
    },
    "listRealEstateSubtype": {
        "metadata": {
            "translation": {
                "plural": "Estándar",
                "singular": "Estándar"
            }
        },
        "real_estate_sub_type_id": "38"
    },
    "listPostingType": {
        "metadata": {
            "translation": {
                "plural": "Properties",
                "singular": "Property"
            }
        },
        "posting_type": "PROPERTY"
    },
    "units": {
        "totalAreaRange": "59 m2",
        "roomsRange": "3 amb.",
        "bathroomRange": "1 baño",
        "garagesRange": null,
        "units_quantity": null
    },
    "publisher": {
        "id": "30026294",
        "name": "RE/MAX Legado",
        "logo": "https://imgar.zonapropcdn.com/empresas/1/00/30/02/62/94/130x70/logo_re-max-legado_1707594159410.jpg",
        "premier": false,
        "by_owner": false,
        "type_id": "2",
        "feedback_statistics": {
            "score": 4,
            "average": "4.4",
            "ratings": [
                {
                    "title": "Atención",
                    "average": "4.4"
                },
                {
                    "title": "Tiempo de respuesta",
                    "average": "4.6"
                },
                {
                    "title": "Recomendación",
                    "average": "4.3"
                }
            ],
            "new_publisher": false,
            "responded_count": 27
        }
    },
    "publisherFlat": {
        "id": "30026294",
        "name": "RE/MAX Legado",
        "premier": false,
        "by_owner": false,
        "type_id": "2",
        "approved": null,
        "logoUrls": [],
        "logo": "https://imgar.zonapropcdn.com/empresas/1/00/30/02/62/94/130x70/logo_re-max-legado_1707594159410.jpg",
        "feedback": {
            "score": 4,
            "average": "4.4",
            "responded_count": 27,
            "new_publisher": false,
            "ratings": [
                {
                    "title": "Atención",
                    "average": "4.4"
                },
                {
                    "title": "Tiempo de respuesta",
                    "average": "4.6"
                },
                {
                    "title": "Recomendación",
                    "average": "4.3"
                }
            ]
        }
    },
    "publicationMerged": {
        "publication_type": "SIMPLE"
    },
    "publicationDetail": {
        "publication_type": "SIMPLE",
        "begin_date": null,
        "first_date_online": null,
        "on_hold": null,
        "publication_plan_types": [],
        "publication_plan_raw": null
    },
    "publicationListCard": {
        "publication_type": null,
        "begin_date": "2026-03-30T21:30:22-0400",
        "first_date_online": "2026-03-30T00:00:00-0400",
        "on_hold": false,
        "publication_plan_types": [
            "SIMPLE"
        ],
        "publication_plan_raw": {
            "publication_areas": [
                {
                    "publication_type": "SIMPLE"
                }
            ]
        }
    },
    "contactPreferences": {
        "questions": [
            "¿Sigue disponible?",
            "¿Valor de las expensas?",
            "¿En qué piso está?",
            "¿Cuándo puedo visitarlo?"
        ],
        "has_whatsapp": false,
        "dni_required": false
    },
    "featuresDetailGroups": [
        {
            "name": "Características generales",
            "values": [
                "Apto crédito",
                "Permite mascotas",
                "Cantidad de plantas: 5 o más",
                "Pileta",
                "Vigilancia"
            ]
        },
        {
            "name": "Servicios",
            "values": [
                "Laundry",
                "Internet/Wifi"
            ]
        },
        {
            "name": "Ambientes",
            "values": [
                "Cocina",
                "Hall",
                "Lavadero",
                "Living",
                "Living comedor"
            ]
        }
    ],
    "mainFeatures": [
        {
            "id": "CFT101",
            "value": "55 m² cub."
        },
        {
            "id": "CFT100",
            "value": "59 m² tot."
        },
        {
            "id": "CFT1",
            "value": "3 amb."
        },
        {
            "id": "CFT2",
            "value": "2 dorm."
        },
        {
            "id": "CFT3",
            "value": "1 baño"
        },
        {
            "id": "CFT5",
            "value": "11 años"
        }
    ],
    "featuresListCard": [
        {
            "feature": {
                "category": {
                    "metadata": {
                        "translation": {
                            "plural": "Características generales",
                            "singular": "Caracter&iacute;sticas generales"
                        }
                    },
                    "feature_category_id": "4",
                    "name": "Generales"
                },
                "metadata": {
                    "translation": {
                        "singular": "Apto crédito"
                    }
                },
                "feature_id": "1000001"
            },
            "value": "0"
        },
        {
            "feature": {
                "category": {
                    "metadata": {
                        "translation": {
                            "plural": "Características generales",
                            "singular": "Caracter&iacute;sticas generales"
                        }
                    },
                    "feature_category_id": "4",
                    "name": "Generales"
                },
                "metadata": {
                    "translation": {
                        "singular": "Permite mascotas"
                    }
                },
                "feature_id": "1000002"
            },
            "value": "0"
        }
    ],
    "featuresListCardSimplified": [
        {
            "categoryId": "4",
            "categoryName": "Generales",
            "featureId": "1000001",
            "featureLabel": "Apto crédito",
            "value": "0",
            "valueUnit": null
        },
        {
            "categoryId": "4",
            "categoryName": "Generales",
            "featureId": "1000002",
            "featureLabel": "Permite mascotas",
            "value": "0",
            "valueUnit": null
        },
        {
            "categoryId": "4",
            "categoryName": "Generales",
            "featureId": "1000016",
            "featureLabel": "Cantidad de plantas",
            "value": "1000019",
            "valueUnit": null
        },
        {
            "categoryId": "1",
            "categoryName": "Servicios",
            "featureId": "1000074",
            "featureLabel": "Laundry",
            "value": "0",
            "valueUnit": null
        }
    ],
    "tagsListCard": [
        {
            "metadata": {
                "translation": {
                    "singular": "Video"
                }
            },
            "posting_tag_id": 8
        }
    ],
    "statusesListCard": [
        "ONLINE"
    ],
    "media": {
        "pictureUrls": [
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812352.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812331.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812354.jpg"
        ],
        "pictureUrlsDetailOnly": [
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812352.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812331.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/720x532/2042812354.jpg"
        ],
        "pictureUrlsListCardOnly": [
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812352.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812331.jpg",
            "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812354.jpg"
        ],
        "pictureCount": 66,
        "floorPlansUrls": [],
        "videosUrls": [
            "https://www.youtube.com/embed/ZhID5Nry4Y4"
        ],
        "toursUrls": [],
        "listPicturesRaw": [
            {
                "order": 0,
                "sizes": [
                    {
                        "url": "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812352.jpg"
                    }
                ],
                "multimedia_type": {
                    "name": "imagen",
                    "metadata": {
                        "translation": {
                            "plural": "Fotos",
                            "singular": "Foto"
                        }
                    },
                    "multimedia_type_id": "2"
                }
            }
        ],
        "listPicturesEnriched": [
            {
                "order": 0,
                "title": null,
                "multimediaTypeId": "2",
                "multimediaName": "imagen",
                "urls": [
                    "https://imgar.zonapropcdn.com/avisos/1/00/58/72/49/88/wxh/2042812352.jpg"
                ]
            }
        ],
        "_readme_pictureUrls_count": 66,
        "_readme_pictureUrlsDetailOnly_count": 33,
        "_readme_pictureUrlsListCardOnly_count": 33
    },
    "codes": "Cód. del anunciante: AR.42.121.131.128.V2 | Cód. Zonaprop: 58724988",
    "publicationStatistics": "Publicado ayer",
    "detailExtraTopLevel": {
        "pills": [
            {
                "id": "ADMITS_PETS",
                "value": "Acepta mascotas"
            },
            {
                "id": "CREDIT",
                "value": "Apto crédito"
            }
        ]
    },
    "requestResponses": {
        "_readme_note": "In the real dataset, v3ListingSearchCard equals listSummary and v4PostingDetail equals posting.",
        "v3ListingSearchCard": {
            "posting_id": "58724988",
            "title": "Venta Dto 3 amb en Ezeiza APTO CREDITO con Baulera"
        },
        "v4PostingDetail": {
            "id": "58724988",
            "title": "Venta Dto 3 amb en Ezeiza APTO CREDITO con Baulera"
        }
    }
}
```

#### Sample: `zonaprop_list_page` (listings API metadata row)

```json
{
    "source": "zonaprop_list_page",
    "url": "https://bsre.zonaprop.com.ar/v3/postings?search.name=listing&paging.limit=30&paging.offset=0&search.parameters=operation_type%3A1%3Breal_estate_type%3A2%3Bexclude_postings_contacted%3Afalse%3Bpublication_date%3A2%3Bgeneral%3A1000090%2C1000001%2C1000002%3Broom.type%3A1000110%3B&sortByName=low_price",
    "statusCode": 200,
    "originalSearchUrl": "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",
    "offset": 0,
    "pageSize": 30,
    "returnedCount": 21,
    "totalApprox": 21,
    "parseMeta": {
        "mode": "mapped",
        "webPage": 1,
        "propertyTypeSlug": "departamentos",
        "operationSlug": "venta",
        "locationSlug": null,
        "unmappedPathTail": null,
        "sortByName": "low_price",
        "operationType": 1,
        "realEstateType": 2
    },
    "scrapedAt": "2026-03-31T07:49:31.639Z"
}
```

***

### Output fields (`zonaprop_detail`)

#### Row metadata

- **`source`** — Always **`zonaprop_detail`** for these rows; use it to filter the dataset.
- **`listingId`** — ZonaProp posting id (same as **`v4/postings/{id}`** path segment).
- **`url`** — Exact **`v4`** API URL that returned **`posting`**.
- **`statusCode`** — HTTP status for that **`v4`** call (e.g. **200**).
- **`originalSearchUrl`** — Website URL from **`startUrls`** that led to this listing (SERP or discovery context).
- **`parseMeta`** — How the SERP path was mapped to **`search.parameters`** (same shape as list-page rows). **`mode`**: mapping strategy (**`mapped`** = path recognized). **`webPage`**: 1-based page from **`-pagina-N`** in the URL. **`propertyTypeSlug`** / **`operationSlug`**: URL segments (e.g. departamentos / venta). **`locationSlug`**: location segment if present, else **null**. **`unmappedPathTail`**: leftover path tokens for debugging. **`sortByName`**: sort sent to **`v3/postings`**. **`operationType`** / **`realEstateType`**: numeric API filters echoed from the mapper.
- **`scrapedAt`** — ISO-8601 UTC timestamp when the row was written.

#### Flattened **`list_*`** fields (from the v3 search card)

Convenience copies of the list card so spreadsheets and simple pipelines do not need to parse **`listSummary`**.

- **`list_posting_id`** — Posting id from the card.
- **`list_title`** — Headline on the SERP card.
- **`list_description`** — Short description from the card (often truncated vs full **`posting.description`**).
- **`list_public_url`** — Public clasificado URL.
- **`list_location_label`** — Single-line address/location string from the card.
- **`list_postal_code`** — Postal code when present.
- **`list_latitude`** / **`list_longitude`** — Coordinates from the card geolocation.
- **`list_first_image_url`** — One representative photo URL (first size URL from pictures).
- **`list_price_label`** — Human-readable price (e.g. **USD 98.000**).
- **`list_price_amount`** / **`list_price_currency`** — Parsed numeric amount and currency from **`price_operation_types`** when available.
- **`list_operation_name`** — Operation label (e.g. Venta).
- **`list_publisher_name`** — Publisher display name on the card (may be **null** while **`list_publisher_id`** is set).
- **`list_publisher_id`** — Publisher id.
- **`list_publication_begin`** — Publication begin timestamp from the card.
- **`list_site`** — Site code (e.g. **ZPAR**).
- **`list_statuses`** — Status strings (e.g. **ONLINE**).
- **`list_internal_code`** — Internal / advertiser code on the card.
- **`list_has_whatsapp`** / **`list_premier`** / **`list_favorite`** — Booleans from the card.
- **`list_units_total_area_range`** / **`list_units_rooms_quantity_range`** / **`list_units_bathroom_quantity_range`** / **`list_units_garages_quantity_range`** / **`list_units_quantity`** — Surface/rooms/bath/garage/unit count as formatted ranges or **null**.
- **`list_real_estate_type_label`** / **`list_real_estate_subtype_label`** — Human-readable type and subtype from translations on the card.

#### Raw **`listSummary`** (v3 posting object)

The **exact** object returned inside **`v3/postings`** results for this listing. Important top-level keys:

- **`title`**, **`description`**, **`url`**, **`posting_id`**, **`site`** — Core identity and copy.
- **`statuses`** — Array of status strings.
- **`pictures`** — Gallery: each item has **`order`**, **`sizes[]`** with **`url`**, **`multimedia_type`** (id, name, translations).
- **`tags`** — Badges (e.g. video): **`posting_tag_id`**, **`metadata.translation`**.
- **`favorite`** — User favorite flag from API context.
- **`location`** — **`address`** (**`name`**, **`visibility`**), **`posting_geolocation.geolocation`** (**`latitude`**, **`longitude`**), **`postal_code`**.
- **`features`** — Rich feature rows: **`feature.feature_id`**, category, **`metadata.translation`** labels, **`value`** / **`value_unit`**.
- **`publisher`** — Card publisher: **`publisher_id`**, **`publisher_type`**, **`logos`**, **`approved`**, **`premier`**, **`tags`**.
- **`publication`** — **`begin_date`**, **`first_date_online`**, **`on_hold`**, **`publication_plan`** (areas / plan types).
- **`real_estate_type`** / **`real_estate_subtype`** — Ids plus **`metadata.translation`**.
- **`units_*_range`** — Surface, rooms, bathrooms as display strings.
- **`posting_type`** — e.g. **PROPERTY** with translations.
- **`price_operation_types`** — Per operation: **`operation_type`** (id, name, metadata) and **`prices`** (**`amount`**, **`currency`**, **`formatted_price`**).
- **`internal_code`**, **`has_whatsapp`**, **`premier`** — Card codes and flags.

#### Raw **`posting`** (v4 posting object)

Full **`GET /v4/postings/{id}`** JSON. Top-level keys in typical responses:

- **`id`**, **`site`**, **`title`**, **`url`**, **`description`**, **`online`** — Core listing data; description is usually the long text body.
- **`pills`** — UI chips: **`id`** (machine id) and **`value`** (Spanish label).
- **`features`** — Grouped detail sections: **`name`** (group title) and **`values`** (string lines).
- **`publication`** — Often **`publication_type`** and related fields (shape can be slimmer than on the v3 card).
- **`prices`** — Array of objects with **`price`** display strings (e.g. **Venta USD 98.000**).
- **`publisher`** — **`id`**, **`name`**, **`logo`**, **`premier`**, **`by_owner`**, **`type_id`**, **`feedback_statistics`** (score, averages, **`ratings`**, counts).
- **`location`** — **`location`** (area label), **`address`**, **`visibility`**, **`geolocation`**.
- **`real_estate_type`** — In v4 often a **string** label (e.g. **Departamento**), unlike the nested object on the v3 card.
- **`contact_preferences`** — **`questions`** (suggested chat prompts), **`has_whatsapp`**, **`dni_required`**.
- **`pictures_urls`** / **`videos_urls`** — Flat URL lists for media.
- **`main_features`** — Key facts as **`{ id, value }`** (surface, rooms, age, etc.).
- **`posting_codes`** — Human-readable code line(s) for advertiser and ZonaProp ids.
- **`publication_statistics`** — Short human-readable stats line (e.g. publication recency).

#### Merged export (root-level convenience object from **`buildZonapropFullExport`**)

These keys are **copied onto the dataset row root** by default (same as a merged **`property`** object when nesting is off).

- **`postingId`** — Prefer v4 **`id`**, else list **`posting_id`**.
- **`site`**, **`online`** — From v4 when present.
- **`propertyUrl`** — Canonical public listing URL.
- **`apiDetailUrl`** — Same as row **`url`** (the **`v4`** request URL).
- **`title`**, **`description`** — Prefer v4 strings, else list card.
- **`listCardFlags`** — **`internal_code`**, **`favorite`**, **`has_whatsapp`**, **`premier`** from the list card.
- **`hasWhatsapp`** — From **`contact_preferences`** if set, else list card flag.
- **`dniRequired`** — From **`contact_preferences.dni_required`**.
- **`suggestedQuestions`** — **`contact_preferences.questions`** array.
- **`labels`** — **`realEstateType`**, **`realEstateSubtype`**, **`postingType`** singular strings from list metadata translations.
- **`ids`** — **`real_estate_type_id`**, **`real_estate_sub_type_id`**, **`posting_type_code`** from the list card.
- **`location`** — Normalized: **`neighborhood`**, **`streetAddress`**, **`visibility`**, **`latitude`**, **`longitude`**, **`listCardAddressLine`**, **`postalCode`**, **`mapsUrl`** (Google Maps link when coords exist).
- **`prices`** — **`displayLines`** (deduped strings from v4 + list), **`amounts`** (**`amount`**, **`currency`** from list), **`detailPricesArray`**, **`listPriceOperationTypes`**, **`operationsSummary`** (per-operation id/name + prices).
- **`realEstateType`** — v4 value (often a string).
- **`listRealEstateType`**, **`listRealEstateSubtype`**, **`listPostingType`** — Original nested objects from the list card.
- **`units`** — **`totalAreaRange`**, **`roomsRange`**, **`bathroomRange`**, **`garagesRange`**, **`units_quantity`** from list **`units_*`** fields.
- **`publisher`** — Publisher object preferring v4 over list.
- **`publisherFlat`** — Flattened publisher: ids, name, flags, **`logo`**, **`logoUrls`**, **`feedback`** subset.
- **`publicationMerged`** — **`detail.publication ?? list.publication`**.
- **`publicationDetail`** — Flattened v4 publication (**`publication_type`**, dates, **`on_hold`**, plan types, raw plan).
- **`publicationListCard`** — Flattened list publication the same way.
- **`contactPreferences`** — Full v4 **`contact_preferences`** object.
- **`featuresDetailGroups`** — v4 **`features`** (grouped).
- **`mainFeatures`** — v4 **`main_features`**.
- **`featuresListCard`** — Raw list **`features`** array.
- **`featuresListCardSimplified`** — Table-friendly rows: **`categoryId`**, **`categoryName`**, **`featureId`**, **`featureLabel`**, **`value`**, **`valueUnit`**.
- **`tagsListCard`** / **`statusesListCard`** — List **`tags`** and **`statuses`**.
- **`media`** — **`pictureUrls`** (union of v4 **`pictures_urls`** and all list picture URLs), **`pictureUrlsDetailOnly`**, **`pictureUrlsListCardOnly`**, **`pictureCount`**, **`floorPlansUrls`**, **`videosUrls`**, **`toursUrls`**, **`listPicturesRaw`**, **`listPicturesEnriched`** (per picture: order, type, collected URLs).
- **`codes`** — String built from v4 **`posting_codes`** when it is a string (human-readable codes line).
- **`publicationStatistics`** — String from v4 **`publication_statistics`** when string-shaped.
- **`detailExtraTopLevel`** — Any other v4 top-level keys not mapped above (forward compatibility).
- **`requestResponses`** — **`v3ListingSearchCard`**: same JSON as **`listSummary`**; **`v4PostingDetail`**: same JSON as **`posting`**.

***

### Output fields (`zonaprop_list_page`)

- **`source`** — **`zonaprop_list_page`**.
- **`url`** — Full **`v3/postings`** request URL (includes **`search.parameters`**, **`paging`**, **`sortByName`**).
- **`statusCode`** — HTTP status for that listings call.
- **`originalSearchUrl`** — User-supplied website SERP URL.
- **`offset`** — **`paging.offset`** for this page.
- **`pageSize`** — **`paging.limit`** (30 in current code).
- **`returnedCount`** — Number of result cards on this page.
- **`totalApprox`** — Approximate total hits (for pagination); treat as approximate.
- **`parseMeta`** — Same fields as on detail rows (see above).
- **`scrapedAt`** — When the list page row was written.

### Benefits of the ZonaProp Scraper

- **Filter parity with the site**: Reuse complex SERP URLs (amenities, publication age, sort) without manually building `search.parameters`.
- **Full depth**: List metadata per API page plus **per-posting v4** payloads for rich fields.
- **Traceability**: Each row ties back to **`originalSearchUrl`** and the exact **API `url`** called.
- **Automation-friendly**: JSON suitable for warehouses, BI tools, or custom normalization.

***

### Why Choose This Actor?

Built for **Argentine real-estate research and monitoring** on ZonaProp: market scans, lead lists, and repeatable exports driven by the same URLs users see in the browser, with **mobile API** stability and **session-based token** acquisition (with compiled JWT fallback).

**Use cases:**

- Track new listings under tight filters (e.g. last 2 days, amenities, sort by price or visits).
- Enrich internal CRMs with structured **merged root fields** / **`posting`** data.
- Archive raw **`requestResponses`** for compliance or re-parsing when schemas change.

***

### Technical Implementation

1. **URL planning** (`zonaprop-mapper.ts`): Parses `www.zonaprop.com.ar` paths → `search.parameters` string + `sortByName` + initial offset from `-pagina-N`.
2. **Listings pass**: **CheerioCrawler** requests **`v3/postings`** with **Bearer** + **uuid**; pushes a **`zonaprop_list_page`** row; enqueues **`v4/postings/{id}`** for each card until **`maxItems`**.
3. **Pagination**: If more results exist, enqueues the next **`v3/postings`** URL with **`offset += pageSize`**.
4. **Detail pass**: Parses **v4** JSON, merges with list card via **`buildZonapropFullExport`** (`zonaprop-full-export.ts`) and pushes **`zonaprop_detail`** (merged fields at dataset row root unless nesting is enabled).

***

### Explore More Scrapers

If you found this actor useful, check out other scrapers at [memo23's Apify profile](https://apify.com/memo23).

***

### Support

- For issues or feature requests, use the **Issues** section of this actor on Apify.
- For further assistance, contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

***

### Additional Services

- Request customization or a full dataset: <muhamed.didovic@gmail.com>
- Need other platforms scraped? Contact <muhamed.didovic@gmail.com>
- For API services of this actor, reach out to <muhamed.didovic@gmail.com>
- Custom integrations and automation solutions available

# Actor input Schema

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

ZonaProp search-results URLs, or single listing and development pages (/propiedades/clasificado/…-{id}.html, /propiedades/emprendimiento/…-{id}.html), which return that one posting. Optional if you use the Search filters below instead.

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

Buy (venta), rent (alquiler), or temporary rent. Setting this triggers a filter-based search.

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

Property type to search. Leave as 'All property types' to include every type.

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

A barrio, city or province as zonaprop.com.ar names it, e.g. 'Palermo', 'Capital Federal', 'GBA Norte', 'Córdoba' (the province, as on the site). The search uses the place the site itself applies to that name. A name the site does not know, or one shared by several places, is refused with the reason in the log instead of searching somewhere else.

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

Lower price bound (in the selected currency).

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

Upper price bound (in the selected currency).

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

Currency for the price bounds. 'Auto' uses USD for sale and ARS for rent (the ZonaProp convention).

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

Minimum number of bedrooms.

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

Minimum number of bathrooms.

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

Minimum covered surface in square metres.

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

Maximum covered surface in square metres.

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

When enabled, restrict results to listings published by real-estate agencies (inmobiliarias).

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

Only listings ZonaProp counts as published in this window. ZonaProp counts from midnight, not a rolling window: "Today" run at 03:30 in Buenos Aires sees only the listings posted since midnight. For a daily schedule use "Since yesterday" and drop repeated listings by their ID.

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

Maximum number of listings to scrape per run.

## `maxConcurrency` (type: `integer`):

Maximum concurrent requests.

## `minConcurrency` (type: `integer`):

Minimum concurrent requests.

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

Retries per failed request.

## `enrichContacts` (type: `boolean`):

When enabled, each listing is enriched via ZonaProp's private mobile contact API with the agent's direct phone, the agency email, and the contact name (adds phone, phones, agencyEmail, agencyEmails, contactName, contactEnriched). Billed per contact successfully fetched.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. A website found by the agency's name is kept only when it mentions the listing's city (Buenos Aires for Capital Federal and GBA). Billed once per agency per run when a contact email is found (the Additional data event); agencies without an email are not charged. Best-effort.

## `zonapropSearchParametersOverride` (type: `string`):

Raw `search.parameters` string for ZonaProp's mobile listings API, e.g. `operation_type:1;real_estate_type:2;location:V1-B-6`. When set, it is used verbatim for every ZonaProp search start URL instead of parsing the URL path (a `-pagina-N` suffix in the URL still sets the starting page). Use this when a search URL contains filters the actor cannot map yet — capture the value from the mobile app/API traffic.

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

Paying Apify accounts: requests go through the actor's own residential proxies at no extra cost, and this setting is ignored unless you turn Apify Proxy off and paste your own proxy URLs, which are then used for every request. Free accounts: this proxy carries every request (default: the Apify RESIDENTIAL group, billed to your Apify account).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.zonaprop.com.ar/departamentos-venta-capital-federal.html"
    }
  ],
  "filterOperation": "",
  "filterPropertyType": "",
  "filterLocation": "Palermo",
  "filterPriceCurrency": "",
  "filterAgenciesOnly": false,
  "filterPublishedWithin": "",
  "maxItems": 10000,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 10,
  "enrichContacts": false,
  "enrichEmails": false,
  "zonapropSearchParametersOverride": "operation_type:1;real_estate_type:2;location:V1-B-6",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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-capital-federal.html" }],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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-capital-federal.html"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/zonaprop-scraper --silent --output-dataset

```

## MCP server setup

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