Zapimoveis APIzapimoveis.com.br ↗
Search, filter, and retrieve Brazilian property listings from ZAP Imóveis. Covers sale and rental data, amenities, location autocomplete, and full listing detail.
What is the Zapimoveis API?
This API exposes 5 endpoints covering ZAP Imóveis, Brazil's largest real estate portal, giving developers access to property listings for sale or rent across the country. Use search_listings to query properties by city, state, bedrooms, bathrooms, and area range, then drill into individual records via get_listing_detail — which returns full address, pricing, amenity list, media URLs, and advertiser details in a single call.
curl -X GET 'https://api.parse.bot/scraper/724e0e0a-2b10-42c0-85e9-caa4d2f8924d/search_listings?city=S%C3%A3o+Paulo&page=1&page_size=3&location_id=BR%3ERio+de+Janeiro%3ENULL%3ERio+de+Janeiro&transaction=RENTAL' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace zapimoveis-com-br-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ZAP Imóveis SDK — search listings, drill into details, discover locations."""
from parse_apis.zap_imóveis_api import ZapImoveis, TransactionType, ListingNotFound
client = ZapImoveis()
# Discover locations matching a query
for suggestion in client.locationsuggestions.search(query="Copacabana", limit=3):
print(suggestion.category, suggestion.address.city, suggestion.address.location_id)
# Construct a location and check available property types
rio = client.location(location_id="BR>Rio de Janeiro>NULL>Rio de Janeiro")
types = rio.property_types(transaction=TransactionType.RENTAL)
for prop_type, count in types.items():
print(prop_type, count)
# Search listings in that location with filters
listing = rio.search(transaction=TransactionType.RENTAL, bedrooms=2, limit=1).first()
if listing:
print(listing.id, listing.listing.title, listing.listing.property_type)
print(listing.listing.address.city, listing.listing.address.neighborhood)
for pricing in listing.listing.pricing_infos:
print(pricing.price, pricing.business_type, pricing.monthly_condo_fee)
# Fetch a specific listing by ID with error handling
try:
detail = client.listings.get(listing_id="2874967379")
print(detail.id, detail.listing.title)
print(detail.account.name, detail.account.tier)
for media in detail.medias:
print(media.url, media.type)
except ListingNotFound as exc:
print(f"Listing not found: {exc.listing_id}")
print("exercised: locationsuggestions.search / location.property_types / location.search / listings.get")
Search for real estate listings with extensive filters. Returns paginated results including listing details, account info, media, and total count. Supports filtering by location, property type, price range, bedrooms, bathrooms, area, and parking spaces. Pagination via page number; each page returns up to page_size results.
| Param | Type | Description |
|---|---|---|
| city | string | City name filter (e.g. 'Rio de Janeiro', 'São Paulo'). |
| page | integer | Page number for pagination. |
| sort | string | Sort order for results. |
| state | string | State name filter (e.g. 'Rio de Janeiro', 'São Paulo'). |
| bedrooms | integer | Number of bedrooms to filter by. |
| max_area | integer | Maximum area in m². |
| min_area | integer | Minimum area in m². |
| bathrooms | integer | Number of bathrooms to filter by. |
| max_price | integer | Maximum price filter. |
| min_price | integer | Minimum price filter. |
| page_size | integer | Number of results per page. |
| location_id | string | Location ID from get_location_suggestions endpoint (e.g. 'BR>Rio de Janeiro>NULL>Rio de Janeiro'). |
| transaction | string | Transaction type: RENTAL or SALE. |
| is_development | boolean | Filter for new developments only. |
| parking_spaces | integer | Number of parking spaces to filter by. |
| property_types | string | Comma-separated property type slugs (e.g. 'APARTMENT', 'HOME', 'APARTMENT,HOME'). Available types include APARTMENT, HOME, CONDOMINIUM, PENTHOUSE, FLAT, KITNET, VILLAGE_HOUSE, LOFT. |
{
"type": "object",
"fields": {
"page": "integer current page number",
"size": "integer page size",
"total": "integer total number of results",
"listings": "array of listing result objects, each containing listing, account, medias, link, and id",
"total_count": "integer total number of matching listings"
},
"sample": {
"data": {
"page": 1,
"size": 24,
"total": 173079,
"listings": [
{
"id": "2877108789",
"link": {
"href": "/imovel/aluguel-apartamento-id-2877108789/"
},
"medias": [
{
"id": "c3b199ef",
"url": "https://resizedimgs.zapimoveis.com.br/img/c3b199ef.webp",
"type": "IMAGE"
}
],
"account": {
"id": "fcc4c0ee",
"name": "Yuca",
"tier": "diamond"
},
"listing": {
"id": "2877108789",
"title": "Apartamento com 1 Quarto para alugar, 36m²",
"address": {
"city": "São Paulo",
"state": "São Paulo",
"neighborhood": "Campos Elíseos"
},
"bedrooms": [
1
],
"amenities": [
"INTERNET_ACCESS",
"ELEVATOR"
],
"bathrooms": [
1
],
"usableAreas": [
"36"
],
"pricingInfos": [
{
"price": "2463",
"businessType": "RENTAL",
"monthlyCondoFee": "983"
}
],
"parkingSpaces": [
0
]
}
}
],
"total_count": 173079
},
"status": "success"
}
}About the Zapimoveis API
Searching and Filtering Listings
search_listings is the main entry point. It accepts filters for city, state, bedrooms, bathrooms, min_area, and max_area, plus a sort parameter and page for pagination. The response wraps two top-level objects: page (containing uriPagination.total, uriPagination.page, and uriPagination.size for cursor-aware iteration) and search (containing result.listings and totalCount). Each listing element carries a listing sub-object, an account sub-object for the advertiser, a medias array, and a link object with the canonical URL path.
Listing Detail and Media
get_listing_detail accepts a numeric listing_id — available as listing.id in search results — and returns the full property record. The listing object includes address fields, pricing, bedroom and bathroom counts, total and usable area, and an amenities array. The medias array provides individual image and video entries, each with id, url, and type. The account object exposes the advertiser's name, logoUrl, licenseNumber, and tier, which is useful for distinguishing individual agents from agencies.
Location Autocomplete and Discovery
get_location_suggestions takes a free-text query (e.g. "Copacabana" or "São Paulo") and an optional transaction_type of RENTAL or SALE. It returns an array of suggestion objects, each containing address.locationId, address.city, address.state, and address.neighborhood. These locationId values feed directly into get_property_types and get_listing_amenities, which return per-type and per-amenity listing counts (e.g. APARTMENT, PENTHOUSE, POOL, ELEVATOR) scoped to that location and transaction type. This makes it straightforward to build faceted search UIs or populate filter dropdowns.
The Zapimoveis API is a managed, monitored endpoint for zapimoveis.com.br — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when zapimoveis.com.br changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official zapimoveis.com.br API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate for-sale apartment listings in São Paulo filtered by minimum area and bedroom count
- Build a rental price monitoring dashboard across multiple Brazilian cities using paginated
search_listingsresults - Populate a location autocomplete field using
get_location_suggestionsbefore passinglocationIdto downstream filters - Generate a property detail page by fetching full media, amenities, and advertiser info via
get_listing_detail - Enumerate available property types and their counts per location with
get_property_typesto drive dynamic filter menus - Identify listings with specific amenities (pool, elevator) in a given neighborhood using
get_listing_amenitiescounts - Compare advertiser tiers and license numbers across listings to analyze agency vs. individual seller market share
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ZAP Imóveis have an official public developer API?+
How do I get the right locationId to use with get_property_types and get_listing_amenities?+
get_location_suggestions returns an array of suggestion objects each containing address.locationId. Pass a neighborhood, city, or zone name as the query parameter, then use the locationId from the matching result as the location_id input to get_property_types or get_listing_amenities. This scopes the returned counts to that specific area.Does the API return rental price history or historical listing data?+
What pagination metadata is available from search_listings?+
page object in the response includes uriPagination.total (total result count), uriPagination.page (current page index), and uriPagination.size (page size). Use the page input parameter in subsequent requests to iterate through results. The search.totalCount field also gives the overall match count.Does the API expose contact details for listing agents or owners?+
account object returned by get_listing_detail includes the advertiser's name, logoUrl, licenseNumber, and tier. Direct contact details such as phone numbers or email addresses are not currently part of the response schema. You can fork this API on Parse and revise it to surface additional account fields if they become available in the source data.