VivaReal & ZAP Imóveis Scraper
Scrape Brazilian real estate listings from VivaReal and ZAP Imóveis: price, condo fee, IPTU, area, rooms, address, coordinates, advertiser and photos.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
location,portal,business(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0014 per property = $1.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Property returned | One property listing returned in the dataset. Diagnostic rows and the labelled sample row are not charged. | $0.0014 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
location | A Brazilian city or neighbourhood, written the way it is written there: "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. | string |
portal | VivaReal and ZAP Imóveis run on one shared listing index, so both return the same properties. This only decides which site the listing URL points at, and the order results come back in. | string |
business | Sale (venda) or rental (aluguel). Rental rows also carry the monthly total with condo fee and IPTU added. | string |
listingType | USED is the ordinary resale market. DEVELOPMENT is new-build launches (lançamentos), a much smaller pool, a few thousand nationally rather than millions. | string |
maxItems | Hard cap on rows across every search in this run (1–5000). You are charged per listing returned. Sample and diagnostic rows are never charged. | integer |
startUrls | Paste search pages or single listing pages from either portal. A search page works best when it still carries its "?onde=" parameter, that is where the portal keeps the place id. A single listing page must end in -id-{number}/. | array |
unitTypes | Leave empty for everything. These are the portal's own codes. | array |
bedroomsMin | Minimum number of bedrooms (quartos). | integer |
bathroomsMin | Minimum number of bathrooms (banheiros). | integer |
parkingMin | Minimum number of parking spaces (vagas). | integer |
priceMin | Sale price, or monthly rent when you are searching rentals. | integer |
priceMax | Sale price, or monthly rent when you are searching rentals. | integer |
areaMin | Minimum área útil in square metres. | integer |
areaMax | Maximum área útil in square metres. | integer |
locationIds | For repeat runs where you already know the exact place. These look like BR>Sao Paulo>NULL>Sao Paulo>Zona Oeste>Pinheiros and appear in the run log whenever a location is resolved. Using them skips the place lookup and guarantees the same area every time. | array |
What you get
A structured dataset — each result includes fields like:
imageUrltitlepricecondoFeeiptuusableAreabedroomsbathroomsparkingSpacesneighborhoodcitystateAcronymadvertiserTypeadvertiserNameupdatedAturllistingIdExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
VivaReal and Zap Imóveis Scraper: Brazilian property listings with price, fees and area
Name a Brazilian city or neighbourhood and get one row per listing: the asking price, the condo fee, the IPTU, usable and total area, bedrooms, bathrooms, suites, parking, the address down to the postcode, amenities, who is advertising it, their phone and WhatsApp, 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.
| Input | A Brazilian city or neighbourhood, or portal URLs |
| Output | One row per listing |
| Ceiling | 5,000 listings per run, 1,500 per search |
| Account needed | None, and no API key |
| Price | $1.40 per 1,000 listings, flat on every plan |
🏠 What this 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 guarantees 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.
One search reaches 1,500 listings. The portal stops paging there whatever its own count says. The log tells you when a search hit that wall, and splitting by neighbourhood or price band is how you get past it.
📥 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, box 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. |
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 from a recent run, with the description and the photo list 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": ["11944822247"],
"whatsapp": "11944822247",
"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 | What it is |
|---|---|
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. See the legal note 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 |
Run it with no location, no id and no URL and you get the one sample row. Every diagnostic carries a message and a hint next to its code.
| 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. |
One bad search never stops the others, and a diagnostic row never fails the run.
▶️ How to run it
1. Open VivaReal and 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.
💰 How much does it cost?
$1.40 per 1,000 listings. Flat on every Apify plan, no volume tiers.
You pay per listing row delivered. Diagnostic rows, a place the portal cannot find, a search that matches nothing, a listing that has left the index, and the sample row are all free.
💡 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.
🧭 Which property scraper do you need?
| If you want | Use |
|---|---|
| Brazilian listings with fees, area and advertiser | This one |
| Brazilian classified ads, property included | OLX Brazil Scraper |
| US property details from Zillow | Zillow Property Details Scraper |
| Spanish and Portuguese listings on Idealista | Idealista Scraper |
❓ Questions people ask
Do I need an account on either portal? 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 from one city? Split it. Run each neighbourhood, or the same neighbourhood in price bands.
Is scraping these portals 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 scraping and the law 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.