PLP without keyword
Recommended flow: send city, state, businessType and page. keyword is optional.
{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "Curitiba",
"state": "PR",
"businessType": "rent",
"page": 1
} // docs
Extracts properties from ZAP by city/UF, neighborhood and property type, with optional keyword, area/price range and coordinates. The filters follow the ZAP's native search; Check the type and address returned when selecting comparables.
zapimoveis.com.br:plp · 1 credit per request
Standard credit cost. Your account pricing is shown in the sandbox.
Try this operation in the sandboxcurl -X POST https://api.geckoapi.com.br/v1/extract \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "Curitiba",
"state": "PR",
"businessType": "rent",
"page": 1
}' Keep your API key on your server. See the quickstart for authentication and response handling.
The hosted MCP tool fixes target and type for this operation. Its remaining arguments use the same input rules as Extract.
POST /v1/mcp · Bearer or X-API-Key authentication
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "zapimoveis_com_br_plp",
"arguments": {
"city": "Curitiba",
"state": "PR",
"businessType": "rent",
"page": 1,
"executionId": "exec_example_123"
}
}
} Conditional fields depend on the alternatives and constraints in the rule column. Fields marked unsupported are omitted.
| Field | Type | Requirement | Rule | Default | Example |
|---|---|---|---|---|---|
| keyword Keyword for PLP searches. In Google Search it represents the query sent to Google; in Booking PLP is mandatory; in other PLPs it can replace URL. | string | Optional | Optional textual search with the same behavior as the website. You can find words in the description; use propertyTypes to filter the property category. | - | vista livre |
| latitude Latitude of the search area. It must be sent together with longitude. Supported in Airbnb PLP, Zap Imóveis PLP, VivaReal PLP, Chaves na Mão PLP and Webmotors PLP. | number | Optional | Optional together with longitude. Applies radius filter 2km around the point within the reported city/state. | - | -23.561399 |
| longitude Longitude of the search area. It must be sent together with latitude. Supported in Airbnb PLP, Zap Imóveis PLP, VivaReal PLP, Chaves na Mão PLP and Webmotors PLP. | number | Optional | Optional together with latitude. Applies radius filter 2km around the point within the reported city/state. | - | -46.65599 |
| city City used in structured searches for properties and vehicles and optionally in Catho PLP. In VivaReal, it requires state. | string | Required | Full name of the municipality in the entered UF, with or without accents. Accepts suffix of the same UF (e.g.: Criciúma-SC) and the spellings Sa-o Paulo and Nossa Sra da Glória. Unknown county or divergent UF returns 400. | - | Curitiba |
| neighborhood Neighborhood used in ZAP Properties PLP, Chaves na Mão PLP and VivaReal PLP. Requires city + state when shipped. | string | Optional | Name of a neighborhood within the informed city/state (e.g.: Mirim or Pinheiros). Up to 120 characters, without commas or |. Uses the native localization of ZAP. The displayed address and enlarged results follow the source; Check the address and coordinates of each advertisement. | - | Mirim |
| state UF used in structured searches for properties and vehicles and optionally in Catho PLP. | string (UF 2 letters) | Required | UF with 2 letters (ex: PR). | - | PR |
| businessType Business type used in Zapimoveis, VivaReal and Chaves na Mão PLP to choose between sale and rent. | "sale" | "rent" | Required | Type of business. Supported values: sale or rent (synonyms sale/rent are also accepted in API). | - | rent |
| bedrooms Room filter in real estate searches PLP. Accepts list of integers (ex: [2,3,4]). | integer[] | Optional | Room filter. Accepts list of integers (ex: [2,3,4]). | - | [2,3,4] |
| bathrooms Bathroom filter in real estate searches PLP. Accepts list of integers (ex: [2,3,4]). | integer[] | Optional | Bathroom filter. Accepts list of integers (ex: [2,3,4]). | - | [2,3,4] |
| parkingSpots Job filter in real estate searches PLP. Accepts list of integers (ex: [2,3,4]). | integer[] | Optional | Job filter. Accepts list of integers (ex: [2,3,4]). | - | [2,3,4] |
| propertyTypes Property types for ZAP Properties, Chaves na Mão and VivaReal PLP. Accepted values depend on API; see specific rules below. | array<string | integer> | Optional | Property types: apartment, house, two_story_house, condominium, penthouse, kitnet, flat, land, farm, warehouse, commercial_point and commercial_room. Accepts array strings or CSV (max. 20 items), including aliases such as land, house, apartment and shed. Various types are combined with OU. Unknown values are rejected. Uses the native category of ZAP, independently of keyword. | - | ["land"] |
| priceMin Minimum price for PLP searches for properties and vehicles. | integer | Optional | Minimum price. Must be integer >= 0. | - | 1000 |
| priceMax Maximum price for PLP searches for properties and vehicles. | integer | Optional | Maximum price. Must be integer >= 0 and >= priceMin when both are sent. | - | 2000 |
| areaMin Minimum area (m²) for real estate searches PLP. | integer | Optional | Minimum area in m² in the native usable area filter of ZAP. Integer >= 0. It is not a separate total area or land filter. | - | 750 |
| areaMax Maximum area (m²) for real estate searches PLP. | integer | Optional | Maximum area in m² in the ZAP native usable area filter. Integer >= 0 and >= areaMin when both are sent. Check attributes.usableAreas and attributes.totalAreas separately in the answer. | - | 2250 |
| target Target source for extraction. | enum | Required | Always mandatory and must be zapimoveis.com.br. | - | zapimoveis.com.br |
| type Extraction type: pdp, idp, plp, ilp, quote, review or places. | enum | Required | Always mandatory and must be plp. | - | plp |
| page Pagination. In PLP, including Trivago, and in Reclame AQUI ILP starts in 1; in review (MercadoLivre, Booking and Hotels) starts in 0. The Reclame AQUI ILP even accepts the page 100. | integer | Optional | Paging 1-based (1 to 50). Page 50 is the last accessible page, even when totalResults is larger. Send the same filters when increasing page. nextPageUrl preserves the filters, but the public API continues to receive structured parameters, not url. | 1 | 1 |
Recommended flow: send city, state, businessType and page. keyword is optional.
{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "Curitiba",
"state": "PR",
"businessType": "rent",
"page": 1
} Use propertyTypes to filter the property category without relying on words in the description. neighborhood refines city/state. To search the entire city, omit neighborhood. Repeat the same filters and increase page to page.
{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "Imbituba",
"state": "SC",
"businessType": "sale",
"propertyTypes": [
"land"
],
"neighborhood": "Mirim",
"areaMin": 750,
"areaMax": 2250,
"page": 1
} Example with filters for rooms, bathrooms, vacancies, price range and area.
{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "Curitiba",
"state": "PR",
"businessType": "rent",
"bedrooms": [
2,
3,
4
],
"bathrooms": [
2,
3,
4
],
"parkingSpots": [
2,
3,
4
],
"priceMin": 1000,
"priceMax": 2000,
"areaMin": 80,
"areaMax": 220,
"page": 1
} Refines the search for city/state with latitude and longitude. The upstream applies a radius of 2km around the point.
{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "Sao Paulo",
"state": "SP",
"businessType": "sale",
"latitude": -23.561399,
"longitude": -46.65599,
"page": 1
} Matches apartments or houses with an independent textual search. keyword maintains the website's behavior and does not classify the property.
{
"target": "zapimoveis.com.br",
"type": "plp",
"city": "São Paulo",
"state": "SP",
"businessType": "sale",
"propertyTypes": [
"apartment",
"house"
],
"neighborhood": "Pinheiros",
"keyword": "vista livre",
"page": 1
} Leaf paths and expected types. Field names and enum values are part of the API contract.
{
"requestId": "string (uuid)",
"executionId": "string (uuid)",
"notFound": "boolean (optional; true when the upstream entity was not found and data is null)",
"data.source": "string",
"data.type": "string",
"data.parser": "\"1.0.0\"",
"data.url": "string",
"data.requestUrl": "string",
"data.extractedAt": "string (iso datetime)",
"data.keyword": "string",
"data.query": "string",
"data.city": "string",
"data.citySlug": "string",
"data.state": "string",
"data.businessType": "string",
"data.neighborhood": "string | null",
"data.propertyTypes[]": "string",
"data.latitude": "number | null",
"data.longitude": "number | null",
"data.searchId": "string",
"data.totalResults": "number",
"data.primaryResults": "number",
"data.page": "number",
"data.resultsPerPage": "number",
"data.offset": "number",
"data.nextPage": "number | null",
"data.nextPageUrl": "string | null",
"data.items[].position": "number",
"data.items[].id": "string",
"data.items[].url": "string",
"data.items[].business": "string",
"data.items[].listingType": "string",
"data.items[].unitTypes[]": "string",
"data.items[].attributes": "object | null",
"data.items[].attributes.usableAreas": "number[]",
"data.items[].attributes.totalAreas": "number[]",
"data.items[].attributes.bedrooms": "number[]",
"data.items[].attributes.bathrooms": "number[]",
"data.items[].attributes.suites": "number[]",
"data.items[].attributes.parkingSpaces": "number[]",
"data.items[].attributes.floors": "number[]",
"data.items[].attributes.unitFloor": "number | null",
"data.items[].description": "string",
"data.items[].address.city": "string",
"data.items[].address.state": "string",
"data.items[].address.neighborhood": "string",
"data.items[].address.latitude": "number | null",
"data.items[].address.longitude": "number | null",
"data.items[].prices.mainValue": "number",
"data.items[].prices.period": "string",
"data.items[].stamps[]": "string",
"data.items[].amenities[]": "string",
"data.items[].advertiser.id": "string",
"data.items[].advertiser.name": "string",
"data.items[].images[].url": "string",
"data.items[].childrenCount": "number"
} Illustrative response. Product names, reviews and other source content retain their original language. Missing and null values do not imply zero stock, free shipping or zero reviews.
{
"requestId": "a1f9c6b6-56da-4be1-b2f2-4ed0f3b2f001",
"executionId": "a1f9c6b6-56da-4be1-b2f2-4ed0f3b2f002",
"data": {
"source": "zapimoveis.com.br",
"type": "plp",
"parser": "1.0.0",
"url": "https://www.zapimoveis.com.br/venda/imoveis/pr+curitiba/?q=apartamento+2+quartos&transacao=venda&pagina=1&addressPointLat=-25.4296&addressPointLon=-49.2719&tipos=apartamento_residencial&onde=%2CParan%C3%A1%2CCuritiba%2C%2CCentro%2C%2C%2Cneighborhood%2C%2C%2C&pointRadius=2km",
"requestUrl": "https://www.zapimoveis.com.br/venda/imoveis/pr+curitiba/?q=apartamento+2+quartos&transacao=venda&pagina=1&addressPointLat=-25.4296&addressPointLon=-49.2719&tipos=apartamento_residencial&onde=%2CParan%C3%A1%2CCuritiba%2C%2CCentro%2C%2C%2Cneighborhood%2C%2C%2C&pointRadius=2km",
"extractedAt": "2026-02-19T13:00:00.000Z",
"keyword": "apartamento 2 quartos",
"query": "apartamento 2 quartos",
"city": "Curitiba",
"citySlug": "curitiba",
"state": "PR",
"businessType": "sale",
"latitude": -25.4296,
"longitude": -49.2719,
"searchId": "search-9fd22f2f",
"totalResults": 824,
"primaryResults": 24,
"page": 1,
"resultsPerPage": 24,
"offset": 0,
"nextPage": 2,
"nextPageUrl": "https://www.zapimoveis.com.br/venda/imoveis/pr+curitiba/?q=apartamento+2+quartos&transacao=venda&pagina=2&addressPointLat=-25.4296&addressPointLon=-49.2719&tipos=apartamento_residencial&onde=%2CParan%C3%A1%2CCuritiba%2C%2CCentro%2C%2C%2Cneighborhood%2C%2C%2C&pointRadius=2km",
"items": [
{
"position": 1,
"id": "2670123456",
"url": "https://www.zapimoveis.com.br/imovel/venda-apartamento-2-quartos-centro-curitiba-pr-70m2-id-2670123456/",
"business": "SALE",
"listingType": "USED",
"description": "Apartamento com 2 quartos, 1 suite e vaga coberta no Centro de Curitiba.",
"address": {
"city": "Curitiba",
"state": "PR",
"neighborhood": "Centro",
"latitude": -25.4296,
"longitude": -49.2719
},
"prices": {
"mainValue": 549000,
"period": "MONTHLY"
},
"stamps": [
"Super Destaque"
],
"amenities": [
"Elevador"
],
"advertiser": {
"id": "55123",
"name": "Imobiliaria Exemplo"
},
"images": [
{
"url": "https://resizedimgs.vivareal.com/{action}/{width}x{height}/vr.images.sp/e7d3cb8f500f42f4b95f316643e2b235.webp"
}
],
"childrenCount": 0,
"unitTypes": [
"APARTMENT"
],
"attributes": {
"usableAreas": [
70
],
"totalAreas": [],
"bedrooms": [
2
],
"bathrooms": [],
"suites": [],
"parkingSpaces": [],
"floors": [],
"unitFloor": null
}
}
],
"neighborhood": "Centro",
"propertyTypes": [
"apartment"
]
}
} | Path | Type | Description | Example |
|---|---|---|---|
| data.businessType | string | Standard business type (sale or rent). | sale |
| data.city | string | Normalized search city. | Curitiba |
| data.citySlug | string | City slug used on URL. | curitiba |
| data.extractedAt | string (iso datetime) | Extraction Timestamp UTC. | 2026-02-19T13:00:00.000Z |
| data.items[].address.city | string | City of advertisement. | Curitiba |
| data.items[].address.latitude | number | null | Ad latitude when displayed on the PLP card. | -25.4296 |
| data.items[].address.longitude | number | null | Ad length when displayed on the PLP card. | -49.2719 |
| data.items[].address.neighborhood | string | Ad neighborhood. | Centro |
| data.items[].address.state | string | UF. | PR |
| data.items[].advertiser.id | string | Advertiser identifier. | 55123 |
| data.items[].advertiser.name | string | Advertiser name. | Imobiliaria Exemplo |
| data.items[].amenities[] | string | Amenities summarized on card. | Elevador |
| data.items[].attributes | object | null | Numerical characteristics published by the source; null when missing. List fields with no value are returned as []. | {"usableAreas":[70],"totalAreas":[],"bedrooms":[2],"bathrooms":[],"suites":[],"parkingSpaces":[],"floors":[],"unitFloor":null} |
| data.items[].attributes.bathrooms | number[] | Number of bathrooms. | [] |
| data.items[].attributes.bedrooms | number[] | Number of rooms. | [2] |
| data.items[].attributes.floors | number[] | Number of floors. | [] |
| data.items[].attributes.parkingSpaces | number[] | Number of vacancies. | [] |
| data.items[].attributes.suites | number[] | Number of suites. | [] |
| data.items[].attributes.totalAreas | number[] | Total areas in m², only when explicitly published by the source. [] when absent; never copied from usableAreas or inferred from the description. | [] |
| data.items[].attributes.unitFloor | number | null | Floor of the unit when informed; null when missing. | null |
| data.items[].attributes.usableAreas | number[] | Useful areas in m² reported by ZAP. For land, the source can publish the footage in this field. | [70] |
| data.items[].business | string | Business type in the ad (SALE/RENTAL). | SALE |
| data.items[].childrenCount | number | Number of child/aggregate ads on the card. | 0 |
| data.items[].description | string | Short description of the property. | Apartamento com 2 quartos, 1 suite e vaga coberta no Centro de Curitiba. |
| data.items[].id | string | Internal identifier for the ad. | 2670123456 |
| data.items[].images[].url | string | URL of the card image. | https://resizedimgs.vivareal.com/{action}/{width}x{height}/vr.images.sp/e7d3cb8f500f42f4b95f316643e2b235.webp |
| data.items[].listingType | string | Source publication category (e.g.: USED); the physical classification of the property is unitTypes. | USED |
| data.items[].position | number | Absolute position of the item in the result. | 1 |
| data.items[].prices.mainValue | number | Main listing price. | 549000 |
| data.items[].prices.period | string | Price billing period. | MONTHLY |
| data.items[].stamps[] | string | Stamps/promos displayed on the card. | Super Destaque |
| data.items[].unitTypes[] | string | Native classification of the property, such as APARTMENT, HOME, ALLOTMENT_LAND or RESIDENTIAL_ALLOTMENT_LAND. Preserves the source values, without inferring from keyword, title or description. Empty list when unavailable. | APARTMENT |
| data.items[].url | string | URL ad public. | https://www.zapimoveis.com.br/imovel/venda-apartamento-2-quartos-centro-curitiba-pr-70m2-id-2670123456/ |
| data.keyword | string | Keyword sent in the payload. | apartamento 2 quartos |
| data.latitude | number | null | Latitude used as point filter when sent; null for city/state search without coordinates. | -25.4296 |
| data.longitude | number | null | Longitude used as point filter when sent; null for city/state search without coordinates. | -49.2719 |
| data.neighborhood | string | null | Requested neighborhood; null when omitted. It does not replace the address of each advertisement. | Centro |
| data.nextPage | number | null | Next page accessible; null when reaching page 50 or the end of the results. | 2 |
| data.nextPageUrl | string | null | URL native to the next page with the same filters when available. To query by API, repeat the search parameters and use nextPage as page. | https://www.zapimoveis.com.br/venda/imoveis/pr+curitiba/?q=apartamento+2+quartos&transacao=venda&pagina=2&addressPointLat=-25.4296&addressPointLon=-49.2719&tipos=apartamento_residencial&onde=%2CParan%C3%A1%2CCuritiba%2C%2CCentro%2C%2C%2Cneighborhood%2C%2C%2C&pointRadius=2km |
| data.offset | number | Calculated paging offset. | 0 |
| data.page | number | Page returned. | 1 |
| data.parser | "1.0.0" | Stable version of the API response format. | 1.0.0 |
| data.primaryResults | number | Number of items returned on the current page. | 24 |
| data.propertyTypes[] | string | Requested types standardized for API aliases (e.g.: land). Empty list when there is no category filter. | apartment |
| data.query | string | Search term applied in the query. | apartamento 2 quartos |
| data.requestUrl | string | Same value as `data.url`; never exposes the queried internal endpoint. | https://www.zapimoveis.com.br/venda/imoveis/pr+curitiba/?q=apartamento+2+quartos&transacao=venda&pagina=1&addressPointLat=-25.4296&addressPointLon=-49.2719&tipos=apartamento_residencial&onde=%2CParan%C3%A1%2CCuritiba%2C%2CCentro%2C%2C%2Cneighborhood%2C%2C%2C&pointRadius=2km |
| data.resultsPerPage | number | Number of results per page. | 24 |
| data.searchId | string | Search identifier returned by the page. | search-9fd22f2f |
| data.source | string | Extraction source. | zapimoveis.com.br |
| data.state | string | UF used in the search. | PR |
| data.totalResults | number | Total results available for the query. | 824 |
| data.type | string | Extraction type. | plp |
| data.url | string | URL assembled for query. | https://www.zapimoveis.com.br/venda/imoveis/pr+curitiba/?q=apartamento+2+quartos&transacao=venda&pagina=1&addressPointLat=-25.4296&addressPointLon=-49.2719&tipos=apartamento_residencial&onde=%2CParan%C3%A1%2CCuritiba%2C%2CCentro%2C%2C%2Cneighborhood%2C%2C%2C&pointRadius=2km |
| executionId | string (uuid) | Field executionId returned in the response payload. | a1f9c6b6-56da-4be1-b2f2-4ed0f3b2f002 |
| notFound | boolean (optional; true when the upstream entity was not found and data is null) | Present and true when the upstream entity was not found. In this case data is null and the request still completes successfully. | N/A |
| requestId | string (uuid) | Field requestId returned in the response payload. | a1f9c6b6-56da-4be1-b2f2-4ed0f3b2f001 |
When supported by this operation, an entity not found upstream can return HTTP 200 with data: null and notFound: true. Check the documented response fields before interpreting an empty result. Source-specific behavior and exceptions are described above.
| HTTP status | Error code | Meaning |
|---|---|---|
| 400 | INVALID_PAYLOAD | Invalid JSON or a request that violates the documented validation rules. |
| 401 | UNAUTHORIZED | Missing authorization or an invalid API key or token. |
| 402 | INSUFFICIENT_CREDITS | The account has insufficient credits for this operation. |
| 403 | FORBIDDEN | The account does not have access, or the API is temporarily disabled. |
| 409 | EXECUTION_CONFLICT | The execution identifier conflicts with an incompatible execution state. |
| 429 | RATE_LIMIT_EXCEEDED / TOO_MANY_INFLIGHT_REQUESTS | A rate limit or simultaneous request limit was exceeded. |
| 5xx | UPSTREAM_TIMEOUT / UPSTREAM_HTTP_ERROR / WORKER_FUNCTION_ERROR | An upstream, worker or gateway failure. Failed requests follow the platform refund policy. |