# Zap Imóveis & VivaReal Scraper | Brazil Property Listings API (`data_daemon/zap-imoveis-vivareal-scraper`) Actor

$1 per 1,000 listings | Scrape Zap Imóveis and VivaReal (Brazil): price, condo fee, IPTU, area, bedrooms, parking, address with lat/long, neighborhood, created date, agency and CRECI. Sale or rent, any city, newest first, only-new mode for daily feeds. No login, no proxy.

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

## Pricing

from $0.70 / 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 Imóveis & VivaReal Scraper** returns **Brazilian property listings from [Zap Imóveis](https://www.zapimoveis.com.br) and [VivaReal](https://www.vivareal.com.br)** as JSON, CSV or Excel: price, condominium fee, IPTU, price per m², usable area, bedrooms, bathrooms, parking, address with neighborhood, CEP and latitude/longitude, the date the listing was created, and the advertiser (agency with its CRECI number, or private owner). Sale or rent, any city or state, requested newest first, with an **only-new mode for daily feeds**. **$1 per 1,000 listings**, no login, no proxy. Advertiser phone and WhatsApp numbers are not collected.

### What can you do with Zap Imóveis and VivaReal data?

| Who | What they get | Typical run |
|---|---|---|
| Real-estate investors | New listings below a price per m² in chosen neighborhoods, every morning | `onlyNewSinceLastRun` + `postedWithinDays: 1` |
| Agencies and portals | Competitor inventory and pricing by bairro | one city, `maxResults: 0` |
| Analysts and proptech | Asking prices, condo fees and IPTU by neighborhood and size | export to Sheets / BigQuery |
| Relocation and rental services | Fresh rentals with photos and coordinates | `business: rent` |

### How to scrape Zap Imóveis and VivaReal

1. Open the **Input** tab and keep or change `locations` (one per line, `City, UF`, e.g. `Curitiba, PR`).
2. Pick `sale` or `rent`, the portals and, if you like, neighborhoods, property types, price, bedrooms or area.
3. Click **Start**. Listings appear in the **Output** tab; download them as JSON, CSV, Excel or HTML, or read them through the API.
4. For a daily feed, turn on **Only new listings since the last run** and add a schedule (Actor → Schedules).

An empty input `{}` returns the 50 newest São Paulo sale listings on Zap Imóveis.

### Input

| Field | What it does |
|---|---|
| `locations` | `City, UF` per line, e.g. `São Paulo, SP`, `Rio de Janeiro, RJ`; or a state code (`SC`) for a whole state. |
| `business` | `sale` (venda) or `rent` (aluguel; `priceBrl` is the monthly rent). Short-stay rentals priced per day are left out unless `includeShortStays` is on. |
| `portals` | `zap`, `vivareal` or both (a listing id is delivered once). |
| `listingType` | `used` (resale and rentals), `development` (new launches / lançamentos) or `both`. |
| `neighborhoods` | Bairros such as `Pinheiros`, `Moema`, `Copacabana`; each is searched in every location. |
| `propertyTypes` | `apartment`, `house`, `condominium` (casa de condomínio), `penthouse`, `flat`, `studio`, `land`, `commercial`, `office`, `warehouse`, `farm`, `parking`. Checked against the listing's type and sub-types. |
| `minPrice`, `maxPrice`, `minBedrooms`, `minArea` | Filters. Price filters go to the portal; the others are checked on each listing and non-matching listings are not charged. |
| `postedWithinDays` | Only listings created in the last N days. The portals' newest-first order is approximate; a price band stops after two pages in a row older than the window. |
| `sortBy` | `newest` (default; the portals' own created-date order, approximately newest first) or `relevance`. |
| `maxResults`, `maxResultsPerSearch` | Caps (0 = no cap). |
| `onlyNewSinceLastRun`, `stateName` | Remember delivered ids in the `zap-vivareal-state` key-value store and skip them next time (not charged). |
| `skipIds` | Listing ids you already have (not charged). |

```json
{
    "locations": ["São Paulo, SP"],
    "neighborhoods": ["Pinheiros", "Vila Madalena"],
    "business": "sale",
    "propertyTypes": ["apartment"],
    "minBedrooms": 2,
    "maxPrice": 1500000,
    "postedWithinDays": 7,
    "maxResults": 200
}
```

### Output

```json
{
    "id": "2920089342",
    "portal": "Zap Imóveis",
    "url": "https://www.zapimoveis.com.br/imovel/venda-apartamento-4-quartos-com-piscina-santana-zona-norte-sao-paulo-sp-153m2-id-2920089342/",
    "title": "Apartamento com 4 Quartos à venda, 153m²",
    "business": "sale",
    "priceBrl": 1300000,
    "monthlyCondoFeeBrl": 2395,
    "yearlyIptuBrl": 5000,
    "pricePerSqmBrl": 8496.73,
    "usableAreaSqm": 153,
    "bedrooms": 4,
    "parkingSpaces": 3,
    "neighborhood": "Santana",
    "zone": "Zona Norte",
    "city": "São Paulo",
    "stateCode": "SP",
    "zipCode": "02403010",
    "latitude": -23.491836,
    "longitude": -46.631268,
    "createdAt": "2026-10-30T18:13:08.506+00:00",
    "advertiserName": "…",
    "advertiserCreci": "…"
}
```

| Field | Meaning |
|---|---|
| `id`, `portal`, `url`, `title` | Listing id (stable), portal, listing page and title. |
| `priceBrl`, `rentalPeriod`, `monthlyCondoFeeBrl`, `yearlyIptuBrl`, `pricePerSqmBrl` | Price (sale price, or rent per `rentalPeriod`: MONTHLY, or DAILY for short stays when `includeShortStays` is on), condominium fee, IPTU, price per m² of usable area. |
| `usableAreaSqm`, `totalAreaSqm`, `bedrooms`, `bathrooms`, `suites`, `parkingSpaces` | Size and rooms. |
| `unitTypes`, `usageTypes`, `constructionStatus`, `unitFloor`, `condominiumName`, `amenities` | Property details. |
| `street`, `streetNumber`, `neighborhood`, `zone`, `city`, `state`, `stateCode`, `zipCode`, `latitude`, `longitude` | Address as the advertiser shows it (street may be hidden). |
| `createdAt`, `updatedAt` | When the listing was created / last updated on the portal. |
| `advertiserName`, `advertiserCreci`, `advertiserId` | Advertiser as shown on the portal (agency, or the owner for private listings) and the agency's CRECI licence. |
| `imageCount`, `imageUrls` | Photos (up to 10 URLs). |

### How much does it cost to scrape Zap Imóveis?

**$1 per 1,000 listings** plus $0.001 per run, on Apify's pay-per-event pricing (SILVER $0.85, GOLD and above $0.70 per 1,000). The default run (50 listings) costs about $0.05. Listings skipped by only-new mode, `skipIds` or the filters are never charged. Platform usage is included.

### Tips

- **Daily new-listings feed:** `postedWithinDays: 1`, `onlyNewSinceLastRun: true`, `maxResults: 0`, scheduled once a day. São Paulo alone gets several thousand new sale listings a day; narrow by neighborhood or price for a smaller feed.
- **More than 1,000 listings:** the portals' service lists at most about 1,000 listings per search, so the Actor splits large searches into up to 64 price bands and reads them side by side. The lowest band has no lower bound and the highest no upper bound, so cheap, unpriced and luxury listings stay included. If a band still holds more than ~1,000 listings (e.g. a whole state without a date window), the status message says so; add neighborhoods, a price range or `postedWithinDays`.
- **Both portals:** Zap Imóveis and VivaReal read one OLX listing database: in a 31 Oct 2026 test 1,610 of 1,612 listing ids were on both with identical price, area and advertiser. One portal (the default, `zap`) is enough; selecting both delivers each id once.
- **IPTU:** advertisers often type the monthly IPTU into the yearly field (a third to two fifths of rental values in São Paulo and Rio were R$ 200 a year or less in the study below), so treat very small `yearlyIptuBrl` values as monthly.
- **New developments:** a launch page quotes a "from" price next to the smallest unit's area, so `pricePerSqmBrl` is null for `listingType: development`.

### FAQ

**What is the price per m² in São Paulo and Rio de Janeiro?** In listings created 28–31 October 2026, the median asking price for apartments was R$ 18,824 per m² in Pinheiros, R$ 18,645 in Itaim Bibi, R$ 14,053 in Vila Mariana and R$ 8,776 in Vila Andrade (São Paulo); R$ 24,538 in Ipanema, R$ 13,158 in Copacabana, R$ 6,417 in Tijuca and R$ 4,385 in Méier (Rio). Rent per m² ran from R$ 128 a month in Vila Nova Conceição to R$ 38 in Tijuca, and gross asking yields from 5.7% to 8.2%. Full tables for 26 neighborhoods, with the runs and code: [São Paulo and Rio asking prices per square metre by neighborhood](https://dev.to/datadaemon/sao-paulo-and-rio-asking-prices-per-m2-by-neighborhood-19000-new-zap-imoveis-and-vivareal-38ll).

**Do Zap Imóveis and VivaReal have the same listings?** Yes. In four neighborhoods pulled from each portal separately, 1,610 of 1,612 listing ids were on both with identical price, area, advertiser and creation date ([study](https://dev.to/datadaemon/sao-paulo-and-rio-asking-prices-per-m2-by-neighborhood-19000-new-zap-imoveis-and-vivareal-38ll)). Selecting both portals does not add listings; the Actor delivers each id once.

**Is there a Zap Imóveis or VivaReal API?** Not a public one for listing data. This Actor reads the JSON the portals' own pages load and returns it in a stable, documented format through Apify's API.

**Does it collect phone numbers?** No. Advertiser phone and WhatsApp numbers are left out; the agency name and CRECI number identify the advertiser.

**How fresh is the data?** Live: every run reads the portals at that moment. `createdAt` tells you when each listing went up.

**Can I get listings for a whole state?** Yes, enter the state code (e.g. `PR`). Large states are split into price bands automatically.

**Is it legal to scrape Zap Imóveis?** The Actor reads publicly shown listing data without logging in. You are responsible for how you use the data, including Brazil's LGPD and the portals' terms.

Questions or a field you need? Use the **Issues** tab.

### Related Actors

- [Magicbricks Scraper](https://apify.com/data_daemon/magicbricks-property-scraper) – India property listings: price, price per sq ft, carpet area, BHK, locality, possession date
- [Dubai DLD Property Transactions](https://apify.com/data_daemon/dubai-property-transactions) – registered Dubai sales, mortgages and gifts with AED value and price per sq m
- [Gupy Jobs Scraper](https://apify.com/data_daemon/gupy-jobs-scraper) – Brazil job postings from Gupy with full descriptions, city, state and contract type

All Daemon Data Actors: [apify.com/data_daemon](https://apify.com/data_daemon).

# Actor input Schema

## `locations` (type: `array`):

One per line: "City, UF" (e.g. `São Paulo, SP`, `Curitiba, PR`, `Belo Horizonte, MG`) or a state code alone (`SC`) for the whole state. Capitals and large cities also work without the state. Each location is its own search. City names are matched as the portals spell them, accents included.

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

Listings for sale (`sale`) or for rent (`rent`; `priceBrl` is the rent per `rentalPeriod`, monthly by default).

## `includeShortStays` (type: `boolean`):

Rentals only: also return listings priced per day (temporada / short stays). Off by default, so every rent is monthly.

## `portals` (type: `array`):

`zap` (zapimoveis.com.br), `vivareal` (vivareal.com.br) or both. Both portals belong to OLX Brasil and read one listing database (1,610 of 1,612 listings were on both in a 31 Oct 2026 test), so one portal is enough; with both selected a listing id is delivered once.

## `listingType` (type: `string`):

`used`: properties listed by owners and agencies (resale and rentals). `development`: new launches (lançamentos) from developers. `both`: run both.

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

Bairro names as the portals spell them, e.g. `Pinheiros`, `Moema`, `Copacabana`. Each neighborhood is searched in every location.

## `propertyTypes` (type: `array`):

Keep only these types: `apartment`, `house`, `condominium` (casa de condomínio), `penthouse`, `flat`, `studio`, `land`, `commercial`, `office`, `warehouse`, `farm`, `parking`, or a raw code such as `APARTMENT`. Checked on each listing; others are not charged.

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

Sale price, or monthly rent for rentals. Leave empty for no limit.

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

Sale price, or monthly rent for rentals. Leave empty for no limit.

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

Keep listings with at least this many bedrooms.

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

Keep listings with at least this usable area.

## `postedWithinDays` (type: `integer`):

Only listings created in the last N days (by the portal's `createdAt`). With the default newest-first order the run stops reading a search once it reaches older listings.

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

`newest` (created date, newest first) or `relevance` (the portal's default order).

## `includeImages` (type: `boolean`):

Up to 10 photo URLs per listing in `imageUrls`.

## `maxResultsPerSearch` (type: `integer`):

Cap per location (and neighborhood). 0 = no cap. Searches with more than ~1,000 listings are split into price bands automatically.

## `maxResults` (type: `integer`):

Stop after this many saved listings (default 50, about $0.05). 0 = no cap (the run's maximum cost still applies).

## `onlyNewSinceLastRun` (type: `boolean`):

Remember delivered listing ids in a key-value store named `zap-vivareal-state` in your account and skip them next time (not charged). Use with a schedule for a daily new-listings feed.

## `stateName` (type: `string`):

Name of the only-new memory. By default it follows portals, sale/rent, locations and neighborhoods, so different feeds don't mix.

## `skipIds` (type: `array`):

Listing ids you already have. They are neither saved nor charged.

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

Not needed: the listings service answers Apify's servers directly.

## Actor input object example

```json
{
  "locations": [
    "São Paulo, SP"
  ],
  "business": "sale",
  "includeShortStays": false,
  "portals": [
    "zap"
  ],
  "listingType": "used",
  "neighborhoods": [],
  "propertyTypes": [],
  "sortBy": "newest",
  "includeImages": true,
  "maxResultsPerSearch": 0,
  "maxResults": 50,
  "onlyNewSinceLastRun": false,
  "skipIds": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Zap Imóveis / VivaReal listings as JSON items in the default dataset (also CSV, Excel, XML).

## `runSummary` (type: `string`):

RUN-SUMMARY record: searches, listings found, saved, filtered, skipped and charged counts.

# 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 = {
    "locations": [
        "São Paulo, SP"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_daemon/zap-imoveis-vivareal-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 = { "locations": ["São Paulo, SP"] }

# Run the Actor and wait for it to finish
run = client.actor("data_daemon/zap-imoveis-vivareal-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 '{
  "locations": [
    "São Paulo, SP"
  ]
}' |
apify call data_daemon/zap-imoveis-vivareal-scraper --silent --output-dataset

```

## MCP server setup

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