Zap Imoveis Scraper: Brazil Property Listings and Prices avatar

Zap Imoveis Scraper: Brazil Property Listings and Prices

Pricing

from $1.99 / 1,000 listings

Go to Apify Store
Zap Imoveis Scraper: Brazil Property Listings and Prices

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

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

30 Zap Imoveis listings in 34 seconds with price, condo fee, IPTU, area, address and agency

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 latitude was 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.

Run it on Apify

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 maxItems above 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, and url points 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

ParameterTypeDefaultWhat it does
citystringemptyBrazilian city, for example São Paulo or Rio de Janeiro.
statestringemptyState code (SP, RJ, PR) or name. Picks the right city when two states share a name.
neighborhoodsarray of stringsemptyNeighbourhoods of that city, one search each. Empty searches the whole city.
businessTypestringsalesale or rent.
propertyTypestringallapartment, house, two_story_house, condo_house, village_house, penthouse, flat, kitnet, studio, loft, land, farm, office, retail, warehouse or commercial_building.
minPrice, maxPriceintegeremptyPrice range in BRL: sale price, or monthly rent for rentals.
bedrooms, bathrooms, parkingSpacesintegeremptyMinimum, 1 to 4. 4 means 4 or more.
minArea, maxAreaintegeremptyUsable area range in m².
sortBystringrelevancerelevance, newest or lowest_price.
startUrlsarray of stringsemptyResults links from zapimoveis.com.br or vivareal.com.br. Each keeps its own filters.
sourcestringzapSite for the city search: zap or vivareal.
maxItemsinteger50Most listings per search (each neighbourhood, city or link), 1 to 10,000.
includeDetailsbooleantrueReads each listing's own title, full description, updated_at, portals and accepts_exchange.
proxyConfigurationobjectresidential BRApify 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.

FieldWhat it is
id, external_idListing id on the site (the key to join on), and the advertiser's own reference code
title, url, sourceTitle, link to the listing, and zap or vivareal
business_typesale or rent
property_type, property_subtypes, usage_type, listing_typee.g. APARTMENT, ["DUPLEX"], RESIDENTIAL, USED
price, currency, price_hiddenAsking price in BRL for the business searched, and a flag when the advertiser hides it
sale_price, rent_priceBoth prices, when a listing is offered for sale and for rent
rental_period, rent_total_monthly, rental_warrantiesRentals: period, monthly total with fees, accepted guarantees
condo_feeMonthly condominium fee in BRL
iptu, iptu_period, yearly_iptuIPTU property tax, its period, and the yearly amount when given
total_area, usable_areaAreas in m²
bedrooms, bathrooms, suites, parking_spaces, floorRoom counts, parking and floor
street, street_number, complement, neighborhood, zone, city, state, state_code, zip_codeAddress as the advertiser shows it
latitude, longitude, address_shown, location_idCoordinates, how much of the address is public (ALL, STREET, NEIGHBORHOOD), and the site's location path
condominium_nameBuilding or condominium name, when given
amenitiesAmenity codes, e.g. POOL, GYM, ELEVATOR, BALCONY, PETS_ALLOWED
descriptionFull description, line breaks kept (with details on)
images, image_count, image_urlPhoto links at 1280x960, how many, and the first one
video_urls, video_tour_urlVideo links and the virtual tour
advertiser_name, advertiser_id, advertiser_license, advertiser_tier, advertiser_urlThe agency, its id, CRECI, plan on the portal and page on the site
advertiser_phones, advertiser_whatsappBusiness contact numbers the advertiser publishes on the listing
publication_typePlacement plan: STANDARD, PREMIUM or SUPER_PREMIUM
portals, accepts_exchange, updated_atPortals carrying the listing, exchange accepted, last update (with details on)
created_atWhen the listing was published
details_scraped, details_errorWhether the listing's own record was read, and why not when it failed
search, search_url, price_band, page, positionThe search that found it, its link, the price band when one was used, results page and place in the search
scraped_atWhen 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:

FieldWhat it is
idThe key to store and join on
urlLink to the listing
sourcezap or vivareal
business_typesale or rent
property_typeProperty type code
priceAsking price in BRL
usable_areaUsable area in m²
bedroomsBedrooms
bathroomsBathrooms
parking_spacesParking spaces
neighborhoodNeighbourhood
cityCity
state_codeState code
imagesPhoto links (an empty list when there are none)
advertiser_nameThe agency
created_atPublication time
positionPlace 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.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
listing-scrapedOnce 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-startOnce 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

  1. Open the actor in Apify Console, set your input and click Save as a new task.
  2. In the task, open Schedules, click Add schedule and pick how often (every day, every Monday at 08:00 and so on).
  3. Compare runs on id and price to see new listings and price cuts in your area.
  4. 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"

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

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

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.