ZAP Imóveis & VivaReal Scraper — Brazil Property Listings
Pricing
from $1.50 / 1,000 listing scrapeds
ZAP Imóveis & VivaReal Scraper — Brazil Property Listings
Scrape ZAP Imóveis and VivaReal listings for sale or rent from search URLs or city/neighbourhood + filters: price, condo fee, IPTU, area, rooms, address, coordinates, photos, agency.
Pricing
from $1.50 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Trevor Ortega
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
ZAP Imóveis & VivaReal Scraper
Scrape property listings from ZAP Imóveis and VivaReal, Brazil's two biggest real estate portals (both run by Grupo OLX), for sale (venda) or for rent (aluguel). For each listing you get the price, the condo fee (condomínio), the IPTU, the total monthly rent, the usable and total area, bedrooms, bathrooms, suites and parking spaces, and the property type. You also get the address as the advertiser publishes it (street, number, neighbourhood, zone, city, state, CEP), the coordinates, the amenities, every photo URL, and the advertiser's name, CRECI, profile link and type (agency, developer or private owner). The listing date and the listing URL are included too. Start from any ZAP or VivaReal search URL, or type a city or neighbourhood and pick filters. Turn on Include description and last update to also get each listing's full description text, its own title, the last update date and the portals it is published on.
The actor reads the same JSON API the two websites load (30 listings per request), not the HTML. That keeps the output complete and stable and runs fast: about 1,400 listings a minute (1,491 listings in 63 seconds in our test). You pay only for the listings you get.
What data does ZAP Imóveis & VivaReal Scraper extract?
| Field | Description |
|---|---|
id, url, portal | Listing id (the same on both portals), the listing URL, and ZAP or VIVAREAL |
title | The portal's headline, e.g. "Apartamento com 2 Quartos à venda, 69m²" |
businessType | SALE (venda) or RENTAL (aluguel) |
price, currency | Sale price or rent in BRL (null when the advertiser hides the price; then priceOnRequest is true) |
condoFee, iptuYearly | Monthly condo fee (condomínio) and yearly IPTU, when given |
rentTotalMonthly, rentalPeriod | Rent + condo + IPTU per month as the portal shows it, and MONTHLY / DAILY (rentals) |
salePrice, rentPrice | Both prices when a property is offered for sale and for rent |
propertyType, propertyTypeCode | e.g. "Apartamento" / APARTMENT, "Casa de Condomínio" / CONDOMINIUM, "Sobrado", "Cobertura", "Conjunto Comercial / Sala" |
unitType, unitSubType, usageType, listingType | The portals' raw type codes; listingType is USED or DEVELOPMENT (lançamento) |
usableArea, totalArea | Área útil and área total in m² |
bedrooms, bathrooms, suites, parkingSpaces, floor | Counts; floor is the unit's floor when given |
ranges | For new developments with several unit sizes: {"usableArea": [59, 69], "bedrooms": [2, 3]} |
street, streetNumber, zipCode | Only as far as the advertiser publishes them (see the privacy FAQ) |
neighborhood, zone, city, state, stateCode | e.g. Pinheiros, Zona Oeste, São Paulo, São Paulo, SP |
latitude, longitude, isApproximateLocation, addressDisplay | Coordinates as the map shows them; addressDisplay is ALL, STREET or NEIGHBORHOOD |
amenities | e.g. ["POOL", "GYM", "ELEVATOR", "BARBECUE_GRILL", "PETS_ALLOWED", "FURNISHED"] |
images, videos | All photo URLs (1920 px) and video links |
advertiserName, advertiserType | Agency, developer or owner name, and agency / developer / owner |
advertiserCreci, advertiserUrl, advertiserId | CRECI licence number, the advertiser's page on the portal, id |
advertiserTier, advertiserVerified, advertiserSince, advertiserLogo | Plan tier, verified badge, on the portal since, logo |
externalId, condominiumName, publicationType, stamps | The advertiser's own reference code, building name, ad tier (STANDARD, PREMIUM, SUPER_PREMIUM), badges |
createdAt | When the listing was published (ISO, UTC) |
search, scrapedAt | The search the listing came from and the time of the run |
With Include description and last update you also get:
| Field | Description |
|---|---|
description | Full description text (line breaks kept) |
advertiserTitle | The advertiser's own title for the listing |
updatedAt | Last update of the listing |
publishedOn | The portals it is published on, e.g. ["OLX", "VIVAREAL", "ZAP"] |
How to scrape ZAP Imóveis and VivaReal listings
- Open zapimoveis.com.br or vivareal.com.br, search for a city or neighbourhood, set any filters (type, price, bedrooms, area, amenities, sort, ...) and copy the address from your browser. Or skip this step and type the place in Locations and pick the filters in the input.
- Paste the URL into Start URLs. You can add several searches from both sites, and single listing URLs too.
- Set Max items and start the run. Download the results as JSON, CSV or Excel, or read them through the API.
The Locations search covers the filters most people use: sale or rent, property types, price, usable area, bedrooms, bathrooms and parking spaces. Any other filter on the websites works through a search URL: amenities, condo fee, total rent with condo fee, new developments (lançamentos), virtual tour, near the metro and more.
Input example
{"locations": ["Pinheiros, São Paulo", "Copacabana, Rio de Janeiro"],"portal": "zap","businessType": "RENTAL","propertyTypes": ["APARTMENT"],"maxPrice": 6000,"bedrooms": ["2", "3"],"parkingSpaces": ["1"],"sort": "newest","maxItems": 500,"includeDetails": false}
Or with URLs:
{"startUrls": [{ "url": "https://www.zapimoveis.com.br/venda/apartamentos/sp+sao-paulo+zona-oeste+pinheiros/?quartos=2,3&precoMaximo=1500000" },{ "url": "https://www.vivareal.com.br/aluguel/rj/rio-de-janeiro/zona-sul/copacabana/apartamento_residencial/" },{ "url": "https://www.zapimoveis.com.br/imovel/venda-apartamento-3-quartos-mobiliado-agua-verde-curitiba-pr-92m2-id-2916766574/" }],"maxItems": 1000}
Locations accept a city (Curitiba, Curitiba - PR), a neighbourhood with its city (Moema, São Paulo), a zone (Zona Sul, Rio de Janeiro) or a street. The actor looks each one up with the portal's own autocomplete; the SUMMARY record in the key-value store shows which place was used.
Output example
{"id": "2916768579","url": "https://www.zapimoveis.com.br/imovel/venda-apartamento-2-quartos-com-churrasqueira-ecoville-curitiba-pr-69m2-id-2916768579/","portal": "ZAP","title": "Apartamento com 2 Quartos à venda, 69m²","businessType": "SALE","price": 780000,"priceOnRequest": false,"condoFee": 1175,"iptuYearly": 200,"salePrice": 780000,"currency": "BRL","propertyType": "Apartamento","propertyTypeCode": "APARTMENT","listingType": "USED","usableArea": 69,"totalArea": 100,"bedrooms": 2,"bathrooms": 2,"suites": 1,"parkingSpaces": 1,"floor": 14,"street": "Rua Paulo Ziliotto","streetNumber": "85","neighborhood": "Campina do Siqueira","city": "Curitiba","state": "Paraná","stateCode": "PR","zipCode": "80740310","latitude": -25.437667,"longitude": -49.312622,"isApproximateLocation": false,"addressDisplay": "ALL","amenities": ["GATED_COMMUNITY", "PLAYGROUND", "ELEVATOR", "GOURMET_SPACE", "BARBECUE_GRILL", "PARTY_HALL"],"images": ["https://resizedimgs.zapimoveis.com.br/img/vr-listing/86a709acbfa4115f23558a06b3675f6d/foto.webp?action=fit-in&dimension=1920x1080"],"videos": [],"advertiserType": "agency","advertiserName": "Valphi Negócios Imobiliários","advertiserCreci": "8430-J-PR","advertiserUrl": "https://www.zapimoveis.com.br/imobiliaria/786904/","advertiserTier": "diamond","advertiserVerified": true,"advertiserSince": "2022-11-14T17:55:26Z","externalId": "47","publicationType": "STANDARD","createdAt": "2026-10-10T01:13:21.294+00:00","advertiserTitle": "Apartamento de 02 quartos à venda no Ecoville","description": "Apartamento de 02 quartos, sendo 01 suíte, à venda no Ecoville, Curitiba:\n\n- 69m² de área útil\n- Sala para 02 ambientes\n...","updatedAt": "2026-10-10T01:35:59.662Z","publishedOn": ["OLX", "VIVAREAL", "ZAP"],"detailsFetched": true,"search": "ZAP Imóveis: Curitiba - PR (sale)","scrapedAt": "2026-10-10T01:43:28Z"}
(Shortened: real items carry every field from the table above. Detail fields are absent when Include description and last update is off.)
ZAP Imóveis or VivaReal: which one should I scrape?
Either. Both portals belong to Grupo OLX and list the same properties under the same listing ids (São Paulo for sale: 822,316 listings on ZAP Imóveis and 822,315 on VivaReal in our test; Curitiba: 34,860 on both). The only difference is the site the links point to. If you give searches from both sites, each listing is output once (duplicates are dropped by id, so you are not charged twice). With details on, publishedOn tells you on which portals a listing appears.
How many listings can I get per search?
The portals serve at most 1,500 listings per search (50 pages of 30). When a search has more and Max items asks for more, the actor cuts it into price bands of up to 1,500 listings each, using a few tiny count requests, and collects them all: for Curitiba rentals (8,003 listings when the run started) the actor returned 8,017 listings in 8 price bands, as new listings arrived during the run. Results then come band by band, cheapest band first, and each band keeps your sort order. Very broad searches (all of São Paulo for sale: 822,000 listings) need hundreds of bands; the actor uses up to 150 count requests per search (about 100,000 listings), so split those yourself by neighbourhood, type or price. Turn off Split searches over 1,500 results to stop at the first 1,500.
Does it work without login? Does it collect phone numbers or addresses?
No login and no account are needed: the actor reads only what anyone sees on the websites. It does not export phone or WhatsApp numbers, which the portals show only after a click. Street, number, CEP and exact coordinates are exported only when the advertiser publishes them on the listing (addressDisplay = ALL; STREET shows the street without number; NEIGHBORHOOD shows only the neighbourhood and the approximate map point). For private owners (advertiserType = owner) the actor never exports the street, number or CEP, and rounds the coordinates to about 1 km. Agencies' and developers' names, CRECI and profile pages are business data and are included.
Do I need a proxy?
Yes. Both portals sit behind Cloudflare, which refuses many datacenter IP addresses (about half of the requests in our tests; the actor retries them, so runs still finish, only slower). The default proxy, Apify Residential proxy in Brazil, worked on every request in our tests (over 300 requests, no retries). Residential traffic is billed by Apify per GB, and this actor uses little of it: about 1 MB per 1,000 listings, about 8 MB per 1,000 with descriptions, and about 0.15 MB per start URL (the search page is opened once to read its filters). A refused request is retried automatically on a fresh IP and, if needed, on the other portal's API host.
Monitor changes on a schedule
Turn on Only new or changed items to watch a search. Each run remembers what earlier runs returned and outputs only new listings and listings whose price or condo fee changed. Unchanged listings are dropped before any detail request, so they are not charged. Max items then sets how many listings are checked per run; keep the "Newest first" sort, e.g. 100-300 for a neighbourhood. Save the input as a task in Apify and add a Schedule (for example daily). Give each watch its own Monitoring key if several schedules use the same search. Every output item gets changeType (new or changed), and changed items get previousValues with the old values, e.g. {"price": 780000}. The actor also remembers a few listings just below the window without outputting or charging them, so an older listing that moves into the window because a newer one was taken down is not reported as new. Sold or removed listings simply stop appearing.
Pricing
Pay per result: you are charged for each listing saved to the dataset, plus a small extra per listing when Include description and last update is on (and for single listing URLs, which always load the full record). See the Pricing tab for the current prices. There is no start fee. Platform usage is small: at the default 512 MB memory our test runs used about $0.016 per 1,000 listings without descriptions (residential proxy traffic, compute and dataset writes) and about $0.08 per 1,000 with descriptions.
Integrations and API
Run it from the Apify API or a schedule, and send the results to Google Sheets, Slack, Make, Zapier, n8n or a webhook. Use maxItems to cap the cost of each run. Typical uses are price per m² studies by neighbourhood, rent vs. sale yield analysis, agency inventory tracking, new-listing alerts and lead lists of real estate agencies.
Is it legal to scrape ZAP Imóveis and VivaReal?
This actor collects publicly visible listing data that anyone can see on the websites without logging in. It does not log in, it does not collect phone numbers or anything else behind a click, and it does not export private owners' street addresses. Names of private owners and of individual brokers are personal data under the LGPD: you are responsible for having a legitimate purpose and a legal basis for processing them, and for respecting the portals' terms of use. If in doubt, ask a lawyer.
Support
Found a bug or need a field that is not there? Open an issue on the Issues tab with the input you used and the run link.