O objeto JSON do imóvel
Esta é a referência do que você envia: quais campos o objeto do imóvel tem, quais são obrigatórios, quais valores cada um aceita e como dizer "não tenho este dado".
É uma referência do objeto, não de um endpoint. Para entender como um imóvel é identificado —por que o tipo e a operação são chaves estáveis e de onde saem os seus valores— leia primeiro O modelo de imóvel.
Os campos e intervalos desta página saem de medir 220 imóveis reais, não de suposições. Onde o dado real contradiz a regra, está anotado.
38 campos são suficientes
Não é preciso enviar o objeto completo. Se você enviar os 38 campos abaixo com o array
attributes preenchido, a resposta devolve o imóvel inteiro —82 campos— com todo o resto
reconstruído.
você envia 38 campos → devolvemos 82
você envia 84 campos → devolvemos 82 (os mesmos, idênticos)
Funciona porque 46 desses 82 campos já estão ditos em attributes. Quando você envia a entrada
{"id": "alarm", "key_legacy": "alarm", "selected": true}, não é preciso enviar também
"alarm": true: é o mesmo dado duas vezes.
E os 46 voltam ao seu lugar, misturados com o resto do imóvel — não a um bloco separado.
Comece pelo objeto mínimo. É menos código do seu lado, menos oportunidades de se contradizer, e o resultado é exatamente o mesmo.
O objeto mínimo
{
"code": "DEV-V3-909181",
"title": "Hermoso departamento luminoso con excelente ubicación y amenities completos",
"address": "Av. Santa Fe 4271",
"zone0": 1,
"zone1": 2,
"zone2": 189,
"zone3": 973,
"description": "Excelente propiedad ubicada en zona premium…",
"descriptionFormatted": "Excelente propiedad ubicada en zona premium…",
"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,
"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": [ … ]
}
As fotos, a planta, os vídeos e os preços adicionais
Vão no mesmo JSON. Não são campos do imóvel —por dentro eles vão para outro lugar— mas você envia um só objeto e a distribuição é nossa.
| Bloco | Forma | Observação |
|---|---|---|
images | lista de {url, description, main} | a URL, não o arquivo: o binário não viaja em um JSON |
blueprint | {url} | apenas uma por imóvel |
videos | lista de {source, description} | source é a URL do YouTube ou do Matterport |
prices | {expensesCurrency, expensesPrice, taxCurrency, taxPrice, paymentPeriod} | condomínio e impostos, valores como número |
altPrices | lista de {description, currency, price} | preços alternativos |
⚠️ O price e a currency do imóvel não vão aqui: são campos do próprio imóvel e já estão mais
acima.
O array attributes
É onde vive a maior parte do imóvel. Cada entrada descreve um dado, e há quatro famílias: o tipo, a operação, o estado e os atributos avulsos.
[
{
"id": "individualGarage", "label": "Cochera",
"group": "type", "group_sub": "propertyType",
"type": "string", "key_legacy": "6", "value": 6,
"locale": "es_AR", "country": "ar"
},
{
"id": "rent", "label": "Alquiler",
"group": "operation", "group_sub": "propertyOperation",
"type": "string", "key_legacy": "2", "value": 2,
"locale": "es_AR", "country": "ar"
},
{
"id": "statusAverage", "label": "Estado Regular",
"group": "propertyStatus", "group_sub": "status",
"type": "list", "key_legacy": "8", "value": 8,
"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"
}
]
O valor que você envia é key_legacy: é o mesmo nos 15 países. O id, o label e o value saem
do catálogo do seu país — onde obtê-los está mais abaixo.
attributes é obrigatório, e uma lista vazia é válida. Se o imóvel não tiver nenhum atributo,
envie "attributes": []; o que não se pode é omitir a chave. Omiti-la devolve:
{"error": "ATTRIBUTES_REQUIRED",
"description": "Falta la lista de atributos de la propiedad. El campo \"attributes\" es obligatorio: enviá la lista de atributos, o una lista vacía ([]) si la propiedad no tiene ninguno."}
Mas enviá-la vazia tem um custo: você perde o objeto mínimo. Os 46 campos que o array reconstrói passam a ser sua responsabilidade, um por um.
Campos obrigatórios
São 12, mais o array attributes. Todo o resto é opcional.
Dez são campos avulsos:
| Campo | Tipo | Regra |
|---|---|---|
code | string | 1–30, sem espaços: ^[A-Za-z0-9._-]{1,30}$ |
title | string | 1–150 caracteres |
description | string | pelo menos 1 caractere |
price | integer | 1 ou mais |
currency | string | USD ou ARS |
zone0 | integer | país |
zone1 | integer | província |
zone2 | integer | município ou departamento |
zone3 | integer | localidade ou bairro |
address | string | pelo menos 1 caractere |
E os dois que completam os 12 são o tipo e a operação, que podem ser enviados de duas formas:
| Campo | Como enviá-lo |
|---|---|
| tipo | entrada de attributes com group: "type" ← preferido · ou o campo avulso type |
| operação | entrada de attributes com group: "operation" ← preferido · ou o campo avulso operation |
Uma das duas formas é suficiente. Se você enviar as duas e elas não coincidirem, vence a do array e o campo avulso é ignorado.
Campos opcionais
| Campo | Tipo | Intervalo | Observação |
|---|---|---|---|
mapLatitude · mapLongitude | number | ±90 / ±180 | veja o aviso abaixo |
buildingArea | integer | 1 – 100.000 m² | |
landArea | integer | 1 – 10.000.000 m² | |
rooms | integer | 0 – 50 | ⚠️ são dormitórios, não ambientes |
ambiences | integer | 0 – 50 | os ambientes |
bathrooms | integer | 0 – 50 | |
toilettes | integer | 0 – 10 | |
garage | integer | 0 – 100 | |
floors | integer | 0 – 10 | andares da unidade |
totalFloors | integer | 0 – 200 | andares do prédio |
apartmentsPerFloor | integer | 0 – 50 | |
dependencies | integer | 0 – 10 | |
yearsOld | integer | 0 – 300 | idade em anos |
occupancy | integer | 1 – 50 | |
zipcode | string | 1–10: ^[A-Za-z0-9-]{1,10}$ | |
betweenStreets | string | livre | |
conditions · urlWebExternal · descriptionFormatted | string | livre |
mapLatitude e mapLongitude vão como número, não como texto, e o 0 não é "sem
coordenada": é um ponto real no Golfo da Guiné. Se você não tem a coordenada, envie null ou não
envie o campo — mas nunca 0.
Como dizer "não tenho este dado"
Um campo opcional que você não tem é enviado como null ou não é enviado: para nós é a mesma
coisa.
O que não é a mesma coisa é enviar 0. Um 0 em uma área, na idade, na quantidade de ocupantes ou
em uma coordenada é gravado como o número zero — ou seja, como um dado.
De onde saem os valores
Os campos enumerados —o tipo, a operação, o estado, as orientações, as comodidades— não têm uma lista fixa nesta página de propósito: dependem do país e mudam quando um novo é adicionado.
Você os solicita aqui:
GET /property-attributes?country=AR
Ver a referência completa do endpoint
Devolve, para aquele país, tudo o que ele aceita: a chave em texto (pa_key), o valor que você
envia (pa_key_legacy), o rótulo traduzido (pa_label) e a família (pa_group_subtype).
Solicite o catálogo do país do imóvel, não de um só: um tipo pode estar habilitado na Argentina e não no Peru.
E tenha isso em mente: não validamos os valores contra o catálogo. Um valor que aquele país não usa não é rejeitado: é gravado, e o imóvel fica publicado com um dado errado. O catálogo não é uma sugestão — é a única forma de saber o que enviar.
Verifique antes de publicar
Você pode enviar o seu objeto e ver o que ele produz, sem cadastrar nada:
POST /property-v1/properties/verify
Ele diz se o objeto é válido, quais regras ele descumpre campo por campo, e o que aconteceria em cada portal. É o mesmo corpo do cadastro, sem a gravação.
Veja também
- O modelo de imóvel — chaves estáveis, catálogo por país, o que você envia e o que nós definimos
- GET /property-attributes — o catálogo de valores
- POST /property/post — o endpoint de cadastro