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 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.

BlocoFormaNota
imageslista 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
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

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:

ValorO que significa
accountÉ a sua ficha, lida com o seu clientRef. O caso normal
placeholderVocê 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
frozenO 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:

CampoTipoRegra
codestring^[A-Za-z0-9._-]{1,30}$
titlestring1–150 caracteres
descriptionstringal menos 1 carácter
priceinteger1 o más
currencystringUSD o ARS
typeinteger—o id do tipo — pa_key_legacy do grupo type do catálogo
operationinteger—o id da operação — pa_key_legacy do grupo operation
zone0integer—país
zone1integer—província
zone2integer—município ou departamento
addressstringal menos 1 carácter
zipcodestring^[A-Za-z0-9-]{1,10}$
mapLatitudenumber-90 – 90veja o aviso abaixo
mapLongitudenumber-180 – 180veja o aviso abaixo
buildingAreainteger0 – 100.000área construída, em m²
landAreainteger1 – 10.000.000área TOTAL do imóvel, em m² — também em um apartamento
ambiencesinteger0 – 50os ambientes
roomsinteger0 – 50⚠️ são dormitórios, não ambientes
bathroomsinteger0 – 50
toilettesinteger0 – 10
garageinteger0 – 100
floorsinteger0 – 10andares da unidade
totalFloorsinteger0 – 200andares do edifício
apartmentsPerFloorinteger0 – 50
dependenciesinteger0 – 10
yearsOldinteger0 – 300idade, 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

CampoTipoRegra
zone3integer—localidade ou bairro
betweenStreetsstring—
occupancyinteger1 – 50
soldboolean—vendido
rentedboolean—alugado
reservedboolean—reservado
suspendedboolean—publicação suspensa
descriptionFormattedstring—a descrição com suas quebras de linha; se você omitir, usa-se description
conditionsstring—condições da operação — "À vista", "Aceita financiamento"…
urlWebExternalstring—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