DEVELOPING

The development JSON object

A real estate development —a building under construction, a gated community, a tower in the works— is sent with the same endpoint as a property: POST /property-v1/properties. There is no separate endpoint and no new model to learn.

What turns it into a development is a development group inside the object:

{
  "code": "TORRE-NORTE",
  "type": 23,
  "operation": 1,
  "title": "Torre Norte — Development under construction",
  // … the rest of the usual fields …

  "development": {
    "totalBuildingArea": 7400,
    "totalFloors": 12,
    "apartmentsPerFloor": 4,
    "units": ["TORRE-NORTE-4B", "TORRE-NORTE-5A"]
  }
}

Two rules worth having clear from the start:

type has to be 23That is "Real Estate Development" in our type catalog. Sending the group with any other type is a contract error, and we tell you: we do not guess which of the two you meant
The presence of the group IS the signalNo flag is needed. An empty development ({}) already declares the object as a development

1. The fields of the development group

They all describe the project, not a unit.

FieldWhat it isRequired
totalBuildingAreaCovered square metres of the developmentyes
totalLandAreaTotal square metres of the landyes
totalGaragesParking spaces of the developmentyes
minAmbiencesRooms from — the minimum across the unitsyes
minRoomsBedrooms fromyes
minBathroomsFull bathrooms fromyes
unitsThe units. See section 2no
totalApartmentsNumber of apartmentsno
totalFloorsFloors of the buildingno
apartmentsPerFloorApartments per floorno
totalElevatorsNumber of elevatorsno
totalOfficesNumber of officesno
totalCommercialUnitsNumber of commercial unitsno
totalTowersNumber of towersno
totalHousesNumber of houses. For a gated communityno
totalLotsNumber of lots. For a gated communityno
deliveryDateDelivery dateno
logoUrlDevelopment logono
commercialTaglineCommercial taglineno

The total* ones are about the whole project; the min* ones are the "from" the listing shows.

If a required field is missing, the error names it by its path in your JSON (development.minRooms): something you can look up literally in what you sent.

⚠️ totalHouses / totalLots and the building fields do not coexist. A gated community is described with houses and lots; a building with floors, apartments per floor and elevators. If you send fields from both sides we return the conflict naming the fields on each one, so you keep only one set.

2. The units: units

The units are regular properties belonging to that same client of yours, already created. In the development you only reference them:

"units": ["TORRE-NORTE-4B", "TORRE-NORTE-5A", "01M43Y1T192XEXJCV6Y6C4QTNB"]

You can use the code you gave them or the paId we returned when you created them. Both work, and in the response we return both so you can cross-reference against your own database.

Order matters: the units first, the development afterwards

A unit has to exist before you reference it. The flow is:

  1. POST /properties for each unit → keep its paId
  2. POST /properties for the development, with their codes in units

A development can be born without units

units is optional. You can create the development empty and load its units later with PUT: that is the normal flow when the project goes on sale before the unit mix is settled.

⚠️ PUT replaces the complete list, it does not append. If the development has 10 units and you send a PUT with 3, it ends up with 3 — the other 7 are released. Always send the entire list.

The limit: 100 units that CHANGE, not that it has

A single operation can move up to 100 units. What counts are the ones coming in and going out, not the ones the development already has: a unit that was already its own and stays so costs nothing.

That is why "always send the entire list" and the limit coexist. With a development of 150:

You doUnits moved
PUT with the same 1500✅
PUT with 150, of which 1 is new1✅
PUT with 149 (you remove one)1✅
POST creating it with all 150 at once150❌ 400 too_many_units_in_one_operation

The only case that does not fit is loading more than ~92 new units in a single operation. It is solved in two steps and then never gets in the way again:

POST /properties   → the development with the first 90
PUT  /properties/{paId} → the list of 150

From then on you can PUT the 150 as many times as you want: none of them moves.

The seven unit rules

A unit that fails one of these is reported to you with its reason, and the development is saved anyway: what you cannot do is publish it.

If…We tell you
the code does not exist, or the property is deletednot_found
you sent the same code twice in the same listduplicate
the string could be a code and a paId of two different propertiesambiguous — disambiguate with the paId
the unit already belongs to another developmentalready_in_development
you listed the development as a unit of itselfself_reference
the unit contains the development (directly or indirectly)cycle
the chain of developments is too deep to verifyunverifiable_depth

A unit belongs to a single development. If you want to move it, remove it from the previous one first.

📌 A development can be a unit of another one (a community with towers inside). In that case it counts as one unit: we do not descend into its children's units, because adding the child and its units would count the same thing twice.

3. Amenities specific to the development

A development uses the same attributes as any property, and on top of that it has 16 amenities of its own: the ones belonging to the complex, not to a unit. A gym or a golf course belong to the development; the air conditioning belongs to the apartment.

They come in the catalog with group_subtype: "development":

clubhouse Clubhousegym Gymspa Spa
golf-course Golf coursesports-court Sports courtsauna Sauna
equestrian Equestrian facilitiessports-school Sports schoolsolarium Solarium
playground Playgroundmicro-cinema Screening roomrestaurant Restaurant
medical-center Medical centerschool Schoolcommercial-area Commercial area
maid-service Maid service

They are booleans and are sent in attributes just like the rest, with nothing special about them:

"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 }
]

They exist in all 15 countries. Download them from the catalog along with the rest —do not write them by hand— and filter by group_subtype:

GET /property-attributes — the complete catalog: types, operations, states and amenities

4. The complete object

This is a whole development, with all its fields. It is the object we use for testing.

{
  "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
    },
    // … and 54 more entries, one per development attribute
  ]
}

5. And next

POST /properties/verify for a development — try the object out before creating anything

developmentStats — the calculated numbers of its units

The property JSON object — the usual fields, which a development also carries