Este servicio devuelve la lista de desarrollos inmobiliarios de tu cuenta (la inmobiliaria dueña del token). El scope sale del access token, no se envía como parámetro.
| Información del recurso | |
|---|---|
| Autenticación | Requerida (Token de API, Bearer) |
| Scope | express-base |
| Método HTTP | GET |
| Respuesta | JSON |
| Versión | 1 |
URL del recurso
https://mapaprop.app/api/action/express-v1/developments
Código de ejemplo
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
| Clave | Tipo | Requerido | Descripción |
|---|---|---|---|
| customerId | int | no | Se ignora. El scope sale del access token: la búsqueda se acota siempre a la inmobiliaria dueña del token, y un customerId enviado en la consulta no tiene ningún efecto. |
| term | string | no | Término que intenta coincidir con al menos 3 caracteres en la zona, dirección o título de la propiedad. Admite búsqueda de texto completo. |
| type | int | no | Siempre se sobreescribe con 23 (Desarrollo Inmobiliario) por la API. Cualquier valor enviado por el usuario es ignorado. Constantes |
| operation | int | no | Operación de la propiedad. Constantes |
| from | int | no | Número de registro inicial. El valor por defecto es 0. |
| size | int | no | Cantidad de registros a traer en cada consulta. El valor por defecto es 7. El máximo es 20 (error de validación: "You cannot retrieve more than 20 properties at a time"). |
| branchId | int | no | ID de la sucursal donde se encuentran las propiedades. |
| stateId | int | no | ID del estado o provincia de la propiedad. |
| countyId | int | no | ID del partido o municipio de la propiedad. |
| cityId | int | no | ID de la ciudad de la propiedad. |
| tempOccupancy | int | no | Número de personas que pueden hospedarse en la propiedad. |
| dateFrom | string | no | Fecha de llegada (formato: "dd-MM-yyyy"). |
| dateTo | string | no | Fecha de salida (formato: "dd-MM-yyyy"). |
Paginación
Este endpoint utiliza paginación por offset a través de los parámetros from y size.
| Parámetro | Significado | Valor por defecto | Máximo |
|---|---|---|---|
from | Offset (base cero) del primer registro a devolver | 0 | — |
size | Cantidad de registros devueltos por solicitud | 7 | 20 |
La respuesta siempre incluye el campo total con el total de registros que coinciden con los filtros (no solo los de la página actual). Usá ese valor para saber cuándo dejar de paginar.
Cómo paginar
Para obtener la página N (índice 1) con un tamaño fijo de página:
from = (N - 1) * size
Seguí solicitando la siguiente página mientras from + size < total.
Ejemplo: paginar 25 desarrollos, 20 por página
Supongamos que una búsqueda devuelve "total": 25. Para obtener todos los resultados se necesitan 2 solicitudes:
Página 1 — registros 1 a 20:
GET /api/action/express-v1/developments?from=0&size=20
Respuesta: { "took": 8, "total": 25, "properties": [ ...20 items... ] }
Página 2 — registros 21 a 25:
GET /api/action/express-v1/developments?from=20&size=20
Respuesta: { "took": 6, "total": 25, "properties": [ ...5 items... ] }
En este punto from + size = 40 >= total = 25, por lo que no hay más páginas.
Notas
- Mantené los filtros consistentes entre páginas. Cambiar cualquier filtro entre solicitudes (por ejemplo
operation,stateId,dateFrom) reinicia el conjunto de resultados y tu offset apuntará a una colección diferente. sizeno puede superar 20. Solicitarsize=21o más devuelve un error de validación:"You cannot retrieve more than 20 properties at a time". Para recuperar conjuntos grandes debés paginar.fromes un offset, no un número de página.from=2devuelve registros a partir de la posición 3, no "página 2".- Los filtros numéricos esperan un entero. Un valor fuera del rango de un entero (por ejemplo, un número de 20 dígitos) o con decimales retorna un error de validación en vez de ignorarse en silencio.
- El campo
tookindica el tiempo en milisegundos que tardó la búsqueda en el servidor para esa página.
Respuesta
Un documento JSON con la lista de zonas en jerarquía donde el cliente tiene propiedades.
| Objeto | Campo | Tipo | Requerido | Descripción |
|---|---|---|---|---|
| Response | took | int | yes | Tiempo que tardó la búsqueda, en milisegundos |
| total | int | yes | Total de registros en el contexto de esta búsqueda. Podés paginarlo | |
| properties | Array of Property | yes | La lista de objetos Property | |
| Property | propertyHash | string | yes | ID único de la propiedad |
| timestamp | string | yes | Timestamp ISO8601 de cuándo se creó la propiedad | |
| lastUpdate | string | yes | Timestamp ISO8601 de la última actualización de la propiedad | |
| code | string | yes | Código único de la propiedad ingresado por el cliente | |
| branchId | int | yes | ID de la sucursal asociada a esta propiedad. GET /api/action/express-v1/branches. | |
| type | int | yes | Id del tipo de propiedad. GET /api/action/express-v1/types | |
| operation | int | yes | Id de la operación de la propiedad. Constantes | |
| propertyType | string | yes | Descripción traducida del tipo de propiedad. GET /api/action/express-v1/types | |
| propertyOperation | string | yes | Descripción traducida de la operación de la propiedad. Constantes | |
| status | string | yes | Descripción traducida del estado constructivo. Constantes | |
| mainImage | string | no | Id del tipo de propiedad. GET /api/action/express-v1/types | |
| currency | string | yes | Símbolo de moneda del precio de la propiedad. Constantes | |
| price | int | yes | Precio de la propiedad | |
| expensesCurrency | string | no | Símbolo de moneda de las expensas mensuales/anuales. Constantes | |
| expensesPrice | int | no | Monto de las expensas mensuales/anuales | |
| taxCurrency | string | no | Símbolo de moneda de los impuestos mensuales/anuales. Constantes | |
| taxPrice | int | no | Monto de los impuestos mensuales/anuales | |
| title | string | yes | Título ingresado por el cliente | |
| address | string | yes | Dirección y número de la propiedad | |
| zipCode | string | yes | Código postal de la propiedad | |
| zone | string | yes | Descripción combinada desde ciudad (si está disponible) hasta estado | |
| countryId | int | yes | ID del país de la propiedad | |
| stateId | int | yes | ID del estado o provincia. GET /api/action/express-v1/zones | |
| countyId | int | yes | ID del partido o municipio. GET /api/action/express-v1/zones | |
| cityId | int | no | ID de la ciudad. GET /api/action/express-v1/zones | |
| countryId | int | yes | ID del país. GET /api/action/express-v1/zones | |
| country | string | yes | Nombre del país | |
| state | string | yes | Nombre del estado o provincia | |
| county | string | yes | Nombre del partido o segunda división | |
| city | string | no | Nombre de la ciudad, barrio o tercera división | |
| suspended | boolean | yes | La publicación ha sido suspendida | |
| reserved | boolean | yes | La propiedad ha sido reservada | |
| rented | boolean | yes | La propiedad ha sido alquilada | |
| sold | boolean | yes | La propiedad ha sido vendida | |
| description | string | yes | Descripción larga de la propiedad | |
| conditions | string | no | Condiciones de la propiedad. Generalmente relacionadas con los pagos | |
| bedrooms | int | no | Número de dormitorios | |
| ambiences | int | no | Número de ambientes o espacios | |
| bathrooms | int | no | Número de baños | |
| dependencies | int | no | Número de cuartos de servicio | |
| occupancy | int | no | Número de ocupantes (generalmente en alquiler temporario) | |
| toilettes | int | no | Número de toilettes (baños de media) | |
| buildingArea | int | no | Metros cuadrados de superficie construida | |
| landArea | int | no | Metros cuadrados del terreno | |
| yearsOld | int | no | Antigüedad de la propiedad | |
| ubication | string | no | Orientación cardinal de la propiedad en el edificio | |
| totalFloors | int | no | Total de pisos del edificio | |
| apartmentsPerFloor | int | no | Cantidad de departamentos por piso | |
| airConditionerType | string | no | Tipo de aire acondicionado | |
| waterHeaterType | string | no | Tipo de calefón | |
| heatingType | string | no | Tipo de calefacción | |
| balconyType | string | no | Tipo de balcón | |
| garage | int | no | Total de cocheras de la propiedad | |
| garageType | string | no | Tipo de cochera | |
| images | Array of Image | no | Array de objetos Image | |
| location | Location | yes | Objeto Location | |
| Location | lon | string | yes | Longitud geográfica de la propiedad |
| lat | string | yes | Latitud geográfica de la propiedad | |
| Image | image | string | yes | URL de la imagen |
| thumbnail | string | yes | URL del thumbnail | |
| orientation | int | yes | Orientación de la imagen. 1 = PORTRAIT, 2 = LANDSCAPE | |
| type | int | yes | Tipo de imagen. 1 = PHOTO, 2 = BLUEPRINT | |
| contentType | string | yes | Tipo de contenido de la imagen | |
| timestamp | string | yes | Timestamp ISO8601 de cuándo se subió la imagen | |
| Labels | labels | Array of labels | no | Etiquetas de la propiedad. Constantes |
| attributes | attributes | Array of json attributes | no | Todos los atributos de la propiedad |
| descriptionFormatted | description | string | no | Descripción con formato nuevo que acepta saltos de línea |
Los campos propios del desarrollo
Un desarrollo es una propiedad con campos extra, y son los que lo hacen útil:
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| development | boolean | yes | Siempre true en este servicio |
| developmentProperties | Array of int | no | Los Id de las unidades que componen el desarrollo. Son los que le pasás a GET /development/properties para traer el detalle de cada una |
| commercialTagline | string | no | La leyenda comercial del proyecto, tal como la cargó la inmobiliaria |
| deliveryDate | string | no | Fecha de entrega, en formato ISO8601 con zona horaria |
| logoUrl | string | no | URL del logo del desarrollo. Es el logo del proyecto, no el de la inmobiliaria |
| totalApartments | int | no | Total de viviendas del proyecto |
| totalTowers | int | no | Total de torres |
| totalElevators | int | no | Total de ascensores |
| totalOffices | int | no | Total de oficinas |
| totalCommercialUnits | int | no | Total de locales comerciales |
| totalHouses | int | no | Total de casas |
| totalLots | int | no | Total de lotes |
Son los valores que declaró la inmobiliaria para el proyecto. No son el resultado de contar las
unidades de developmentProperties: un desarrollo puede anunciar 500 viviendas y tener cargadas 12.
Un 0 significa "no lo declaró", no "cero".
Los siete contadores son opcionales, y cuando la inmobiliaria no los carga el servicio devuelve
0, no los omite. Así que "totalTowers": 0 no quiere decir que el proyecto no tenga torres:
quiere decir que nadie informó cuántas.
Si vas a mostrar el dato, tratá al 0 como ausencia. Un sitio que publique "0 torres" está
afirmando algo que la inmobiliaria nunca dijo.
Es la convención del objeto, no de este grupo: aplica igual a los enteros opcionales que ya
existían —totalFloors, floors, apartmentsPerFloor, toilettes, dependencies,
expensesPrice y taxPrice—, que se comportan del mismo modo desde siempre.
Los tres campos no numéricos se OMITEN cuando están vacíos.
commercialTagline, deliveryDate y logoUrl no vienen en null: directamente no aparecen
en el JSON. Es la otra mitad de la misma convención, y necesitás las dos para leer bien una
respuesta: en los numéricos preguntás por el valor, en estos por la existencia de la clave.
developmentStats — los números DERIVADOS de las unidades
Desde el 2026-10-27 cada desarrollo trae un bloque developmentStats con los indicadores que
salen de contar sus unidades. No lo cargó nadie: se calcula en el backend a partir de las
unidades que el desarrollo tiene vinculadas, y se recalcula cuando una de ellas cambia.
Es la otra mitad del grupo anterior, y hay que leerlas juntas.
Los siete contadores (totalApartments, totalTowers…) son lo que declaró la inmobiliaria
para el proyecto. developmentStats es lo que hay cargado. Un desarrollo puede anunciar 500
viviendas (totalApartments: 500) y tener 12 unidades cargadas
(developmentStats.units.total: 12). Las dos cosas son ciertas y responden preguntas distintas.
"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 } }
}
| Rama | Qué trae |
|---|---|
units | cuántas unidades hay y en qué estado. withOperation cuenta unidades, no estados: una vendida Y reservada cuenta una. availabilityRate es el porcentaje disponible sobre el total |
sale / rent | la comercialización por operación, cada una contra su propio universo |
otherOperation | las unidades en permuta, traspaso, compartir o remate. Existen para que sale.units + rent.units + otherOperation.units dé el total y ninguna unidad desaparezca |
buildingArea | los m² cubiertos. unavailable es un OR (vendida ‖ reservada ‖ alquilada), así que una unidad con dos estados se descuenta una sola vez |
prices.byCurrency | el desglose por moneda: from/to el rango, total la suma, average el promedio |
typology | cuántas unidades hay por ambientes, dormitorios, m² cubiertos y m² totales. Las claves son el valor; las que no están, no las tiene ninguna unidad |
rate en null NO es 0.
sale.rate y rent.rate vienen en null cuando no hay ninguna unidad de esa operación: la
pregunta "¿cuánto se comercializó de lo que está en venta?" no tiene respuesta si no hay nada en
venta, y un 0 % sería una respuesta falsa. Un 0 sí significa algo: hay unidades en venta y no
se colocó ninguna.
En un desarrollo de puros alquileres vas a ver sale.rate: null y rent.rate con un número. Eso
es correcto: son dos negocios distintos y no se promedian juntos.
Los precios NO tienen campos planos, y es a propósito.
No hay prices.from, prices.to, prices.total ni prices.average al nivel del bloque: sólo
byCurrency. Si un desarrollo tiene unidades en dólares y en pesos, cualquier número único que
los mezcle es falso, no aproximado — un promedio de 120.000 USD y 95.000.000 ARS no es ni
dólares ni pesos.
mixedCurrencies te dice si hay más de una. Con una sola —el caso habitual— el único balde de
byCurrency ES el dato del desarrollo: leelo y listo.
Sólo los desarrollos lo traen. Una propiedad común no lleva developmentStats en absoluto: no
tiene unidades de las que derivarlo, así que la pregunta no existe. No es un bloque en cero — no
está la clave.
Se recalcula solo. Cuando una unidad se vende, se alquila, cambia de precio, de superficie o se borra, el bloque del desarrollo se actualiza en el mismo momento. No hay que pedir nada ni esperar un proceso.
developmentId — de qué desarrollo es una propiedad
Desde el 2026-10-26 toda propiedad trae developmentId: el Id del desarrollo al que
pertenece, o 0 si no pertenece a ninguno.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| developmentId | int | yes | Id del desarrollo del que esta propiedad es unidad. 0 = no es unidad de ningún desarrollo |
Es el inverso de developmentProperties, y completa la relación en los dos sentidos: con
developmentProperties vas del proyecto a sus unidades; con developmentId, de una unidad a su
proyecto.
Un desarrollo también puede tener developmentId. Si es un sub-desarrollo —una etapa dentro de
un proyecto más grande— va a traer development: true, su propio developmentProperties y el
developmentId de su proyecto padre. Las tres cosas a la vez.
Campos adicionales
Cada desarrollo trae además los mismos campos extra que una propiedad —seoUrl, typeDesc,
operationDesc, descriptionFormatted, publishedAt, floors, garages, branchSeoUrl,
customerCountry, customerCountryDesc, videos, alternativePrices, reservations y
tempOccupied— documentados en
GET /properties.
La respuesta incluye también campos de uso interno de Mapaprop que no forman parte de este
contrato y pueden cambiar sin aviso: embeddingVersion, vectorizedAt, configs,
moderationStatus, publication y networks. No construyas nada sobre ellos.
Respuesta de ejemplo
{
"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
}
]
}