Zap Imoveis Scraper: Brazil Property Listings and Prices
Pricing
from $1.99 / 1,000 listings
Zap Imoveis Scraper: Brazil Property Listings and Prices
Scrape Zap Imoveis (and VivaReal) by city, neighbourhood or search link: one row per listing with sale or rent price, condo fee, IPTU, areas, bedrooms, bathrooms, parking, full address with coordinates, amenities, description, photos, agency and dates. No login.
Pricing
from $1.99 / 1,000 listings
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
From The Mine Works, makers of Zillow Rentals Scraper and Housing.com Scraper, with over 140,000 runs across 170+ public actors.
Updated 21 Oct 2026: first release. City, state and neighbourhood search or pasted results links, sale or rent, 16 property types, price, area, room and parking filters, and one flat row per listing with price, condo fee, IPTU, areas, full address with coordinates, amenities, description, photos and the agency. VivaReal works too. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- The full cost of a property, in columns. Every row has the asking price, the monthly condo fee (condomínio) and the IPTU with its period, as numbers. Rentals also get the rent period, the monthly total the site shows and the guarantees the landlord accepts. Sort a whole neighbourhood by price per square metre without cleaning text.
- Address you can map. Street, number when shown, neighbourhood, zone, city, state, CEP, latitude and longitude, plus how much of the address the advertiser chose to show. In our test runs
latitudewas filled on 2,069 of 2,071 rows. - Full description and the agency. With details on (the default) each listing's own title and full description are read, which the search pages show only for paid placements. Every row names the agency, its CRECI licence, its page on the site and the business phone it publishes on the listing.
- Pay per listing, nothing for errors. Links that are not results pages, places the site does not know, the summary row and duplicates found by two searches are never charged. No Zap Imoveis account, cookies or API key.
Part of The Mine Works Real estate family: Zillow Rentals Scraper, Zillow Sold Comps Scraper, India Real Estate MCP, Housing.com Scraper, 99acres Scraper, MagicBricks Scraper.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns the first 30 listings for sale in São Paulo, with their full descriptions. It took 34 seconds in our test run:
{"city": "São Paulo","state": "SP","maxItems": 30}
Add neighbourhoods to search them one by one, switch businessType to rent, or paste a results link from your browser into startUrls. A listing that two of your searches find is delivered once.
Apify's free plan includes $5 of credit every month, which covers about 2,790 listings at this actor's price.
Copy to your AI assistant
themineworks/zap-imoveis-scraper on Apify. Searches Zap Imoveis (or VivaReal), Brazil's property portals, by city, state and neighbourhood or by a pasted results link, and returns one flat row per listing with no login. Call ApifyClient("TOKEN").actor("themineworks/zap-imoveis-scraper").call(run_input={"city": "São Paulo", "state": "SP", "neighborhoods": ["Pinheiros"], "businessType": "rent", "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give city (with optional state and neighborhoods list) or startUrls (zapimoveis.com.br or vivareal.com.br results links, each keeps its own filters) or both; up to 100 searches. Optional for the city search: businessType ("sale" default or "rent"), propertyType ("all" default, "apartment", "house", "two_story_house", "condo_house", "village_house", "penthouse", "flat", "kitnet", "studio", "loft", "land", "farm", "office", "retail", "warehouse", "commercial_building"), minPrice, maxPrice (BRL), bedrooms, bathrooms, parkingSpaces (minimum, 1 to 4, 4 means 4 or more), minArea, maxArea (usable m²), sortBy ("relevance", "newest", "lowest_price"), source ("zap" default or "vivareal"). Also: maxItems (per search, default 50, 1 to 10000; above 1400 the search is read in price bands), includeDetails (default true; adds the full title, description, updated_at, portals). Listing rows have no _type field and carry id, external_id, title, url, source, business_type, property_type, property_subtypes, usage_type, listing_type, price, price_hidden, currency, rental_period, rent_total_monthly, rental_warranties, sale_price, rent_price, condo_fee, iptu, iptu_period, yearly_iptu, total_area, usable_area, bedrooms, bathrooms, suites, parking_spaces, floor, street, street_number, complement, neighborhood, zone, city, state, state_code, zip_code, latitude, longitude, address_shown, location_id, condominium_name, amenities, description, images, image_count, image_url, video_urls, video_tour_url, advertiser_name, advertiser_id, advertiser_license, advertiser_tier, advertiser_url, advertiser_phones, advertiser_whatsapp, publication_type, portals, accepts_exchange, created_at, updated_at, details_scraped, search, search_url, price_band, page, position, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when listings were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~zap-imoveis-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- City, neighbourhood or link. Type the city and state, add neighbourhoods (bairros) one per line, or paste a results link from zapimoveis.com.br or vivareal.com.br with the filters you set on the site. The location is matched in the site's own location index, so spelling with or without accents both work.
- The site's filters. Sale or rent, 16 property types (apartment, house, sobrado, casa de condomínio, cobertura, flat, kitnet, studio, loft, land, farm, office, shop, warehouse, whole building), price range, minimum bedrooms, bathrooms and parking spaces, and usable area range. Sort by relevance, newest or lowest price.
- Past 1,500 listings. The site serves at most 1,500 listings per search. Set
maxItemsabove 1,400 and the actor counts the matches first, cuts the search into price bands that each fit, and reads them from the cheapest up. In our test, 1,600 apartments in Pinheiros came back from 4 price bands. - Zap Imoveis or VivaReal. Both belong to Grupo ZAP and share one listing database. Pick the site for the city search with
source; links always use the site they come from, andurlpoints to that site. - Only the area you asked for. The site tops up thin pages with listings from nearby areas. The actor drops those, so a Copacabana search returns Copacabana; the summary counts what it dropped in
outside_area_skipped. - Stops cleanly. Each request is tried up to 4 times on a fresh Brazilian IP. Six failed requests in a row end the run; the run stops before its time limit and keeps every row it read. The summary row says why.
How to use it
Basic: one city, for sale
{"city": "Curitiba","state": "PR","maxItems": 300}
One row per listing, in the site's relevance order. Sort by price or by price divided by usable_area in a spreadsheet to find the cheapest square metre.
Rental market in chosen neighbourhoods
{"city": "Rio de Janeiro","state": "RJ","neighborhoods": ["Copacabana", "Botafogo"],"businessType": "rent","propertyType": "apartment","bedrooms": 2,"minPrice": 3000,"maxPrice": 9000,"maxItems": 200}
Each neighbourhood is its own search, labelled in search. price is the monthly rent, condo_fee and iptu the costs on top, and rent_total_monthly the total the site shows.
New listings watch
{"city": "Belo Horizonte","state": "MG","propertyType": "house","sortBy": "newest","maxItems": 100}
Save it as a task with a daily schedule and compare runs on id: anything new is a listing published since the last run. created_at gives the publication time.
Paste a search from the site
{"startUrls": ["https://www.zapimoveis.com.br/venda/apartamentos/sp+sao-paulo+zona-oeste+pinheiros/?quartos=2,3&precoMaximo=1500000","https://www.vivareal.com.br/aluguel/pr/curitiba/"],"maxItems": 100}
Each link keeps its own place, type and filters (bedrooms, bathrooms, parking, price, area and sort). The form filters apply to the city field only.
Agency prospecting
Run a city search, then group the rows on advertiser_name: the count per agency is its stock in that city. advertiser_license is its CRECI, advertiser_url its page on the site and advertiser_phones the business number it publishes on its listings.
Fast export without descriptions
{"city": "São Paulo","state": "SP","neighborhoods": ["Moema"],"maxItems": 1000,"includeDetails": false}
Rows come from the search pages only: every field except the full description, updated_at, portals and accepts_exchange, and the title is the site's short name. About twice as fast. Same price per listing.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
city | string | empty | Brazilian city, for example São Paulo or Rio de Janeiro. |
state | string | empty | State code (SP, RJ, PR) or name. Picks the right city when two states share a name. |
neighborhoods | array of strings | empty | Neighbourhoods of that city, one search each. Empty searches the whole city. |
businessType | string | sale | sale or rent. |
propertyType | string | all | apartment, house, two_story_house, condo_house, village_house, penthouse, flat, kitnet, studio, loft, land, farm, office, retail, warehouse or commercial_building. |
minPrice, maxPrice | integer | empty | Price range in BRL: sale price, or monthly rent for rentals. |
bedrooms, bathrooms, parkingSpaces | integer | empty | Minimum, 1 to 4. 4 means 4 or more. |
minArea, maxArea | integer | empty | Usable area range in m². |
sortBy | string | relevance | relevance, newest or lowest_price. |
startUrls | array of strings | empty | Results links from zapimoveis.com.br or vivareal.com.br. Each keeps its own filters. |
source | string | zap | Site for the city search: zap or vivareal. |
maxItems | integer | 50 | Most listings per search (each neighbourhood, city or link), 1 to 10,000. |
includeDetails | boolean | true | Reads each listing's own title, full description, updated_at, portals and accepts_exchange. |
proxyConfiguration | object | residential BR | Apify residential proxy in Brazil, included in the price. |
Give city, startUrls or both. Up to 100 searches per run.
What data do you get?
One row per listing. Listing rows have no _type field; the summary, info and error rows do, so a filter on _type separates them.
| Field | What it is |
|---|---|
id, external_id | Listing id on the site (the key to join on), and the advertiser's own reference code |
title, url, source | Title, link to the listing, and zap or vivareal |
business_type | sale or rent |
property_type, property_subtypes, usage_type, listing_type | e.g. APARTMENT, ["DUPLEX"], RESIDENTIAL, USED |
price, currency, price_hidden | Asking price in BRL for the business searched, and a flag when the advertiser hides it |
sale_price, rent_price | Both prices, when a listing is offered for sale and for rent |
rental_period, rent_total_monthly, rental_warranties | Rentals: period, monthly total with fees, accepted guarantees |
condo_fee | Monthly condominium fee in BRL |
iptu, iptu_period, yearly_iptu | IPTU property tax, its period, and the yearly amount when given |
total_area, usable_area | Areas in m² |
bedrooms, bathrooms, suites, parking_spaces, floor | Room counts, parking and floor |
street, street_number, complement, neighborhood, zone, city, state, state_code, zip_code | Address as the advertiser shows it |
latitude, longitude, address_shown, location_id | Coordinates, how much of the address is public (ALL, STREET, NEIGHBORHOOD), and the site's location path |
condominium_name | Building or condominium name, when given |
amenities | Amenity codes, e.g. POOL, GYM, ELEVATOR, BALCONY, PETS_ALLOWED |
description | Full description, line breaks kept (with details on) |
images, image_count, image_url | Photo links at 1280x960, how many, and the first one |
video_urls, video_tour_url | Video links and the virtual tour |
advertiser_name, advertiser_id, advertiser_license, advertiser_tier, advertiser_url | The agency, its id, CRECI, plan on the portal and page on the site |
advertiser_phones, advertiser_whatsapp | Business contact numbers the advertiser publishes on the listing |
publication_type | Placement plan: STANDARD, PREMIUM or SUPER_PREMIUM |
portals, accepts_exchange, updated_at | Portals carrying the listing, exchange accepted, last update (with details on) |
created_at | When the listing was published |
details_scraped, details_error | Whether the listing's own record was read, and why not when it failed |
search, search_url, price_band, page, position | The search that found it, its link, the price band when one was used, results page and place in the search |
scraped_at | When the row was written |
Summary row (_type: "summary", never charged): searches_requested, searches_read, searches_failed, searches_not_started, pages_read, count_requests, listings_found, listings_delivered, charged_for, duplicates_skipped, outside_area_skipped, details_requested, details_ok, details_failed, http_requests, http_megabytes, ended_on_deadline, stopped_by_max_cost, stopped_by_block_guard, shortfall_reason when fewer listings came back than asked, and per_search, one entry per search with the matched location, total_matches, price_bands, pages, listings_delivered and why it stopped. The same summary is saved as the OUTPUT record of the run.
Error rows (_type: "error", never charged): one per input that could not be read, with error_type (invalid_input, location_not_found, blocked, http_error, fetch_error), identifier and reason.
Stable fields for automations
These were present in every listing row of our test runs (2,071 rows from 9 searches in 5 cities), and their names will not change:
| Field | What it is |
|---|---|
id | The key to store and join on |
url | Link to the listing |
source | zap or vivareal |
business_type | sale or rent |
property_type | Property type code |
price | Asking price in BRL |
usable_area | Usable area in m² |
bedrooms | Bedrooms |
bathrooms | Bathrooms |
parking_spaces | Parking spaces |
neighborhood | Neighbourhood |
city | City |
state_code | State code |
images | Photo links (an empty list when there are none) |
advertiser_name | The agency |
created_at | Publication time |
position | Place in the search |
Optional, present only when the listing has a value: title (2,066 of 2,071 test rows), condo_fee (houses outside a condominium have none), iptu, street_number and street (the advertiser can hide them), latitude and longitude (2 of 2,071 test rows had none), description (434 of the 435 rows read with details on), amenities, advertiser_license, advertiser_whatsapp, video_urls, video_tour_url, floor, condominium_name, and the rental fields on rentals only.
Output examples
One apartment for rent from the Copacabana search (test run, 21 Oct 2026, trimmed):
{"id": "2895407584","title": "Apartamento : Padrão / Residencial / Copacabana","url": "https://www.zapimoveis.com.br/imovel/aluguel-apartamento-2-quartos-mobiliado-copacabana-zona-sul-rio-de-janeiro-rj-90m2-id-2895407584/","source": "zap","business_type": "rent","property_type": "APARTMENT","price": 7500,"currency": "BRL","rental_period": "MONTHLY","rent_total_monthly": 9020,"condo_fee": 1520,"iptu": 420,"usable_area": 90,"bedrooms": 2,"bathrooms": 2,"parking_spaces": 2,"neighborhood": "Copacabana","zone": "Zona Sul","city": "Rio de Janeiro","state_code": "RJ","latitude": -22.977166,"longitude": -43.192939,"advertiser_name": "Julio Bogoricin Imoveis - Leblon","advertiser_license": "02410-J-RJ","created_at": "2026-06-27T04:25:51.809Z","updated_at": "2026-10-20T13:26:27.013Z","details_scraped": true,"search": "Copacabana, Rio de Janeiro, RJ","position": 1}
A penthouse for sale from the "Try it" input (same day, trimmed):
{"id": "2914409611","title": "Cobertura à venda no Bosque da Saúde com 4 quartos","url": "https://www.zapimoveis.com.br/imovel/venda-cobertura-4-quartos-com-piscina-bosque-da-saude-zona-sul-sao-paulo-sp-176m2-id-2914409611/","business_type": "sale","property_type": "PENTHOUSE","price": 1160000,"condo_fee": 3300,"iptu": 745,"usable_area": 176,"bedrooms": 4,"bathrooms": 4,"parking_spaces": 3,"neighborhood": "Bosque da Saúde","city": "São Paulo","state_code": "SP","latitude": -23.612706,"advertiser_name": "IMOBILIÁRIA NOVA SÃO PAULO","description": "Cobertura à venda no Bosque da Saúde com 176 m², projetada para proporcionar ambientes confortáveis e bem distribuídos...","position": 1}
The summary row of the Rio de Janeiro run, trimmed:
{"_type": "summary","searches_requested": 2,"searches_read": 2,"pages_read": 4,"listings_delivered": 80,"outside_area_skipped": 1,"details_ok": 80,"details_failed": 0,"per_search": [{ "search": "Copacabana, Rio de Janeiro, RJ", "location": "Copacabana, Rio de Janeiro, RJ", "total_matches": 267, "pages": 2, "listings_delivered": 40, "stopped": "max_items_reached" },{ "search": "Botafogo, Rio de Janeiro, RJ", "location": "Botafogo, Rio de Janeiro, RJ", "total_matches": 177, "pages": 2, "listings_delivered": 40, "stopped": "max_items_reached" }]}
An error row for a link that is not a results page (nothing charged):
{ "_type": "error", "error_type": "invalid_input", "identifier": "https://example.com/foo", "reason": "Skipped: not a Zap Imoveis or VivaReal link. Use a results link from zapimoveis.com.br or vivareal.com.br (for example https://www.zapimoveis.com.br/venda/apartamentos/sp+sao-paulo/), or the city, state and neighbourhood fields." }
Pricing
Pay per event: you pay for the listings you receive, plus a flat $0.003 per run, whatever memory you choose. Reading the full descriptions costs nothing extra, and the Brazilian residential proxy is included.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
listing-scraped | Once per listing row stored in your dataset | $1.99 per 1,000 | $1.99 per 1,000 | $1.99 per 1,000 | $1.99 per 1,000 |
run-start | Once per run, after the first results page returned listings | $0.003 | $0.003 | $0.003 | $0.003 |
The price of one listing is the price per 1,000 divided by 1,000.
Never charged:
- links that are not Zap Imoveis or VivaReal results pages, and places the site does not know (each gets an error row);
- a listing that a second search of the same run finds again;
- listings from nearby areas the site mixes into a neighbourhood search;
- listings past your
maxItems; - the summary, info and error rows;
- a run with no valid input, or one whose searches return no listings: the start fee is charged only once a results page has returned listings;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input and click Save as a new task.
- In the task, open Schedules, click Add schedule and pick how often (every day, every Monday at 08:00 and so on).
- Compare runs on
idandpriceto see new listings and price cuts in your area. - Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.
FAQ
What does this actor read?
The same public listing data the Zap Imoveis and VivaReal websites load in your browser when you search, from Grupo ZAP's own listing service, as a visitor who is not logged in. It does not log in, send messages to advertisers or open contact forms.
How many listings can I get?
Up to 10,000 per search and 100 searches per run. The site itself serves at most 1,500 listings per search; above a maxItems of 1,400 the actor reads the search in price bands so it can go further. Listings that hide their price cannot fall in a price band, so a banded search can miss those few. A search also ends when the results run out or two pages in a row bring nothing new.
What is the difference between includeDetails on and off?
On (the default), each listing's own record is read too, for the advertiser's full title, the full description, the last update time, the portals that carry it and whether an exchange is accepted. The search pages carry those only for paid placements. Off, every other field is still there and the run is about twice as fast. The price per listing is the same.
Zap Imoveis or VivaReal: which should I pick?
Both sites belong to Grupo ZAP and read from one listing database, and most listings carry both in portals. The order and the paid placements differ. Pick the one whose links you want in url; for market research either gives the same stock.
Why do some rows have no condo fee, street number or coordinates?
The advertiser decides what to show. Houses outside a condominium have no condo fee, and many advertisers hide the street number or show only the neighbourhood, which address_shown tells you. Coordinates were missing on 2 of 2,071 rows in our tests.
How do the bedroom, bathroom and parking filters work?
They are minimums, the way the site's buttons work: bedrooms: 2 returns 2 or more, and 4 means 4 or more. In a pasted link, quartos=2,3 means exactly 2 or 3, as on the site.
How long does a run take?
In our tests: 34 seconds for the "Try it" input (30 listings with details), 157 seconds for 300 houses in Belo Horizonte with details, 29 seconds for 36 listings from 3 links with details off, and 243 seconds for 1,600 apartments in Pinheiros read in 4 price bands with details off. Requests go through a residential proxy in Brazil, which answers in 3 to 8 seconds; the actor reads 4 result pages and 30 listing records at a time.
Do I need an account, cookies or a proxy?
No account and no cookies. The site blocks datacenter IPs after a few requests, so the actor uses Apify's residential proxy in Brazil by default, included in the price. You can pick another proxy under Advanced.
Which actor should I use for other property markets?
Zillow Rentals Scraper and Zillow Sold Comps Scraper for the United States, Housing.com Scraper and NoBroker Scraper for India.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Listings, Price and costs, Location, and Advertisers. In CSV and Excel, list fields such as images and amenities are flattened into columns such as images/0.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/zap-imoveis-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http zap-imoveis-scraper "https://mcp.apify.com/?tools=themineworks/zap-imoveis-scraper"
Is it legal to scrape Zap Imoveis?
The actor reads only public listings that anyone can see without logging in, published by agencies and owners to be found. Contact numbers are the ones the advertiser publishes on the listing. You are responsible for how you use the data, including the sites' terms and data protection law such as Brazil's LGPD. This is general information, not legal advice.
Integrations
- Google Sheets: send each run's listings to a sheet with Apify's Google Sheets integration; one row per listing fits a sheet as is.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "new listings in our neighbourhoods every morning to Slack".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
Real estate
- Zillow Rentals Scraper
- Zillow Sold Comps Scraper
- India Real Estate MCP
- Housing.com Scraper
- 99acres Scraper
- MagicBricks Scraper
- Zillow Property Scraper
- Zillow Photos Scraper
- Real Estate MCP
- Airbnb Scraper
- Domain.com.au Property Scraper
- realestate.com.au Scraper
Social media and video
Leads and business directories
Marketing, SEO and reviews
Science, health and government data
Jobs and hiring
Company and business data
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a search that returns fewer listings than the site, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.
Search Zap Imoveis or VivaReal by city, neighbourhood or link and get every listing back as one row, with price, condo fee, IPTU, areas, rooms, address, coordinates, photos and the agency, no login.

