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 se diz "este dado eu não tenho".
É 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 antes O modelo de imóvel.
O objeto que você envia
Este é o objeto completo. Abaixo está o que é obrigatório, o que é opcional e quais valores cada campo aceita.
{
"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/foto-1.jpg",
"description": "Imagen principal",
"main": true
},
{
"url": "https://cdn.ejemplo.com/propiedades/909181/foto-2.jpg",
"description": "Imagen 2",
"main": false
},
{
"url": "https://cdn.ejemplo.com/propiedades/909181/foto-3.jpg",
"description": "Imagen 3",
"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
},
// … e mais 42 entradas, uma por atributo do imóvel
],
"publication": { … } // configuração de publicação por portal — veja sua própria página
}
As fotos, a planta, os vídeos e os preços acessórios
Vão no mesmo JSON: você envia um único objeto.
| Bloco | Forma | Nota |
|---|---|---|
images | lista de {url, description, main} | a URL, não o arquivo: o binário não viaja num 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
Cada entrada descreve um dado. Há duas famílias: o estado do imóvel (propertyStatus) e os
atributos — comodidades, orientação, tipo de aquecimento e demais (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
}
]
O valor que você envia é key_legacy: é o mesmo em todos os 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.
customerSource — de onde saiu o cliente
Toda resposta que traz o bloco customer traz também, na raiz, de onde ele saiu:
| Valor | O que significa |
|---|---|
account | É a sua ficha, lida com o seu clientRef. O caso normal |
placeholder | Você não declarou ficha e isto é preenchimento. Só acontece no /verify — o cadastro sem ficha responde 400, não preenche. Resolve-se com POST /customers |
frozen | O snapshot com que esse imóvel foi criado (devolvido pelo GET e pelo PUT). Não é a sua ficha de hoje, e isso é deliberado: permite que o GET diga com que dados aquele imóvel foi publicado |
Fica na raiz e não dentro de customer de propósito: dentro, se misturaria com os campos que você
mesmo declarou.
O cliente NÃO faz parte deste objeto
Até 2026-09-30 o bloco customer viajava aqui dentro. Não mais: o cliente se declara uma vez e
cliente e os imóveis a herdam.
👉 Clientes — o POST /property-v1/customers,
seus campos, o customerId que devolvemos e a filial.
⚠️ Se você enviar customer dentro deste objeto, ele é ignorado — como propertyId, customerId e
branchId. E sem cliente declarado, o cadastro responde 400 com rule: account_required.
publication — como ele é publicado
Dentro do mesmo objeto viaja uma chave publication com o que cada portal precisa da sua conta e das
suas escolhas de publicação. Não é um campo do imóvel: é como você o publica.
{
"publication": {
"api": {
"argenprop": {
"advertiserId": 99999,
"visible": true,
"token": "<tu-token-de-argenprop>"
},
"zonaprop": {
"plan": {
"plan": "SUPERDESTACADO"
},
"token": "<tu-token-de-zonaprop>"
},
"cabaprop": {
"branchOfficeId": 42,
"token": "<tu-token-de-cabaprop>"
},
"mercadolibre": {
"listingTypeId": "gold_special",
"condition": "used",
"token": "<tu-token-de-mercadolibre>"
}
}
}
}
A referência completa está em A chave publication.
Campos obrigatórios
São 26, mais o array attributes. Todo o resto é opcional.
A maioria são campos avulsos:
| Campo | Tipo | Regra | |
|---|---|---|---|
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 | — | o id do tipo — pa_key_legacy do grupo type do catálogo |
operation | integer | — | o id da operação — pa_key_legacy do grupo operation |
zone0 | integer | — | país |
zone1 | integer | — | província |
zone2 | integer | — | município ou departamento |
address | string | al menos 1 carácter | |
zipcode | string | ^[A-Za-z0-9-]{1,10}$ | |
mapLatitude | number | -90 – 90 | veja o aviso abaixo |
mapLongitude | number | -180 – 180 | veja o aviso abaixo |
buildingArea | integer | 0 – 100.000 | área construída, em m² |
landArea | integer | 1 – 10.000.000 | área TOTAL do imóvel, em m² — também em um apartamento |
ambiences | integer | 0 – 50 | os ambientes |
rooms | integer | 0 – 50 | ⚠️ são dormitórios, não 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 edifício |
apartmentsPerFloor | integer | 0 – 50 | |
dependencies | integer | 0 – 10 | |
yearsOld | integer | 0 – 300 | idade, em anos |
O número do tipo e o da operação é o mesmo em todos os países — o que muda de um país para outro é o rótulo. Você os encontra listados em Constantes.
As duas áreas têm pisos diferentes, e é de propósito. landArea vai de 1 em diante porque todo
imóvel ocupa terreno; buildingArea admite 0, porque um lote não tem construção e declará-lo
como zero está correto.
Campos opcionais
| Campo | Tipo | Regra | |
|---|---|---|---|
zone3 | integer | — | localidade ou bairro |
betweenStreets | string | — | |
occupancy | integer | 1 – 50 | |
sold | boolean | — | vendido |
rented | boolean | — | alugado |
reserved | boolean | — | reservado |
suspended | boolean | — | publicação suspensa |
descriptionFormatted | string | — | a descrição com suas quebras de linha; se você omitir, usa-se description |
conditions | string | — | condições da operação — "À vista", "Aceita financiamento"… |
urlWebExternal | string | — | a URL do imóvel no seu próprio site |
mapLatitude e mapLongitude são obrigatórias, e vão como número, não como texto. Estão na
tabela acima: se você as omitir ou enviá-las como null, a propriedade não passa na validação.
Geocodifique o endereço antes de enviar.
E o 0 não é "sem coordenada": é um ponto real no Golfo da Guiné, portanto uma propriedade com
0, 0 é publicada lá. A validação o aceita —é um número válido— mas o anúncio sai errado.
Como se diz "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 numa área, na idade, na quantidade de ocupantes ou
numa coordenada é armazenado 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
Ele devolve, para esse país, tudo o que 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).
Peça 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 isto em mente: não validamos os valores contra o catálogo. Um valor que esse país não usa não é rejeitado: é armazenado, 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 escrita.
O seu token precisa do scope property-api-verify. Sem ele, a resposta é 403. Peça-o junto com
as suas credenciais de acesso.
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 /properties — o endpoint de cadastro