DEVELOPING

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.

BlocoFormaObservação
imageslista 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
videoslista 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
altPriceslista 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:

CampoTipoRegra
codestring1–30, sem espaços: ^[A-Za-z0-9._-]{1,30}$
titlestring1–150 caracteres
descriptionstringpelo menos 1 caractere
priceinteger1 ou mais
currencystringUSD ou ARS
zone0integerpaís
zone1integerprovíncia
zone2integermunicípio ou departamento
zone3integerlocalidade ou bairro
addressstringpelo 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:

CampoComo enviá-lo
tipoentrada de attributes com group: "type" ← preferido · ou o campo avulso type
operaçãoentrada 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

CampoTipoIntervaloObservação
mapLatitude · mapLongitudenumber±90 / ±180veja o aviso abaixo
buildingAreainteger1 – 100.000 m²
landAreainteger1 – 10.000.000 m²
roomsinteger0 – 50⚠️ são dormitórios, não ambientes
ambiencesinteger0 – 50os ambientes
bathroomsinteger0 – 50
toilettesinteger0 – 10
garageinteger0 – 100
floorsinteger0 – 10andares da unidade
totalFloorsinteger0 – 200andares do prédio
apartmentsPerFloorinteger0 – 50
dependenciesinteger0 – 10
yearsOldinteger0 – 300idade em anos
occupancyinteger1 – 50
zipcodestring1–10: ^[A-Za-z0-9-]{1,10}$
betweenStreetsstringlivre
conditions · urlWebExternal · descriptionFormattedstringlivre

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