# Zap Imoveis Scraper: Brazil Property Listings and Prices (`themineworks/zap-imoveis-scraper`) Actor

Scrape Zap Imoveis (and VivaReal) by city, neighbourhood or search link: one row per listing with sale or rent price, condo fee, IPTU, areas, bedrooms, bathrooms, parking, full address with coordinates, amenities, description, photos, agency and dates. No login.

- **URL**: https://apify.com/themineworks/zap-imoveis-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 listings

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

## Zap Imoveis Scraper: Brazil Property Listings and Prices

[![30 Zap Imoveis listings in 34 seconds with price, condo fee, IPTU, area, address and agency](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/zap-imoveis-scraper-hero.png)](https://console.apify.com/actors/FUF61BXBpdUMr6lw9/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

Updated 21 Oct 2026: first release. City, state and neighbourhood search or pasted results links, sale or rent, 16 property types, price, area, room and parking filters, and one flat row per listing with price, condo fee, IPTU, areas, full address with coordinates, amenities, description, photos and the agency. VivaReal works too. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **The full cost of a property, in columns.** Every row has the asking price, the monthly condo fee (condomínio) and the IPTU with its period, as numbers. Rentals also get the rent period, the monthly total the site shows and the guarantees the landlord accepts. Sort a whole neighbourhood by price per square metre without cleaning text.
- **Address you can map.** Street, number when shown, neighbourhood, zone, city, state, CEP, latitude and longitude, plus how much of the address the advertiser chose to show. In our test runs `latitude` was filled on 2,069 of 2,071 rows.
- **Full description and the agency.** With details on (the default) each listing's own title and full description are read, which the search pages show only for paid placements. Every row names the agency, its CRECI licence, its page on the site and the business phone it publishes on the listing.
- **Pay per listing, nothing for errors.** Links that are not results pages, places the site does not know, the summary row and duplicates found by two searches are never charged. No Zap Imoveis account, cookies or API key.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/FUF61BXBpdUMr6lw9/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Real estate family:** [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [99acres Scraper](https://apify.com/themineworks/99acres-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [MagicBricks Scraper](https://apify.com/themineworks/magicbricks-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns the first 30 listings for sale in São Paulo, with their full descriptions. It took 34 seconds in our test run:

```json
{
  "city": "São Paulo",
  "state": "SP",
  "maxItems": 30
}
```

Add neighbourhoods to search them one by one, switch `businessType` to `rent`, or paste a results link from your browser into `startUrls`. A listing that two of your searches find is delivered once.

Apify's free plan includes $5 of credit every month, which covers about 2,790 listings at this actor's price.

#### Copy to your AI assistant

```text
themineworks/zap-imoveis-scraper on Apify. Searches Zap Imoveis (or VivaReal), Brazil's property portals, by city, state and neighbourhood or by a pasted results link, and returns one flat row per listing with no login. Call ApifyClient("TOKEN").actor("themineworks/zap-imoveis-scraper").call(run_input={"city": "São Paulo", "state": "SP", "neighborhoods": ["Pinheiros"], "businessType": "rent", "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give city (with optional state and neighborhoods list) or startUrls (zapimoveis.com.br or vivareal.com.br results links, each keeps its own filters) or both; up to 100 searches. Optional for the city search: businessType ("sale" default or "rent"), propertyType ("all" default, "apartment", "house", "two_story_house", "condo_house", "village_house", "penthouse", "flat", "kitnet", "studio", "loft", "land", "farm", "office", "retail", "warehouse", "commercial_building"), minPrice, maxPrice (BRL), bedrooms, bathrooms, parkingSpaces (minimum, 1 to 4, 4 means 4 or more), minArea, maxArea (usable m²), sortBy ("relevance", "newest", "lowest_price"), source ("zap" default or "vivareal"). Also: maxItems (per search, default 50, 1 to 10000; above 1400 the search is read in price bands), includeDetails (default true; adds the full title, description, updated_at, portals). Listing rows have no _type field and carry id, external_id, title, url, source, business_type, property_type, property_subtypes, usage_type, listing_type, price, price_hidden, currency, rental_period, rent_total_monthly, rental_warranties, sale_price, rent_price, condo_fee, iptu, iptu_period, yearly_iptu, total_area, usable_area, bedrooms, bathrooms, suites, parking_spaces, floor, street, street_number, complement, neighborhood, zone, city, state, state_code, zip_code, latitude, longitude, address_shown, location_id, condominium_name, amenities, description, images, image_count, image_url, video_urls, video_tour_url, advertiser_name, advertiser_id, advertiser_license, advertiser_tier, advertiser_url, advertiser_phones, advertiser_whatsapp, publication_type, portals, accepts_exchange, created_at, updated_at, details_scraped, search, search_url, price_band, page, position, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when listings were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~zap-imoveis-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **City, neighbourhood or link.** Type the city and state, add neighbourhoods (bairros) one per line, or paste a results link from zapimoveis.com.br or vivareal.com.br with the filters you set on the site. The location is matched in the site's own location index, so spelling with or without accents both work.
- **The site's filters.** Sale or rent, 16 property types (apartment, house, sobrado, casa de condomínio, cobertura, flat, kitnet, studio, loft, land, farm, office, shop, warehouse, whole building), price range, minimum bedrooms, bathrooms and parking spaces, and usable area range. Sort by relevance, newest or lowest price.
- **Past 1,500 listings.** The site serves at most 1,500 listings per search. Set `maxItems` above 1,400 and the actor counts the matches first, cuts the search into price bands that each fit, and reads them from the cheapest up. In our test, 1,600 apartments in Pinheiros came back from 4 price bands.
- **Zap Imoveis or VivaReal.** Both belong to Grupo ZAP and share one listing database. Pick the site for the city search with `source`; links always use the site they come from, and `url` points to that site.
- **Only the area you asked for.** The site tops up thin pages with listings from nearby areas. The actor drops those, so a Copacabana search returns Copacabana; the summary counts what it dropped in `outside_area_skipped`.
- **Stops cleanly.** Each request is tried up to 4 times on a fresh Brazilian IP. Six failed requests in a row end the run; the run stops before its time limit and keeps every row it read. The summary row says why.

### How to use it

#### Basic: one city, for sale

```json
{
  "city": "Curitiba",
  "state": "PR",
  "maxItems": 300
}
```

One row per listing, in the site's relevance order. Sort by `price` or by `price` divided by `usable_area` in a spreadsheet to find the cheapest square metre.

#### Rental market in chosen neighbourhoods

```json
{
  "city": "Rio de Janeiro",
  "state": "RJ",
  "neighborhoods": ["Copacabana", "Botafogo"],
  "businessType": "rent",
  "propertyType": "apartment",
  "bedrooms": 2,
  "minPrice": 3000,
  "maxPrice": 9000,
  "maxItems": 200
}
```

Each neighbourhood is its own search, labelled in `search`. `price` is the monthly rent, `condo_fee` and `iptu` the costs on top, and `rent_total_monthly` the total the site shows.

#### New listings watch

```json
{
  "city": "Belo Horizonte",
  "state": "MG",
  "propertyType": "house",
  "sortBy": "newest",
  "maxItems": 100
}
```

Save it as a task with a daily schedule and compare runs on `id`: anything new is a listing published since the last run. `created_at` gives the publication time.

#### Paste a search from the site

```json
{
  "startUrls": [
    "https://www.zapimoveis.com.br/venda/apartamentos/sp+sao-paulo+zona-oeste+pinheiros/?quartos=2,3&precoMaximo=1500000",
    "https://www.vivareal.com.br/aluguel/pr/curitiba/"
  ],
  "maxItems": 100
}
```

Each link keeps its own place, type and filters (bedrooms, bathrooms, parking, price, area and sort). The form filters apply to the city field only.

#### Agency prospecting

Run a city search, then group the rows on `advertiser_name`: the count per agency is its stock in that city. `advertiser_license` is its CRECI, `advertiser_url` its page on the site and `advertiser_phones` the business number it publishes on its listings.

#### Fast export without descriptions

```json
{
  "city": "São Paulo",
  "state": "SP",
  "neighborhoods": ["Moema"],
  "maxItems": 1000,
  "includeDetails": false
}
```

Rows come from the search pages only: every field except the full description, `updated_at`, `portals` and `accepts_exchange`, and the title is the site's short name. About twice as fast. Same price per listing.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `city` | string | empty | Brazilian city, for example `São Paulo` or `Rio de Janeiro`. |
| `state` | string | empty | State code (`SP`, `RJ`, `PR`) or name. Picks the right city when two states share a name. |
| `neighborhoods` | array of strings | empty | Neighbourhoods of that city, one search each. Empty searches the whole city. |
| `businessType` | string | `sale` | `sale` or `rent`. |
| `propertyType` | string | `all` | `apartment`, `house`, `two_story_house`, `condo_house`, `village_house`, `penthouse`, `flat`, `kitnet`, `studio`, `loft`, `land`, `farm`, `office`, `retail`, `warehouse` or `commercial_building`. |
| `minPrice`, `maxPrice` | integer | empty | Price range in BRL: sale price, or monthly rent for rentals. |
| `bedrooms`, `bathrooms`, `parkingSpaces` | integer | empty | Minimum, 1 to 4. 4 means 4 or more. |
| `minArea`, `maxArea` | integer | empty | Usable area range in m². |
| `sortBy` | string | `relevance` | `relevance`, `newest` or `lowest_price`. |
| `startUrls` | array of strings | empty | Results links from zapimoveis.com.br or vivareal.com.br. Each keeps its own filters. |
| `source` | string | `zap` | Site for the city search: `zap` or `vivareal`. |
| `maxItems` | integer | `50` | Most listings per search (each neighbourhood, city or link), 1 to 10,000. |
| `includeDetails` | boolean | `true` | Reads each listing's own title, full description, `updated_at`, `portals` and `accepts_exchange`. |
| `proxyConfiguration` | object | residential BR | Apify residential proxy in Brazil, included in the price. |

Give `city`, `startUrls` or both. Up to 100 searches per run.

### What data do you get?

One row per listing. Listing rows have no `_type` field; the summary, info and error rows do, so a filter on `_type` separates them.

| Field | What it is |
|---|---|
| `id`, `external_id` | Listing id on the site (the key to join on), and the advertiser's own reference code |
| `title`, `url`, `source` | Title, link to the listing, and `zap` or `vivareal` |
| `business_type` | `sale` or `rent` |
| `property_type`, `property_subtypes`, `usage_type`, `listing_type` | e.g. `APARTMENT`, `["DUPLEX"]`, `RESIDENTIAL`, `USED` |
| `price`, `currency`, `price_hidden` | Asking price in BRL for the business searched, and a flag when the advertiser hides it |
| `sale_price`, `rent_price` | Both prices, when a listing is offered for sale and for rent |
| `rental_period`, `rent_total_monthly`, `rental_warranties` | Rentals: period, monthly total with fees, accepted guarantees |
| `condo_fee` | Monthly condominium fee in BRL |
| `iptu`, `iptu_period`, `yearly_iptu` | IPTU property tax, its period, and the yearly amount when given |
| `total_area`, `usable_area` | Areas in m² |
| `bedrooms`, `bathrooms`, `suites`, `parking_spaces`, `floor` | Room counts, parking and floor |
| `street`, `street_number`, `complement`, `neighborhood`, `zone`, `city`, `state`, `state_code`, `zip_code` | Address as the advertiser shows it |
| `latitude`, `longitude`, `address_shown`, `location_id` | Coordinates, how much of the address is public (`ALL`, `STREET`, `NEIGHBORHOOD`), and the site's location path |
| `condominium_name` | Building or condominium name, when given |
| `amenities` | Amenity codes, e.g. `POOL`, `GYM`, `ELEVATOR`, `BALCONY`, `PETS_ALLOWED` |
| `description` | Full description, line breaks kept (with details on) |
| `images`, `image_count`, `image_url` | Photo links at 1280x960, how many, and the first one |
| `video_urls`, `video_tour_url` | Video links and the virtual tour |
| `advertiser_name`, `advertiser_id`, `advertiser_license`, `advertiser_tier`, `advertiser_url` | The agency, its id, CRECI, plan on the portal and page on the site |
| `advertiser_phones`, `advertiser_whatsapp` | Business contact numbers the advertiser publishes on the listing |
| `publication_type` | Placement plan: `STANDARD`, `PREMIUM` or `SUPER_PREMIUM` |
| `portals`, `accepts_exchange`, `updated_at` | Portals carrying the listing, exchange accepted, last update (with details on) |
| `created_at` | When the listing was published |
| `details_scraped`, `details_error` | Whether the listing's own record was read, and why not when it failed |
| `search`, `search_url`, `price_band`, `page`, `position` | The search that found it, its link, the price band when one was used, results page and place in the search |
| `scraped_at` | When the row was written |

**Summary row** (`_type: "summary"`, never charged): `searches_requested`, `searches_read`, `searches_failed`, `searches_not_started`, `pages_read`, `count_requests`, `listings_found`, `listings_delivered`, `charged_for`, `duplicates_skipped`, `outside_area_skipped`, `details_requested`, `details_ok`, `details_failed`, `http_requests`, `http_megabytes`, `ended_on_deadline`, `stopped_by_max_cost`, `stopped_by_block_guard`, `shortfall_reason` when fewer listings came back than asked, and `per_search`, one entry per search with the matched `location`, `total_matches`, `price_bands`, `pages`, `listings_delivered` and why it `stopped`. The same summary is saved as the `OUTPUT` record of the run.

**Error rows** (`_type: "error"`, never charged): one per input that could not be read, with `error_type` (`invalid_input`, `location_not_found`, `blocked`, `http_error`, `fetch_error`), `identifier` and `reason`.

#### Stable fields for automations

These were present in every listing row of our test runs (2,071 rows from 9 searches in 5 cities), and their names will not change:

| Field | What it is |
|---|---|
| `id` | The key to store and join on |
| `url` | Link to the listing |
| `source` | `zap` or `vivareal` |
| `business_type` | `sale` or `rent` |
| `property_type` | Property type code |
| `price` | Asking price in BRL |
| `usable_area` | Usable area in m² |
| `bedrooms` | Bedrooms |
| `bathrooms` | Bathrooms |
| `parking_spaces` | Parking spaces |
| `neighborhood` | Neighbourhood |
| `city` | City |
| `state_code` | State code |
| `images` | Photo links (an empty list when there are none) |
| `advertiser_name` | The agency |
| `created_at` | Publication time |
| `position` | Place in the search |

Optional, present only when the listing has a value: `title` (2,066 of 2,071 test rows), `condo_fee` (houses outside a condominium have none), `iptu`, `street_number` and `street` (the advertiser can hide them), `latitude` and `longitude` (2 of 2,071 test rows had none), `description` (434 of the 435 rows read with details on), `amenities`, `advertiser_license`, `advertiser_whatsapp`, `video_urls`, `video_tour_url`, `floor`, `condominium_name`, and the rental fields on rentals only.

#### Output examples

One apartment for rent from the Copacabana search (test run, 21 Oct 2026, trimmed):

```json
{
  "id": "2895407584",
  "title": "Apartamento : Padrão / Residencial / Copacabana",
  "url": "https://www.zapimoveis.com.br/imovel/aluguel-apartamento-2-quartos-mobiliado-copacabana-zona-sul-rio-de-janeiro-rj-90m2-id-2895407584/",
  "source": "zap",
  "business_type": "rent",
  "property_type": "APARTMENT",
  "price": 7500,
  "currency": "BRL",
  "rental_period": "MONTHLY",
  "rent_total_monthly": 9020,
  "condo_fee": 1520,
  "iptu": 420,
  "usable_area": 90,
  "bedrooms": 2,
  "bathrooms": 2,
  "parking_spaces": 2,
  "neighborhood": "Copacabana",
  "zone": "Zona Sul",
  "city": "Rio de Janeiro",
  "state_code": "RJ",
  "latitude": -22.977166,
  "longitude": -43.192939,
  "advertiser_name": "Julio Bogoricin Imoveis - Leblon",
  "advertiser_license": "02410-J-RJ",
  "created_at": "2026-06-27T04:25:51.809Z",
  "updated_at": "2026-10-20T13:26:27.013Z",
  "details_scraped": true,
  "search": "Copacabana, Rio de Janeiro, RJ",
  "position": 1
}
```

A penthouse for sale from the "Try it" input (same day, trimmed):

```json
{
  "id": "2914409611",
  "title": "Cobertura à venda no Bosque da Saúde com 4 quartos",
  "url": "https://www.zapimoveis.com.br/imovel/venda-cobertura-4-quartos-com-piscina-bosque-da-saude-zona-sul-sao-paulo-sp-176m2-id-2914409611/",
  "business_type": "sale",
  "property_type": "PENTHOUSE",
  "price": 1160000,
  "condo_fee": 3300,
  "iptu": 745,
  "usable_area": 176,
  "bedrooms": 4,
  "bathrooms": 4,
  "parking_spaces": 3,
  "neighborhood": "Bosque da Saúde",
  "city": "São Paulo",
  "state_code": "SP",
  "latitude": -23.612706,
  "advertiser_name": "IMOBILIÁRIA NOVA SÃO PAULO",
  "description": "Cobertura à venda no Bosque da Saúde com 176 m², projetada para proporcionar ambientes confortáveis e bem distribuídos...",
  "position": 1
}
```

The summary row of the Rio de Janeiro run, trimmed:

```json
{
  "_type": "summary",
  "searches_requested": 2,
  "searches_read": 2,
  "pages_read": 4,
  "listings_delivered": 80,
  "outside_area_skipped": 1,
  "details_ok": 80,
  "details_failed": 0,
  "per_search": [
    { "search": "Copacabana, Rio de Janeiro, RJ", "location": "Copacabana, Rio de Janeiro, RJ", "total_matches": 267, "pages": 2, "listings_delivered": 40, "stopped": "max_items_reached" },
    { "search": "Botafogo, Rio de Janeiro, RJ", "location": "Botafogo, Rio de Janeiro, RJ", "total_matches": 177, "pages": 2, "listings_delivered": 40, "stopped": "max_items_reached" }
  ]
}
```

An error row for a link that is not a results page (nothing charged):

```json
{ "_type": "error", "error_type": "invalid_input", "identifier": "https://example.com/foo", "reason": "Skipped: not a Zap Imoveis or VivaReal link. Use a results link from zapimoveis.com.br or vivareal.com.br (for example https://www.zapimoveis.com.br/venda/apartamentos/sp+sao-paulo/), or the city, state and neighbourhood fields." }
```

### Pricing

Pay per event: you pay for the listings you receive, plus a flat $0.003 per run, whatever memory you choose. Reading the full descriptions costs nothing extra, and the Brazilian residential proxy is included.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `listing-scraped` | Once per listing row stored in your dataset | $1.99 per 1,000 | $1.99 per 1,000 | $1.99 per 1,000 | $1.99 per 1,000 |
| `run-start` | Once per run, after the first results page returned listings | $0.003 | $0.003 | $0.003 | $0.003 |

The price of one listing is the price per 1,000 divided by 1,000.

Never charged:

- links that are not Zap Imoveis or VivaReal results pages, and places the site does not know (each gets an error row);
- a listing that a second search of the same run finds again;
- listings from nearby areas the site mixes into a neighbourhood search;
- listings past your `maxItems`;
- the summary, info and error rows;
- a run with no valid input, or one whose searches return no listings: the start fee is charged only once a results page has returned listings;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every day, every Monday at 08:00 and so on).
3. Compare runs on `id` and `price` to see new listings and price cuts in your area.
4. Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.

### FAQ

#### What does this actor read?

The same public listing data the Zap Imoveis and VivaReal websites load in your browser when you search, from Grupo ZAP's own listing service, as a visitor who is not logged in. It does not log in, send messages to advertisers or open contact forms.

#### How many listings can I get?

Up to 10,000 per search and 100 searches per run. The site itself serves at most 1,500 listings per search; above a `maxItems` of 1,400 the actor reads the search in price bands so it can go further. Listings that hide their price cannot fall in a price band, so a banded search can miss those few. A search also ends when the results run out or two pages in a row bring nothing new.

#### What is the difference between includeDetails on and off?

On (the default), each listing's own record is read too, for the advertiser's full title, the full description, the last update time, the portals that carry it and whether an exchange is accepted. The search pages carry those only for paid placements. Off, every other field is still there and the run is about twice as fast. The price per listing is the same.

#### Zap Imoveis or VivaReal: which should I pick?

Both sites belong to Grupo ZAP and read from one listing database, and most listings carry both in `portals`. The order and the paid placements differ. Pick the one whose links you want in `url`; for market research either gives the same stock.

#### Why do some rows have no condo fee, street number or coordinates?

The advertiser decides what to show. Houses outside a condominium have no condo fee, and many advertisers hide the street number or show only the neighbourhood, which `address_shown` tells you. Coordinates were missing on 2 of 2,071 rows in our tests.

#### How do the bedroom, bathroom and parking filters work?

They are minimums, the way the site's buttons work: `bedrooms: 2` returns 2 or more, and 4 means 4 or more. In a pasted link, `quartos=2,3` means exactly 2 or 3, as on the site.

#### How long does a run take?

In our tests: 34 seconds for the "Try it" input (30 listings with details), 157 seconds for 300 houses in Belo Horizonte with details, 29 seconds for 36 listings from 3 links with details off, and 243 seconds for 1,600 apartments in Pinheiros read in 4 price bands with details off. Requests go through a residential proxy in Brazil, which answers in 3 to 8 seconds; the actor reads 4 result pages and 30 listing records at a time.

#### Do I need an account, cookies or a proxy?

No account and no cookies. The site blocks datacenter IPs after a few requests, so the actor uses Apify's residential proxy in Brazil by default, included in the price. You can pick another proxy under Advanced.

#### Which actor should I use for other property markets?

[Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for the United States, [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for India.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Listings, Price and costs, Location, and Advertisers. In CSV and Excel, list fields such as `images` and `amenities` are flattened into columns such as `images/0`.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/zap-imoveis-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http zap-imoveis-scraper "https://mcp.apify.com/?tools=themineworks/zap-imoveis-scraper"`

#### Is it legal to scrape Zap Imoveis?

The actor reads only public listings that anyone can see without logging in, published by agencies and owners to be found. Contact numbers are the ones the advertiser publishes on the listing. You are responsible for how you use the data, including the sites' terms and data protection law such as Brazil's LGPD. This is general information, not legal advice.

### Integrations

- **Google Sheets**: send each run's listings to a sheet with Apify's Google Sheets integration; one row per listing fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "new listings in our neighbourhoods every morning to Slack".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [99acres Scraper](https://apify.com/themineworks/99acres-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [MagicBricks Scraper](https://apify.com/themineworks/magicbricks-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Property Scraper](https://apify.com/themineworks/zillow-property-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Photos Scraper](https://apify.com/themineworks/zillow-photos?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Real Estate MCP](https://apify.com/themineworks/real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Airbnb Scraper](https://apify.com/themineworks/airbnb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Domain.com.au Property Scraper](https://apify.com/themineworks/domain-property-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [realestate.com.au Scraper](https://apify.com/themineworks/realestate-com-au-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search that returns fewer listings than the site, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

*Search Zap Imoveis or VivaReal by city, neighbourhood or link and get every listing back as one row, with price, condo fee, IPTU, areas, rooms, address, coordinates, photos and the agency, no login.*

# Actor input Schema

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

Brazilian city as the site writes it, for example São Paulo, Rio de Janeiro, Curitiba or Belo Horizonte. Accents are optional.

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

State of the city, as the two letter code (SP, RJ, PR, MG) or the full name. Optional, but it picks the right city when two states have one with the same name.

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

Neighbourhoods (bairros) of that city, one per line, for example Pinheiros, Vila Mariana, Moema. Each one is its own search. Leave empty to search the whole city.

## `businessType` (type: `string`):

Listings for sale (venda) or for rent (aluguel).

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

One property type, as in the site's type menu. All types by default.

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

Lowest price in reais: the sale price, or the monthly rent for rentals. Example: 500000.

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

Highest price in reais: the sale price, or the monthly rent for rentals. Example: 1500000.

## `bedrooms` (type: `integer`):

At least this many bedrooms (quartos), 1 to 4. 4 means 4 or more.

## `bathrooms` (type: `integer`):

At least this many bathrooms, 1 to 4. 4 means 4 or more.

## `parkingSpaces` (type: `integer`):

At least this many parking spaces (vagas), 1 to 4. 4 means 4 or more.

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

Smallest usable area in square metres. Example: 60.

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

Largest usable area in square metres. Example: 200.

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

Order of the results: the site's own relevance order, newest first, or lowest price first.

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

Results links copied from your browser on zapimoveis.com.br or vivareal.com.br, for example https://www.zapimoveis.com.br/venda/apartamentos/sp+sao-paulo+zona-oeste+pinheiros/?quartos=2,3 or https://www.vivareal.com.br/aluguel/rj/rio-de-janeiro/. Each link is its own search and keeps its own location, type and filters (bedrooms, bathrooms, parking, price and area); the form filters above apply to the city field only.

## `source` (type: `string`):

Zap Imoveis or VivaReal for the city and neighbourhood fields. Both sites belong to Grupo ZAP and share one listing database, so most listings appear on both; links in startUrls always use the site they come from.

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

The most listings to return for each search (each neighbourhood, city or link), 1 to 10,000. The site serves 1,500 per search; above 1,400 the actor reads the search in price bands to go further. Example: 500.

## `includeDetails` (type: `boolean`):

On: one extra small request per listing for its own title and full description, which the search pages show only for paid placements. Off: rows come from the search pages only, about twice as fast; the title is then the site's short name such as "Apartamento com 3 Quartos à venda, 100m²" and most rows have no description. Same price either way.

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

Apify residential proxy in Brazil by default, included in the price. The site blocks datacenter IPs after a few requests.

## Actor input object example

```json
{
  "city": "São Paulo",
  "state": "SP",
  "businessType": "sale",
  "propertyType": "all",
  "sortBy": "relevance",
  "source": "zap",
  "maxItems": 30,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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",
    "state": "SP",
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/zap-imoveis-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 = {
    "city": "São Paulo",
    "state": "SP",
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/zap-imoveis-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 '{
  "city": "São Paulo",
  "state": "SP",
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call themineworks/zap-imoveis-scraper --silent --output-dataset

```

## MCP server setup

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