DEVELOPING

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 23Es "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ñalNo 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.

CampoQué esObligatorio
totalBuildingAreaM² cubiertos del desarrollosí
totalLandAreaM² totales del terrenosí
totalGaragesCocheras del desarrollosí
minAmbiencesAmbientes desde — el mínimo entre las unidadessí
minRoomsDormitorios desdesí
minBathroomsBaños completos desdesí
unitsLas unidades. Ver la sección 2no
totalApartmentsCantidad de departamentosno
totalFloorsPisos del edificiono
apartmentsPerFloorDepartamentos por pisono
totalElevatorsCantidad de ascensoresno
totalOfficesCantidad de oficinasno
totalCommercialUnitsCantidad de locales comercialesno
totalTowersCantidad de torresno
totalHousesCantidad de casas. Para un barrio cerradono
totalLotsCantidad de lotes. Para un barrio cerradono
deliveryDateFecha de entregano
logoUrlLogo del desarrollono
commercialTaglineLeyenda comercialno

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 / totalLots y 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:

  1. POST /properties de cada unidad → te guardás su paId
  2. POST /properties del desarrollo, con sus códigos en units

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ésSe mueven
PUT con las mismas 1500✅
PUT con 150, de las cuales 1 es nueva1✅
PUT con 149 (sacás una)1✅
POST de alta con las 150 de una vez150❌ 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á borradanot_found
mandaste el mismo código dos veces en la misma listaduplicate
el string puede ser un code y un paId de dos propiedades distintasambiguous — desambiguá con el paId
la unidad ya es unidad de otro desarrolloalready_in_development
pusiste el desarrollo como unidad de sí mismoself_reference
la unidad contiene al desarrollo (directa o indirectamente)cycle
la cadena de desarrollos es demasiado profunda para verificarlaunverifiable_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 housegym Gimnasiospa Spa
golf-course Cancha de golfsports-court Cancha deportivasauna Sauna
equestrian Equitaciónsports-school Escuela deportivasolarium Solárium
playground Plaza de juegosmicro-cinema Microcinerestaurant Restaurante
medical-center Centro médicoschool Colegiocommercial-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