# VivaReal Brazil Property Listing Scraper (`parsebird/vivareal-property-scraper`) Actor

Extract property listings from VivaReal, Brazil's leading real estate portal: prices, location, rooms, amenities, media, and seller contact details. Search by city or neighborhood, or paste listing URLs directly.

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

## Pricing

from $1.40 / 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/platform/actors/running/actors-in-store#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

### VivaReal Property Listing Scraper

Extract property listings from [VivaReal](https://www.vivareal.com.br), Brazil's leading real estate portal. The **VivaReal Property Listing Scraper** searches by city or neighborhood — or a pasted listing URL — and returns clean, structured data: prices, rooms, usable area, amenities, location and coordinates, media, and seller/agency contact details.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any Brazilian city or neighborhood for sale or rental listings, filter by price, rooms, usable area, amenities, and below-market-price stamps, and get seller contact details (phone, WhatsApp) with every record.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/vivareal-property-scraper. Scrapes property listings from VivaReal (vivareal.com.br), Brazil's leading real estate portal. Call via ApifyClient: client.actor("parsebird/vivareal-property-scraper").call(run_input={"location": "Rio de Janeiro", "deal_type": "sale", "property_type": ["apartment"], "min_price": 250000, "max_price": 1200000, "limit": 100}). Also accepts startUrls (VivaReal listing URLs to scrape directly), amenities, min_bedroom/min_bathroom/min_parking ("1"-"4"), min_sqm/max_sqm, below_market_price, near_transit, maximize_coverage. Returns per listing a structured record with sections: identity (id/external_id/fingerprint), source_context, timestamps, content (title/description), pricing (amount + per-business-type offers), availability, location (address + coordinates), media (images/videos), attributes (property type, rooms, area, amenities, badges), entities.seller (agency/broker + contact), contact (phones/whatsapp). Full API spec: https://apify.com/parsebird/vivareal-property-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What does VivaReal Property Listing Scraper do?

This actor reads the same structured listing data VivaReal's own search results and listing pages render — no manual clicking, no guessing at CSS selectors. You give it a city, a neighborhood, or a VivaReal listing URL, and it returns every matching property with price, rooms, usable area, amenities, coordinates, photos, and the agency's contact details.

- 🔍 **City or neighborhood search** — search a whole city (e.g. `"Rio de Janeiro"`) or narrow to a specific neighborhood (e.g. `"Pinheiros, Sao Paulo"`).
- 🔗 **Direct listing URLs** — paste one or more VivaReal listing URLs into Start URLs to scrape specific properties directly, skipping search entirely.
- 🏠 **Sale or rental** — toggle deal type, with rental listings returning monthly condo fee, IPTU, and accepted warranty types where available.
- 🎚️ **Rich filtering** — 21 property types, 30 amenities, minimum bedrooms/bathrooms/parking spaces, price range, usable area range, below-market-price stamp, and near-public-transit.
- 📞 **Public contact details** — phone numbers and WhatsApp number for the listing agency or broker, when publicly shown.
- 📊 **Structured, analysis-ready output** — identity, pricing, location, and attributes are each their own object, ready for deduplication, mapping, and portfolio-level reporting.

### What data can you extract from VivaReal?

| Field | Description |
|-------|-------------|
| `identity.id` / `identity.fingerprint` | Listing ID and a stable fingerprint for deduplication/change tracking |
| `content.title` / `content.description` | Listing title and full description text |
| `pricing.offers[]` | Price, currency, monthly condo fee, and IPTU per business type (sale/rent) |
| `location.city` / `location.neighborhood` / `location.state_code` | Where the property is located |
| `location.coordinates` | Latitude/longitude for mapping |
| `attributes.rooms` | Bedrooms, bathrooms, suites, parking spaces |
| `attributes.area` | Usable and total area in square meters |
| `attributes.amenities` / `attributes.badges` | Amenity list and listing stamps (e.g. below-market-price) |
| `media.images[]` / `media.videos[]` | Photo and video URLs |
| `entities.seller` | Agency/broker name, tier, license number, profile URL |
| `contact.phones` / `contact.whatsapp` | Public contact numbers |

See the [full field reference](https://apify.com/parsebird/vivareal-property-scraper/input-schema) for every field across all 11 output sections (`identity`, `source_context`, `timestamps`, `content`, `pricing`, `availability`, `location`, `media`, `attributes`, `entities`, `contact`).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | array | No | — | VivaReal listing URLs to scrape directly instead of a location search |
| `location` | string | No | `Rio de Janeiro` | A city or neighborhood, e.g. `"Rio de Janeiro"` or `"Pinheiros, Sao Paulo"` |
| `deal_type` | string | No | `sale` | `sale` or `rent` |
| `property_type` | array | No | — | e.g. `apartment`, `house`, `studio`, `penthouse` (21 types) |
| `amenities` | array | No | — | e.g. `pets_allowed`, `air_conditioning`, `balcony` (30 amenities) |
| `min_bedroom` / `min_bathroom` / `min_parking` | string | No | — | `"1"`–`"4"` for 1+ to 4+ |
| `min_price` / `max_price` | integer | No | — | Whole numbers, e.g. `250000` |
| `min_sqm` / `max_sqm` | integer | No | — | Usable area range in square meters |
| `below_market_price` | boolean | No | `false` | Keep only listings marked below market price |
| `near_transit` | boolean | No | `false` | Keep only listings tagged near public transit |
| `maximize_coverage` | boolean | No | `false` | Raises the default per-search result cap for broader retrieval |
| `limit` | integer | No | `100` | Maximum listings to save per search seed |

### Output example

```json
{
  "identity": { "id": "2880363892", "external_id": "PAAP31641", "fingerprint": "47c70add902f38bd61b5" },
  "content": { "title": "Apartamento 3 quartos, dependência completa, 2 vagas em Irajá" },
  "pricing": {
    "amount": 295000,
    "currency": "BRL",
    "offers": [{ "business_type": "sale", "amount": 295000, "currency": "BRL", "monthly_condo_fee": 627, "yearly_iptu": 540 }]
  },
  "location": {
    "neighborhood": "Irajá", "city": "Rio de Janeiro", "state_code": "RJ",
    "coordinates": { "latitude": -22.836969, "longitude": -43.323003 }
  },
  "attributes": {
    "property_type": "unit", "unit_types": ["apartment"],
    "rooms": { "bedrooms": 3, "bathrooms": 3, "suites": 1, "parking_spaces": 2 },
    "area": { "usable_area": 98 },
    "amenities": ["builtin_wardrobe", "intercom", "pets_allowed"]
  },
  "entities": { "seller": { "name": "Patrimônio Rio Imobiliária", "tier": "diamond" } },
  "contact": { "phones": ["21995819223"], "whatsapp": "21995819223" }
}
```

Download results as **JSON, CSV, Excel, HTML, or XML** directly from the Apify Console, or fetch them via the [Apify API](https://docs.apify.com/api/v2) / [dataset endpoint](https://apify.com/parsebird/vivareal-property-scraper/api).

### Use cases

- **Portfolio and market monitoring** — track listing prices and availability by city or neighborhood over time.
- **Lead generation** — pull agency/broker contact details for outreach or CRM enrichment.
- **Mapping and territory analysis** — use `location.coordinates` to plot listings and analyze coverage by area.
- **Price benchmarking** — compare sale and rental pricing, condo fees, and IPTU across neighborhoods.
- **Below-market deal sourcing** — filter for `below_market_price` listings to surface underpriced opportunities.

### How to scrape VivaReal property listings

1. **Set your search** — enter a Location (city or `"Neighborhood, City"`), or paste listing URLs into Start URLs.
2. **Choose deal type and property type** — sale or rent, and one or more property types.
3. **Apply filters** — price range, usable area, minimum rooms/parking, amenities, below-market-price, and near-transit.
4. **Set a limit** — cap how many listings to collect; enable Maximize Coverage for broader searches.
5. **Run the actor** — click **Start** in the Apify Console, or trigger it via the [API](https://docs.apify.com/api/v2) or on a [schedule](https://docs.apify.com/platform/schedules).
6. **Get your data** — download the dataset as JSON/CSV/Excel, or pull it via the API.

### How much does it cost to scrape VivaReal?

This actor uses [Pay-Per-Event (PPE)](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) pricing — you're charged per listing extracted, not per compute unit.

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `listing-scraped` (Free plan) | $0.0019 | **$1.90** |
| `listing-scraped` (Bronze) | $0.0018 | **$1.80** |
| `listing-scraped` (Silver) | $0.0016 | **$1.60** |
| `listing-scraped` (Gold) | $0.0014 | **$1.40** |

A run collecting 500 listings costs roughly $0.70–$0.95 depending on your Apify plan. All Apify accounts include a [free trial](https://apify.com/pricing) with credits to try the actor before committing to a paid plan.

### FAQ

**Why do some fields come back empty?**
VivaReal only discloses full street address and exact contact details on listings where the agency has enabled it; search results also mask the exact street for privacy until you view the listing. Fields are omitted (not fabricated) when VivaReal doesn't supply a value.

**Which cities and neighborhoods does `location` support?**
Any city or neighborhood VivaReal indexes. State resolution (used internally to scope the search) is built in for state capitals and 50+ major metro areas; for less common cities, pass a full VivaReal search URL via Start URLs for precise targeting instead.

**What's the difference between `identity.id` and `identity.fingerprint`?**
`id` is VivaReal's own listing ID. `fingerprint` is a stable content hash useful for detecting when the same listing has been reposted or duplicated across searches.

**Does `limit` really cap "all available results"?**
Leaving `limit` empty collects up to a safety cap (500 listings, or 2,000 with `maximize_coverage` enabled) rather than a truly unbounded run, to keep runs predictable and cost-bounded. Set `limit` explicitly for full control.

**What are the limitations of this actor?**
⚠️

- Listing detail via Start URLs returns a slightly smaller field set than location search (no `portal`/`portals`, `checksum`-based fingerprint, or seller trust/count fields — VivaReal's listing page doesn't expose these)
- Property type and amenity filters are best-effort mappings from VivaReal's own filter taxonomy; verify results against your criteria for filter-critical workflows

### Is it legal to scrape VivaReal?

Yes. This actor only accesses publicly available property listings that VivaReal and its advertisers have made visible for the purpose of marketing real estate. It does not bypass login walls or access private accounts. Scraping publicly available data is generally considered legal — see [Apify's overview of web scraping legality](https://www.apify.com/is-web-scraping-legal) for more detail. Users are responsible for ensuring their use of the collected data complies with applicable laws and [VivaReal's Terms of Use](https://www.vivareal.com.br/sobre/termos-de-uso/).

### Python and JavaScript usage

**Python** ([apify-client](https://docs.apify.com/api/client/python/)):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "location": "Rio de Janeiro",
    "deal_type": "sale",
    "property_type": ["apartment"],
    "min_price": 250000,
    "max_price": 1200000,
    "limit": 100,
}

run = client.actor("parsebird/vivareal-property-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["content"]["title"], item["pricing"]["amount"])
```

**JavaScript** ([apify-client](https://docs.apify.com/api/client/js/)):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const input = {
    location: 'Rio de Janeiro',
    deal_type: 'sale',
    property_type: ['apartment'],
    min_price: 250000,
    max_price: 1200000,
    limit: 100,
};

const run = await client.actor('parsebird/vivareal-property-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Related Actors

- [PropertyFinder Scraper](https://apify.com/parsebird/propertyfinder-scraper) — real estate listings from the Gulf region
- [MagicBricks Scraper](https://apify.com/parsebird/magicbricks-scraper) — property listings from India
- [NoBroker Scraper](https://apify.com/parsebird/nobroker-scraper) — broker-free property listings from India
- [Craigslist Real Estate Scraper](https://apify.com/parsebird/craigslist-real-estate-scraper) — real estate listings from Craigslist

Browse the full catalog on the [ParseBird Apify Store page](https://apify.com/parsebird).

# Actor input Schema

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

One or more VivaReal listing URLs to scrape directly instead of a location search.

## `location` (type: `string`):

A city or neighborhood in Brazil, such as "Rio de Janeiro" or "Pinheiros, Sao Paulo".

## `deal_type` (type: `string`):

Whether to collect sale or rental listings.

## `property_type` (type: `array`):

One or more property types to include.

## `amenities` (type: `array`):

One or more amenities to include.

## `min_bedroom` (type: `string`):

Minimum bedroom count.

## `min_bathroom` (type: `string`):

Minimum bathroom count.

## `min_parking` (type: `string`):

Minimum parking space count.

## `min_price` (type: `integer`):

Minimum listing price. Use whole numbers such as 400000.

## `max_price` (type: `integer`):

Maximum listing price. Use whole numbers such as 3000000.

## `below_market_price` (type: `boolean`):

When true, keeps only listings marked by VivaReal/DataZAP as below market price.

## `min_sqm` (type: `integer`):

Minimum usable area in square meters.

## `max_sqm` (type: `integer`):

Maximum usable area in square meters.

## `near_transit` (type: `boolean`):

When true, keeps only listings tagged as near public transit.

## `maximize_coverage` (type: `boolean`):

When true, prioritizes broader retrieval on larger searches when you want stronger dataset completeness.

## `limit` (type: `integer`):

Maximum number of listings to save for each search seed. Leave empty to collect all available results.

## Actor input object example

```json
{
  "startUrls": [],
  "location": "Rio de Janeiro",
  "deal_type": "sale",
  "min_bedroom": "",
  "min_bathroom": "",
  "min_parking": "",
  "below_market_price": false,
  "near_transit": false,
  "maximize_coverage": false,
  "limit": 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 = {
    "startUrls": [],
    "location": "Rio de Janeiro",
    "limit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/vivareal-property-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 = {
    "startUrls": [],
    "location": "Rio de Janeiro",
    "limit": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/vivareal-property-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 '{
  "startUrls": [],
  "location": "Rio de Janeiro",
  "limit": 100
}' |
apify call parsebird/vivareal-property-scraper --silent --output-dataset

```

## MCP server setup

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