VivaReal & ZAP Imóveis Scraper: Brazil Property Listings
Pricing
from $0.60 / 1,000 listings
VivaReal & ZAP Imóveis Scraper: Brazil Property Listings
Scrape VivaReal and ZAP Imóveis listings in Brazil for sale or rent: BRL price, condo fee, IPTU, area in m², bedrooms, bathrooms, suites, parking, neighbourhood, coordinates, amenities, photos, advertiser and URL. Filter by city, price and type, or paste a search URL. $0.60 per 1,000 listings.
Pricing
from $0.60 / 1,000 listings
Rating
0.0
(0)
Developer
Philip Kirkbride
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Features
Share
Collect public Brazilian property listings from VivaReal and ZAP Imóveis as clean, structured rows: BRL price, condo fee (condomínio) and IPTU, usable and total area, bedrooms, bathrooms, suites, parking, street and neighbourhood, city and state, map coordinates, amenities, photos, the advertiser's published name and contact details, and the listing link.
Use it as a VivaReal and ZAP Imóveis API: search a city for sale or rental listings with price and property-type filters, or paste a search URL you built on either portal and keep every filter you set in the browser. Results download as JSON, CSV or Excel and can be scheduled, called from your own code, or sent to Google Sheets, a webhook or cloud storage.
$0.60 per 1,000 listings ($0.0006 per row) plus $0.0005 per run start — a 100-listing run costs about 6 cents.
What you can do with it
- Market snapshot by city or neighbourhood. Compare asking prices, price per m² (from
priceandusableAreaM2), stock and property mix for sale or rent in São Paulo, Rio, Curitiba, Florianópolis and any other Brazilian city on either portal. - Price monitoring. Run the same search on a schedule and compare
listingId,price,condoFeeandupdatedAtbetween runs to spot new, repriced and removed listings. - Lead and advertiser research.
agencyNameand the advertiser contact fields identify the agencies and individual advertisers publishing each listing. Contacts are filled when the source exposes them (pasted search-URL pages); they arenullon the default search. - Feeds for dashboards, maps and valuation models. Typed numbers and ISO dates, one row per listing, ready for a spreadsheet, BI tool or database.
Quick start
The default input returns up to 20 properties for sale in São Paulo from VivaReal:
{"portal": "vivareal", "businessType": "sale", "city": "São Paulo", "state": "SP", "maxResults": 20}
To collect rentals from both portals in one run:
{"portal": "both", "businessType": "rent", "city": "Curitiba", "state": "PR", "maxResults": 40}
To keep every filter from a search you set up in the browser, paste its address bar link:
{"searchUrl": "https://www.vivareal.com.br/venda/sp/sao-paulo/apartamento_residencial/", "maxResults": 100}
Input
| Input | Default | Meaning |
|---|---|---|
portal | vivareal | vivareal, zap or both |
businessType | sale | sale or rent |
city | São Paulo | Brazilian city name |
state | SP | State abbreviation or full name |
propertyType | all | all, apartment, house, condominium, land, commercial |
minPrice, maxPrice | unset | BRL price bounds (sale price, or monthly rent for rent) |
searchUrl | unset | HTTPS sale/rental search URL from either portal |
maxResults | 20 | Total delivered rows, from 1 to 1,000 |
A pasted search URL supplies its own portal, location, operation and property filters. City, state, portal, businessType and propertyType inputs do not override it. Price bounds additionally filter returned rows. With both, the total budget is shared across the portals; the same property may appear once per portal. Agency promotions and changing rankings mean this is a snapshot, with no promise of exhaustive coverage.
Output
Each row contains listingId, portal, businessType, propertyType, price, currency, condoFee, iptu, iptuPeriod, usableAreaM2, totalAreaM2, bedrooms, bathrooms, suites, parkingSpaces, street, neighborhood, city, state, latitude, longitude, amenities, title, description, imageUrls, agencyName, advertiserPhones, advertiserEmails, advertiserContact, createdAt, updatedAt, url and observedAt.
Amounts and areas are numbers; unavailable values are null. iptuPeriod is year for API rows and source-unspecified for pasted-URL rows. Prices, fees and areas reflect the source, including inconsistencies. Coordinates can be approximate. Street and coordinates are omitted when the source does not expose the street. Images are limited to five. Dates use ISO 8601; the pasted-URL search state generally omits creation/update dates and total area.
Published titles and descriptions are retained, including any contact text the listing contains. agencyName contains the published advertiser name, including individual advertisers. advertiserPhones, advertiserEmails and advertiserContact are filled only when the source page carries them (searchUrl pages); they are null on the default search. Missing contacts are null, and contact availability on source pages is not guaranteed. Street addresses and coordinates are included only when the source makes them public.
Example row (selected fields, illustrative values):
{"listingId": "2676543210","portal": "vivareal","businessType": "sale","propertyType": "APARTMENT","price": 650000,"currency": "BRL","condoFee": 800,"iptu": 210,"iptuPeriod": "year","usableAreaM2": 70,"bedrooms": 2,"bathrooms": 2,"suites": 1,"parkingSpaces": 1,"street": "Rua Exemplo","neighborhood": "Pinheiros","city": "São Paulo","state": "SP","latitude": -23.5643,"longitude": -46.6921,"amenities": ["Piscina", "Academia", "Elevador"],"title": "Apartamento 2 quartos em Pinheiros","imageUrls": ["https://resizedimgs.vivareal.com/example.jpg"],"agencyName": "Example Imóveis","advertiserPhones": null,"advertiserEmails": null,"advertiserContact": null,"createdAt": "2026-09-14T18:22:00+00:00","updatedAt": "2026-10-30T11:05:00+00:00","url": "https://www.vivareal.com.br/imovel/2676543210/","observedAt": "2026-11-10T04:00:00+00:00"}
FAQ
Is this the official VivaReal or ZAP Imóveis API? No. It reads the public listings those two portals show to any visitor and returns them as structured rows. No account, login or developer key is needed.
How fresh is the data? Every run reads the live listings, so price, availability and updatedAt are as of the run (observedAt). Advertised prices and fees can change at any time.
Why did I get fewer rows than maxResults? The source returns only what it has for that search, and each portal caps how deep a search can be paged. To cover more of a city, narrow the search (a neighbourhood, a price band, one property type) and run several searches.
Why is a field null? The portal does not publish it for that listing, or the field is only exposed on pasted search-URL pages (advertiser contacts, total area, creation and update dates). Nulls are not filled with guesses.
Can I get contact details for every advertiser? Only when the source publishes them. On a pasted search-URL run the advertiser's phones and emails are captured when shown; they are null otherwise.
Can the same property appear twice? With both, the same property can appear once per portal. Within one portal, deduplicate on listingId; across portals no cross-portal id is published.
How do I use it from my own code? Start the Actor through the Apify API and read the dataset. Results can also go to Google Sheets, a webhook or cloud storage, and the Actor can run on a schedule.
Limits and tips
A partial run with delivered rows succeeds and identifies blocked searches in its final status. A run with no rows fails with a plain status message. Slow or unavailable sources can leave partial results. Large searches should be split into narrower price ranges or neighborhoods; each run is capped at 1,000 results.
Pricing
$0.0006 per listing row ($0.60 per 1,000), plus $0.0005 per run start per GB of memory (the default 512 MB run is one start). Only delivered rows are charged; a search that returns nothing adds no row charge.
| Run | Rows | Cost |
|---|---|---|
| Default input (São Paulo, for sale) | 20 | about $0.0125 |
| Five cities, sale | 100 | about $0.0605 |
| One portal, 1,000 rows | 1,000 | about $0.60 |
See the Pricing tab for the current terms.