# ZAP Imoveis Scraper | Brazil Real Estate Listings & Prices (`plum_spear/aztec-zapimoveis`) Actor

Scrape ZAP Imoveis - Brazil's largest real estate portal - by city, price and property type. Returns price, condo fee, IPTU, area, bedrooms, bathrooms, parking, full address, geo coordinates and the listing URL as clean structured data.

- **URL**: https://apify.com/plum\_spear/aztec-zapimoveis.md
- **Developed by:** [Roberto Kerber](https://apify.com/plum_spear) (community)
- **Categories:** Real estate, Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.15 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Imoveis Scraper - Brazil Real Estate Listings, Prices & Areas

> Built and maintained by **Az Digital Consulting LU**.

**Scrape ZAP Imoveis at scale.** This scraper turns [ZAP Imoveis](https://www.zapimoveis.com.br/) - Brazil's largest real estate portal, with **4.9 million+ active listings** - into a clean, structured data feed. Search by city, price range and property type, and get flat JSON for every listing: **price in BRL, condo fee, yearly IPTU, usable area, bedrooms, bathrooms, suites, parking spaces, full address, neighborhood, ZIP code, geo coordinates** and a direct URL to the ad.

No proxy setup and no HTML parsing. This Actor talks to the portal's **official listings API**, so runs are fast, cheap and stable. Run it once for a market snapshot, or **schedule it daily** to track how asking prices and inventory move over time.

***

### What does ZAP Imoveis Scraper do?

Instead of copying listings by hand, you give it a city - `São Paulo`, `Rio de Janeiro`, `Belo Horizonte`, `Curitiba` - and it returns every matching property as clean, flat JSON.

Prices arrive as **integers** (`419000`, not `"R$ 419.000"`), so you can sort, filter and run calculations the moment the run finishes. Area comes as an integer in square meters, ready for range filters. City, neighborhood and state arrive as separate fields, so grouping by region is trivial.

It is the fastest way to **scrape ZAP Imoveis listings** for any city or segment - whether you are benchmarking asking prices, sizing a neighborhood, sourcing leads, or building a Brazilian real estate market analysis for a client.

***

### Why use ZAP Imoveis Scraper?

- **Price monitoring** - track asking prices per neighborhood, per m2, over time.
- **Market intelligence** - quantify supply by city, property type and price band.
- **Real estate lead generation** - build lists of properties matching a client brief.
- **Investment analysis** - compare price/m2 across regions, factoring condo fee and IPTU.
- **Comparable sales (CMA)** - pull comparable listings for a valuation in seconds.

***

### How to use it

1. Click **Try for free**.
2. Choose **For sale** or **For rent**.
3. Type a **city** (e.g. `São Paulo`) and, optionally, a price range and property type.
4. Set **Max listings**.
5. Click **Start** and download the results as JSON, CSV, Excel or HTML.

No account on the target site, no proxy configuration, nothing to install.

***

### Input

| Field | Description |
|---|---|
| `business` | `SALE` (for sale) or `RENTAL` (for rent) |
| `city` | City name in Portuguese, e.g. `São Paulo` |
| `state` | State name in Portuguese (optional) |
| `unitTypes` | `APARTMENT`, `HOME`, `CONDOMINIUM`, `PENTHOUSE`, `FLAT`, `BUSINESS`, `ALLOTMENT_LAND`, `FARM` |
| `priceMin` / `priceMax` | Price range in BRL (optional) |
| `maxListings` | How many listings to collect |

```json
{
  "business": "SALE",
  "city": "São Paulo",
  "unitTypes": "APARTMENT",
  "priceMin": 200000,
  "priceMax": 500000,
  "maxListings": 100
}
```

***

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "id": "2693198935",
  "title": "Apartamento com 3 quartos à venda em Vila Andrade",
  "businessType": "SALE",
  "unitType": "APARTMENT",
  "price": 1290000,
  "condoFee": 1100,
  "iptu": 4200,
  "usableArea": 128,
  "bedrooms": 3,
  "bathrooms": 3,
  "suites": 1,
  "parkingSpaces": 2,
  "street": "Rua Doutor José Estefno",
  "neighborhood": "Vila Andrade",
  "city": "São Paulo",
  "state": "São Paulo",
  "stateAcronym": "SP",
  "zipCode": "05713080",
  "latitude": -23.62,
  "longitude": -46.73,
  "url": "https://www.zapimoveis.com.br/imovel/apartment-venda-sao-paulo-vila-andrade-id-2693198935/"
}
```

#### Data fields

| Field | Type | Description |
|---|---|---|
| `id` | string | ZAP listing ID |
| `title` | string | Listing headline |
| `businessType` | string | `SALE` or `RENTAL` |
| `unitType` | string | Property type |
| `price` | number | Asking price in BRL |
| `condoFee` | number | Monthly condo fee in BRL |
| `iptu` | number | Yearly property tax in BRL |
| `usableArea` / `totalArea` | number | Area in m2 |
| `bedrooms` / `bathrooms` / `suites` | number | Room counts |
| `parkingSpaces` | number | Parking spots |
| `street`, `streetNumber`, `neighborhood`, `city`, `state`, `stateAcronym`, `zipCode` | string | Address breakdown |
| `latitude` / `longitude` | number | Geo coordinates when published |
| `amenities` | array | Listed amenities |
| `createdAt` / `updatedAt` | string | Listing timestamps |
| `url` | string | Direct link to the ad |

***

### Pricing

**Pay per event: $0.15 per 1,000 listings returned, plus a minimal actor-start event.**

No subscription, no monthly minimums - you only pay for the data you actually extract. New Apify users get free monthly platform credits to test at no cost before scaling.

***

### Automated & Recurring Real Estate Tracking (Apify Scheduler)

To track asking prices, condo fee trends, and newly posted apartments automatically over time:

1. In the Actor console, click the **Schedules** tab > **Add new schedule**.
2. Set frequency (e.g. `@daily` at 8:00 AM).
3. Connect your output via **Webhook** or the **Google Sheets / Make / n8n** integration to log new listings automatically into your spreadsheet, CRM, or BI dashboard.

#### Python Integration Example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("plum_spear/aztec-zapimoveis").call(
    run_input={"business": "SALE", "city": "São Paulo", "unitTypes": "APARTMENT", "maxListings": 100}
)

items = client.dataset(run["defaultDatasetId"]).list_items().items
for prop in items:
    print(f"{prop['title']} - R$ {prop['price']} (Condo: R$ {prop['condoFee']})")
```

***

### Tips

- **The portal caps a single search at roughly 1,500 results.** To collect more, split the job: run one search per city, per price band, or per property type. The Actor warns you in the log when a search hits that ceiling.
- Narrow searches are faster and cheaper. `city` + `unitTypes` + a price band is the sweet spot.
- Schedule a daily run on the same filters to build a price history you can chart.

***

### FAQ

**Is scraping ZAP Imoveis legal?**
This Actor collects only **publicly available listing data** - the same information any visitor sees without logging in. It collects **no personal data**: no names, no emails, no phone numbers. As always, you are responsible for how you use the data, and you should review the target site's terms and applicable law (including LGPD/GDPR) for your specific use case.

**Do I need a proxy?**
No. The Actor reaches the portal's official listings API directly.

**Why did I get fewer listings than I asked for?**
Either the search matched fewer properties, or you hit the portal's ~1,500-result ceiling for a single query. Narrow the filters and run again.

**Can I get more fields or another portal?**
Yes - open an issue on the **Issues** tab. Custom scrapers and additional Brazilian real estate sources are available on request.

***

### Support

Found a bug or need a field that is not here? Open an issue on the **Issues** tab of this Actor. Issues are answered.

# Actor input Schema

## `business` (type: `string`):

Whether to scrape properties for sale or for rent.

## `city` (type: `string`):

City name in Portuguese, exactly as ZAP writes it, e.g. 'Sao Paulo', 'Rio de Janeiro', 'Belo Horizonte'. Leave blank to search all of Brazil.

## `state` (type: `string`):

State name in Portuguese, e.g. 'Sao Paulo', 'Minas Gerais'. Optional.

## `unitTypes` (type: `string`):

Filter by property type. Leave blank for all types.

## `priceMin` (type: `integer`):

Lowest price in Brazilian Reais. Optional.

## `priceMax` (type: `integer`):

Highest price in Brazilian Reais. Optional.

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

Maximum number of listings to scrape. The portal returns at most ~1,500 results per search - narrow by city, price or property type to collect more.

## Actor input object example

```json
{
  "business": "SALE",
  "city": "São Paulo",
  "unitTypes": "",
  "maxListings": 100
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "city": "São Paulo"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plum_spear/aztec-zapimoveis").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 = { "city": "São Paulo" }

# Run the Actor and wait for it to finish
run = client.actor("plum_spear/aztec-zapimoveis").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 '{
  "city": "São Paulo"
}' |
apify call plum_spear/aztec-zapimoveis --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plum_spear/aztec-zapimoveis"
        }
    }
}

```

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/pLuI78IoP1ppJkjam/builds/eT2o3WcdGAluUfBXh/openapi.json
