VivaReal & ZAP Imóveis Scraper - Brazil Property Data avatar

VivaReal & ZAP Imóveis Scraper - Brazil Property Data

Pricing

from $1.34 / 1,000 properties

Go to Apify Store
VivaReal & ZAP Imóveis Scraper - Brazil Property Data

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

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.

InputA Brazilian city or neighbourhood, portal place ids, or VivaReal and ZAP URLs
OutputOne 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
Ceiling5,000 listings per run, 1,500 per search
Account neededNone, 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 getField
The listing id, which portal's link, the link, title and descriptionlistingId, portal, url, title, description
Sale or rent, resale or new development, property type and usebusinessType, listingType, propertyType, unitTypes, usageTypes
Asking price or monthly rent, and on rentals the monthly total with feesprice, currency, rentalTotalPrice, rentalPeriod
Condo fee and IPTU, with the period the tax is quoted forcondoFee, iptu, iptuPeriod
Usable and total area in m²usableArea, totalArea
Bedrooms, bathrooms, suites, parking spaces and floorbedrooms, bathrooms, suites, parkingSpaces, unitFloor
Amenitiesamenities
Street and number, neighbourhood, zone, city, state and postcodestreet, streetNumber, neighborhood, zone, city, state, stateAcronym, zipCode, fullAddress
Map position, where the advertiser published onelatitude, longitude
Agency or private seller, the advertiser's name, id, licence and rank on the portaladvertiserType, advertiserName, advertiserId, advertiserLicense, advertiserTier
Phone numbers and WhatsApp, if you switch them onphones, whatsapp
Listing tier and statuspublicationType, status
Lead photo, photo count and every photoimageUrl, imageCount, images
When it went up and when the advertiser last touched itcreatedAt, updatedAt
Which search found it, where in it, and when it was readsearchLocation, position, scrapedAt

▶️ How to scrape VivaReal and ZAP Imóveis

  1. Open VivaReal & ZAP Imóveis Scraper and click Try for free.
  2. Type a city or neighbourhood into Where to search.
  3. Pick For sale or to rent, then add filters like Bedrooms, at least or Price up to.
  4. Set Maximum listings, then click Start.
  5. 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
}
FieldDefaultWhat it is
locationnone, the form starts at Pinheiros, São PauloA city or neighbourhood, in Brazilian spelling.
portalvivarealvivareal or zap. Decides the link target and the result order, not which properties you get.
businessSALESALE for venda, RENTAL for aluguel.
listingTypeUSEDUSED for the resale market, DEVELOPMENT for new-build launches.
maxItems100Rows across every search in the run, up to 5,000.
includeContactsfalseAdds the advertiser's phone numbers and WhatsApp to each row. Off by default.
startUrlsnoneSearch 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}/.
unitTypesnone, meaning everythingThe portal's own codes, from APARTMENT and HOME through FARM and PARKING_SPACE.
bedroomsMin, bathroomsMin, parkingMinnoneMinimum quartos, banheiros and vagas, 1 to 10.
priceMin, priceMaxnoneSale price, or monthly rent when you are searching rentals.
areaMin, areaMaxnoneUsable area (área útil) in square metres.
locationIdsnonePortal place ids, as described above.
proxyConfigurationnoneOptional. 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"
}
FieldHow to read it
priceThe asking price on a sale, the monthly rent on a rental.
rentalTotalPriceRental rows only: the monthly figure with the condo fee and IPTU added.
condoFee, iptu, iptuPeriodThe 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, longitudeFilled only where the advertiser published them. Plenty leave the exact address off, and then fullAddress is as precise as it gets.
advertiserType, advertiserTierAgency or private seller, and the advertiser's rank on the portal.
phones, whatsappThe contact numbers on the listing, only with includeContacts on; empty otherwise. See the legal question below.
createdAt, updatedAtWhen the listing went up and when the advertiser last touched it. updatedAt is the one worth sorting on.
images, imageCountEvery photo the listing carries. 30 on this one.

🧾 Reading the output

RowHow to spot itCharged
A listing_sample and _diagnostic both absentyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

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.

CodeWhat it means
LOCATION_NOT_FOUNDThe portal does not recognise that place. Try the Brazilian spelling with the city attached.
LOCATION_LOOKUP_FAILEDThe place lookup itself did not answer. Usually temporary.
NO_LOCATIONNo 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_RECOGNISEDNot a VivaReal or ZAP Imóveis address.
LISTING_NOT_FOUNDThat listing has left the index. Advertisers take them down and properties sell.
NO_RESULTSNothing matched. Widen the price or area range, drop a filter, or search the city rather than the neighbourhood.
BAD_FILTERSThe portal rejected that combination of filters.
PAGE_OUT_OF_RANGEThe search does not go that deep. Split it into neighbourhoods or price bands.
FEW_MATCHESThe 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_LIMITThe 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 rentalTotalPrice already has the condo fee and IPTU in it.
  • Building a price-per-square-metre picture from price and usableArea across a city.
  • Watching new-build launches by switching Resale or new development to DEVELOPMENT.
  • Seeing which agencies hold the stock in an area, from advertiserName and advertiserTier.

🚧 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 price is 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 wantUse
Homes for sale and to rent on VivaReal and ZAP Imóveis, with feesThis one
Rentals and sales on QuintoAndar, with the full monthly costQuintoAndar Scraper
Caixa's own repossessed properties, with both auction roundsCaixa Imóveis Leilão Scraper
Judicial and extrajudicial auctions from auction houses and banksBrazilian Property Auction Scraper
Classified ads on OLX Brazil, property includedOLX 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.

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.