# 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
- **Stats:** 101 total users, 28 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ZAP Imóveis Scraper — Brazil Premium Real Estate Data Extractor for Apartamentos, Casas, Lançamentos & Salas Comerciais

> **The most complete ZAP Imóveis (zapimoveis.com.br) data extraction tool on Apify.** Pull live property listings, lançamentos pipeline, and the full imobiliária directory from Brazil's premium broker-centric portal — structured with BRL pricing, condomínio, IPTU, CRECI, CNPJ and São Paulo / Rio / Belo Horizonte coverage, ready for investor research, prop-tech apps, premium-market analytics, journalism, and CRM enrichment.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/zapimoveis-scraper)
[![Live Data](https://img.shields.io/badge/Data-Live%20at%20Run%20Time-orange)]()
[![Engine](https://img.shields.io/badge/Engine-Direct%20Glue%20API-green)]()
[![Pay Per Event](https://img.shields.io/badge/Pricing-Pay%20Per%20Event-yellow)]()
[![Coverage](https://img.shields.io/badge/Coverage-26%20UFs%20%2B%20DF-purple)]()
[![Country](https://img.shields.io/badge/Country-Brasil%20%F0%9F%87%A7%F0%9F%87%B7-009c3b)]()
[![Currency](https://img.shields.io/badge/Currency-BRL%20R%24-success)]()
[![No Login](https://img.shields.io/badge/Authentication-None%20Required-success)]()

***

### What This Actor Does

The **ZAP Imóveis Scraper** is a production-ready Apify Actor that extracts structured property and agency data from **ZAP Imóveis (zapimoveis.com.br)** — one of the two flagship portals of **Grupo OLX Brasil / QuintoAndar Group** (alongside its sibling **VivaReal**). Where VivaReal indexes the broad mass market, **ZAP historically skews premium, broker-centric and high-end**: more apartamentos de alto padrão in Jardins and Vila Olímpia, more lançamentos from Cyrela, EZTec, Tegra and JFL, more salas comerciais Triple-A on Faria Lima and along Avenida das Nações Unidas, and a heavier weighting toward the imobiliárias that work the top of the market.

The actor talks directly to ZAP's internal **Glue API** (`glue-api.zapimoveis.com.br`) — no headless browser, no Cloudflare-cracking gymnastics inside the request loop — and normalizes every response into a flat, analytics-ready JSON record with Brazilian-specific fields baked in: **preço, condomínio mensal, IPTU anual, CEP, CRECI da imobiliária, CNPJ da construtora, lançamento phase, sem fiador, FGTS e MCMV elegibilidade**.

Each run can return:

- **Residential listings** — apartamento, casa, cobertura, flat, kitnet, condomínio fechado, sobrado, sítio
- **Commercial real estate (CRE)** — sala comercial, conjunto comercial, galpão / warehouse, loja, prédio comercial, ponto comercial
- **Lançamentos** — pre-launch and in-construction developer projects with constructor name, CNPJ, delivery date and total units
- **Land lots (terrenos)** — urban and rural plots
- **Agency directory profiles** — 200K+ imobiliárias with CRECI-J, CNPJ, phone, website, branch count, service areas and specializations
- **Cross-portal flags** — whether a ZAP listing also appears on VivaReal (and its VivaReal ID)

You can also flip the `portal` parameter from `ZAP` to `VIVA_REAL` to scrape the sibling portal from the same actor — useful for diffing inventory between the premium and mass-market sides of the same group.

#### Why scrape ZAP Imóveis yourself when this exists?

ZAP looks scrape-friendly until you actually try it. Then you hit the same wall every other team hits:

- **Cloudflare in front of every page** — datacenter IPs get 403/503 challenges within the first dozen requests
- **The Glue API is undocumented** — there are no public Swagger or OpenAPI specs; endpoint contracts change without notice
- **Mandatory headers** — `X-Domain`, `Origin`, and `Referer` must all align to a specific portal or requests are rejected
- **Pricing is split across an array** — `pricingInfos[]` carries rental, sale, condomínio, IPTU, yearly IPTU and monthly condo as parallel entries you have to reconcile
- **Lançamento vs. used split** — pre-launch developments use a different `listingType` (`DEVELOPMENT`), different sort behavior, and carry constructor metadata the standard listings don't
- **Geography normalization** — UF codes, accented city names, slug-form URLs and free-text neighborhoods all coexist, and the API insists on the unslugified accented version
- **Bedrooms/areas as arrays** — `bedrooms`, `bathrooms`, `usableAreas`, `parkingSpaces` come back as `[3]` not `3`, so naive parsers crash
- **Cross-portal duplication** — many listings are syndicated to both ZAP and VivaReal under different IDs; without a dedupe key your dataset double-counts
- **Agency directory is paginated by ID range, not by listing** — discovering imobiliárias requires sequential ID crawling, not a search endpoint
- **Sort filter syntax is bizarre** — price ordering needs a `sortFilter:pricingInfos.businessType='SALE'` clause appended or the order silently misbehaves

This actor abstracts every one of those problems. You pass plain inputs (`states`, `cities`, `business`, `usageTypes`, `minPrice`, `maxPrice`), the actor handles Brazilian-residential proxy rotation, header forgery, pricing reconciliation, lançamento detection, duplicate flagging, and cross-portal switching, and you get back JSON ready to drop into Postgres, BigQuery or Power BI.

***

### Quick Start

#### One-Click Run

1. Click **"Try for free"** on the [Apify Store page](https://apify.com/haketa/zapimoveis-scraper)
2. Pick your `states` (default `SP`) and `cities` (default `sao-paulo`), choose `SALE` or `RENTAL`
3. Leave the default Brazilian residential proxy enabled (highly recommended)
4. Hit **Start** — the first 200 listings land in your dataset in 60-120 seconds

#### API Run (Python)

```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"],
    "listingType": ["USED"],
    "usageTypes": ["RESIDENTIAL"],
    "unitTypes": ["APARTMENT", "PENTHOUSE"],
    "states": ["SP"],
    "cities": ["sao-paulo"],
    "neighborhoods": ["pinheiros", "itaim-bibi", "vila-olimpia"],
    "minPrice": 1_500_000,
    "maxPrice": 5_000_000,
    "minBedrooms": 2,
    "minParkingSpaces": 1,
    "sortBy": "newest",
    "maxListings": 500,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["listingId"], item["neighborhood"], item["priceBRL"],
          item["usableArea"], item["agencyName"])
```

#### API Run (Node.js / TypeScript)

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/zapimoveis-scraper').call({
    mode: 'listings',
    portal: 'ZAP',
    business: ['RENTAL'],
    usageTypes: ['RESIDENTIAL'],
    states: ['RJ'],
    cities: ['rio-de-janeiro'],
    neighborhoods: ['ipanema', 'leblon', 'copacabana'],
    minPrice: 5000,
    maxPrice: 25000,
    semFiador: true,
    sortBy: 'lowest_price',
    maxListings: 300,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} sem-fiador rentals in Rio`);
```

#### API Run (cURL)

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~zapimoveis-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "listings",
    "business": ["SALE"],
    "listingType": ["DEVELOPMENT"],
    "usageTypes": ["RESIDENTIAL"],
    "states": ["SP"],
    "cities": ["sao-paulo"],
    "maxListings": 200
  }'
```

***

### How It Works

ZAP Imóveis and VivaReal share the **same Glue API backend** under Grupo OLX, distinguished only by an `X-Domain` request header. This actor talks to that backend directly via `got-scraping` — no Puppeteer, no Playwright, no headless Chrome eating 1 GB of RAM per worker. The result: a full run that would take a browser-based scraper 10 minutes finishes here in under 90 seconds.

#### Endpoints used

| Endpoint | Purpose | Pagination |
|---|---|---|
| `GET glue-api.zapimoveis.com.br/v2/listings` | Property search (residential, commercial, lançamentos) | `from` / `size`, max ~24-36 per page |
| `GET glue-api.zapimoveis.com.br/v2/account/{id}` | Agency profile metadata (imobiliária) | Single record per call |
| `GET glue-api.zapimoveis.com.br/v2/account/{id}/listings` | Agency listings portfolio | `from` / `size` paginated |

#### Engineering details

- **Direct HTTPS API calls** — `got-scraping` with browser-class TLS fingerprint and rotated UA strings
- **Brazilian residential proxy** — defaults to Apify Proxy `RESIDENTIAL` group with `country=BR` to evade Cloudflare's geo + ASN heuristics
- **Mandatory header set** — `X-Domain`, `Origin`, `Referer` aligned to either `www.zapimoveis.com.br` or `www.vivareal.com.br` depending on the `portal` input
- **UF + city slug normalization** — input slugs (`sao-paulo`) are mapped to the accented full names the API expects (`São Paulo`) using a built-in lookup of 50+ major Brazilian municipalities (fallback handles unknown slugs)
- **Pricing reconciliation** — `pricingInfos[]` is walked to extract sale price, monthly rent, monthly condomínio, yearly IPTU and `totalMonthlyCostBRL` in one normalized row
- **Array unpacking** — `bedrooms`, `bathrooms`, `suites`, `usableAreas`, `totalAreas`, `parkingSpaces` are unwrapped from arrays to scalars
- **Lançamento detection** — `listingType=DEVELOPMENT` records get `isLancamento: true` along with `launchName`, `launchPhase`, `constructorName`, `constructorCNPJ`, `deliveryDate`, `totalUnits`
- **Sort filter syntax handled** — the `pricingInfos.businessType='{BUSINESS}'` clause needed for price-ordered searches is built automatically
- **Cross-portal flagging** — `alsoOnVivaReal` and `vivaRealId` are emitted when a listing appears under both portals so you can dedupe downstream
- **Polite by default** — `requestDelay: 800` ms and `maxConcurrency: 1` to stay well under Cloudflare's challenge threshold; both are user-tunable
- **Retry-aware** — 403/503 / Cloudflare-challenge responses retry up to `maxRetries` times with exponential backoff

***

### Input Parameters

```json
{
  "mode": "listings",
  "portal": "ZAP",
  "business": ["SALE"],
  "listingType": ["USED"],
  "usageTypes": ["RESIDENTIAL"],
  "unitTypes": ["APARTMENT"],
  "states": ["SP"],
  "cities": ["sao-paulo"],
  "neighborhoods": ["pinheiros"],
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "minBedrooms": 0,
  "minParkingSpaces": 0,
  "semFiador": false,
  "sortBy": "relevance",
  "maxListings": 200,
  "maxPages": 20,
  "pageSize": 24,
  "requestDelay": 800,
  "maxConcurrency": 1,
  "maxRetries": 3
}
```

#### Parameter reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | `string` | `listings` | `listings` = property search; `agencies` = imobiliária directory crawl |
| `portal` | `string` | `ZAP` | `ZAP` or `VIVA_REAL`. Both portals share one backend |
| `business` | `array<string>` | `["SALE"]` | `SALE` (venda), `RENTAL` (aluguel), or both |
| `listingType` | `array<string>` | `["USED"]` | `USED` = padrão resale/rental; `DEVELOPMENT` = lançamentos |
| `usageTypes` | `array<string>` | `["RESIDENTIAL"]` | `RESIDENTIAL` or `COMMERCIAL` (ZAP is strong in CRE) |
| `unitTypes` | `array<string>` | `[]` | Property-type filter — see Unit Type Reference below |
| `states` | `array<string>` | `["SP"]` | 2-letter UF codes (`SP`, `RJ`, `MG`, `RS`, `PR`, `SC`, `BA`, `DF`, `PE`, `CE`...) |
| `cities` | `array<string>` | `["sao-paulo"]` | City slugs in ZAP URL format (lowercase, hyphenated, no accents) |
| `neighborhoods` | `array<string>` | `[]` | Bairro slugs; requires a single city. E.g. `["pinheiros", "itaim-bibi"]` |
| `minPrice` / `maxPrice` | `integer` | `0` | Price floor/ceiling in BRL. `0` = open-ended |
| `minArea` / `maxArea` | `integer` | `0` | Area floor/ceiling in m² |
| `minBedrooms` | `integer` | `0` | Minimum quartos |
| `minParkingSpaces` | `integer` | `0` | Minimum vagas |
| `semFiador` | `boolean` | `false` | Filter rentals that don't require a guarantor (QuintoAndar-style) |
| `sortBy` | `string` | `relevance` | `relevance`, `newest`, `lowest_price`, `highest_price`, `lowest_area`, `highest_area` |
| `agencyIds` | `array<string>` | `[]` | Explicit imobiliária IDs (agencies mode) |
| `agencyIdRangeStart` / `agencyIdRangeEnd` | `integer` | `0` | Sequential ID-range crawl for agency discovery. IDs go up to ~850000 |
| `fetchAgencyListings` | `boolean` | `false` | In agencies mode, also pull each agency's listing portfolio |
| `maxListings` | `integer` | `200` | Hard cap across all tasks. `0` = unlimited |
| `maxPages` | `integer` | `20` | Cap per state/city/business task. Each page ≈ 24 records |
| `pageSize` | `integer` | `24` | Page size (1-50, ZAP default 24) |
| `proxyConfiguration` | `object` | BR Residential | Strongly recommended: Apify Proxy `RESIDENTIAL` group, country `BR` |
| `requestDelay` | `integer` | `800` | Inter-request delay in ms (raise if Cloudflare bites) |
| `maxConcurrency` | `integer` | `1` | Parallel tasks (1-5). Keep low to dodge rate limits |
| `maxRetries` | `integer` | `3` | Retries per failed request (Cloudflare 403/503) |

***

### Output Schema

Every record — listing or agency — uses the same flat JSON shape. Fields irrelevant to the record type come back `null`, so a single Postgres table or BigQuery schema covers everything.

#### Identification & taxonomy

| Field | Type | Description |
|---|---|---|
| `recordType` | string | `listing` or `agency` |
| `listingId` | string | ZAP-issued listing ID |
| `portal` | string | `ZAP` or `VIVA_REAL` |
| `url` | string | Canonical listing or agency URL |
| `title` | string | Listing title as published |
| `description` | string | Full free-text description |
| `business` | string | `SALE` or `RENTAL` |
| `listingType` | string | `USED` or `DEVELOPMENT` |
| `usageType` | string | `RESIDENTIAL` or `COMMERCIAL` |
| `unitType` | string | ZAP UnitType enum (APARTMENT, HOME, OFFICE, etc.) |
| `unitSubType` | string | Granular sub-type (e.g. `FLAT`, `LOFT`, `PENTHOUSE`) |
| `category` | string | Normalized top-level (`residential`, `comercial`, `rural`, `other`) |
| `subCategory` | string | Normalized fine-grained category |

#### Pricing (all BRL)

| Field | Type | Description |
|---|---|---|
| `priceBRL` | number | Sale price or monthly rent (depending on `business`) |
| `rentPeriod` | string | `MONTHLY` / `DAILY` / `YEARLY` for rentals |
| `condominioMonthlyBRL` | number | Monthly condo fee |
| `iptuYearlyBRL` | number | Annual IPTU (municipal property tax) |
| `totalMonthlyCostBRL` | number | Rent + condomínio + IPTU/12, pre-computed |
| `pricePerSqmBRL` | number | BRL per m² (price / usableArea) |

#### Property metrics

| Field | Type | Description |
|---|---|---|
| `usableArea` | number | Usable area in m² (área útil) |
| `totalArea` | number | Total area in m² (área total) |
| `bedrooms` | integer | Quartos |
| `bathrooms` | integer | Banheiros |
| `suites` | integer | Suítes |
| `parkingSpaces` | integer | Vagas de garagem |

#### Address & geo

| Field | Type | Description |
|---|---|---|
| `uf` | string | 2-letter state code |
| `city` | string | Município |
| `neighborhood` | string | Bairro |
| `zone` | string | Zona (Zona Sul / Zona Oeste / Centro etc.) |
| `street` | string | Logradouro |
| `streetNumber` | string | Número |
| `zipCode` | string | CEP |
| `latitude` / `longitude` | number | Geolocation |

#### Building & amenities

| Field | Type | Description |
|---|---|---|
| `amenities` | array | Piscina, academia, sauna, churrasqueira, salão de festas, portaria 24h, etc. |
| `buildingClass` | string | Building classification when published |
| `buildingName` | string | Edifício / condomínio name |
| `ceilingHeight` | number | Ceiling height (m) — relevant for galpão listings |
| `isCommercialCondo` | boolean | True for CRE inside a multi-tenant building |
| `zoning` | string | Municipal zoning class (if exposed) |

#### Lançamento fields (when `isLancamento` is `true`)

| Field | Type | Description |
|---|---|---|
| `isLancamento` | boolean | `true` for new-development records |
| `launchName` | string | Project name (e.g. `JK Faria Lima by Cyrela`) |
| `launchPhase` | string | Phase (pre-launch, launched, under-construction, ready) |
| `constructorName` | string | Builder/developer (Cyrela, EZTec, Tegra, JFL, MRV, Eztec...) |
| `constructorCNPJ` | string | Developer CNPJ (corporate tax ID) |
| `deliveryDate` | string | Forecast delivery date |
| `totalUnits` | integer | Total units in the project |

#### Brazilian financial flags

| Field | Type | Description |
|---|---|---|
| `isFiadorFree` | boolean | True when rental does not require a fiador (guarantor) |
| `acceptsExchange` | boolean | Aceita permuta |
| `isFinancing` | boolean | Owner accepts mortgage financing |
| `isFGTSEligible` | boolean | Buyer can use FGTS (severance fund) for down payment |
| `isMCMVEligible` | boolean | Qualifies for the Minha Casa Minha Vida federal program |

#### Agency / imobiliária

| Field | Type | Description |
|---|---|---|
| `agencyId` | string | ZAP-issued imobiliária ID |
| `agencyName` | string | Imobiliária name |
| `agencyCRECI` | string | CRECI registration (state realtor licence) |
| `agencyCNPJ` | string | Corporate tax ID |
| `agencyPhone` | string | Primary phone |
| `agencyEmail` | string | Public email (when exposed) |
| `agencyWebsite` | string | Imobiliária website |
| `agencyAddress` | string | Physical office address |
| `agencyLogoUrl` | string | Logo image URL |
| `agencyTier` | string | ZAP-issued tier (DESTAQUE / SUPER\_PREMIUM / PREMIUM / STANDARD) |
| `agencyVerified` | boolean | Tier-verified flag |
| `agencyEstablishedYear` | integer | Year of establishment |
| `agencyTotalListings` | integer | Total active inventory on ZAP |
| `agencyServiceAreas` | array | Cities/regions served |
| `agencySpecializations` | array | Verticals (lançamento, alto padrão, comercial, rural...) |
| `agencyBranchCount` | integer | Branch / filial count |
| `publisherType` | string | `OWNER` / `AGENCY` / `DEVELOPER` |

#### Media & cross-portal

| Field | Type | Description |
|---|---|---|
| `publishedAt` | string | Original publish timestamp |
| `updatedAt` | string | Last update timestamp on ZAP |
| `imageCount` | integer | Photo count |
| `thumbnailUrl` | string | Primary thumbnail |
| `imageUrls` | array | Full image URL list |
| `videoUrls` | array | Video URL list |
| `hasVideo` / `hasFloorplan` / `hasVirtualTour` | boolean | Media flags |
| `listingQualityScore` | integer | ZAP-issued content-quality score |
| `alsoOnVivaReal` | boolean | True if the same listing is syndicated to VivaReal |
| `vivaRealId` | string | Sibling VivaReal listing ID for dedupe |
| `searchBusiness` / `searchState` / `searchCity` / `searchNeighborhood` | string | The input filter that produced this record (audit-friendly) |
| `scrapedAt` | string | ISO-8601 extraction timestamp |

#### Example: Pinheiros (São Paulo) sale listing

```json
{
  "recordType": "listing",
  "listingId": "2622080195",
  "portal": "ZAP",
  "url": "https://www.zapimoveis.com.br/imovel/venda-apartamento-3-quartos-com-piscina-pinheiros-zona-oeste-sao-paulo-sp-128m2-id-2622080195/",
  "title": "Apartamento alto padrão, 128 m², 3 quartos, 2 vagas - Pinheiros",
  "description": "Apartamento totalmente reformado no coração de Pinheiros...",
  "business": "SALE",
  "listingType": "USED",
  "usageType": "RESIDENTIAL",
  "unitType": "APARTMENT",
  "category": "residential",
  "priceBRL": 2150000,
  "condominioMonthlyBRL": 1850,
  "iptuYearlyBRL": 7200,
  "totalMonthlyCostBRL": 2450,
  "pricePerSqmBRL": 16797,
  "usableArea": 128,
  "totalArea": 145,
  "bedrooms": 3,
  "bathrooms": 3,
  "suites": 1,
  "parkingSpaces": 2,
  "uf": "SP",
  "city": "São Paulo",
  "neighborhood": "Pinheiros",
  "zone": "Zona Oeste",
  "street": "Rua dos Pinheiros",
  "zipCode": "05422-001",
  "latitude": -23.5658,
  "longitude": -46.6850,
  "amenities": ["Piscina", "Academia", "Portaria 24h", "Salão de festas"],
  "buildingName": "Edifício Pinheiros Prime",
  "isLancamento": false,
  "isFGTSEligible": true,
  "isFinancing": true,
  "agencyId": "231067",
  "agencyName": "Imobiliária Exemplo Alto Padrão",
  "agencyCRECI": "J-99999",
  "agencyTier": "PREMIUM",
  "publisherType": "AGENCY",
  "publishedAt": "2026-03-12T10:14:00Z",
  "updatedAt": "2026-05-08T18:22:00Z",
  "imageCount": 28,
  "hasFloorplan": true,
  "hasVirtualTour": true,
  "alsoOnVivaReal": true,
  "vivaRealId": "id-9999911",
  "scrapedAt": "2026-05-16T09:00:00.000Z"
}
```

#### Example: Lançamento (Vila Olímpia, São Paulo)

```json
{
  "recordType": "listing",
  "listingId": "2899200001",
  "portal": "ZAP",
  "title": "Lançamento JK Vila Olímpia - 1 a 4 dorms",
  "business": "SALE",
  "listingType": "DEVELOPMENT",
  "usageType": "RESIDENTIAL",
  "unitType": "APARTMENT",
  "priceBRL": 1980000,
  "usableArea": 78,
  "bedrooms": 2,
  "parkingSpaces": 1,
  "uf": "SP",
  "city": "São Paulo",
  "neighborhood": "Vila Olímpia",
  "zone": "Zona Sul",
  "isLancamento": true,
  "launchName": "JK Vila Olímpia Residences",
  "launchPhase": "under-construction",
  "constructorName": "Cyrela Brazil Realty",
  "constructorCNPJ": "73.178.600/0001-18",
  "deliveryDate": "2027-12-31",
  "totalUnits": 240,
  "isFGTSEligible": false,
  "isFinancing": true,
  "agencyName": "Cyrela Vendas Diretas",
  "publisherType": "DEVELOPER",
  "scrapedAt": "2026-05-16T09:01:00.000Z"
}
```

***

### Reference Tables

#### Unit Type enum (most common)

| `unitType` | Português | Notes |
|---|---|---|
| `APARTMENT` | Apartamento | Most common residential type |
| `HOME` | Casa | Standalone house |
| `CONDOMINIUM` | Casa de condomínio | House inside gated condominium |
| `PENTHOUSE` | Cobertura | Top-floor / duplex penthouse |
| `FLAT` | Flat / apart-hotel | Hotel-serviced unit |
| `KITNET` | Kitnet / studio | Studio apartment |
| `FARM` | Fazenda / sítio / chácara | Rural property |
| `LAND_LOT` | Terreno / lote | Land plot |
| `OFFICE` | Sala comercial | Standalone office |
| `COMMERCIAL_BUILDING` | Prédio comercial | Entire commercial building |
| `COMMERCIAL_PROPERTY` | Conjunto comercial | Office floor / suite |
| `BUSINESS` | Ponto comercial | Business / storefront with goodwill |
| `WAREHOUSE_SHED` | Galpão | Industrial warehouse |
| `GARAGE` | Vaga de garagem | Parking spot |

#### Business + Listing-Type Matrix

| `business` × `listingType` | Means |
|---|---|
| `SALE` × `USED` | Resale / secondhand sale (the bulk of inventory) |
| `SALE` × `DEVELOPMENT` | Lançamento — pre-construction or under-construction sale |
| `RENTAL` × `USED` | Standard rental — long-term or short-term per `rentPeriod` |
| `RENTAL` × `DEVELOPMENT` | Rare — pre-leasing in mixed-use developments |

#### Agency Tier reference

| Tier | Meaning |
|---|---|
| `DESTAQUE` / `SUPER_PREMIUM` | Top-paying advertisers — surfaced first in search |
| `PREMIUM` | Standard paid plan with featured listings |
| `STANDARD` | Free or basic plan |

***

### Use Cases

#### Real Estate Investor & Family-Office Research (Brazil)

International and domestic investors evaluating Brazilian residential and CRE opportunities use this dataset to:

- **Benchmark BRL price per m²** across Pinheiros, Itaim Bibi, Vila Olímpia, Faria Lima, Jardins, Moema, Brooklin (SP) and Ipanema, Leblon, Lagoa, Barra da Tijuca (RJ)
- **Track yield potential** by joining sale price against `RENTAL` listings in the same building or `neighborhood`
- **Spot stale inventory** by monitoring `publishedAt` vs. `updatedAt` — long stagnation often signals overpriced or distressed assets
- **Filter for FGTS / MCMV-eligible inventory** when modelling first-time buyer demand
- **Compare lançamento vs. resale spreads** in the same bairro to gauge developer premium pricing
- **Pull commercial inventory only** (`usageTypes: ["COMMERCIAL"]`) for triple-A office and galpão analysis on the Faria Lima / Anhanguera / Castelo Branco corridors

#### Brazilian Prop-Tech & Listings Aggregator Apps

Aggregators, off-portal CRM tools and consumer-facing buyer apps use the actor as their ZAP / VivaReal ingestion layer:

- **Bootstrap a multi-portal listings index** in days, not months — flip `portal` to add VivaReal coverage from the same actor
- **Dedupe automatically** using `alsoOnVivaReal` + `vivaRealId` so users don't see the same apartamento three times
- **Refresh on Apify Scheduler** every few hours so the app always reflects current inventory
- **Enrich with agency metadata** (`agencyName`, `agencyCRECI`, `agencyTier`) for trust signals
- **Power "lançamentos near me"** features using `isLancamento`, `constructorName`, `deliveryDate`

#### IPTU, Condomínio & Total-Cost Benchmarking

Brazilian buyers, accountants and property-tax consultants need real `condomínio` and `IPTU` data to make informed decisions:

- **Compute median condomínio per m²** by bairro to flag overpriced buildings
- **Benchmark IPTU progressivo** changes across SP / RJ / BH municipalities year-over-year
- **Estimate total monthly carrying cost** using `totalMonthlyCostBRL` instead of headline rent
- **Cross-reference with sale price** to compute effective gross yield net of condomínio + IPTU
- **Identify FII (Real Estate Investment Trust) sub-markets** with the lowest condomínio-to-rent ratios

#### Premium-Market Analytics (Alto Padrão / Triple-A)

ZAP's premium skew makes it the right portal for high-end research:

- **Map "alto padrão" inventory** by combining `unitType=PENTHOUSE`, `minPrice=5_000_000` and bairros like Jardins, Vila Nova Conceição, Leblon
- **Track Triple-A office vacancies** along Avenida Faria Lima, Avenida Brigadeiro Faria Lima and Avenida Berrini
- **Benchmark developer pricing strategy** for Cyrela, EZTec, Tegra, JFL, Even, Tecnisa via lançamento records
- **Quantify amenity adoption** (rooftop pool, concierge, EV-charging) across premium buildings
- **Build "ultra-luxury" feeds** filtered to `priceBRL > 10_000_000` for private bank wealth-management teams

#### Journalism, Data Reporting & Public Interest

Brazilian newsrooms (Folha, Estadão, Valor, Piauí, Agência Pública) and international outlets use real-estate data for housing-affordability and gentrification reporting:

- **Document price escalation** in gentrifying bairros (Vila Madalena, Pinheiros, Botafogo, Gloria, Centro de SP)
- **Visualize lançamento concentration** by neighborhood and constructor
- **Trace developer dominance** by joining `constructorCNPJ` against CVM filings
- **Investigate "sem fiador" rental displacement** of traditional fiador-based contracts
- **Compare ZAP vs. VivaReal pricing** for the same listing using `alsoOnVivaReal`

#### B2B Lead Generation — Selling To Brazilian Imobiliárias

Vendors selling CRM, photography, virtual-tour, mortgage origination, insurance and SaaS to Brazilian agencies use the agency directory to:

- **Build an imobiliária prospect list** across all 200K+ ZAP-registered agencies
- **Segment by tier** — target `PREMIUM` and `SUPER_PREMIUM` agencies first
- **Filter by inventory size** (`agencyTotalListings > 100`) to find serious operators
- **Geo-route reps** by `agencyServiceAreas`
- **Score lead quality** with `agencyVerified`, `agencyEstablishedYear`, `agencyBranchCount`

#### Mortgage, Financing & FinTech Origination

Mortgage brokers, financiamento imobiliário FinTechs (CrediHome, MelhorTaxa, Truffi etc.) and FGTS-leverage products need clean listing inventory:

- **Score FGTS-eligible apartamentos** with `isFGTSEligible: true` for first-buyer marketing
- **Filter MCMV-eligible inventory** (`isMCMVEligible: true`) for federal-program lead funnels
- **Compute LTV scenarios** at scale across active inventory
- **Identify "isFinancing" friendly sellers** for warm-handoff campaigns

#### Insurance & Underwriting

Residential property insurers and pet/contents insurers use the dataset for:

- **Geo-risk modelling** by joining `latitude`/`longitude` with flood, fire and crime risk layers
- **Building-class underwriting** based on `buildingClass`, `amenities`, `buildingName`
- **Bulk quote generation** against active rental inventory for renter-insurance tie-ins
- **Property-replacement-cost estimation** using `pricePerSqmBRL` benchmarks

#### Academic & Public-Policy Research

Universities (USP, FGV, UFRJ, Insper), urban-economics researchers and Brazilian think tanks (Cebrap, IPEA) leverage longitudinal scraped data to:

- **Quantify housing affordability** by metro / bairro / cohort
- **Measure construction pipeline elasticity** through lançamento phase tracking
- **Study commercial-real-estate vacancy patterns** post-pandemic
- **Inform urban-planning thesis work** at neighborhood granularity

#### Relocation, Expat & Corporate Mobility

International HR teams and relocation specialists (Cushman & Wakefield, JLL, Crown Relocations) placing executives in Brazil use the dataset to:

- **Surface "sem fiador"** rentals for foreign hires who can't easily provide a Brazilian guarantor
- **Filter premium furnished flats** in Itaim Bibi, Vila Olímpia, Pinheiros for short-term stays
- **Benchmark monthly cost-of-living packages** across SP / RJ / BH / Brasília
- **Compare schools-proximity options** for family relocations

***

### Sample Queries & Recipes

#### Recipe 1 — Premium 3-bedroom apartamentos for sale in Pinheiros / Itaim Bibi

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

#### Recipe 2 — Sem-fiador rentals in Rio de Janeiro

```json
{
  "mode": "listings",
  "business": ["RENTAL"],
  "usageTypes": ["RESIDENTIAL"],
  "states": ["RJ"],
  "cities": ["rio-de-janeiro"],
  "neighborhoods": ["copacabana", "ipanema", "leblon", "botafogo"],
  "semFiador": true,
  "sortBy": "lowest_price",
  "maxListings": 300
}
```

#### Recipe 3 — All São Paulo lançamentos this quarter

```json
{
  "mode": "listings",
  "business": ["SALE"],
  "listingType": ["DEVELOPMENT"],
  "usageTypes": ["RESIDENTIAL"],
  "states": ["SP"],
  "cities": ["sao-paulo"],
  "sortBy": "newest",
  "maxListings": 1000
}
```

#### Recipe 4 — Triple-A office space (sala / conjunto comercial) on Faria Lima

```json
{
  "mode": "listings",
  "business": ["RENTAL"],
  "usageTypes": ["COMMERCIAL"],
  "unitTypes": ["OFFICE", "COMMERCIAL_PROPERTY"],
  "states": ["SP"],
  "cities": ["sao-paulo"],
  "neighborhoods": ["itaim-bibi", "vila-olimpia", "faria-lima"],
  "minArea": 200,
  "sortBy": "highest_area",
  "maxListings": 200
}
```

#### Recipe 5 — Galpões / warehouses in Greater SP for logistics tenants

```json
{
  "mode": "listings",
  "business": ["SALE", "RENTAL"],
  "usageTypes": ["COMMERCIAL"],
  "unitTypes": ["WAREHOUSE_SHED"],
  "states": ["SP"],
  "cities": ["sao-paulo", "guarulhos", "osasco", "cajamar"],
  "minArea": 1000,
  "maxListings": 500
}
```

#### Recipe 6 — Discover new imobiliárias by sequential ID scan

```json
{
  "mode": "agencies",
  "agencyIdRangeStart": 700000,
  "agencyIdRangeEnd": 705000,
  "fetchAgencyListings": false,
  "maxListings": 0
}
```

#### Recipe 7 — Mirror to VivaReal from the same actor

```json
{
  "mode": "listings",
  "portal": "VIVA_REAL",
  "business": ["SALE"],
  "states": ["MG"],
  "cities": ["belo-horizonte"],
  "neighborhoods": ["savassi", "lourdes", "funcionarios"],
  "maxListings": 500
}
```

***

### Integration Examples

#### Google Sheets

Schedule the actor daily at 7:00 BRT, attach the **Apify → Google Sheets** integration to the schedule, and your operations team opens a fresh inventory tab every morning — no manual export.

#### Make.com / Zapier / n8n

The official **Apify** connector runs on all three platforms. Common workflows:

- New listing in a target neighborhood → Slack notification + CRM record
- `priceBRL` drops by >5% vs. last run → email alert to a watchlist of investors
- New `isLancamento: true` → push to a Notion development tracker
- Agency tier upgrade (`STANDARD` → `PREMIUM`) → log to outreach pipeline

#### Power BI / Tableau / Looker Studio

Connect Apify's REST API (`https://api.apify.com/v2/datasets/{id}/items?format=json`) as a JSON data source. Auto-refresh on Apify schedule. Build dashboards covering:

- BRL price per m² heatmap by bairro
- Total active inventory by UF
- Average condomínio mensal by building age
- Lançamento pipeline by constructor and delivery year
- Cross-portal duplication rate (ZAP vs. VivaReal)

#### Postgres / Snowflake / BigQuery

Use [Apify webhooks](https://docs.apify.com/platform/integrations/webhooks) to POST `RUN.SUCCEEDED` events to a small ingestion endpoint that streams items into your warehouse. The flat output schema maps directly to a single table — no nested-JSON unpacking required.

#### Salesforce / HubSpot / RD Station / Pipedrive

For agency-mode runs, upsert each agency by `agencyId`. Trigger Salesforce **Lead** creation when `agencyTier=SUPER_PREMIUM`, or RD Station **Oportunidade** when `agencyTotalListings>500`.

#### Webhooks & Event Streams

Apify supports outbound webhooks for `RUN.SUCCEEDED`, `RUN.FAILED`, `RUN.TIMED_OUT`. Wire them to Datadog, PagerDuty or a Slack incident channel for production pipelines.

***

### Major Brazilian Markets Covered

| Metro / Capital | UF | City Slug | Why it matters |
|---|---|---|---|
| São Paulo | SP | `sao-paulo` | Largest market, premium core (Faria Lima, Jardins, Itaim, Pinheiros, Vila Olímpia, Moema, Brooklin) |
| Rio de Janeiro | RJ | `rio-de-janeiro` | Iconic Zona Sul (Ipanema, Leblon, Copacabana), Barra da Tijuca, Botafogo |
| Belo Horizonte | MG | `belo-horizonte` | Mineiro premium (Savassi, Lourdes, Funcionários, Belvedere, Sion) |
| Brasília | DF | `brasilia` | Federal capital, Asa Sul / Asa Norte / Lago Sul / Sudoeste |
| Salvador | BA | `salvador` | Northeast hub, Pituba, Barra, Graça, Horto Florestal |
| Curitiba | PR | `curitiba` | Strong middle-class market, Batel, Água Verde, Bigorrilho |
| Porto Alegre | RS | `porto-alegre` | Southern capital, Moinhos de Vento, Bela Vista, Petrópolis |
| Recife | PE | `recife` | Boa Viagem, Pina, Casa Forte premium corridors |
| Fortaleza | CE | `fortaleza` | Beira-Mar, Meireles, Aldeota — beach-front premium |
| Florianópolis | SC | `florianopolis` | Beach / lifestyle market, Jurerê Internacional, Lagoa |
| Goiânia | GO | `goiania` | Setor Bueno, Marista, Jardim Goiás |
| Campinas | SP | `campinas` | Tech hub, Cambuí, Nova Campinas |
| Vitória | ES | `vitoria` | Praia do Canto, Jardim Camburi, Mata da Praia |
| Manaus | AM | `manaus` | Amazonas capital — Adrianópolis, Ponta Negra |
| Niterói | RJ | `niteroi` | Icaraí, Charitas — across the bay from Rio |

All 26 Brazilian states plus the Federal District are supported via the `states` parameter (UF codes).

***

### Cost & Performance

| Metric | Value |
|---|---|
| Engine | Direct Glue API via `got-scraping` — no browser |
| Runtime (200 listings, single city) | 60-120 seconds |
| Runtime (1,000 listings, multi-city) | 4-7 minutes |
| Runtime (agency-mode 5,000 ID scan) | 10-20 minutes (range-dependent) |
| Cost per run | Pay-per-event — varies with record count |
| Pricing model | Pay-per-event (per-record transparency) |
| Data freshness | Live at run time — pulls current ZAP API state |
| Auth required | None (ZAP user account not required) |
| Proxy required | Strongly recommended (Brazilian residential, Apify Proxy default) |
| Concurrency | Default 1, max 5 — keep low to dodge Cloudflare |
| Memory footprint | 256 MB sufficient; 512 MB for large agency-mode scans |

***

### Compliance, Privacy & Legal Notes

- **Public data only.** Every field this actor extracts is shown to anonymous visitors of `zapimoveis.com.br` and the public Glue API surface — no login, no paywall, no scraping of "members-only" content.
- **No buyer/seller PII.** ZAP intentionally redacts buyer/seller identity from public listings. Only **agency** contact details (CRECI, CNPJ, phone, email, address) — which are themselves regulatory-mandated public information under Brazilian law — appear in the dataset.
- **CRECI compliance.** Real-estate brokers in Brazil are legally required to display their CRECI registration on every listing; extracting that field reflects regulator intent, not circumvention.
- **LGPD (Lei Geral de Proteção de Dados).** All data is **publicly published commercial information about real estate inventory and licensed real-estate agencies**, processed under legitimate interest (Art. 7, IX). Personal data of natural persons (buyer/seller) is not collected. As the data controller of any derived database, you are responsible for downstream LGPD compliance (purpose limitation, retention, subject rights).
- **robots.txt deference.** ZAP exposes a public robots.txt; the actor respects published search and listing pages and uses the same Glue API the public web app uses.
- **No CAPTCHA bypass code is shipped.** When the actor encounters a Cloudflare challenge, it backs off and retries on a new residential IP rather than attempting to break the challenge.
- **Terms of Service.** Users are responsible for their own use of the data, including ZAP's Terms of Service and Grupo OLX policies. Commercial republishing of full listing photos may require licensing.
- **GDPR / CCPA.** No EU- or California-personal data is collected by design (this is Brazilian-real-estate inventory).

> **Important:** This actor is intended for legitimate research, analytics, prop-tech development, journalism, and lead-generation use cases. It is not intended to facilitate scraping of personal data, evasion of any portal's stated commercial restrictions, or any practice prohibited by Brazilian law.

***

### Frequently Asked Questions

#### How fresh is the data?

**Live at run time.** Each run pulls the current state of the Glue API at the moment of execution. There is no caching layer between the actor and ZAP — what you get is what a logged-out visitor sees in their browser right now.

#### How many records will I get?

Up to your `maxListings` cap, subject to the actual inventory matching your filters. A single São Paulo city-wide `SALE` × `RESIDENTIAL` query routinely exceeds 50,000 matching listings; the actor's `maxPages` and `pageSize` cap how deep it paginates per task. For unlimited, set `maxListings: 0` and `maxPages: 0` — but expect proportional runtime and cost.

#### Does this require a ZAP Imóveis login or API key?

No. ZAP's Glue API is consumed by the public web client without authentication; the actor uses the same path. You only need an Apify account.

#### Why do I need a Brazilian residential proxy?

ZAP is fronted by **Cloudflare**, which aggressively blocks datacenter IPs (especially non-Brazilian ones). The default `proxyConfiguration` uses Apify Proxy's `RESIDENTIAL` group with `country=BR`, which is the most reliable configuration. You can supply your own BR residential proxies if you have them.

#### What's the difference between this and the VivaReal actor?

VivaReal and ZAP are **sibling portals under Grupo OLX** sharing the same Glue API backend. This actor lets you flip `portal: "VIVA_REAL"` to scrape VivaReal from the same code path — but the dedicated [VivaReal Brazil Real Estate Scraper](https://apify.com/haketa/vivareal-scraper) is tuned for VivaReal's slightly different metadata defaults and is the recommended option for VivaReal-primary workloads. **Use ZAP for premium / alto padrão / lançamento research; use VivaReal for mass-market coverage and broader inventory breadth.**

#### Can I scrape commercial real estate (CRE)?

Yes — set `usageTypes: ["COMMERCIAL"]` and optionally narrow `unitTypes` to `OFFICE`, `COMMERCIAL_BUILDING`, `COMMERCIAL_PROPERTY`, `BUSINESS`, or `WAREHOUSE_SHED`. ZAP has strong inventory for sala comercial, conjunto comercial and galpão.

#### Can I scrape lançamentos specifically?

Yes — set `listingType: ["DEVELOPMENT"]`. The output will include `isLancamento: true`, `launchName`, `launchPhase`, `constructorName`, `constructorCNPJ`, `deliveryDate` and `totalUnits`.

#### How do I dedupe against VivaReal?

Records carry `alsoOnVivaReal: true` and `vivaRealId` when the same listing is syndicated to both portals. Build a composite key on `(listingId, vivaRealId)` or use the building+address fingerprint for cross-portal matching.

#### Can I filter by CEP (zip code)?

Not at API level — ZAP filters by city + neighborhood. Pull broader inventory and apply a `zipCode` filter post-extraction in SQL or Python.

#### Can I get phone numbers and emails of property owners?

No. ZAP redacts owner personal data; only **agency** (imobiliária) contact details are exposed publicly and returned by this actor.

#### How does pagination work?

The Glue API uses `from` + `size` offset pagination. The actor walks each search until either `maxPages` is reached, `maxListings` is hit, or the API returns no more records. Each `from` step equals `pageSize` (default 24).

#### What happens if Cloudflare challenges me?

The actor retries up to `maxRetries` times with backoff (default 3). If you see persistent failures, raise `requestDelay` to 1500-3000 ms, lower `maxConcurrency` to 1, or supply higher-quality Brazilian residential proxies.

#### Can I run this on the Apify free plan?

Yes. Modest runs (a few hundred listings) fit comfortably in free-tier limits. Larger workloads should be on a paid plan to take advantage of higher concurrency and longer run timeouts.

#### Can I schedule this?

Yes — Apify's built-in Scheduler supports cron-style schedules. Common patterns: hourly for hot-watching specific neighborhoods, daily for full-market refresh, weekly for agency-directory updates.

#### What export formats are supported?

JSON, JSON Lines, CSV, Excel (XLSX), HTML, XML and RSS — directly from the Apify dataset view or via the REST API.

#### How do I crawl all imobiliárias in Brazil?

Run `mode: "agencies"` with `agencyIdRangeStart: 1` and `agencyIdRangeEnd: 850000`. Note this is slow; in production, parallelize across several runs by partitioning the range (e.g. 100K chunks). Set `fetchAgencyListings: false` first to get just profile metadata.

#### Will the actor break if ZAP changes their API?

The Glue API has been stable for over two years, but if endpoint shapes drift, raise an issue on the actor's Apify Store page and a patched version is usually shipped within 24-48 hours.

#### Can I use this data commercially?

This actor is a tool. You — as the data controller — are responsible for ensuring your use complies with ZAP's Terms of Service, LGPD, applicable Brazilian commercial law, and the regulations of any jurisdiction in which you operate.

#### Can I track price changes over time?

Yes — schedule the actor daily, archive each dataset, and diff `priceBRL` per `listingId` over time. Apify retains run datasets indefinitely on most plans.

***

### Related Apify Actors by Haketa

If you're building a multi-market real-estate or LATAM data pipeline, these sibling actors cover adjacent geographies and verticals:

- [VivaReal Brazil Real Estate Scraper](https://apify.com/haketa/vivareal-scraper) — sibling Brazilian portal (Grupo OLX), mass-market focus
- [Lamudi Philippines Real Estate Scraper](https://apify.com/haketa/lamudi-scraper) — emerging-Asia residential & condo inventory
- [Zameen.com Pakistan Real Estate Scraper](https://apify.com/haketa/zameen-scraper) — South-Asia property data
- [Realestate.com.kh Cambodia Scraper](https://apify.com/haketa/realestate-com-kh-scraper) — Cambodia / Phnom Penh property inventory
- [Realtor.ca Scraper (Canada)](https://apify.com/haketa/realtor-ca-scraper) — Canadian MLS-syndicated listings
- [Immoweb.be Belgium Property Scraper](https://apify.com/haketa/immoweb-scraper) — Belgian residential / commercial market
- [Domain.com.au Property Scraper (Australia)](https://apify.com/haketa/domain-com-au-scraper) — Australian metro property data
- [Apartments.com Scraper (US)](https://apify.com/haketa/apartments-com-scraper) — US rental inventory
- [Rent.com Scraper (US)](https://apify.com/haketa/rent-com-scraper) — US rental inventory alternative
- [BBB Business Scraper](https://apify.com/haketa/bbb-scraper) — North American business directory for B2B enrichment

***

### Comparison vs. Alternatives

| Approach | Setup time | Premium / Lançamento support | Cross-portal (VivaReal) | Cloudflare handling | Schema normalization | Cost (1,000 listings) |
|---|---|---|---|---|---|---|
| **This actor** | < 1 minute | Full | Built-in via `portal` switch | Handled (BR residential) | Built-in | A few BRL cents |
| Manual browsing | N/A | Manual | Manual | N/A | None | Free, unscalable |
| Custom Python + Playwright | 2-4 weeks | DIY | DIY | DIY (hard) | DIY | $$$ infra |
| Custom Python + raw HTTP | 1-3 weeks | DIY | DIY | Likely blocked | DIY | $$ infra |
| Paid real-estate data vendor | Days-weeks | Sometimes | Rare | Built-in | Built-in | $1K-10K/mo |
| ZAP partner API | Months (sales cycle) | Yes | Yes | N/A | Built-in | Enterprise contract |

***

### Why Pay-Per-Event Pricing?

This actor uses **pay-per-event** pricing on the Apify Store rather than a flat monthly fee or unpredictable per-Compute-Unit rate, which means:

- You only pay when the actor actually runs and emits data
- Charges scale with what you consume — sampling 50 records costs pennies
- Transparent line-item billing inside the Apify Console
- No monthly minimums, no commit, no "seat licenses"
- Free to evaluate — run a tiny `maxListings: 25` sample before committing
- Predictable unit economics for prop-tech apps that bill end-users per query

***

### Changelog

| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-05 | Initial public release — listings + agency modes, ZAP and VivaReal portals, lançamento support, BR residential proxy default, pay-per-event pricing |

***

### Keywords

ZAP Imóveis scraper · ZAP Imoveis data · zapimoveis.com.br scraper · ZAP API alternative · Brazil real estate scraper · Brazil premium real estate scraper · Brasil real estate API · BRL price data Brasil · imóveis Brasil API · São Paulo apartamento scraper · São Paulo imóveis scraper · Rio imóvel data · Rio de Janeiro real estate API · Belo Horizonte imóveis scraper · Brasília imóveis scraper · Salvador real estate data · Curitiba imóveis API · Porto Alegre real estate scraper · Recife imóveis data · Fortaleza real estate data · Florianópolis imóveis scraper · lançamento imobiliário scraper · Cyrela EZTec Tegra lançamento data · sala comercial scraper Brasil · galpão warehouse scraper Brasil · CRE Brasil data · imobiliária CRECI scraper · CNPJ imobiliária Brasil · sem fiador rental scraper · QuintoAndar alternative data · FGTS eligible apartamento data · MCMV Minha Casa Minha Vida scraper · condomínio mensal data · IPTU benchmark data · preço por m² Brasil · Pinheiros Itaim Vila Olímpia scraper · Faria Lima office data · Ipanema Leblon Copacabana rental scraper · Barra da Tijuca property scraper · Jardins Moema Brooklin alto padrão data · Brazil prop-tech API · LATAM real estate data · Apify Brazil scraper · real estate lead generation Brasil · agency CRECI directory Brasil · Grupo OLX real estate data · Cloudflare-bypass real estate scraper · investor research Brazil real estate · BR residential proxy scraper

***

### Support

- **Bug reports:** Use the **Issues** tab on the [Apify Store page](https://apify.com/haketa/zapimoveis-scraper)
- **Feature requests:** Same place — describe your use case and target portal/region
- **Direct contact:** Reach the developer through the Apify Console developer profile

If this actor saves your team hours of Cloudflare-fighting and pricing-array reconciliation, a **5-star rating** on the Apify Store helps other prop-tech, investor and journalist teams discover it. Obrigado!

***

### 📅 Changelog & Maintenance

**Last updated:** 2026-07-02 — Actor verified and maintained. Data pipeline tested for quality, structure and freshness; selectors/endpoints confirmed against the live site.

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

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

How many listings to fetch per API call. The site default is 24; up to 36 is recommended.

## `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": 100,
  "maxPages": 20,
  "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": 100,
    "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": 100,
    "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": 100,
  "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/49vSrKirUl2cSR6mg/openapi.json
