VivaReal & ZAP Imóveis Scraper - Brazil Property Data
Pricing
from $1.34 / 1,000 properties
VivaReal & ZAP Imóveis Scraper - Brazil Property Data
VivaReal and ZAP Imóveis scraper for Brazil. Name a city or neighbourhood and get one row per listing: price or rent, condo fee, IPTU, area, bedrooms, parking, address, amenities, advertiser, photos. $1.40 per 1,000 listings.
Pricing
from $1.34 / 1,000 properties
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Name a Brazilian city or neighbourhood and get one row per property listing from VivaReal and ZAP Imóveis: the asking price or rent, the condo fee, the IPTU, usable and total area, bedrooms, bathrooms, suites, parking, the address down to the postcode, amenities, who is advertising it, and every photo.
The two portals run on one shared listing index, so both return the same properties. Choosing between them only sets which site the url points at, and the order results come back in. And one search reaches 1,500 listings at most, whatever the portal's own count says, so a big city has to be split by neighbourhood or price band.
| Input | A Brazilian city or neighbourhood, portal place ids, or VivaReal and ZAP URLs |
| Output | One row per listing: price, condo fee, IPTU, area, bedrooms, bathrooms, suites, parking, address, amenities, advertiser, photos, and phone and WhatsApp if you switch them on |
| Ceiling | 5,000 listings per run, 1,500 per search |
| Account needed | None, and no API key |
| Price | $1.40 per 1,000 listings on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 3,500 |
🔍 What VivaReal & ZAP Imóveis Scraper does
Write the place the way it is written in Brazil: "Pinheiros, São Paulo", "Copacabana, Rio de Janeiro", "Curitiba", "Balneário Camboriú". The portal's own place lookup decides the match, and the run log tells you which one it picked, along with the exact location id it resolved to.
Keep that id for repeat runs. It looks like BR>Sao Paulo>NULL>Sao Paulo>Zona Oeste>Pinheiros, and putting it in Portal location ids skips the lookup and keeps the same area every time. Place names drift, ids do not.
Sale or rental, resale or new development. Rental rows also carry the monthly total with the condo fee and IPTU added on. New developments (lançamentos) are a far smaller pool, a few thousand nationally rather than millions.
When a search hits the 1,500 wall, the log says so.
📋 What data you get from each VivaReal and ZAP listing
| What you get | Field |
|---|---|
| The listing id, which portal's link, the link, title and description | listingId, portal, url, title, description |
| Sale or rent, resale or new development, property type and use | businessType, listingType, propertyType, unitTypes, usageTypes |
| Asking price or monthly rent, and on rentals the monthly total with fees | price, currency, rentalTotalPrice, rentalPeriod |
| Condo fee and IPTU, with the period the tax is quoted for | condoFee, iptu, iptuPeriod |
| Usable and total area in m² | usableArea, totalArea |
| Bedrooms, bathrooms, suites, parking spaces and floor | bedrooms, bathrooms, suites, parkingSpaces, unitFloor |
| Amenities | amenities |
| Street and number, neighbourhood, zone, city, state and postcode | street, streetNumber, neighborhood, zone, city, state, stateAcronym, zipCode, fullAddress |
| Map position, where the advertiser published one | latitude, longitude |
| Agency or private seller, the advertiser's name, id, licence and rank on the portal | advertiserType, advertiserName, advertiserId, advertiserLicense, advertiserTier |
| Phone numbers and WhatsApp, if you switch them on | phones, whatsapp |
| Listing tier and status | publicationType, status |
| Lead photo, photo count and every photo | imageUrl, imageCount, images |
| When it went up and when the advertiser last touched it | createdAt, updatedAt |
| Which search found it, where in it, and when it was read | searchLocation, position, scrapedAt |
▶️ How to scrape VivaReal and ZAP Imóveis
- Open VivaReal & ZAP Imóveis Scraper and click Try for free.
- Type a city or neighbourhood into Where to search.
- Pick For sale or to rent, then add filters like Bedrooms, at least or Price up to.
- Set Maximum listings, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Run it with no location, no id and no URL and you get one labelled sample row, not charged, so you can see the columns first.
💰 How much does it cost to scrape VivaReal and ZAP Imóveis?
$1.40 per 1,000 listings on the Free plan. Paid plans pay a little less: $1.38 on Starter, $1.36 on Scale and $1.34 on Business. On the free plan, the $5 Apify gives you each month covers about 3,500 listings.
Only listing rows are charged. The sample row and every diagnostic row are free, including the ones for a place the portal cannot find, a search that matches nothing and a listing that has left the index.
📥 What you give it
{"location": "Pinheiros, São Paulo","portal": "vivareal","business": "SALE","listingType": "USED","unitTypes": ["APARTMENT"],"bedroomsMin": 2,"priceMax": 1500000,"maxItems": 200}
| Field | Default | What it is |
|---|---|---|
location | none, the form starts at Pinheiros, São Paulo | A city or neighbourhood, in Brazilian spelling. |
portal | vivareal | vivareal or zap. Decides the link target and the result order, not which properties you get. |
business | SALE | SALE for venda, RENTAL for aluguel. |
listingType | USED | USED for the resale market, DEVELOPMENT for new-build launches. |
maxItems | 100 | Rows across every search in the run, up to 5,000. |
includeContacts | false | Adds the advertiser's phone numbers and WhatsApp to each row. Off by default. |
startUrls | none | Search pages or single listing pages from either portal. A search page works best while it still carries its ?onde= parameter, which is where the place id lives. A single listing must end -id-{number}/. |
unitTypes | none, meaning everything | The portal's own codes, from APARTMENT and HOME through FARM and PARKING_SPACE. |
bedroomsMin, bathroomsMin, parkingMin | none | Minimum quartos, banheiros and vagas, 1 to 10. |
priceMin, priceMax | none | Sale price, or monthly rent when you are searching rentals. |
areaMin, areaMax | none | Usable area (área útil) in square metres. |
locationIds | none | Portal place ids, as described above. |
proxyConfiguration | none | Optional. Leave it alone unless the run needs to go out through a network of your own. |
📤 What you get back
A real row, with the description, the photo list and the phone numbers cut short:
{"listingId": "2814207417","portal": "VivaReal","url": "https://www.vivareal.com.br/imovel/apartamento-2-quartos-pinheiros-zona-oeste-sao-paulo-com-garagem-85m2-venda-RS2650000-id-2814207417/","title": "Apartamento com 2 quartos à venda e para alugar em Pinheiros, São Paulo","description": "Unidade disponível em um dos empreendimentos mais sofisticados de São Paulo...","businessType": "SALE","listingType": "USED","propertyType": "UNIT","unitTypes": ["APARTMENT"],"usageTypes": ["RESIDENTIAL"],"currency": "BRL","price": 2650000,"rentalTotalPrice": null,"rentalPeriod": null,"condoFee": 2060,"iptu": null,"iptuPeriod": "YEARLY","usableArea": 85,"totalArea": 85,"bedrooms": 2,"bathrooms": 2,"suites": 2,"parkingSpaces": 2,"unitFloor": null,"amenities": [],"street": null,"streetNumber": null,"neighborhood": "Pinheiros","zone": "Zona Oeste","city": "São Paulo","state": "São Paulo","stateAcronym": "SP","zipCode": "05414020","fullAddress": "Rua Francisco Leitão Pinheiros São Paulo SP","latitude": null,"longitude": null,"advertiserType": "agency","advertiserName": "Cobens Negócios De Bens Móveis E Imóveis Ltda","advertiserId": "cef4b87e-6256-8bb2-b798-cf23e10cd883","advertiserLicense": null,"advertiserTier": "diamond","phones": ["..."],"whatsapp": "...","publicationType": "STANDARD","status": "ACTIVE","imageUrl": "https://resizedimgs.vivareal.com/img/vr-listing/439a18da.../imovel.jpg?action=fit-in&dimension=870x653","imageCount": 30,"images": ["https://resizedimgs.vivareal.com/img/vr-listing/439a18da.../imovel.jpg?...", "..."],"createdAt": "2025-06-14T19:02:35.799Z","updatedAt": "2026-08-22T05:00:44.261Z","searchLocation": "Pinheiros, São Paulo, São Paulo","position": 1,"scrapedAt": "2026-09-20T02:35:14.803Z"}
| Field | How to read it |
|---|---|
price | The asking price on a sale, the monthly rent on a rental. |
rentalTotalPrice | Rental rows only: the monthly figure with the condo fee and IPTU added. |
condoFee, iptu, iptuPeriod | The monthly condo charge and the property tax, with the period the tax is quoted for. |
usableArea, totalArea | Área útil and the total, in square metres. |
street, streetNumber, latitude, longitude | Filled only where the advertiser published them. Plenty leave the exact address off, and then fullAddress is as precise as it gets. |
advertiserType, advertiserTier | Agency or private seller, and the advertiser's rank on the portal. |
phones, whatsapp | The contact numbers on the listing, only with includeContacts on; empty otherwise. See the legal question below. |
createdAt, updatedAt | When the listing went up and when the advertiser last touched it. updatedAt is the one worth sorting on. |
images, imageCount | Every photo the listing carries. 30 on this one. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A listing | _sample and _diagnostic both absent | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on _sample and _diagnostic being absent. Every diagnostic carries a message and a hint next to its code.
Every listing is checked against your filters before it is charged. Some listings carry a range, say 1 or 2 bathrooms, and the row shows the first figure. Under Bathrooms, at least 2 that row is left out, not charged, and the run reads on to fill Maximum listings.
| Code | What it means |
|---|---|
LOCATION_NOT_FOUND | The portal does not recognise that place. Try the Brazilian spelling with the city attached. |
LOCATION_LOOKUP_FAILED | The place lookup itself did not answer. Usually temporary. |
NO_LOCATION | No place could be read out of a pasted URL. Use Where to search, or paste a URL that still has its onde= parameter. |
URL_NOT_RECOGNISED | Not a VivaReal or ZAP Imóveis address. |
LISTING_NOT_FOUND | That listing has left the index. Advertisers take them down and properties sell. |
NO_RESULTS | Nothing matched. Widen the price or area range, drop a filter, or search the city rather than the neighbourhood. |
BAD_FILTERS | The portal rejected that combination of filters. |
PAGE_OUT_OF_RANGE | The search does not go that deep. Split it into neighbourhoods or price bands. |
FEW_MATCHES | The search ran out before it reached your Maximum listings, and some listings it returned did not meet your filters, so they were left out. Widen a filter or the area to get more. |
TIME_LIMIT | The run stopped itself just before its time limit. Everything found until then is in the dataset; give the run more time for the rest. |
One bad search never stops the others, and a diagnostic row never fails the run. The one exception: if the time limit stops the run before any listing came back, it ends as failed.
💡 What people use it for
- Tracking asking prices in a neighbourhood week by week and diffing on
listingId. - Working out the real monthly cost of a rental, since
rentalTotalPricealready has the condo fee and IPTU in it. - Building a price-per-square-metre picture from
priceandusableAreaacross a city. - Watching new-build launches by switching Resale or new development to
DEVELOPMENT. - Seeing which agencies hold the stock in an area, from
advertiserNameandadvertiserTier.
🚧 What it does not do
- 1,500 listings per search. The portal stops paging there. Split by neighbourhood or price band to go deeper.
- No sold prices and no history. Live listings only, and
priceis what is being asked today. - Exact addresses and coordinates are often missing, because the advertiser chose not to publish them.
- The two portals share one index, so running both does not get you more properties.
- Amenities come from the advertiser, so two identical flats can list different ones.
- Department-style browse pages are not the input. Use a place name, a place id, a search page with
onde=, or a listing page ending-id-{number}/. - Brazil only, in Portuguese and in reais.
- It is not an official VivaReal tool. Dami's Studio is independent and is not affiliated with or endorsed by VivaReal or ZAP Imóveis, or by any other company named on this page.
🧭 Which Brazilian property scraper do you need?
| If you want | Use |
|---|---|
| Homes for sale and to rent on VivaReal and ZAP Imóveis, with fees | This one |
| Rentals and sales on QuintoAndar, with the full monthly cost | QuintoAndar Scraper |
| Caixa's own repossessed properties, with both auction rounds | Caixa Imóveis Leilão Scraper |
| Judicial and extrajudicial auctions from auction houses and banks | Brazilian Property Auction Scraper |
| Classified ads on OLX Brazil, property included | OLX Brazil Scraper |
❓ Questions people ask
Do I need an account on VivaReal or ZAP?
No. No login, no API key.
Which portal should I choose?
Whichever link you would rather click. The properties are the same; only the url and the ordering change.
How do I make repeat runs hit exactly the same area?
Run it once, copy the location id out of the run log, and put it into Portal location ids from then on.
Why is the address incomplete?
Because the advertiser left it that way. Many listings publish the neighbourhood and the street but not the number, and some publish no coordinates at all.
How do I get more than 1,500 listings from one city?
Split it. Run each neighbourhood, or the same neighbourhood in price bands.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/vivareal-zap-imoveis-scraper. Either way the run happens on your Apify account at the same price.
Is scraping VivaReal and ZAP Imóveis legal?
These are public listing pages, but the rows carry advertiser names, phone numbers and WhatsApp numbers, which is personal data under Brazil's LGPD and under GDPR if you are in Europe. Have a lawful reason before you collect or contact, and read each portal's terms. Apify's write-up on the legality of web scraping is a starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the location or URL you used. The errorCode on the diagnostic row usually names the problem on its own.