# VivaReal Scraper | $1.5/1K — Listings, Prices, Condo, IPTU (`gangary/vivareal-scraper`) Actor

Scrape VivaReal for sale and rent by city or neighborhood: price, condo fee, IPTU, area, bedrooms, parking, address, coordinates, photos and the advertiser (name, CRECI, phone of agencies). $1.50 per 1,000 listings plus $0.005 per run, no proxy costs. Failed locations free. JSON, CSV, Excel, API.

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

## Pricing

from $1.50 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

![vivareal-scraper](https://empresas-por-cnae.vercel.app/covers/vivareal-scraper.png)

## VivaReal Scraper | $1.5/1K — Listings, Prices, Condo, IPTU

**US$1.50 per 1,000 listings + US$0.005 per run. Proxies are included; locations that fail, can't be found or are ambiguous are never charged.**

Collect **VivaReal** listings — one of Brazil's biggest real estate portals — as structured data. Search by neighborhood or city, for sale or for rent, and get every listing back with **price, condo fee, IPTU, area, bedrooms, bathrooms, parking, full address, coordinates, photos and the advertiser** (name, CRECI, type and link). Filter by property type, price range, size and parking.

- **Up to 20 locations per run**, typed the way you search on the site ("Campinas, SP", "Pinheiros, São Paulo").
- **Up to 1,000 listings per location**, the portal's own ceiling per search.
- **9 property types and 6 filters** (price, bedrooms, area, parking), with duplicates removed across searches in the same run.

**Brazilian fields included:** condo fee (`monthlyCondoFee`), IPTU (`yearlyIptu`), the advertiser's **CRECI** (`advertiserCreci`), agency phone, full address with CEP (`zipCode`) and coordinates when the advertiser shows them.

**Em português:** raspe os anúncios do VivaReal (venda e aluguel) por bairro ou cidade e receba preço, condomínio, IPTU, metragem, quartos, vagas, endereço com CEP, coordenadas, fotos e imobiliária (nome, CRECI e telefone da empresa) em tabela pronta pra planilha. Até 20 localizações por execução e até 1.000 anúncios por localização. Custa US$1,50 por 1.000 anúncios mais US$0,005 por execução; localização não encontrada ou que falhou não é cobrada. Feito pra pesquisa de mercado, avaliação de imóveis e prospecção de imobiliárias.

> **Need VivaReal and Zap Imóveis together?** The **[Zap Imóveis Scraper](https://apify.com/gangary/zap-imoveis-scraper)** takes the same input and returns exactly the same fields (the `portal` field says where each row came from), so you can run both side by side and merge the datasets. For total monthly cost and rental yield, add the **[QuintoAndar Scraper](https://apify.com/gangary/quintoandar-scraper)**.

### What you get

One row per listing, real output from a "Campinas, SP" sale search:

```json
{
  "id": "2919104911",
  "url": "https://www.vivareal.com.br/imovel/casa-3-quartos-parque-residencial-vila-uniao-bairros-campinas-com-garagem-160m2-venda-RS378000-id-2919104911/",
  "title": "Casa com 3 Quartos à venda, 160m²",
  "portal": "vivareal",
  "business": "sale",
  "price": 378000,
  "salePrice": 378000,
  "rentPrice": null,
  "monthlyCondoFee": null,
  "yearlyIptu": null,
  "propertyType": "HOME",
  "propertySubTypes": [],
  "usageTypes": [
    "RESIDENTIAL"
  ],
  "usableArea": 160,
  "totalArea": 160,
  "bedrooms": 3,
  "bathrooms": 2,
  "suites": null,
  "parkingSpaces": 3,
  "floor": 0,
  "street": "Rua Pedro Diogo",
  "streetNumber": "130",
  "neighborhood": "Parque Residencial Vila União",
  "zone": null,
  "city": "Campinas",
  "state": "SP",
  "zipCode": "13060719",
  "latitude": -22.934897,
  "longitude": -47.125352,
  "amenities": [
    "BARBECUE_GRILL",
    "KITCHEN_CABINETS",
    "LAUNDRY"
  ],
  "imageUrls": [
    "https://resizedimgs.vivareal.com/img/vr-listing/2c88e169b7c78a123d002aaa9f67118a/foto.jpg?action=fit-in&dimension=870x707",
    "https://resizedimgs.vivareal.com/img/vr-listing/9b69c3bc08c3017a3f71b25a49730239/foto.jpg?action=fit-in&dimension=870x707"
  ],
  "publicationType": "PREMIUM",
  "createdAt": "2026-10-24T10:50:54.074+00:00",
  "advertiserName": "Chinaglia Imoveis Campinas",
  "advertiserId": "5360f6a6-7988-128f-9de8-e6d8a242ed1c",
  "advertiserCreci": "71318-J-SP",
  "advertiserType": "company",
  "advertiserPhone": "1932292800",
  "advertiserUrl": "https://www.vivareal.com.br/imobiliaria/398374/",
  "searchLocation": "Campinas, SP",
  "scrapedAt": "2026-10-27T22:54:44.208Z"
}
```

| Field | Meaning |
|---|---|
| `price` | Price for the business you asked for: sale price, or monthly rent for rentals |
| `salePrice` / `rentPrice` | Both prices when the listing has them |
| `monthlyCondoFee` / `yearlyIptu` | Condo fee per month and IPTU (property tax) per year, when listed |
| `propertyType` / `propertySubTypes` | Type (apartment, home, office...) and subtypes (duplex, loft, two-story house...) |
| `usableArea` / `totalArea` | Areas in m² |
| `bedrooms` / `bathrooms` / `suites` / `parkingSpaces` | Room counts, as listed |
| `street` / `neighborhood` / `zone` / `city` / `state` / `zipCode` | Address as published (street number and exact coordinates depend on what the advertiser chose to show) |
| `imageUrls` | Up to 20 photo links, ready to open |
| `advertiserName` / `advertiserCreci` / `advertiserType` | Who is selling: `company` (CRECI of a legal entity) or `individual` |
| `advertiserPhone` | Phone of the **real estate company** only. Private sellers' phones are never collected |
| `url` / `advertiserUrl` | Listing and advertiser pages on VivaReal |
| `error` / `ok` | Set only on rows for locations that failed — those rows are **not charged** |

### Use cases

- **Housing market reports:** sale and rent prices per neighborhood or city, with price per square meter (`price` / `usableArea`).
- **Valuation and comparables:** pull listings with the same type, bedrooms and area range around a property to estimate its value.
- **Investor screening:** compare sale prices with rents, condo fees and IPTU in the same neighborhood before buying to rent out.
- **Agency prospecting:** list the real estate agencies active in a city with name, CRECI, phone and number of listings.
- **Cross-portal coverage:** run VivaReal and Zap Imóveis with the same input to see which listings appear on each portal.

### How to use it

1. Add one or more **Locations** the way you would search them on VivaReal: "Pinheiros, São Paulo", "Campinas, SP", "Curitiba". Adding the city or state helps when a neighborhood name exists in several cities. Up to 20 per run.
2. Pick **For sale** or **For rent**.
3. Optionally narrow by **property types**, **price**, **bedrooms**, **area** and **parking spaces**. Leave property types empty to get everything.
4. Set **Max listings per location** (default 100, up to 1,000) and run. Export from the **Listings** dataset view as JSON, CSV or Excel.

| Input | Type | Default | Notes |
|---|---|---|---|
| `locations` | array of strings | — (required) | Neighborhood or city; up to 20 per run, duplicates removed |
| `business` | `sale` / `rent` | `sale` | |
| `propertyTypes` | array | empty = all | `apartment`, `house`, `condo_house`, `two_story_house`, `penthouse`, `flat`, `land`, `office`, `store` |
| `minPrice` / `maxPrice` | integer (BRL) | — | Sale price, or monthly rent on rent searches |
| `minBedrooms` | integer 0-4 | — | 4 means 4 or more |
| `minArea` / `maxArea` | integer (m²) | — | Usable area |
| `minParkingSpaces` | integer 0-4 | — | 4 means 4 or more |
| `maxItemsPerLocation` | integer | 100 | 1 to 1,000, shared across the selected property types |

#### Ready-to-copy inputs

Apartments and houses for sale between R$ 300,000 and R$ 900,000 in Campinas:

```json
{
  "locations": ["Campinas, SP"],
  "business": "sale",
  "propertyTypes": ["apartment", "house"],
  "minPrice": 300000,
  "maxPrice": 900000,
  "maxItemsPerLocation": 100
}
```

Rentals up to R$ 3,500 with 2+ bedrooms and a parking space in two cities:

```json
{
  "locations": ["Curitiba", "Pinheiros, São Paulo"],
  "business": "rent",
  "maxPrice": 3500,
  "minBedrooms": 2,
  "minParkingSpaces": 1,
  "maxItemsPerLocation": 200
}
```

Offices and stores for rent, 50 to 200 m²:

```json
{
  "locations": ["Campinas, SP"],
  "business": "rent",
  "propertyTypes": ["office", "store"],
  "minArea": 50,
  "maxArea": 200,
  "maxItemsPerLocation": 300
}
```

### Pricing

Pay per event: **$0.005 per run** plus **$1.50 per 1,000 listings** delivered. Locations that can't be found, ambiguous locations and failed locations are never charged, and every run respects the `maxTotalChargeUsd` budget you set on Apify. No proxy costs on top.

| Scenario | Approximate cost |
|---|---|
| 100 listings (1 location) | ~US$ 0.16 |
| 1,000 listings (1 location, max per search) | ~US$ 1.51 |
| 10,000 listings (10 locations) | ~US$ 15.01 |

### Run it from code

Replace `<YOUR_APIFY_TOKEN>` with your token from **Apify Console → Settings → API & Integrations**.

**cURL** (waits for the run and returns the items):

```bash
curl -X POST "https://api.apify.com/v2/acts/gangary~vivareal-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Campinas, SP"], "business": "sale", "propertyTypes": ["house"], "maxItemsPerLocation": 100}'
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("gangary~vivareal-scraper").call(
    run_input={"locations": ["Campinas, SP"], "business": "sale", "maxItemsPerLocation": 100}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("price"), item.get("usableArea"), item.get("neighborhood"), item.get("advertiserCreci"))
```

**Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('gangary~vivareal-scraper').call({
    locations: ['Campinas, SP'],
    business: 'sale',
    maxItemsPerLocation: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);
```

The synchronous endpoint waits up to 300 seconds; for big runs (many locations × 1,000 listings) start the run asynchronously and read the dataset when it finishes.

### Integrations

Everything below is built into Apify, no extra setup on our side:

- **[Schedules](https://docs.apify.com/platform/schedules):** run the same cities every day or week to follow new listings and prices.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks):** get a call to your own endpoint when a run finishes.
- **[Make](https://docs.apify.com/platform/integrations/make), [n8n](https://docs.apify.com/platform/integrations/n8n) and [Zapier](https://docs.apify.com/platform/integrations/zapier):** send each run's listings to Google Sheets, your agency CRM or a database.
- **[Google Drive](https://docs.apify.com/platform/integrations/drive):** drop each run's export into a shared folder.
- **Exports:** JSON, CSV, Excel, XML or HTML from the dataset, or straight from the API.

### Use with AI agents (MCP)

Apify runs a hosted MCP server, so Claude, Cursor, VS Code and other MCP clients can call this actor as a tool. Add this server URL to your client (it signs in with OAuth on first use, or send `Authorization: Bearer <YOUR_APIFY_TOKEN>`):

```
https://mcp.apify.com?tools=gangary/vivareal-scraper
```

Then ask in plain words, e.g. *"List houses for sale in Campinas on VivaReal between R$ 300,000 and R$ 900,000 and rank the neighborhoods by price per m²."* Setup details for each client: **[Apify MCP server docs](https://docs.apify.com/platform/integrations/mcp)**.

### FAQ

**How many listings can I get per location?**
Up to about 1,000 listings per location — that is how deep VivaReal lets anyone page. For more, split a big city into neighborhoods (add each neighborhood as its own location) or run separate price ranges. When you select several property types, the per-location limit is shared between them.

**How are locations matched?** Only exact neighborhood or city names. Write `Neighborhood, City` (e.g. `Pinheiros, São Paulo`) or `City, UF` (e.g. `Campinas, SP`). If a name exists in several places (there is a "Copacabana" in Rio and in Belo Horizonte), the actor picks the one with far more listings; if none clearly dominates you get a free `location-ambiguous` row listing the options. Names that match nothing return a free `location-not-found` row.

**What can I type as a location?**
A neighborhood, a city, or both: "Pinheiros, São Paulo", "Pinheiros, São Paulo - SP", "Campinas, SP", "São Paulo". The actor looks the place up on VivaReal and tells you in the log which neighborhood or city it matched. If nothing matches, you get a row with `error: "location-not-found"` and no charge.

**Why are there fewer results than I expected?**
Filters combine (type + price + bedrooms + parking), and the portal only returns what is currently listed. The run log shows how many listings the portal reports for each location and how many were collected.

**Do I get the advertiser's phone number?**
Only for real estate companies (CRECI of a legal entity). For private sellers the phone field is always empty — by design.

**Are duplicates removed?**
Yes. A listing that shows up in more than one search of the same run is delivered once.

**Is scraping VivaReal legal? What about LGPD?**
The actor reads publicly listed property ads — no login and no paywall bypass. It never collects private sellers' phone numbers; the only phone delivered is the one of a real estate company. Review the data you collect against Brazil's LGPD and your own use case before storing or contacting people.

**Is proxy included?**
Yes. The actor handles proxies on its own and moves to Brazilian residential IPs when the site requires it. Nothing to configure, and no proxy costs on top of the listing price.

**Is this the same data as Zap Imóveis?**
Same fields and same input, different portal. Run the [Zap Imóveis Scraper](https://apify.com/gangary/zap-imoveis-scraper) too if you need both portals. Each portal has its own listing `id`, so if the same property shows up on both, match it on your side by address and area.

**How do I cap what a run can cost?**
Set **Max total charge** on Apify before running. The actor stops as soon as that budget is reached.

### Honest limitations

- About 1,000 results per search is the portal's own ceiling.
- Fields appear only when the advertiser filled them in: condo fee, IPTU, street number and coordinates are often missing.
- Each property type runs as its own search, so selecting many types in a big city uses more requests (still billed only per listing delivered).
- "Max listings per location" counts across all selected property types.

### Changelog

- **2026-10-27:** first public release.

### From the same maker

- **[Zap Imóveis Scraper](https://apify.com/gangary/zap-imoveis-scraper)** — sale and rent listings from Zap Imóveis, with condo fee, IPTU and agency data.
- **[QuintoAndar Scraper](https://apify.com/gangary/quintoandar-scraper)** — rent and sale listings from QuintoAndar, with total monthly cost and rental yield.
- **[OLX Brazil Scraper](https://apify.com/gangary/olx-brazil-scraper)** — OLX classifieds by keyword, state or URL, including real estate.

***

If this actor helped you, a rating on its Store page helps others find it. Something broke or a field is missing? Open an issue on the actor's **Issues** tab.

*Keywords: vivareal scraper, raspar vivareal, viva real api, brazil real estate scraper, imoveis a venda, imoveis para alugar, preco metro quadrado, real estate data brazil, property listings brazil, imobiliarias CRECI.*

# Actor input Schema

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

Neighborhoods or cities exactly as you would search them on VivaReal, e.g. "Pinheiros, São Paulo", "Campinas, SP" or "Curitiba". Adding the city or state helps when a neighborhood name exists in several cities. Up to 20 per run.

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

Collect listings for sale or for rent.

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

Only these property types. Leave empty for all types. Each type runs as its own search on VivaReal.

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

Sale price, or monthly rent when collecting rentals. Leave empty for no minimum.

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

Sale price, or monthly rent when collecting rentals. Leave empty for no maximum.

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

Listings with at least this many bedrooms (4 means 4 or more). Leave empty for any.

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

Minimum usable area in square meters. Leave empty for no minimum.

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

Maximum usable area in square meters. Leave empty for no maximum.

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

Listings with at least this many parking spaces (4 means 4 or more). Leave empty for any.

## `maxItemsPerLocation` (type: `integer`):

Collect up to this many listings per location, across all selected property types. VivaReal exposes about 1,000 results per search, so split big areas by neighborhood or price range for more.

## Actor input object example

```json
{
  "locations": [
    "Pinheiros, São Paulo"
  ],
  "business": "sale",
  "maxItemsPerLocation": 100
}
```

# Actor output Schema

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

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

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

```

## MCP server setup

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