El objeto JSON del desarrollo
Un desarrollo inmobiliario —un edificio en pozo, un barrio cerrado, una torre en construcción— se
manda con el mismo endpoint que una propiedad: POST /property-v1/properties. No hay un endpoint
aparte y no hay un modelo nuevo que aprender.
Lo que lo convierte en desarrollo es un grupo development adentro del objeto:
{
"code": "TORRE-NORTE",
"type": 23,
"operation": 1,
"title": "Torre Norte — Emprendimiento en pozo",
// … el resto de los campos de siempre …
"development": {
"totalBuildingArea": 7400,
"totalFloors": 12,
"apartmentsPerFloor": 4,
"units": ["TORRE-NORTE-4B", "TORRE-NORTE-5A"]
}
}
Dos reglas que conviene tener claras desde el principio:
El type tiene que ser 23 | Es "Desarrollo Inmobiliario" en nuestro catálogo de tipos. Mandar el grupo con otro tipo es un error de contrato, y te lo decimos: no adivinamos cuál de los dos quisiste decir |
| La presencia del grupo ES la señal | No hace falta ningún flag. Un development vacío ({}) ya declara que el objeto es un desarrollo |
1. Los campos del grupo development
Todos describen el proyecto, no una unidad.
| Campo | Qué es | Obligatorio |
|---|---|---|
totalBuildingArea | M² cubiertos del desarrollo | sí |
totalLandArea | M² totales del terreno | sí |
totalGarages | Cocheras del desarrollo | sí |
minAmbiences | Ambientes desde — el mínimo entre las unidades | sí |
minRooms | Dormitorios desde | sí |
minBathrooms | Baños completos desde | sí |
units | Las unidades. Ver la sección 2 | no |
totalApartments | Cantidad de departamentos | no |
totalFloors | Pisos del edificio | no |
apartmentsPerFloor | Departamentos por piso | no |
totalElevators | Cantidad de ascensores | no |
totalOffices | Cantidad de oficinas | no |
totalCommercialUnits | Cantidad de locales comerciales | no |
totalTowers | Cantidad de torres | no |
totalHouses | Cantidad de casas. Para un barrio cerrado | no |
totalLots | Cantidad de lotes. Para un barrio cerrado | no |
deliveryDate | Fecha de entrega | no |
logoUrl | Logo del desarrollo | no |
commercialTagline | Leyenda comercial | no |
Los total* son del conjunto; los min* son el "desde" que muestra el aviso.
Si falta un obligatorio, el error te lo nombra por su ruta en tu JSON (
development.minRooms): algo que podés buscar literalmente en lo que mandaste.
⚠️
totalHouses/totalLotsy los campos de edificio no conviven. Un barrio cerrado se describe con casas y lotes; un edificio con pisos, departamentos por piso y ascensores. Si mandás de los dos lados te devolvemos el conflicto nombrando los campos de cada uno, para que dejes sólo los de uno.
2. Las unidades: units
Las unidades son propiedades normales de tu mismo cliente, que ya diste de alta. En el desarrollo sólo las referenciás:
"units": ["TORRE-NORTE-4B", "TORRE-NORTE-5A", "01M43Y1T192XEXJCV6Y6C4QTNB"]
Podés usar el code que vos les pusiste o el paId que te devolvimos al darlas de alta. Los
dos valen, y en la respuesta te devolvemos los dos para que puedas cruzarlos contra tu base.
El orden importa: primero las unidades, después el desarrollo
Una unidad tiene que existir antes de que la referencies. El flujo es:
POST /propertiesde cada unidad → te guardás supaIdPOST /propertiesdel desarrollo, con sus códigos enunits
Un desarrollo puede nacer sin unidades
units es opcional. Podés dar de alta el desarrollo vacío y cargarle las unidades después con PUT:
es el flujo normal cuando el proyecto se publica antes de tener la tipología cerrada.
⚠️ El PUT reemplaza la lista completa, no agrega. Si el desarrollo tiene 10 unidades y mandás un
PUT con 3, queda con 3 — las otras 7 se liberan. Mandá siempre la lista entera.
El tope: 100 unidades que CAMBIAN, no que tiene
Una sola operación puede mover hasta 100 unidades. Lo que cuenta son las que entran y salen, no las que el desarrollo ya tiene: una unidad que ya era suya y sigue siéndolo no cuesta nada.
Por eso "mandá siempre la lista entera" y el tope conviven. Con un desarrollo de 150:
| Hacés | Se mueven | |
|---|---|---|
PUT con las mismas 150 | 0 | ✅ |
PUT con 150, de las cuales 1 es nueva | 1 | ✅ |
PUT con 149 (sacás una) | 1 | ✅ |
POST de alta con las 150 de una vez | 150 | ❌ 400 too_many_units_in_one_operation |
El único caso que no entra es cargar más de ~92 unidades nuevas de una sola vez. Se resuelve en dos pasos y después ya no molesta más:
POST /properties → el desarrollo con las primeras 90
PUT /properties/{paId} → la lista de las 150
A partir de ahí podés PUTear las 150 todas las veces que quieras: no se mueve ninguna.
Las siete reglas de una unidad
Una unidad que no cumpla una de estas se te reporta con su motivo, y el desarrollo se guarda igual: lo que no se puede es publicarlo.
| Si… | Te decimos |
|---|---|
| el código no existe, o la propiedad está borrada | not_found |
| mandaste el mismo código dos veces en la misma lista | duplicate |
el string puede ser un code y un paId de dos propiedades distintas | ambiguous — desambiguá con el paId |
| la unidad ya es unidad de otro desarrollo | already_in_development |
| pusiste el desarrollo como unidad de sí mismo | self_reference |
| la unidad contiene al desarrollo (directa o indirectamente) | cycle |
| la cadena de desarrollos es demasiado profunda para verificarla | unverifiable_depth |
Una unidad pertenece a un solo desarrollo. Si querés moverla, primero sacala del anterior.
📌 Un desarrollo puede ser unidad de otro (un barrio con torres adentro). En ese caso cuenta como una unidad: no bajamos a las unidades de sus hijos, porque sumar el hijo y sus unidades contaría dos veces lo mismo.
3. Amenities propios del desarrollo
Un desarrollo usa el mismo attributes que cualquier propiedad, y además tiene 16 amenities propios:
los del emprendimiento, no los de una unidad. Un gimnasio o una cancha de golf son del complejo; el aire
acondicionado es del departamento.
Vienen en el catálogo con group_subtype: "development":
clubhouse Club house | gym Gimnasio | spa Spa |
golf-course Cancha de golf | sports-court Cancha deportiva | sauna Sauna |
equestrian Equitación | sports-school Escuela deportiva | solarium Solárium |
playground Plaza de juegos | micro-cinema Microcine | restaurant Restaurante |
medical-center Centro médico | school Colegio | commercial-area Área comercial |
maid-service Servicio de mucamas |
Son booleanos y se mandan en attributes igual que el resto, sin nada especial:
"attributes": [
{ "id": "gym", "key_legacy": "gym", "group_sub": "label", "group_subtype": "development", "selected": true },
{ "id": "clubhouse", "key_legacy": "clubhouse", "group_sub": "label", "group_subtype": "development", "selected": true }
]
Están en los 15 países. Bajalos del catálogo con el resto —no los escribas a mano— y filtrá por
group_subtype:
GET /property-attributes — el catálogo completo: tipos, operaciones, estados y amenities
4. El objeto completo
Éste es un desarrollo entero, con todos sus campos. Es el objeto que usamos nosotros para probar.
{
"code": "DEV-TORRE-NORTE",
"type": 23,
"development": {
"totalBuildingArea": 126,
"totalLandArea": 189,
"totalGarages": 2,
"minAmbiences": 2,
"minRooms": 3,
"minBathrooms": 1,
"units": [
"TORRE-NORTE-4B",
"TORRE-NORTE-5A",
"TORRE-NORTE-PH-A"
],
"totalFloors": 12,
"apartmentsPerFloor": 4,
"totalApartments": 96,
"totalTowers": 3,
"totalElevators": 4,
"totalOffices": 2,
"totalCommercialUnits": 3,
"deliveryDate": "2027-06-30",
"logoUrl": "https://cdn.inmobiliaria-modelo.com/torre-norte/logo.png",
"commercialTagline": "Torre Norte — 96 unidades frente al parque, entrega 2027"
},
"operation": 1,
"title": "Torre Norte — desarrollo de 48 unidades en Nordelta",
"address": "Av. Santa Fe 4271",
"mapLatitude": -34.5828,
"mapLongitude": -58.4206,
"zone0": 1,
"zone1": 2,
"zone2": 189,
"description": "Desarrollo de 48 unidades distribuidas en 12 pisos, con amenities completos. Unidades de 1, 2 y 3 ambientes.",
"descriptionFormatted": "<p>Desarrollo de 48 unidades distribuidas en 12 pisos, con amenities completos.</p>",
"zipcode": "1684",
"betweenStreets": "Entre Av. Pueyrredón y Av. Coronel Díaz",
"urlWebExternal": "https://ejemplo-inmobiliaria.com/propiedad-dev",
"conditions": "Contado",
"yearsOld": 16,
"floors": 2,
"dependencies": 1,
"toilettes": 2,
"currency": "USD",
"price": 120000,
"zone3": 973,
"rented": false,
"sold": false,
"reserved": false,
"suspended": false,
"occupancy": null,
"images": [
{
"url": "https://images.mapaprop.app/photos/1/33616/213831.jpg",
"description": "Imagen principal",
"main": true
},
{
"url": "https://images.mapaprop.app/photos/1/33616/1950514.jpg",
"description": "Imagen 2",
"main": false
},
{
"url": "https://images.mapaprop.app/photos/1/33616/1950515.jpg",
"description": "Imagen 3",
"main": false
}
],
"blueprint": {
"url": "https://images.mapaprop.app/photos/1/33616/1950516.jpg"
},
"videos": [
{
"source": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"description": "Recorrido"
}
],
"prices": {
"expensesCurrency": "ARS",
"expensesPrice": 500,
"taxCurrency": "ARS",
"taxPrice": 200,
"paymentPeriod": 1
},
"altPrices": [
{
"description": "Alquiler por semana",
"currency": "ARS",
"price": 100000
}
],
"publication": {
"api": {
"argenprop": {
"advertiserId": 99999,
"visible": true,
"token": "<tu-token-de-argenprop>"
},
"zonaprop": {
"plan": {
"plan": "DESARROLLOS_DESTACADO"
},
"developmentCategory": "vertical",
"token": "<tu-token-de-zonaprop>"
},
"cabaprop": {
"branchOfficeId": 42,
"token": "<tu-token-de-cabaprop>"
},
"mercadolibre": {
"listingTypeId": "gold_special",
"condition": "used",
"token": "<tu-token-de-mercadolibre>"
}
}
},
"attributes": [
{
"locale": "es_AR",
"country": "ar",
"id": "accessible",
"label": "Accesible",
"group": "propertyAttribute",
"group_sub": "label",
"group_subtype": "ammenities",
"type": "bool",
"key_legacy": "accessible",
"selected": true,
"status": true
},
{
"locale": "es_AR",
"country": "ar",
"id": "statusUnderConstruction",
"label": "En Construcción",
"group": "propertyStatus",
"group_sub": "status",
"type": "list",
"key_legacy": "6",
"value": 6
},
// … y 54 entradas más, una por cada atributo del desarrollo
]
}
5. Y después
POST /properties/verify para un desarrollo — probá el objeto antes de dar nada de alta
developmentStats — los números calculados de sus unidades
El objeto JSON de la propiedad — los campos de siempre, que un desarrollo también lleva