El objeto JSON de la propiedad
Esta es la referencia de lo que vos mandás: qué campos tiene el objeto propiedad, cuáles son obligatorios, qué valores acepta cada uno y cómo se dice "este dato no lo tengo".
Es una referencia del objeto, no de un endpoint. Para entender cómo se identifica una propiedad —por qué el tipo y la operación son claves estables y de dónde salen sus valores— leé primero El modelo de propiedad.
El objeto que mandás
Éste es el objeto completo. Abajo está qué es obligatorio, qué es opcional y qué valores acepta cada campo.
{
"code": "DEV-V3-909181",
"type": 6,
"operation": 2,
"title": "Hermoso departamento luminoso con excelente ubicación y amenities completos",
"address": "Av. Santa Fe 4271",
"mapLatitude": -34.5828,
"mapLongitude": -58.4206,
"zone0": 1,
"zone1": 2,
"zone2": 189,
"description": "Excelente propiedad ubicada en zona premium con fácil acceso a transporte público, comercios y servicios. Ideal para vivir o invertir.\n\nCuenta con todos los servicios y amenities modernos. Perfecta para familias o inversión.\n\nUbicación estratégica con fácil acceso a centros comerciales, escuelas y transporte público.",
"descriptionFormatted": "Excelente propiedad ubicada en zona premium con fácil acceso a transporte público, comercios y servicios. Ideal para vivir o invertir.\n\nCuenta con todos los servicios y amenities modernos. Perfecta para familias o inversión.\n\nUbicación estratégica con fácil acceso a centros comerciales, escuelas y transporte público.",
"zipcode": "1684",
"betweenStreets": "Entre Av. Pueyrredón y Av. Coronel Díaz",
"urlWebExternal": "https://ejemplo-inmobiliaria.com/propiedad-dev",
"conditions": "Contado",
"yearsOld": 16,
"totalFloors": 16,
"apartmentsPerFloor": 3,
"floors": 2,
"buildingArea": 126,
"landArea": 189,
"ambiences": 2,
"rooms": 3,
"dependencies": 1,
"bathrooms": 1,
"toilettes": 2,
"garage": 2,
"currency": "USD",
"price": 142410,
"zone3": 973,
"rented": false,
"sold": false,
"reserved": false,
"suspended": false,
"occupancy": null,
"images": [
{
"url": "https://cdn.ejemplo.com/propiedades/909181/frente.jpg",
"description": "Frente",
"main": true
},
{
"url": "https://cdn.ejemplo.com/propiedades/909181/living.jpg",
"description": "Living comedor",
"main": false
}
],
"blueprint": {
"url": "https://cdn.ejemplo.com/propiedades/909181/plano.pdf"
},
"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
}
],
"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": "statusAverage",
"label": "Estado Regular",
"group": "propertyStatus",
"group_sub": "status",
"type": "list",
"key_legacy": "8",
"value": 8
},
// … y 42 entradas más, una por cada atributo de la propiedad
],
"publication": { … } // la configuración de publicación por portal — ver su propia página
}
Las fotos, el plano, los videos y los precios accesorios
Van en el mismo JSON: mandás un objeto solo.
| Bloque | Forma | Nota |
|---|---|---|
images | lista de {url, description, main} | la URL, no el archivo: el binario no viaja en un JSON |
blueprint | {url} | uno solo por propiedad |
videos | lista de {source, description} | source es la URL de YouTube o Matterport |
prices | {expensesCurrency, expensesPrice, taxCurrency, taxPrice, paymentPeriod} | expensas e impuestos, montos como número |
altPrices | lista de {description, currency, price} | precios alternativos |
⚠️ El price y la currency de la propiedad no van acá: son campos del inmueble y ya están más
arriba.
El arreglo attributes
Cada entrada describe un dato. Hay dos familias: el estado de la propiedad
(propertyStatus) y los atributos — amenidades, orientación, tipo de calefacción y demás
(propertyAttribute).
[
{
"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": "statusAverage",
"label": "Estado Regular",
"group": "propertyStatus",
"group_sub": "status",
"type": "list",
"key_legacy": "8",
"value": 8
}
]
El valor que mandás es key_legacy: es el mismo en todos los países. El id, el label y el
value salen del catálogo de tu país — de dónde sacarlos está más abajo.
attributes es obligatorio, y una lista vacía es válida. Si la propiedad no tiene ningún
atributo mandá "attributes": []; lo que no se puede es omitir la clave.
publication — cómo se publica
Dentro del mismo objeto viaja una clave publication con lo que cada portal necesita de tu cuenta y
de tus elecciones de publicación. No es un campo del inmueble: es cómo lo publicás.
{
"publication": {
"api": {
"argenprop": {
"advertiserId": 99999,
"visible": true,
"token": "<tu-token-de-argenprop>"
},
"zonaprop": {
"plan": {
"plan": "SUPERDESTACADO"
},
"branch": {
"custId": 1,
"email": "contacto@ejemplo-inmobiliaria.com",
"name": "Inmobiliaria de ejemplo",
"phone1": "1144445555"
},
"token": "<tu-token-de-zonaprop>"
},
"cabaprop": {
"branchOfficeId": 42,
"token": "<tu-token-de-cabaprop>"
},
"mercadolibre": {
"listingTypeId": "gold_special",
"condition": "used",
"sellerContact": {
"email": "contacto@ejemplo-inmobiliaria.com",
"phone": "1144445555"
},
"token": "<tu-token-de-mercadolibre>"
}
}
}
}
La referencia completa está en La clave publication.
Campos obligatorios
Son 26, más el arreglo attributes. Todo lo demás es opcional.
La mayoría son campos sueltos:
| Campo | Tipo | Regla | |
|---|---|---|---|
code | string | ^[A-Za-z0-9._-]{1,30}$ | |
title | string | 1–150 caracteres | |
description | string | al menos 1 carácter | |
price | integer | 1 o más | |
currency | string | USD o ARS | |
type | integer | — | el id del tipo — pa_key_legacy del grupo type del catálogo |
operation | integer | — | el id de la operación — pa_key_legacy del grupo operation |
zone0 | integer | — | país |
zone1 | integer | — | provincia |
zone2 | integer | — | partido o departamento |
address | string | al menos 1 carácter | |
zipcode | string | ^[A-Za-z0-9-]{1,10}$ | |
mapLatitude | number | -90 – 90 | ver el aviso de abajo |
mapLongitude | number | -180 – 180 | ver el aviso de abajo |
buildingArea | integer | 0 – 100.000 | superficie construida, en m² |
landArea | integer | 1 – 10.000.000 | superficie del terreno, en m² |
ambiences | integer | 0 – 50 | los ambientes |
rooms | integer | 0 – 50 | ⚠️ son dormitorios, no ambientes |
bathrooms | integer | 0 – 50 | |
toilettes | integer | 0 – 10 | |
garage | integer | 0 – 100 | |
floors | integer | 0 – 10 | plantas de la unidad |
totalFloors | integer | 0 – 200 | pisos del edificio |
apartmentsPerFloor | integer | 0 – 50 | |
dependencies | integer | 0 – 10 | |
yearsOld | integer | 0 – 300 | antigüedad, en años |
El número del tipo y el de la operación es el mismo en todos los países — lo que cambia de un país a otro es la etiqueta. Los tenés listados en Constantes.
zone3 no siempre existe, y por eso es opcional. Las zonas de Capital Federal —Recoleta,
Caballito, Palermo— tienen tres niveles: el barrio es el último. En esos casos mandá zone0,
zone1 y zone2, y dejá zone3 afuera. Lo vas a notar en el catálogo de zonas: el code viene
con tres segmentos en vez de cuatro.
Las dos superficies tienen pisos distintos, y es a propósito. landArea va de 1 en adelante
porque toda propiedad ocupa terreno; buildingArea admite 0, porque un lote no tiene
construcción y declararlo en cero es correcto.
Campos opcionales
| Campo | Tipo | Regla | |
|---|---|---|---|
zone3 | integer | — | localidad o barrio |
betweenStreets | string | — | |
occupancy | integer | 1 – 50 | |
sold | boolean | — | vendida |
rented | boolean | — | alquilada |
reserved | boolean | — | reservada |
suspended | boolean | — | publicación suspendida |
descriptionFormatted | string | — | la descripción con sus saltos de línea; si no la mandás se usa description |
conditions | string | — | condiciones de la operación — "Contado", "Apto crédito"… |
urlWebExternal | string | — | la URL de la propiedad en tu propio sitio |
mapLatitude y mapLongitude van como número, no como texto, y el 0 no es "sin
coordenada": es un punto real en el Golfo de Guinea. Si no tenés la coordenada, mandá null o no
mandes el campo — pero nunca 0.
Cómo se dice "no tengo este dato"
Un campo opcional que no tenés se manda en null o no se manda: para nosotros es lo mismo.
Lo que no es lo mismo es mandar 0. Un 0 en una superficie, en la antigüedad, en la cantidad
de ocupantes o en una coordenada se guarda como el número cero — o sea, como un dato.
De dónde salen los valores
Los campos enumerados —el tipo, la operación, el estado, las orientaciones, los amenities— no tienen una lista fija en esta página a propósito: dependen del país y cambian cuando se agrega uno nuevo.
Los pedís acá:
GET /property-attributes?country=AR
Ver la referencia completa del endpoint
Te devuelve, para ese país, todo lo que acepta: la clave en texto (pa_key), el valor que mandás
(pa_key_legacy), la etiqueta traducida (pa_label) y la familia (pa_group_subtype).
Pedí el catálogo del país de la propiedad, no de uno solo: un tipo puede estar habilitado en Argentina y no en Perú.
Y tenelo presente: no validamos los valores contra el catálogo. Un valor que ese país no usa no se rechaza: se guarda, y la propiedad queda publicada con un dato equivocado. El catálogo no es una sugerencia — es la única forma de saber qué mandar.
Verificá antes de publicar
Podés mandar tu objeto y ver qué produce, sin dar de alta nada:
POST /property-v1/properties/verify
Te dice si el objeto es válido, qué reglas incumple campo por campo, y qué pasaría en cada portal. Es el mismo cuerpo del alta, sin la escritura.
Tu token necesita el scope property-api-verify. Sin él, la respuesta es 403. Pedilo junto con
tus credenciales de acceso.
Ver también
- El modelo de propiedad — claves estables, catálogo por país, qué mandás vos y qué ponemos nosotros
- GET /property-attributes — el catálogo de valores
- POST /property/post — el endpoint de alta