Zap Imóveis Scraper icon

Zap Imóveis Scraper

Scrape Zap Imóveis sale, rental and new-development listings by city, filters or URL. Extract 80+ fields including prices, fees, addresses, GPS,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Zap Imóveis Scraper at a glance

Zap Imóveis Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, price, currency and business, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Automation, Developer Tools
Pricing
$1.70 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
38 options
Run success
97.5% of completed public runs in the last 30 days

Scrape Zap Imóveis sale, rental and new-development listings by city, filters or URL. Extract 80+ fields including prices, fees, addresses, GPS, agencies, CRECI, amenities, nearby POIs, scores, H3 location data and media.

What Zap Imóveis Scraper can do

  • 80+ structured fields per listing, including price, condo fee, IPTU (monthly and yearly), price per m², total monthly cost, full address, GPS, agency contact, tier and CRECI license number, plus a verbatim copy of the source record.
  • Every filter the site offers: 21 property types (multi-select), residential or commercial, 226 amenities, condo fee range, near metro, below-market price, rent without guarantor, virtual tour, development stage (on the plan, under construction, ready to move in) and six sort orders.
  • Paste any ZAP link: city, zone, neighborhood and whole-state searches, amenity pages, development-stage pages, links built by the site's filter panel, a single listing or just its listing code. Every link keeps its own filters and starts on the page it points to.
  • Agency intelligence: an Agency Leads summary with one entry per advertiser (contacts, CRECI, cities, neighborhoods, property types, price range), plus the advertiser's public rating and lead response numbers on request.
  • Location intelligence: an H3 spatial-hash array at three resolutions, a curated points-of-interest list (bus stops, train stations, pharmacies, markets) and "valuable zones" tags.
  • Built for recurring monitoring: Resume from run ID continues one interrupted run without re-charging what it already collected, and Incremental mode tracks a saved search over time, classifying every listing as new, updated, unchanged, expired or reappeared.

Choose what to collect

These inputs let you configure Zap Imóveis Scraper - Properties, Prices & 80+ Fields. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredPick how to find listings. 'search' uses the filter fields below. 'url' takes the listing URLs you paste and walks pagination forward.

Choices: search, url

locationsarrayPlaces to search, one per line, typed as you would on the site: a city ('Sao Paulo, SP', 'Rio de Janeiro', 'Curitiba PR'), a neighborhood or zone ('Moema, Sao Paulo', 'Copacabana, Rio de Janeiro'), or a bare two-letter state code ('SP', 'RJ') for a whole state. Diacritics optional; adding the state code picks the right city when several share a name. Each entry resolves to one ZAP location and the log says which; an entry with no match is reported and skipped, never guessed.
businessTypestringSALE = for sale, RENTAL = for rent.

Choices: SALE, RENTAL

listingTypestringUSED = existing properties on the resale market. DEVELOPMENT = new construction launches (lancamentos).

Choices: USED, DEVELOPMENT

propertyTypestringFilter by property category. ANY returns all types.

Choices: ANY, APARTMENT, HOME, PENTHOUSE, STUDIO, ALLOTMENT_LAND, FARM, OFFICE, COMMERCIAL_BUILDING, SHED_DEPOSIT_WAREHOUSE, BUSINESS

minPriceintegerMinimum price in Brazilian Reais. Leave empty for no minimum.
maxPriceintegerMaximum price in Brazilian Reais. Leave empty for no maximum.
Show 31 more inputs
More input fields
InputWhat it controls
minBedroomsintegerMinimum number of bedrooms.
minBathroomsintegerMinimum number of bathrooms.
minParkingSpacesintegerMinimum parking spots.
minUsableAreaintegerMinimum usable floor area in square meters.
maxUsableAreaintegerMaximum usable floor area in square meters.
sortBystringResult ordering. 'relevance' = ZAP default (sponsored + ranked); 'price-asc' / 'price-desc' = primary price; 'newest' = most recently updated first; 'area-desc' / 'area-asc' = largest / smallest usable area first.

Choices: relevance, price-asc, price-desc, newest, area-desc, area-asc

propertyTypesarrayPick one or more property types; listings of ANY picked type are returned. When set, this overrides the single 'Property Type' above. Leave empty to use 'Property Type'.
usageTypestringResidential or commercial properties only. Used only when no property type is picked above.

Choices: ANY, RESIDENTIAL, COMMERCIAL

amenitiesarrayOnly listings that have ALL of the picked amenities (pool, gym, elevator, pets allowed, near public transport, 24h concierge, furnished...).
minCondoFeeintegerMinimum monthly condominium fee in Brazilian Reais. Leave empty for no minimum.
maxCondoFeeintegerMaximum monthly condominium fee in Brazilian Reais. Leave empty for no maximum.
nearTransitbooleanOnly listings near a metro or train station (the site's own 'near metro' filter).
belowMarketPricebooleanOnly listings the site flags as priced below the market reference for comparable properties.
rentWithoutGuarantorbooleanRentals only: listings that can be rented without a guarantor (fiador). Ignored for sale searches.
hasVirtualTourbooleanOnly listings with a virtual / video tour.
constructionStatusstringOnly with Listing Type = New developments: keep launches that are still on the plan ('PLAN_ONLY', the site's 'Na planta'), under construction, or ready to move in ('BUILT', 'Pronto para morar'). Ignored, with a log warning, for resale or rental searches.

Choices: ANY, PLAN_ONLY, UNDER_CONSTRUCTION, BUILT

urlsarrayZAP links to collect (URL mode only), one per line; copy them straight from the browser. Supported: a city search ('.../venda/apartamentos/sp+sao-paulo/'), a zone or neighborhood search ('.../sp+sao-paulo+zona-sul/', '.../sp+sao-paulo+zona-sul+moema/', '.../pr+curitiba++batel/'), a whole-state search ('.../venda/casas/sc/'), a new-development search ('.../lancamentos/imoveis/sp+sao-paulo/', optionally with a stage: '.../na-planta/', '.../em-construcao/', '.../pronto-para-morar/'), an amenity page ('.../sp+sao-paulo/elevador/'), any of those with the site's filters, page (?pagina=N or /page-N/) and sort (ordenarPor / ordem), a link the site's filter panel produced (it carries onde=, tipos=, transacao=), and a single listing or development page (any link ending in '-id-/') or just its numeric listing code. Each search link is walked forward from the page it points to; a listing link returns exactly that listing. Agency pages ('/imobiliaria//') and other site sections are skipped with a warning, never run as a nationwide search. Filter fields in the Search section are ignored here: the link's own filters apply. If you don't replace these defaults, the actor scrapes one example of every supported URL shape below.
maxPagesintegerOptional bound on result pages walked per search or URL (up to 24 listings per page). Leave empty to walk every result page; maxListings is then the effective stopping condition.
maxListingsintegerTotal maximum number of listings to return across all searches. Set 0 for unlimited (subject to maxPages).
fetchDetailsbooleanOpen each listing's detail record to add the full description, title, last-updated date, accepts-exchange / resale flags, publishing portals, building count, a new development's unit variants and units still available, the agency's total listings, service areas and verification score. One extra request per listing, so runs take longer. Off = search-page fields only (the default).
fetchSellerRatingsbooleanAdds the advertiser's public rating from the listing page (the 'x/5' badge next to the CRECI line) as entities.seller.rating: stars, number of ratings and feedbacks, answered vs unanswered leads, and the service points buyers liked or want improved. One extra request per distinct agency or seller (cached for the run). Advertisers nobody has rated yet get null.
maximizeCoveragebooleanThe site shows at most 1,200 results per search. When on, a larger search is split into price ranges and each range is collected, so you can get past that limit. Each listing is returned once and the total still stops at Max Listings. Needs Max Pages empty (0).
resumeFromRunIdstringOptional: paste a previous run ID (or dataset ID) from this actor. Listings already collected there are skipped, so this run only returns new ones. Leave empty for a normal run. For recurring monitoring of the SAME search across scheduled runs, use incrementalMode below instead, the two are not meant to be combined.
incrementalModebooleanWhen true, the actor remembers the previous run of this SAME search itself (via a small internal state store) and classifies every listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED in the output's changeType field. Unlike resumeFromRunId (which continues one interrupted run from a pasted id), this needs no id pasted between scheduled runs. Do not combine with resumeFromRunId, a resumed run is a partial scan and cannot be used to detect EXPIRED listings.
stateKeystringOptional: a name for this monitoring campaign's saved state. Leave empty to auto-derive one from the search scope (locations/urls + filters), so two different searches never share a baseline. Set this explicitly if you want two runs with slightly different inputs to share one baseline, or to keep multiple campaigns cleanly separated.
emitUnchangedbooleanWhen true, listings unchanged since the last incremental run are still returned (changeType=UNCHANGED) instead of being suppressed. This returns AND bills more rows, leave off to get only what changed.
emitExpiredbooleanWhen true, listings present in the previous incremental baseline but no longer found by this run are returned as changeType=EXPIRED tombstone rows. This returns AND bills extra rows. Only fires when this run completed a full scan of every planned search (no listing/page cap hit, not a resumed run), otherwise a listing that was simply not reached yet would be wrongly reported as gone.
ignoreFieldsForChangesarrayOutput field names that should NOT make a listing count as UPDATED in incremental mode. Use a dotted path for a nested field (e.g. 'attributes.lqs'). By default this already ignores the agency/seller fields that change for every listing that agency currently has live (seller_name, seller_tier, seller_license_number, seller_legacy_zap_id, phones, whatsapp, entities.seller, raw.account, raw.account_link) plus raw.listing.score (ZAP's internal ranking score, measured to drift on every fetch with no change to the listing itself). Add more dotted paths here if another field changes too often for your use case. Ignored fields are still returned in the output.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID (text)
titleTitle (text)
pricePrice (number)
currencyCurrency (text)
businessBusiness (text)
property_typeType (text)
bedroomsBeds (number)
bathroomsBaths (number)
parking_spacesParking (number)
usable_areaArea (m²) (number)
cityCity (text)
state_codeState (text)
Show 12 more fields
neighborhoodNeighborhood (text)
seller_nameSeller (text)
seller_tierTier (text)
urlURL (link)
seller_license_numberLicense (CRECI) (text)
seller_legacy_zap_idLegacy ZAP ID (number)
phonesPhones (array)
whatsappWhatsApp (text)
changeTypeChange (text)
changedFieldsChanged Fields (array)
firstSeenAtFirst Seen (date)
lastSeenAtLast Seen (date)

Ways to use this data

  • Real estate investors and analysts: compare price per square meter, condo fees and IPTU across neighborhoods to spot mispriced listings.
  • PropTech and valuation tools: feed structured listings with GPS, POIs and H3 index straight into a pricing or heatmap model.
  • Lead generation for agencies and brokers: use the Agency Leads summary to build a list of advertisers with phones, WhatsApp, CRECI license, ratings and the areas they cover.
  • Market researchers: track new-development (lancamento) launches by construction stage across a city or a whole state over time.
  • Automated workflows: pipe fresh or changed listings into Notion, Airtable or a spreadsheet for a house search or a client-facing shortlist.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Zap Imóveis Scraper return?

The documented output for Zap Imóveis Scraper includes id, title, price, currency, business, type, beds and baths. Availability of each field depends on the source page and the selected mode.

How much does Zap Imóveis Scraper cost?

It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I track a saved search and get only what changed?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then classifies every listing against what that same search returned last time, and unchanged listings are not billed unless you turn that on. Getting EXPIRED rows additionally needs Emit expired listings on and a run that completes a full scan without a page or listing cap cutting it short.

What's the difference between Resume from run ID and Incremental mode?

Resume from run ID continues one specific interrupted run using a pasted run or dataset ID: it skips listings that run already collected and adds no classification. Incremental mode is for a recurring, scheduled search: it remembers that search's own state automatically between runs, with nothing to paste, and classifies each listing as new, updated, unchanged, expired or reappeared.

Why do my property-type results differ from older runs?

Earlier versions sent some property types in a form the site treated as the whole group: Penthouse and Studio returned every apartment, Allotment Land and Farm returned every property, and a pasted /venda/apartamentos/... link returned every type. They now send the site's own type rules, so each option returns what it names. This can mean fewer rows than before for a type the site scopes narrowly (Penthouse in Sao Paulo for sale went from about 437,000 results to about 23,500) or more rows for a type the old code under-scoped (Office in Sao Paulo for sale went from about 12,800 to about 43,800), both now matching the site's own count. A pasted /venda/apartamentos/... link narrows the same way (about 847,800 to about 461,500). The default Property Type: Any search is unchanged. Pasted zone and neighborhood links (sp+sao-paulo+zona-sul+moema) used to fall back to a loose city-name search; they now resolve to that exact neighborhood.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Zap Imóveis Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.