# ZAP Imóveis Scraper (`haketa/zapimoveis-scraper`) Actor

ZAP Imóveis scraper & API for Brazilian real estate: search property for sale & rent and export address, price, condo fee, beds, baths, parking, area, type, amenities, advertiser, photos and coordinates. Brazil property market data and real-estate lead generation — fast, no login.

- **URL**: https://apify.com/haketa/zapimoveis-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 178 total users, 40 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

<h1 align="center">ZAP Imóveis Scraper — Brazil Real Estate Data & Imobiliária Leads</h1>

<p align="center"><strong>Extract live Brazilian property listings (venda & aluguel, residencial & comercial, lançamentos) and imobiliária agency profiles from ZAP Imóveis and VivaReal at 1,000+ scale — complete with BRL prices, condomínio, IPTU, m², coordinates, CRECI, and broker phone numbers.</strong></p>

<p align="center">
  <img src="https://img.shields.io/badge/BRAZIL_REAL_ESTATE-ZAP_IMOVEIS_%26_VIVAREAL-00A868?style=for-the-badge" alt="ZAP Imoveis & VivaReal">
  <img src="https://img.shields.io/badge/B2B_LEADS-AGENCY_CRECI_PHONE_EMAIL-FF6B00?style=for-the-badge" alt="B2B Leads">
  <img src="https://img.shields.io/badge/SCALE-1%2C000%2B_LISTINGS-00B4D8?style=for-the-badge" alt="1000+ Listings">
  <img src="https://img.shields.io/badge/COVERAGE-ALL_27_BRAZILIAN_STATES-7B61FF?style=for-the-badge" alt="27 States">
  <img src="https://img.shields.io/badge/OUTPUT-JSON_CSV_EXCEL_API-1677FF?style=for-the-badge" alt="Export Formats">
</p>

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Portals Supported** | **ZAP Imóveis** (`zapimoveis.com.br`) and **VivaReal** (`vivareal.com.br`) via the `portal` selector |
| **Collection Modes** | `listings` (Property Search: Sale, Rent, New Developments) & `agencies` (Imobiliária B2B Directory) |
| **Property Coverage** | All 26 Brazilian states + DF, 15 unit types (`APARTMENT`, `HOME`, `PENTHOUSE`, `OFFICE`, `WAREHOUSE_SHED`, etc.) |
| **Financial & B2B Data** | `priceBRL`, `condominioMonthlyBRL`, `iptuYearlyBRL`, `pricePerSqmBRL`, `agencyName`, `agencyCRECI`, `agencyPhone`, `agencyEmail` |
| **Brazilian Market Flags** | `isLancamento`, `constructorName`, `launchPhase`, `isFiadorFree` (Sem Fiador), `isFGTSEligible`, `isMCMVEligible`, `acceptsExchange` |
| **Scale & Pagination** | Automatic deep pagination (`maxPages: 0` = auto-scaled) supporting **1,000+ to 100,000+ de-duplicated records** |
| **Export Formats** | JSON, CSV, Excel (XLSX), XML, RSS, HTML Table, and Apify REST API |

***

This **ZAP Imóveis scraper** extracts live Brazilian real-estate listings and **imobiliária** (brokerage) profiles from [zapimoveis.com.br](https://www.zapimoveis.com.br) and its sibling portal **VivaReal** — returning clean, normalized records with **sale or rental price (BRL), monthly condomínio fee, annual IPTU tax, price per m², usable and total area, bedrooms, suites, parking spaces, neighborhood (bairro), street address, CEP, GPS coordinates, amenities, high-resolution photo URLs, and direct agency contact details (CRECI, phone, website, email)**.

Export every result to **JSON, CSV, Excel, XML, or the Apify API** with zero coding and no login required.

> Built for **real-estate investment funds, Brazilian prop-tech platforms, property valuation & AVM models, mortgage and FinTech lead generation, B2B SaaS teams selling to imobiliárias, commercial real-estate analysts, and corporate relocation specialists**.

***

### 🔎 Why scrape ZAP Imóveis?

**ZAP Imóveis** (part of Grupo OLX / QuintoAndar) is Brazil's premier real-estate marketplace, indexing millions of residential and commercial properties across all 27 federative units. While VivaReal covers the broad mass market, **ZAP Imóveis is particularly strong in mid-to-high-end residential inventory, new builder developments (lançamentos), and commercial offices/warehouses**, as well as the professional brokerage network (`imobiliárias`) that manages them.

Collecting structured **ZAP Imóveis data** at scale is difficult without a purpose-built extractor:

- Pricing is split across nested transaction structures (`SALE` vs. `RENTAL`), monthly condo fees (`condomínio`), and annual municipal property taxes (`IPTU`), often polluted by `R$ 1` broker placeholder values.
- Room counts, areas, and amenities are returned in multi-layered arrays that need cleaning and normalization before analysis.
- Image URLs are served as unresolved dimension templates rather than direct links.
- Broker phone numbers, websites, and emails are scattered across multiple contact fields.

This **ZAP Imóveis data extractor** handles every step automatically:

1. Select your target states, cities, neighborhoods, property types, and price/area ranges from simple dropdowns.
2. The Actor paginates deeply through matching inventory (`maxPages: 0` automatically scales to your `maxListings` target — whether 50, 1,000, or 50,000+).
3. Every record is cleaned, de-duplicated by `listingId`, enriched with calculated metrics (`pricePerSqmBRL`, `totalMonthlyCostBRL`, `listingQualityScore`), and exported with ready-to-load 800×600 image URLs and verified broker contact data.

#### Common reasons teams scrape ZAP Imóveis

- **Real-estate market intelligence & AVM pricing** — benchmark `pricePerSqmBRL`, `condominioMonthlyBRL`, and `iptuYearlyBRL` across bairros like Pinheiros, Itaim Bibi, Vila Mariana, Leblon, Ipanema, Savassi, and Batel.
- **B2B lead generation for imobiliárias** — build targeted outreach lists of Brazilian real-estate agencies with `agencyName`, `agencyCRECI`, `agencyPhone`, `agencyWebsite`, `agencyEmail`, and `agencyTier`.
- **Lançamentos (new development) tracking** — monitor brand-new projects from builders like Cyrela, EZTec, Tegra, MRV, Even, Direcional, and Cury, including `launchPhase` (*Pré-lançamento*, *Em obras*, *Pronto para morar*), `constructorCNPJ`, and `deliveryDate`.
- **Prop-tech & listing aggregation** — populate or refresh real-estate search portals, investment calculators, and AI property advisors on a daily schedule.
- **Commercial real-estate & logistics research** — analyze `OFFICE` (*sala comercial*), `COMMERCIAL_BUILDING` (*prédio comercial*), and `WAREHOUSE_SHED` (*galpão*) inventory with `buildingClass`, `ceilingHeight`, and `zoning`.
- **Mortgage, FGTS & rental guarantee funnels** — filter specifically for `isFiadorFree` (*sem fiador* rentals), `isFGTSEligible`, `isMCMVEligible` (*Minha Casa Minha Vida*), and `acceptsExchange` (*aceita permuta*).

***

### ✨ What this ZAP Imóveis scraper does

- ✅ **Dual collection modes (`listings` & `agencies`)** — scrape property inventory in `listings` mode or sweep the brokerage directory in `agencies` mode (with optional `fetchAgencyListings: true` to pull each agency's full portfolio).
- ✅ **Dual portal support (`ZAP` & `VIVA_REAL`)** — switch `portal` between `"ZAP"` and `"VIVA_REAL"` using the exact same input filters and unified output schema.
- ✅ **Unlocked 1,000+ deep pagination** — `maxPages` defaults to `0` (auto/unlimited, governed by `maxListings`), allowing single-city or multi-city runs to collect **1,000+ to 100,000+ unique properties** without page-limit cutoffs.
- ✅ **Complete Brazilian financial breakdown** — extracts `priceBRL`, `condominioMonthlyBRL`, `iptuYearlyBRL`, automatically filters out `R$ 1` placeholder spam, and computes `pricePerSqmBRL` and `totalMonthlyCostBRL` (rent + condo + IPTU/12).
- ✅ **Built-in B2B broker contact extraction** — every property listing includes `agencyId`, `agencyName`, `agencyCRECI`, `agencyPhone`, `agencyWebsite`, `agencyEmail`, `agencyTier`, and `agencyLogoUrl` when published.
- ✅ **15 residential, rural & commercial property types** — `APARTMENT`, `HOME`, `CONDOMINIUM`, `PENTHOUSE`, `FLAT`, `KITNET`, `FARM`, `LAND_LOT`, `OFFICE`, `COMMERCIAL_BUILDING`, `COMMERCIAL_PROPERTY`, `BUSINESS`, `WAREHOUSE_SHED`, `GARAGE`, and `HOTEL`.
- ✅ **Resolved high-res media URLs** — automatically converts template image paths into directly loadable `800x600` image links in `imageUrls` and `thumbnailUrl`, plus `videoUrls`, `hasVideo`, `hasFloorplan`, and `hasVirtualTour`.
- ✅ **Zero-input multi-city sample** — leave location filters empty and the Actor automatically samples Brazil's 8 largest metro markets (São Paulo, Rio de Janeiro, Belo Horizonte, Brasília, Curitiba, Porto Alegre, Salvador, Recife) — scaling seamlessly to 1,000+ items if you raise `maxListings`.

***

### 🎯 High-value use cases

| Team / Role | Workflow | Key fields used |
|---|---|---|
| **Real Estate Funds & Analysts** | Track price per m², condo fees, and inventory velocity by neighborhood and bedroom count. | `priceBRL`, `pricePerSqmBRL`, `condominioMonthlyBRL`, `usableArea`, `neighborhood`, `city` |
| **B2B Sales & PropTech Vendors** | Build verified CRM prospect lists of active Brazilian imobiliárias and brokers. | `agencyName`, `agencyCRECI`, `agencyPhone`, `agencyEmail`, `agencyWebsite`, `agencyTier` |
| **Developers & Incorporadoras** | Monitor competing *lançamentos* (`listingType: ["DEVELOPMENT"]`) by bairro and delivery year. | `isLancamento`, `constructorName`, `constructorCNPJ`, `launchPhase`, `deliveryDate`, `totalUnits` |
| **CRE & Logistics Advisors** | Map office and warehouse availability (`usageTypes: ["COMMERCIAL"]`) across SP, RJ, and PR. | `unitType`, `usableArea`, `pricePerSqmBRL`, `buildingClass`, `ceilingHeight`, `zipCode` |
| **Relocation & Rental Platforms** | Source *sem fiador* rental apartments (`semFiador: true`) with transparent total monthly cost. | `priceBRL`, `totalMonthlyCostBRL`, `isFiadorFree`, `bedrooms`, `neighborhood`, `latitude` |

***

### 📥 Input configuration

All inputs are optional and selectable via user-friendly dropdowns in the Apify Console.

| Field | Type | Default / Prefill | Description |
|---|---|---|---|
| `mode` | `string` | `"listings"` | `"listings"` for property search, or `"agencies"` for B2B imobiliária directory extraction. |
| `portal` | `string` | `"ZAP"` | Target marketplace: `"ZAP"` (ZAP Imóveis) or `"VIVA_REAL"` (VivaReal). |
| `business` | `array<string>` | `["SALE"]` | Transaction type: `"SALE"` (Venda), `"RENTAL"` (Aluguel), or both. |
| `listingType` | `array<string>` | `["USED"]` | `"USED"` (Standard resale/rental inventory) and/or `"DEVELOPMENT"` (Lançamentos / new builds). |
| `usageTypes` | `array<string>` | `["RESIDENTIAL"]` | `"RESIDENTIAL"` and/or `"COMMERCIAL"`. |
| `unitTypes` | `array<string>` | `[]` (all types) | Filter by specific property types (`"APARTMENT"`, `"HOME"`, `"CONDOMINIUM"`, `"PENTHOUSE"`, `"OFFICE"`, `"WAREHOUSE_SHED"`, `"LAND_LOT"`, etc.). |
| `states` | `array<string>` | `["SP"]` | Brazilian 2-letter UF codes (`"SP"`, `"RJ"`, `"MG"`, `"RS"`, `"PR"`, `"SC"`, `"BA"`, `"DF"`, `"GO"`, `"PE"`, `"CE"`, etc.). |
| `cities` | `array<string>` | `["sao-paulo"]` | Dropdown of 30 major Brazilian cities (`"sao-paulo"`, `"rio-de-janeiro"`, `"belo-horizonte"`, `"curitiba"`, `"florianopolis"`, etc.). |
| `citiesCustom` | `array<string>` | `[]` | Any additional city slugs in lowercase hyphenated format (e.g., `"santo-andre"`, `"balneario-camboriu"`). |
| `neighborhoods` | `array<string>` | `[]` | Neighborhood / bairro slugs (e.g., `"pinheiros"`, `"itaim-bibi"`, `"vila-olimpia"`, `"copacabana"`). |
| `minPrice` / `maxPrice` | `integer` | `0` | Minimum and maximum price in BRL (`0` = no limit). |
| `minArea` / `maxArea` | `integer` | `0` | Minimum and maximum usable area in m² (`0` = no limit). |
| `minBedrooms` | `integer` | `0` | Minimum number of bedrooms / quartos (`0` = no limit). |
| `minParkingSpaces` | `integer` | `0` | Minimum number of parking spaces / vagas (`0` = no limit). |
| `semFiador` | `boolean` | `false` | Filter rentals that do not require a guarantor (*Sem Fiador*). |
| `sortBy` | `string` | `"relevance"` | Sort order: `"relevance"`, `"newest"`, `"lowest_price"`, `"highest_price"`, `"lowest_area"`, `"highest_area"`. |
| `agencyIds` | `array<string>` | `[]` | Specific imobiliária IDs to scrape in `"agencies"` mode. |
| `agencyIdRangeStart` / `End` | `integer` | `0` | Numeric ID range sweep for discovering agency profiles in `"agencies"` mode. |
| `fetchAgencyListings` | `boolean` | `false` | In `"agencies"` mode, also extract every active property listing belonging to each agency. |
| `maxListings` | `integer` | `100` (prefill `50`) | Maximum total records to collect across the run (`0` = unlimited; supports **1,000+ results**). |
| `maxPages` | `integer` | `0` | Maximum pages per search task (`0` = unlimited / auto-scaled by `maxListings`; each page has up to 24 listings). |
| `pageSize` | `integer` | `24` | Listings fetched per page (`1`–`24`; `24` is the portal maximum and fastest setting). |
| `proxyConfiguration` | `object` | `RESIDENTIAL` (`BR`) | Apify Proxy configuration. Brazilian residential proxy (`country: "BR"`) is pre-configured by default. |
| `requestDelay` | `integer` | `800` | Polite delay between requests in milliseconds (`0`–`15000`). |
| `maxConcurrency` | `integer` | `1` | Parallel search tasks (`1`–`5`). |
| `maxRetries` | `integer` | `3` | Automatic retries per failed request. |

#### Example 1 — Scrape 1,000+ apartments & houses for sale in São Paulo

```json
{
  "mode": "listings",
  "portal": "ZAP",
  "business": ["SALE"],
  "listingType": ["USED", "DEVELOPMENT"],
  "usageTypes": ["RESIDENTIAL"],
  "unitTypes": ["APARTMENT", "HOME", "PENTHOUSE"],
  "states": ["SP"],
  "cities": ["sao-paulo"],
  "sortBy": "newest",
  "maxListings": 1000,
  "maxPages": 0,
  "pageSize": 24,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "BR"
  }
}
```

#### Example 2 — High-end neighborhood comparison (Pinheiros, Itaim Bibi, Vila Olímpia)

```json
{
  "mode": "listings",
  "portal": "ZAP",
  "business": ["SALE"],
  "usageTypes": ["RESIDENTIAL"],
  "unitTypes": ["APARTMENT"],
  "states": ["SP"],
  "cities": ["sao-paulo"],
  "neighborhoods": ["pinheiros", "itaim-bibi", "vila-olimpia"],
  "minBedrooms": 3,
  "minParkingSpaces": 2,
  "minPrice": 1500000,
  "maxListings": 500
}
```

#### Example 3 — Commercial offices & warehouses for rent (`COMMERCIAL` + `RENTAL`)

```json
{
  "mode": "listings",
  "portal": "ZAP",
  "business": ["RENTAL"],
  "usageTypes": ["COMMERCIAL"],
  "unitTypes": ["OFFICE", "WAREHOUSE_SHED"],
  "states": ["SP", "RJ"],
  "cities": ["sao-paulo", "rio-de-janeiro"],
  "maxListings": 300
}
```

***

### 📤 Output schema & field reference

Every dataset item uses a unified flat schema with **85+ structured fields**, making it effortless to load into PostgreSQL, BigQuery, Snowflake, Excel, or Power BI.

#### Sample JSON output (`recordType: "listing"`)

```json
{
  "recordType": "listing",
  "listingId": "2703825817",
  "portal": "ZAP",
  "url": "https://www.zapimoveis.com.br/imovel/apartamento-com-2-quartos-a-venda-70-m-cidade-moncoes-sao-paulo-sp-id-2703825817/",
  "title": "Apartamento com 2 quartos à venda, 70 m² - Cidade Monções, São Paulo",
  "description": null,
  "business": "SALE",
  "listingType": "USED",
  "usageType": "RESIDENTIAL",
  "unitType": "APARTMENT",
  "unitSubType": null,
  "category": "residential",
  "subCategory": "apartamento",
  "priceBRL": 1300000,
  "rentPeriod": null,
  "condominioMonthlyBRL": 1040,
  "iptuYearlyBRL": 420,
  "totalMonthlyCostBRL": null,
  "pricePerSqmBRL": 18571,
  "usableArea": 70,
  "totalArea": 70,
  "bedrooms": 2,
  "bathrooms": 1,
  "suites": 1,
  "parkingSpaces": 2,
  "uf": "SP",
  "city": "São Paulo",
  "neighborhood": "Cidade Monções",
  "zone": "Zona Oeste",
  "street": "Avenida Engenheiro Luiz Carlos Berrini",
  "streetNumber": "1618",
  "zipCode": "04571000",
  "latitude": -23.610744,
  "longitude": -46.69523,
  "amenities": ["AIR_CONDITIONING", "LAUNDRY", "INTERCOM", "KITCHEN", "ELEVATOR"],
  "isCommercialCondo": false,
  "isLancamento": false,
  "isFiadorFree": false,
  "acceptsExchange": false,
  "isFinancing": false,
  "isFGTSEligible": false,
  "isMCMVEligible": false,
  "agencyId": "e51bec6c-d113-d374-3e0a-27d4d162fe50",
  "agencyName": "Namérica Consultoria Imobiliária Ltda Epp",
  "agencyCRECI": "23707-J-SP",
  "agencyPhone": "1126322000",
  "agencyEmail": null,
  "agencyWebsite": "http://www.namerica.com.br",
  "agencyLogoUrl": "https://resizedimgs.zapimoveis.com.br/img/vr-listing/logo/imovel.jpg?action=fit-in&dimension=200x200",
  "agencyTier": "diamond",
  "agencyVerified": false,
  "publisherType": "agency",
  "publishedAt": "2024-04-04T04:44:01.277+00:00",
  "imageCount": 51,
  "thumbnailUrl": "https://resizedimgs.zapimoveis.com.br/img/vr-listing/97ee1f/imovel.jpg?action=fit-in&dimension=800x600",
  "imageUrls": [
    "https://resizedimgs.zapimoveis.com.br/img/vr-listing/97ee1f/imovel.jpg?action=fit-in&dimension=800x600"
  ],
  "hasVideo": false,
  "hasFloorplan": false,
  "hasVirtualTour": false,
  "listingQualityScore": 45,
  "searchBusiness": "SALE",
  "searchState": "SP",
  "searchCity": "sao-paulo",
  "searchNeighborhood": null,
  "scrapedAt": "2026-11-08T15:30:37.751Z"
}
```

#### 🏠 Core Property, Pricing & Area Fields

| Field | Type | Coverage | Description |
|---|---|---|---|
| `recordType` | `string` | 🟢 High (100%) | `"listing"` or `"agency"`. |
| `listingId` | `string` | 🟢 High (100%) | Unique portal ID used for deduplication. |
| `portal` | `string` | 🟢 High (100%) | `"ZAP"` or `"VIVA_REAL"`. |
| `url` | `string` | 🟢 High (100%) | Canonical property or agency URL on the portal. |
| `title` | `string` | 🟢 High (100%) | Descriptive Portuguese title (`Apartamento com 2 quartos à venda, 70 m² - Bairro, Cidade`). |
| `business` | `string` | 🟢 High (100%) | `"SALE"` or `"RENTAL"`. |
| `listingType` | `string` | 🟢 High (100%) | `"USED"` (standard) or `"DEVELOPMENT"` (lançamento). |
| `usageType` / `unitType` | `string` | 🟢 High (100%) | Usage (`RESIDENTIAL`/`COMMERCIAL`) and unit type (`APARTMENT`, `HOME`, `OFFICE`, etc.). |
| `category` / `subCategory` | `string` | 🟢 High (100%) | Normalized category (`residential`, `comercial`, `rural`, `land`) and Portuguese slug (`apartamento`, `casa`, etc.). |
| `priceBRL` | `integer\|null` | 🟢 High (~99%) | Sale price or monthly rent in BRL (`R$ 1` broker spam is automatically filtered out). |
| `condominioMonthlyBRL` | `integer\|null` | 🟡 Conditional (~60%) | Monthly condominium fee in BRL (when applicable and published). |
| `iptuYearlyBRL` | `integer\|null` | 🟡 Conditional (~55%) | Annual IPTU property tax in BRL (when published). |
| `totalMonthlyCostBRL` | `integer\|null` | 🟡 Conditional (Rentals) | Total monthly cost (`priceBRL + condominioMonthlyBRL + iptuYearlyBRL/12`) for rentals. |
| `pricePerSqmBRL` | `integer\|null` | 🟢 High (~99%) | Calculated BRL price per usable m² (`Math.round(priceBRL / usableArea)`). |
| `usableArea` / `totalArea` | `number\|null` | 🟢 High (~99% / ~96%) | Usable area (*área útil*) and total area (*área total*) in square meters (m²). |
| `bedrooms` / `bathrooms` / `suites` / `parkingSpaces` | `integer\|null` | 🟢 High (~97–99%) | Counts of quartos, banheiros, suítes, and vagas de garagem. |

#### 📍 Location, Geolocation & Amenities

| Field | Type | Coverage | Description |
|---|---|---|---|
| `uf` / `city` / `neighborhood` | `string` | 🟢 High (100%) | 2-letter state acronym (`SP`), city (`São Paulo`), and neighborhood (`Pinheiros`). |
| `zone` | `string\|null` | 🟢 High (~90%) | Urban zone (e.g., `Zona Sul`, `Zona Oeste`, `Centro`). |
| `street` / `streetNumber` | `string\|null` | 🟡 Conditional (~85% / ~50%) | Street name and street number (when disclosed by the broker). |
| `zipCode` | `string\|null` | 🟢 High (~99%) | 8-digit Brazilian postal code (CEP). |
| `latitude` / `longitude` | `number\|null` | 🟢 High (~78–85%) | WGS84 GPS coordinates for mapping and spatial analysis. |
| `amenities` | `array<string>` | 🟢 High (~89%) | Merged list of property and condominium amenities (`POOL`, `GYM`, `ELEVATOR`, `PARTY_HALL`, etc.). |

#### 🏗️ Lançamento, Commercial & Brazilian Financial Flags

| Field | Type | Coverage | Description |
|---|---|---|---|
| `isLancamento` | `boolean` | 🟢 High (100%) | `true` for new developments (`DEVELOPMENT`, `UNDER_CONSTRUCTION`, `PLAN_ONLY`). |
| `launchName` / `constructorName` | `string\|null` | 🟡 Conditional (Devs) | Development or builder name (e.g., `Cyrela`, `EZTec`) on lançamento listings. |
| `launchPhase` / `deliveryDate` | `string\|null` | 🟡 Conditional (Devs) | Construction phase (`Pré-lançamento`, `Em obras`, `Pronto para morar`) and target delivery date. |
| `constructorCNPJ` / `totalUnits` | `string\|int` | 🟡 Conditional (Devs) | Builder corporate tax ID (CNPJ) and unit count when published. |
| `isFiadorFree` | `boolean` | 🟢 High (100%) | `true` when the rental does not require a guarantor (*Sem Fiador*). |
| `isFinancing` / `isFGTSEligible` / `isMCMVEligible` / `acceptsExchange` | `boolean` | 🟢 High (100%) | Brazilian financing, FGTS, Minha Casa Minha Vida, and property exchange (*permuta*) flags. |
| `buildingClass` / `buildingName` / `ceilingHeight` / `zoning` | `string\|num` | 🟡 Conditional (CRE) | Commercial building classification, condo name, ceiling height, and zoning when present. |

#### 🏢 Imobiliária (Agency) B2B Lead & Media Fields

| Field | Type | Coverage | Description |
|---|---|---|---|
| `agencyId` / `agencyName` | `string\|null` | 🟢 High (100%) | Unique advertiser ID and imobiliária business name. |
| `agencyCRECI` | `string\|null` | 🟢 High (~88%) | Official Brazilian real-estate license number (CRECI). |
| `agencyPhone` | `string\|null` | 🟢 High (~99%) | Direct broker/agency phone or WhatsApp number extracted from contact metadata. |
| `agencyWebsite` / `agencyEmail` | `string\|null` | 🟡 Conditional (~55%) | Agency website URL and email address (automatically separated and cleaned). |
| `agencyTier` / `agencyLogoUrl` | `string\|null` | 🟢 High (~98%) | Portal advertiser tier (`diamond`, `gold`, `silver`, `advertiser`) and resolved logo URL. |
| `imageCount` / `thumbnailUrl` / `imageUrls` | `int\|array` | 🟢 High (~99%) | Total photo count, primary thumbnail, and array of resolved `800x600` image URLs. |
| `hasVideo` / `hasFloorplan` / `hasVirtualTour` / `listingQualityScore` | `bool\|int` | 🟢 High (100%) | Media presence flags and 0–100 listing completeness score. |

***

### 🔁 Pagination, deduplication & 1,000+ scale

This **ZAP Imóveis scraper** is built to handle both targeted neighborhood snapshots and large-scale **1,000+ property** extractions:

1. **Unlocked multi-page pagination (`maxPages: 0`):** Each page request returns up to `24` listings (`pageSize: 24`). With `maxPages: 0` (the default), the Actor automatically continues paginating until `maxListings` is reached or all matching inventory is exhausted.
2. **Multi-dimensional search grid:** If you select multiple `states`, `cities`, `neighborhoods`, `business` types (`SALE` + `RENTAL`), or `listingType` values (`USED` + `DEVELOPMENT`), the Actor builds a task queue for every combination and merges the results.
3. **Strict `listingId` deduplication:** Sponsored and featured properties often reappear across multiple result pages on ZAP Imóveis. The Actor tracks every seen `listingId` in memory so your dataset contains **100% unique properties (0 duplicates)**.
4. **Demo-run scaling:** Even if you leave all location filters blank (triggering the 8-city Brazil metro sample), passing `"maxListings": 1000` automatically scales the per-city page depth so you receive all 1,000 listings across those cities.

***

### ⚙️ How to use & automate

1. Open **ZAP Imóveis Scraper** in the Apify Console.
2. Choose `"ZAP"` or `"VIVA_REAL"` under **Website** (`portal`), and select **Property Listings** (`listings`) or **Agency Directory** (`agencies`).
3. Pick your **States** (`states`), **Cities** (`cities`), **For sale or for rent** (`business`), and any price/area/bedroom filters.
4. Set **Maximum results** (`maxListings`, e.g., `50` for a quick test or `1000` for bulk extraction) and keep **Maximum pages per search** (`maxPages`) at `0`.
5. Keep the default **Brazilian Residential Proxy** enabled and click **Start**.
6. Export your dataset in **JSON, CSV, or Excel**, or pull results via the **Apify API**.

#### Python (`apify-client`) example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/zapimoveis-scraper").call(run_input={
    "mode": "listings",
    "portal": "ZAP",
    "business": ["SALE"],
    "usageTypes": ["RESIDENTIAL"],
    "states": ["SP"],
    "cities": ["sao-paulo"],
    "maxListings": 500,
    "maxPages": 0,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(
        item["listingId"],
        item["neighborhood"],
        f"R$ {item['priceBRL']}",
        f"{item['usableArea']} m²",
        item["agencyName"],
        item["agencyPhone"],
    )
```

***

### 💡 Pro tips for best results

- **Keep `pageSize` at `24`:** The portal enforces a maximum of 24 listings per request; keeping `pageSize: 24` minimizes request count and speeds up pagination.
- **Always use Brazilian Residential Proxies (`country: "BR"`):** The portal is protected by geo-sensitive WAF rules that block non-Brazilian datacenter IPs. The default input already configures Apify's Brazilian Residential proxy group for you.
- **Partition huge city crawls by `neighborhoods` or price bands:** If you want tens of thousands of listings from São Paulo or Rio de Janeiro, splitting runs by `neighborhoods` or `minPrice`/`maxPrice` brackets gives you granular progress tracking and clean attribution via `searchNeighborhood`.
- **Switch `portal: "VIVA_REAL"` to cross-compare inventory:** Run the exact same filter set with `portal: "VIVA_REAL"` to capture properties listed exclusively on VivaReal.

***

### ⚠️ Honest limitations

- **Brazilian Residential Proxy requirement:** Because the target portal sits behind strict anti-bot protection, running without a proxy or with non-Brazilian datacenter proxies will result in `403`/`503` blocks. Keep the default `RESIDENTIAL` (`BR`) proxy enabled.
- **Broker-entered optional fields:** Fields like `streetNumber`, `condominioMonthlyBRL`, `iptuYearlyBRL`, and `agencyWebsite` are populated only when the listing broker entered them (typically 50–85% of listings). Sentinel spam values like `R$ 1` are intentionally nulled out to protect your averages.

***

### ❓ Frequently Asked Questions (FAQ)

#### Do I need a ZAP Imóveis account or login?

No. The Actor extracts public property and agency data without any login, session cookies, or credentials.

#### How many listings can I scrape in a single run?

You can scrape **from 50 to 10,000+ listings** in a single run. `maxPages` is set to `0` (unlimited) by default, so pagination continues automatically until `maxListings` is reached.

#### Can I scrape VivaReal with this Actor too?

Yes! Simply set `"portal": "VIVA_REAL"` in the input. Both portals return the exact same normalized 85-field output schema.

#### Does every listing include the broker/agency phone number?

Yes — in verified runs, **99%+ of agency-published listings** return a direct `agencyPhone` along with `agencyName` and `agencyCRECI`, making this Actor an immediate B2B lead source for imobiliária outreach.

#### How do I scrape only new builder projects (Lançamentos)?

Set `"listingType": ["DEVELOPMENT"]`. The Actor will return brand-new developments along with `isLancamento: true`, `constructorName`, `constructorCNPJ`, `launchPhase`, `deliveryDate`, and `totalUnits` when available.

***

### 🔗 Related real estate & LatAm scrapers

- [VivaReal Brazil Real Estate Scraper](https://apify.com/haketa/vivareal-scraper) — dedicated scraper for VivaReal residential and commercial listings.
- [Lamudi Scraper](https://apify.com/haketa/lamudi-scraper) — emerging-market residential and commercial property data.
- [Realtor.ca Scraper (Canada)](https://apify.com/haketa/realtor-ca-scraper) — Canadian MLS property listings and realtor contact details.
- [Immoweb.be Belgium Property Scraper](https://apify.com/haketa/immoweb-scraper) — Belgian residential and commercial real estate.
- [ImmobilienScout24 Scraper (Germany)](https://apify.com/haketa/immobilienscout24-scraper) — German property listings and agency contacts.
- [Zameen.com Pakistan Real Estate Scraper](https://apify.com/haketa/zameen-scraper) — South-Asian property portal data.

***

### 📋 Changelog

- **v1.2 (2026-11)** — Unlocked **1,000+ deep pagination**: changed `maxPages` default from `20` to `0` (`0` = unlimited, auto-scaled by `maxListings`), removed the 100-item / 2-page demo clamp when `maxListings` is explicitly specified by the user, and set fast prefill (`maxListings: 50`) for sub-30-second default runs.
- **v1.1 (2026-10)** — Added `listing.advertiserContact.phones` extraction (boosting `agencyPhone` fill rate to ~100%), automatic website/email splitting on `account.websiteUrl`, and template resolution for all `imageUrls`.
- **v1.0 (2026-09)** — Initial release supporting `ZAP` and `VIVA_REAL` portals, `listings` and `agencies` modes, 27 Brazilian states, and 85+ normalized real-estate fields.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/zapimoveis-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Choose 'Property Listings' to collect homes, apartments and commercial units. Choose 'Agency Directory' to collect imobiliária profiles (contact details, CRECI, CNPJ) for B2B outreach.

## `portal` (type: `string`):

Which Brazilian portal to pull results from. ZAP Imóveis is the default; you can switch to VivaReal with the same settings.

## `business` (type: `array`):

Pick whether you want properties for sale, for rent, or both. Leave empty to include both.

## `listingType` (type: `array`):

'Standard' covers normal resale and rental inventory. 'New Developments' covers lançamentos — brand-new builder projects (Cyrela, EZTec, Tegra and more). Leave empty for both.

## `usageTypes` (type: `array`):

Pick residential (homes, apartments, penthouses) or commercial (offices, retail, warehouses). Leave empty to include both.

## `unitTypes` (type: `array`):

Narrow results to specific property types. Pick one or more from the list. Leave empty to include all types.

## `states` (type: `array`):

Pick one or more Brazilian states to search. Leave empty to search nationwide.

## `cities` (type: `array`):

Pick one or more major cities to search. Leave empty to search the whole selected state (or nationwide). Need a city that isn't listed here? Use the 'Other cities' box below.

## `citiesCustom` (type: `array`):

Optional. Add any city not in the dropdown above, written as a lowercase hyphenated slug without accents (for example: santo-andre, foz-do-iguacu, feira-de-santana). Most users can leave this empty.

## `neighborhoods` (type: `array`):

Optional. Narrow to specific neighborhoods, written as lowercase hyphenated slugs (for example: pinheiros, itaim-bibi, copacabana, ipanema). Works best when you select a single city. Leave empty to include all neighborhoods.

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

Only include properties priced at or above this amount, in Brazilian Reais. Leave 0 for no minimum.

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

Only include properties priced at or below this amount, in Brazilian Reais. Leave 0 for no maximum.

## `minArea` (type: `integer`):

Only include properties with usable area at or above this many square meters. Leave 0 for no minimum.

## `maxArea` (type: `integer`):

Only include properties with usable area at or below this many square meters. Leave 0 for no maximum.

## `minBedrooms` (type: `integer`):

Only include properties with at least this many bedrooms. Leave 0 for no filter.

## `minParkingSpaces` (type: `integer`):

Only include properties with at least this many parking spaces. Leave 0 for no filter.

## `semFiador` (type: `boolean`):

Turn on to only include rental listings that do not require a fiador (guarantor). Applies to rentals.

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

Choose how results are ordered.

## `agencyIds` (type: `array`):

Optional. In 'Agency Directory' mode, paste specific imobiliária IDs to collect (for example: 231067, 233859). Leave empty and use the range option below to discover agencies. Ignored in 'Property Listings' mode.

## `agencyIdRangeStart` (type: `integer`):

Optional. In 'Agency Directory' mode, set the first ID of a range to sweep for agency profiles. Leave 0 to disable.

## `agencyIdRangeEnd` (type: `integer`):

Optional. In 'Agency Directory' mode, set the last ID of the range (must be greater than the start). Leave 0 to disable.

## `fetchAgencyListings` (type: `boolean`):

In 'Agency Directory' mode, turn on to also pull every agency's active listings portfolio (slower). When off, only the agency profile is saved.

## `maxListings` (type: `integer`):

Cap the total number of records collected across the whole run. Set 0 for unlimited.

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

How many result pages to page through for each search (each page returns up to 24 listings). Set 0 for unlimited (governed by Maximum results).

## `pageSize` (type: `integer`):

How many listings to fetch per API call. ZAP's API accepts a maximum of 24 per page (its default), so leave this at 24 for the fastest, most reliable results.

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

Brazilian residential proxy is strongly recommended for reliable results. The default uses Apify Proxy with the RESIDENTIAL group in Brazil. You can also supply your own Brazilian residential proxies.

## `requestDelay` (type: `integer`):

Pause between requests, in milliseconds. Increase this if results start coming back incomplete.

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

How many searches to run at once. Keeping this low (1-2) gives the most reliable results.

## `maxRetries` (type: `integer`):

How many times to retry a failed request before giving up.

## Actor input object example

```json
{
  "mode": "listings",
  "portal": "ZAP",
  "business": [
    "SALE"
  ],
  "listingType": [
    "USED"
  ],
  "usageTypes": [
    "RESIDENTIAL"
  ],
  "unitTypes": [],
  "states": [
    "SP"
  ],
  "cities": [
    "sao-paulo"
  ],
  "citiesCustom": [],
  "neighborhoods": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "minBedrooms": 0,
  "minParkingSpaces": 0,
  "semFiador": false,
  "sortBy": "relevance",
  "agencyIds": [],
  "agencyIdRangeStart": 0,
  "agencyIdRangeEnd": 0,
  "fetchAgencyListings": false,
  "maxListings": 50,
  "maxPages": 0,
  "pageSize": 24,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  },
  "requestDelay": 800,
  "maxConcurrency": 1,
  "maxRetries": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view, filter and export all scraped results from this run (JSON, CSV, Excel).

# 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 = {
    "business": [
        "SALE"
    ],
    "listingType": [
        "USED"
    ],
    "usageTypes": [
        "RESIDENTIAL"
    ],
    "unitTypes": [],
    "states": [
        "SP"
    ],
    "cities": [
        "sao-paulo"
    ],
    "citiesCustom": [],
    "neighborhoods": [],
    "agencyIds": [],
    "maxListings": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/zapimoveis-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 = {
    "business": ["SALE"],
    "listingType": ["USED"],
    "usageTypes": ["RESIDENTIAL"],
    "unitTypes": [],
    "states": ["SP"],
    "cities": ["sao-paulo"],
    "citiesCustom": [],
    "neighborhoods": [],
    "agencyIds": [],
    "maxListings": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/zapimoveis-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 '{
  "business": [
    "SALE"
  ],
  "listingType": [
    "USED"
  ],
  "usageTypes": [
    "RESIDENTIAL"
  ],
  "unitTypes": [],
  "states": [
    "SP"
  ],
  "cities": [
    "sao-paulo"
  ],
  "citiesCustom": [],
  "neighborhoods": [],
  "agencyIds": [],
  "maxListings": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call haketa/zapimoveis-scraper --silent --output-dataset

```

## MCP server setup

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