Este serviço retorna a lista de empreendimentos imobiliários da sua conta (a imobiliária dona do token). O escopo vem do access token, não é enviado como parâmetro.
| Informações do recurso | |
|---|---|
| Autenticação | Obrigatória (Token de API, Bearer) |
| Scope | express-base |
| Método HTTP | GET |
| Resposta | JSON |
| Versão | 1 |
URL do recurso
https://mapaprop.app/api/action/express-v1/developments
Código de exemplo
GET /api/action/express-v1/developments?customerId=1&dateFrom=20-02-2019&dateTo=28-02-2019 HTTP/1.1
Host: mapaprop.app
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Authorization: Bearer {access_token}
Parâmetros
| Chave | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| customerId | int | no | É ignorado. O escopo vem do access token: a busca é sempre delimitada à imobiliária dona do token, e um customerId enviado na consulta não tem nenhum efeito. |
| term | string | no | Termo que tentará corresponder a pelo menos 3 caracteres na zona, endereço ou título do imóvel. Suporta busca de texto completo. |
| type | int | no | Sempre substituído por 23 (Desarrollo Inmobiliario) pela API. Qualquer valor enviado pelo usuário é ignorado. Constantes |
| operation | int | no | Operação do imóvel. Constantes |
| from | int | no | Número do registro inicial. O padrão é 0. |
| size | int | no | Quantidade de registros a retornar por consulta. O padrão é 7. O máximo é 20 (erro de validação: "You cannot retrieve more than 20 properties at a time"). |
| branchId | int | no | ID da filial onde os imóveis estão localizados. |
| stateId | int | no | ID do estado do imóvel. |
| countyId | int | no | ID do município do imóvel. |
| cityId | int | no | ID da cidade do imóvel. |
| tempOccupancy | int | no | Número de pessoas que podem se hospedar no imóvel. |
| dateFrom | string | no | Data de chegada (formato: "dd-MM-yyyy"). |
| dateTo | string | no | Data de saída (formato: "dd-MM-yyyy"). |
Paginação
Este endpoint utiliza paginação por offset via os parâmetros from e size.
| Parâmetro | Significado | Padrão | Máximo |
|---|---|---|---|
from | Offset (base zero) do primeiro registro a retornar | 0 | — |
size | Número de registros retornados por requisição | 7 | 20 |
A resposta sempre inclui o campo total com o total de registros que correspondem aos seus filtros (não apenas os retornados na página atual). Use-o para saber quando parar de paginar.
Como paginar
Para obter a página N (índice 1) com um tamanho de página fixo:
from = (N - 1) * size
Continue solicitando a próxima página enquanto from + size < total.
Exemplo: paginar 25 empreendimentos, 20 por página
Suponha que uma busca retorne "total": 25. Para obter todos os resultados são necessárias 2 requisições:
Página 1 — registros 1 a 20:
GET /api/action/express-v1/developments?from=0&size=20
Resposta: { "took": 8, "total": 25, "properties": [ ...20 items... ] }
Página 2 — registros 21 a 25:
GET /api/action/express-v1/developments?from=20&size=20
Resposta: { "took": 6, "total": 25, "properties": [ ...5 items... ] }
Neste ponto from + size = 40 >= total = 25, portanto não há mais páginas.
Observações
- Mantenha os filtros consistentes entre páginas. Alterar qualquer filtro entre requisições (por exemplo
operation,stateId,dateFrom) reinicia o conjunto de resultados e seu offset apontará para uma coleção diferente. sizenão pode ultrapassar 20. Solicitarsize=21ou mais retorna um erro de validação:"You cannot retrieve more than 20 properties at a time". Para recuperar conjuntos grandes é necessário paginar.fromé um offset, não um número de página.from=2retorna registros a partir da posição 3, não a "página 2".- Os filtros numéricos esperam um número inteiro. Um valor fora do intervalo de um inteiro (por exemplo, um número de 20 dígitos) ou com decimais retorna um erro de validação em vez de ser ignorado silenciosamente.
- O campo
tookindica o tempo em milissegundos que a busca levou no servidor para aquela página.
Resposta
Um documento JSON com a lista de zonas em hierarquia onde o cliente possui imóveis.
| Objeto | Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
| Response | took | int | yes | Tempo que a busca levou, em milissegundos |
| total | int | yes | Total de registros no contexto desta busca. Você pode paginá-los | |
| properties | Array of Property | yes | A lista de objetos Property | |
| Property | propertyHash | string | yes | ID único do imóvel |
| timestamp | string | yes | Timestamp ISO8601 de quando o imóvel foi criado | |
| lastUpdate | string | yes | Timestamp ISO8601 da última atualização do imóvel | |
| code | string | yes | Código único do imóvel inserido pelo cliente | |
| branchId | int | yes | ID da filial associada a este imóvel. GET /api/action/express-v1/branches. | |
| type | int | yes | Id do tipo de imóvel. GET /api/action/express-v1/types | |
| operation | int | yes | Id da operação do imóvel. Constantes | |
| propertyType | string | yes | Descrição traduzida do tipo de imóvel. GET /api/action/express-v1/types | |
| propertyOperation | string | yes | Descrição traduzida da operação do imóvel. Constantes | |
| status | string | yes | Descrição traduzida do estado da construção. Constantes | |
| mainImage | string | no | Id do tipo de imóvel. GET /api/action/express-v1/types | |
| currency | string | yes | Símbolo de moeda do preço do imóvel. Constantes | |
| price | int | yes | Preço do imóvel | |
| expensesCurrency | string | no | Símbolo de moeda das despesas mensais/anuais. Constantes | |
| expensesPrice | int | no | Valor das despesas mensais/anuais | |
| taxCurrency | string | no | Símbolo de moeda dos impostos mensais/anuais. Constantes | |
| taxPrice | int | no | Valor dos impostos mensais/anuais | |
| title | string | yes | Título inserido pelo cliente | |
| address | string | yes | Endereço e número do imóvel | |
| zipCode | string | yes | CEP do imóvel | |
| zone | string | yes | Descrição combinada desde a cidade (se disponível) até o estado | |
| countryId | int | yes | ID do país do imóvel | |
| stateId | int | yes | ID do estado do imóvel. GET /api/action/express-v1/zones | |
| countyId | int | yes | ID do município do imóvel. GET /api/action/express-v1/zones | |
| cityId | int | no | ID da cidade do imóvel. GET /api/action/express-v1/zones | |
| countryId | int | yes | ID do país do imóvel. GET /api/action/express-v1/zones | |
| country | string | yes | Nome do país | |
| state | string | yes | Nome do estado | |
| county | string | yes | Nome do município ou segunda divisão | |
| city | string | no | Nome da cidade, bairro ou terceira divisão | |
| suspended | boolean | yes | A publicação foi suspensa | |
| reserved | boolean | yes | O imóvel foi reservado | |
| rented | boolean | yes | O imóvel foi alugado | |
| sold | boolean | yes | O imóvel foi vendido | |
| description | string | yes | Descrição longa do imóvel | |
| conditions | string | no | Condições do imóvel. Geralmente relacionadas a pagamentos | |
| bedrooms | int | no | Número de dormitórios | |
| ambiences | int | no | Número de ambientes ou espaços | |
| bathrooms | int | no | Número de banheiros | |
| dependencies | int | no | Número de quartos de serviço | |
| occupancy | int | no | Número de ocupantes (geralmente em aluguel temporário) | |
| toilettes | int | no | Número de lavabos | |
| buildingArea | int | no | Metros quadrados de área construída | |
| landArea | int | no | Metros quadrados do terreno | |
| yearsOld | int | no | Idade do imóvel | |
| ubication | string | no | Orientação cardinal do imóvel no edifício | |
| totalFloors | int | no | Total de andares do edifício | |
| apartmentsPerFloor | int | no | Quantidade de apartamentos por andar | |
| airConditionerType | string | no | Tipo de ar-condicionado | |
| waterHeaterType | string | no | Tipo de aquecedor de água | |
| heatingType | string | no | Tipo de aquecimento | |
| balconyType | string | no | Tipo de varanda | |
| garage | int | no | Total de vagas de garagem | |
| garageType | string | no | Tipo de garagem | |
| images | Array of Image | no | Array de objetos Image | |
| location | Location | yes | Objeto Location | |
| Location | lon | string | yes | Longitude geográfica do imóvel |
| lat | string | yes | Latitude geográfica do imóvel | |
| Image | image | string | yes | URL da imagem |
| thumbnail | string | yes | URL do thumbnail | |
| orientation | int | yes | Orientação da imagem. 1 = PORTRAIT, 2 = LANDSCAPE | |
| type | int | yes | Tipo de imagem. 1 = PHOTO, 2 = BLUEPRINT | |
| contentType | string | yes | Tipo de conteúdo da imagem | |
| timestamp | string | yes | Timestamp ISO8601 de quando a imagem foi enviada | |
| Labels | labels | Array of labels | no | Etiquetas do imóvel. Constantes |
| attributes | attributes | Array of json attributes | no | Todos os atributos do imóvel |
| descriptionFormatted | description | string | no | Descrição com nova formatação que aceita quebras de linha |
Os campos próprios do empreendimento
Um empreendimento é um imóvel com campos extra, e são eles que o tornam útil:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| development | boolean | yes | Sempre true neste serviço |
| developmentProperties | Array of int | no | Os Ids das unidades que compõem o empreendimento. São os que você passa para GET /development/properties para trazer o detalhe de cada uma |
| commercialTagline | string | no | A legenda comercial do projeto, tal como a imobiliária a cadastrou |
| deliveryDate | string | no | Data de entrega, no formato ISO8601 com fuso horário |
| logoUrl | string | no | URL do logo do empreendimento. É o logo do projeto, não o da imobiliária |
| totalApartments | int | no | Total de moradias do projeto |
| totalTowers | int | no | Total de torres |
| totalElevators | int | no | Total de elevadores |
| totalOffices | int | no | Total de escritórios |
| totalCommercialUnits | int | no | Total de lojas comerciais |
| totalHouses | int | no | Total de casas |
| totalLots | int | no | Total de lotes |
São os valores que a imobiliária declarou para o projeto. Não são o resultado de contar as
unidades de developmentProperties: um empreendimento pode anunciar 500 moradias e ter 12
cadastradas.
Um 0 significa "não declarou", não "zero".
Os sete contadores são opcionais e, quando a imobiliária não os preenche, o serviço devolve
0 em vez de omiti-los. Portanto "totalTowers": 0 não quer dizer que o projeto não tenha
torres: quer dizer que ninguém informou quantas.
Se você for exibir o dado, trate o 0 como ausência. Um site que publique "0 torres" está
afirmando algo que a imobiliária nunca disse.
É a convenção do objeto, não deste grupo: aplica-se da mesma forma aos inteiros opcionais que
já existiam —totalFloors, floors, apartmentsPerFloor, toilettes, dependencies,
expensesPrice e taxPrice—, que sempre se comportaram assim.
Os três campos não numéricos são OMITIDOS quando estão vazios.
commercialTagline, deliveryDate e logoUrl não vêm em null: simplesmente não aparecem
no JSON. É a outra metade da mesma convenção, e você precisa das duas para ler corretamente uma
resposta: nos numéricos você pergunta pelo valor, nestes pela existência da chave.
developmentStats — os números DERIVADOS das unidades
A partir de 2026-10-27 cada empreendimento traz um bloco developmentStats com os indicadores
que saem da contagem de suas unidades. Ninguém os carregou: são calculados no backend com base
nas unidades vinculadas ao empreendimento, e recalculados quando uma delas muda.
É a outra metade do grupo anterior, e as duas têm que ser lidas juntas.
Os sete contadores (totalApartments, totalTowers…) são o que a imobiliária declarou para o
projeto. developmentStats é o que está carregado. Um empreendimento pode anunciar 500
moradias (totalApartments: 500) e ter 12 unidades carregadas
(developmentStats.units.total: 12). As duas coisas são verdadeiras e respondem perguntas
diferentes.
"developmentStats": {
"units": { "total": 4, "available": 4, "sold": 0, "rented": 0, "reserved": 0,
"suspended": 0, "withOperation": 0, "availabilityRate": 100 },
"sale": { "units": 4, "commercialized": 0, "rate": 0 },
"rent": { "units": 0, "commercialized": 0, "rate": null },
"otherOperation": { "units": 0 },
"buildingArea": { "unit": "m2", "total": 936, "available": 936,
"unavailable": 0, "sold": 0, "rented": 0, "reserved": 0 },
"prices": { "mixedCurrencies": false,
"byCurrency": { "ARS": { "units": 4, "from": 2333333, "to": 2333333,
"total": 9333332, "average": 2333333 } } },
"typology": { "byAmbiences": { "2": 4 }, "byRooms": { "2": 4 },
"byBuildingArea": { "234": 4 }, "byLandArea": { "250": 4 } }
}
| Ramo | O que traz |
|---|---|
units | quantas unidades há e em que estado. withOperation conta unidades, não estados: uma vendida E reservada conta uma. availabilityRate é a porcentagem disponível sobre o total |
sale / rent | a comercialização por operação, cada uma medida contra o seu próprio universo |
otherOperation | as unidades em permuta, trespasse, compartilhamento ou leilão. Existem para que sale.units + rent.units + otherOperation.units dê o total e nenhuma unidade desapareça |
buildingArea | os m² construídos. unavailable é um OR (vendida ‖ reservada ‖ alugada), então uma unidade com dois estados é descontada uma única vez |
prices.byCurrency | o detalhamento por moeda: from/to a faixa, total a soma, average a média |
typology | quantas unidades há por ambientes, dormitórios, m² construídos e m² totais. As chaves são o valor; as que não aparecem não pertencem a nenhuma unidade |
Um rate em null NÃO é 0.
sale.rate e rent.rate voltam em null quando não há nenhuma unidade dessa operação: a
pergunta "quanto foi comercializado do que está à venda?" não tem resposta desde que não haja
nada à venda, e um 0 % seria uma resposta falsa. Já um 0 significa algo: há unidades à venda e
nenhuma foi colocada.
Em um empreendimento só de aluguéis você vai ver sale.rate: null e um número em rent.rate. Isso
está correto: são dois negócios diferentes e não se tiram médias entre eles.
Os preços NÃO têm campos planos, e isso é de propósito.
Não existe prices.from, prices.to, prices.total nem prices.average no nível do bloco:
apenas byCurrency. Se um empreendimento tem unidades em dólares e em pesos, qualquer número
único que os misture é falso, não aproximado — uma média de 120.000 USD e 95.000.000 ARS não é
nem dólares nem pesos.
mixedCurrencies informa dependendo de haver mais de uma. Com uma só — o caso habitual — o
único balde de byCurrency É o dado do empreendimento: basta lê-lo.
Apenas os empreendimentos o trazem. Um imóvel comum não tem developmentStats de forma
alguma: não tem unidades a partir das quais derivá-lo, por isso a pergunta não existe. Não é um
bloco em zero — a chave não está.
Recalcula sozinho. Quando uma unidade é vendida, alugada, muda de preço, de área ou é excluída, o bloco do empreendimento é atualizado no mesmo momento. Não há nada a solicitar nem processo a esperar.
developmentId — de qual empreendimento um imóvel faz parte
A partir de 2026-10-26 todo imóvel traz developmentId: o Id do empreendimento ao qual
pertence, ou 0 se não pertencer a nenhum.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| developmentId | int | yes | Id do empreendimento do qual este imóvel é unidade. 0 = não é unidade de nenhum empreendimento |
É o inverso de developmentProperties, e completa a relação nos dois sentidos: com
developmentProperties você vai do projeto às suas unidades; com developmentId, de uma unidade de
volta ao seu projeto.
Um empreendimento também pode ter developmentId. Se for um subempreendimento — uma etapa
dentro de um projeto maior — vai trazer development: true, o seu próprio
developmentProperties e o developmentId do projeto pai. As três coisas ao mesmo tempo.
Campos adicionais
Cada empreendimento traz também os mesmos campos extra que um imóvel —seoUrl, typeDesc,
operationDesc, descriptionFormatted, publishedAt, floors, garages, branchSeoUrl,
customerCountry, customerCountryDesc, videos, alternativePrices, reservations e
tempOccupied— documentados em
GET /properties.
A resposta inclui também campos de uso interno da Mapaprop que não fazem parte deste
contrato e podem mudar sem aviso: embeddingVersion, vectorizedAt, configs,
moderationStatus, publication e networks. Não construa nada sobre eles.
Resposta de exemplo
{
"took":6,
"total":3,
"properties": [
{
"zipCode":"1884",
"country":"Argentina",
"developmentProperties": [
198102
],
"landArea":133,
"county":"Almirante Brown",
"buildingArea":235,
"cityId":897,
"type":220,
"ambiences":2,
"zone":"Malvinas Argentinas, Almirante Brown, Buenos Aires, Argentina",
"price":1200000,
"airConditionerType":"Central",
"publication": [
{
"mercadolibre":false,
"plan":"no-plan"
},
{
"cabaprop":false,
"plan":"no-plan"
},
{
"zonaprop":false,
"plan":"no-plan"
},
{
"navent":false,
"plan":"no-plan"
}
],
"state":"Buenos Aires",
"branchId":1,
"images": [],
"development":true,
"descriptionFormatted":"Descripcion de un desarrollo unico del sistema.",
"bathrooms":2,
"suspended":false,
"labels": [
"laundry",
"playroom",
"suite"
],
"propertyOperation":"Venta",
"bedrooms":2,
"garages":1,
"yearsOld":12,
"reserved":false,
"lastUpdate":"2024-10-22T12:21:00.000-03:00",
"customerCountryDesc":"Argentina",
"code":"1-DESARROLLO-3",
"city":"Malvinas Argentinas",
"description":"Descripcion de un desarrollo unico del sistema.",
"alternativePrices": [],
"title":"titulo de desarrollo",
"networks": [
"4",
"5"
],
"customerCountry":1,
"countryId":1,
"seoUrl":"venta-de-desarrollo-inmobiliario-en-malvinas-argentinas-almirante-brown-buenos-aires-1-247058",
"rented":false,
"countyId":140,
"propertyType":"Desarrollo Inmobiliario",
"hightlight": {},
"currency":"ARS",
"timestamp":"2024-10-03T00:00:00.000-03:00",
"sold":false,
"address":"Calle 123 1537",
"stateId":2,
"garage":1,
"propertyHash":"1a9ad9df2c25980db55e6f74c5d62b94",
"mainImage":"https://s3.amazonaws.com/mapaprop-dev-image/photos/noimage.gif",
"garageType":"Espacio Guarda Coche",
"location": {
"lon":"-58.54596230000001",
"lat":"-34.5904958"
},
"attributes": [
{
"group_sub":"label",
"country":"ar",
"key_legacy":"hasLaundry",
"group_subtype":"spaces",
"id":"laundry",
"label":"Lavadero",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"petsReady",
"group_subtype":"extras",
"id":"petsReady",
"label":"Apto mascotas",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"playroom",
"group_subtype":"spaces",
"id":"playroom",
"label":"Playroom",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"hasPrivatElevator",
"group_subtype":"ammenities",
"id":"private-elevator",
"label":"Elevador privado",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"suite",
"group_subtype":"spaces",
"id":"suite",
"label":"Dormitorio en suite",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
}
],
"operation":1
}
]
}