Importar Propriedades por JSON
Versão do documento: v1.0 Data: 2026-04-29 Audiência: Clientes avançados, integradores, power users
Resumo
O modo JSON é a forma mais rápida e precisa de importar uma propriedade quando você já tem os dados estruturados. Diferente de URL e HTML, este modo não usa scraping nem IA: o que você cola é o que entra no sistema, sem transformações automáticas.
É o modo recomendado se:
- Você já tem uma exportação de outro sistema (CRM, ERP, Excel convertido para JSON, etc.)
- Está fazendo uma integração personalizada
- Quer ter controle total sobre os campos sem depender do scraper
Se você nunca trabalhou com JSON, convém usar URL ou HTML primeiro.
Como funciona
Cola o JSON -> Mapaprop valida a estrutura -> Mostra os dados no Editor -> Você confirma -> Propriedade importada
O JSON é carregado direto no Editor. Ali você verá todos os campos preenchidos com o que passou — pode corrigir qualquer coisa antes de pressionar Importar.
Estrutura do JSON
O JSON é um objeto plano (sem envelope). Se sua fonte o envolve em { "data": { ... } }, não há problema — o sistema desempacota o campo data automaticamente.
O mínimo que você precisa (exemplo)
Só com isso, já pode importar uma propriedade. Depois você completa o resto no Editor.
{
"title": "Apartamento 2 ambientes em Palermo",
"description": "Apartamento luminoso, varanda para a rua, cozinha integrada.",
"operation": 1,
"type": 1,
"price": 95000,
"currency": "USD",
"address": "Avenida Santa Fe 3500",
"zone0": 1,
"zone1": 1,
"zone2": 23,
"zone3": 1340,
"rooms": 1,
"bathrooms": 1,
"buildingArea": 45
}
Isso é tudo. O resto dos campos (orientação, despesas, fotos, atributos) você pode adicionar no Editor.
Campos: o que é cada um
Identificação
| Campo | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
title | string | Sim | "Casa com jardim" | Título público da propriedade. Máximo 200 caracteres. |
code | string | Não | "DEV-12345" | Código interno. Se não passar, Mapaprop gera um tipo IMP-{timestamp} automático. |
description | string | Sim | "Lindo apto..." | Descrição longa (texto plano). |
descriptionFormatted | string | Não | "Lindo apto..." | Mesma descrição mas com quebras de linha formatadas. Se não passar, copia description. |
urlWebExternal | string | Não | "https://outrosite.com" | URL de origem, caso queira conservar o link. |
Tipo de propriedade e operação
| Campo | Tipo | Obrigatório | Valores comuns |
|---|---|---|---|
type | int | Sim | 1=Apartamento, 2=Casa, 3=Chácara, 4=Terreno, 10=PH, 23=Desenvolvimento |
operation | int | Sim | 1=Venda, 2=Aluguel, 3=Aluguel temporário |
status | int | Não | 1=A estrear, 2=Excelente, 8=Regular, etc. Default: o sistema infere. |
Lista completa de tipos em docs/mapaprop-mysql/mapaprop-database-mysql-report.md.
Localização
Mapaprop usa uma hierarquia de zonas com 4 níveis. Você deve passar pelo menos zone0, zone1, zone2. Se conhece o bairro (zone3) também, melhor.
| Campo | Tipo | Obrigatório | Significado | Exemplo (Argentina) |
|---|---|---|---|---|
zone0 | int | Sim | País | 1 (Argentina) |
zone1 | int | Sim | Província | 1 (Capital), 2 (Buenos Aires) |
zone2 | int | Sim | Município / Cidade / Comuna | 23 (Palermo), 138 (La Matanza) |
zone3 | int | Não | Bairro / Localidade | 1340 (Abasto) |
address | str | Sim | Rua e número | "Av. Santa Fe 3500" |
betweenStreets | str | Não | Entre ruas | "Entre Coronel Diaz e Pueyrredon" |
zipcode | str | Não | Código postal | "1425" |
mapLatitude | str | Não | Latitude (string com decimal) | "-34.5955856" |
mapLongitude | str | Não | Longitude | "-58.382166" |
Importante: se passar o address e os zone*, o Editor mostrará a localização no mapa para você confirmar. Se não tem certeza dos IDs de zona, pode passar só zone3Description (texto do bairro) e o Editor ajuda a mapear.
{
"address": "Av. Santa Fe 3500",
"zone3Description": "Palermo",
"zone2Description": "Capital Federal"
}
Preço
| Campo | Tipo | Obrigatório | Exemplo | Descrição |
|---|---|---|---|---|
price | number | Sim | 95000 | Preço principal. Só o número, sem sinais nem pontos. |
currency | string | Sim | "USD" | Moeda. Valores: "USD", "ARS", "EUR", etc. |
expensesPrice | number | Não | 150000 | Despesas mensais (para aluguéis e propriedades em PH). |
expensesCurrency | string | Não | "ARS" | Moeda das despesas (pode ser diferente do preço). |
taxPrice | number | Não | 5000 | Impostos / IPTU. |
taxCurrency | string | Não | "ARS" | Moeda dos impostos. |
paymentPeriod | int | Não | 2 | 1=Diário, 2=Mensal, 3=Anual. Default 2 (mensal). |
Características físicas
| Campo | Tipo | Descrição |
|---|---|---|
landArea | int | Área do terreno em m². |
buildingArea | int | Área construída em m². |
rooms | int | Quantidade de dormitórios (não é o mesmo que ambientes). |
ambiences | int | Total de ambientes (inclui sala, cozinha, dorms). |
bathrooms | int | Banheiros completos. |
toilettes | int | Lavabos (meio banheiros). |
dependencies | int | Dependências de serviço. |
floors | int | Andar em que está o apartamento (se aplicável). |
totalFloors | int | Quantidade total de andares do edifício. |
apartmentsPerFloor | int | Apartamentos por andar. |
garage | int | Quantidade de vagas de garagem. |
garageType | int | 1=Coberta, 2=Semicoberta, 3=Descoberta. |
yearsOld | int | Idade em anos. 0 = a estrear. |
orientation | str | "1"=Norte, "2"=Sul, ... "8"=Sudoeste. |
Cuidado: rooms ≠ ambiences. Um apartamento de 3 ambientes com 2 dormitórios teria ambiences: 3 e rooms: 2.
Comodidades (booleanos)
Todos opcionais. Passe como true se a propriedade tem, omita se não (não precisa colocar false).
{
"hasSwimmingPool": true,
"hasPatio": true,
"hasLaundry": true,
"hasStorage": true,
"hasSecurity": true,
"hasPrivateElevator": true,
"terrace": true,
"frontGarden": true,
"grill": true,
"janitor": true,
"suite": true,
"playroom": true,
"furnished": true,
"accessible": true,
"laundryMachine": true,
"wifi": true,
"alarm": true,
"securityBox": true,
"partySaloon": true,
"jacuzzi": true,
"barbecueArea": true,
"electricGenerator": true,
"gatedCommunity": true,
"countryClub": true,
"park": true,
"mortgageReady": true,
"professionalAvailable": true,
"petsReady": true,
"telephoneLine": true,
"cableIncluded": true
}
Imagens
{
"mainImage": "https://meusite.com/foto-principal.jpg",
"images": [
{ "url": "https://meusite.com/foto1.jpg", "description": "Sala" },
{ "url": "https://meusite.com/foto2.jpg", "description": "Cozinha" },
{ "url": "https://meusite.com/foto3.jpg", "description": "Dormitório" }
]
}
- As URLs devem ser públicas e acessíveis pela Internet (Mapaprop as baixa no servidor).
- Se você só tem uma foto principal, passe
mainImagee deixeimagesvazio ou não coloque — o sistema monta o array a partir demainImage. - Máximo recomendado: 20 fotos por propriedade.
Estado do negócio
{
"reserved": false,
"sold": false,
"rented": false,
"suspended": false,
"published": true,
"publishedOnlyWebsite": false
}
published: falsedeixa a propriedade como rascunho (visível só no seu painel, não se publica em redes nem website).publishedOnlyWebsite: truea publica só no seu site sem enviar para portais (Zonaprop, MercadoLibre, etc).
Atributos avançados (não obrigatórios)
O array attributes permite passar comodidades com detalhe (categoria, label em espanhol, código legacy). Se não passar, Mapaprop infere os atributos dos booleanos da seção anterior.
{
"attributes": [
{
"locale": "es_AR",
"country": "ar",
"id": "swimming-pool",
"label": "Piscina",
"group": "propertyAttribute",
"group_sub": "label",
"group_subtype": "ammenities",
"type": "bool",
"key_legacy": "hasSwimmingPool",
"selected": true,
"status": true
}
]
}
Só recomendamos usar attributes se você está migrando de um sistema que já os exporta neste formato. Para uso normal, os booleanos bastam.
Exemplo completo realista
Este é um JSON válido e completo, pronto para colar no formulário:
{
"code": "JSON-001",
"title": "Apartamento 2 ambientes em Palermo com varanda",
"description": "Apartamento luminoso, em andar alto, com varanda para a rua. Cozinha integrada à sala. Dormitório com armário embutido. Banheiro completo com banheira. Edifício com zelador e porteiro eletrônico. Perto de metrô e ônibus. Aceita financiamento.",
"operation": 1,
"type": 1,
"address": "Av. Santa Fe 3500",
"betweenStreets": "Entre Coronel Diaz e Pueyrredon",
"zone0": 1,
"zone1": 1,
"zone2": 23,
"zone3": 22097,
"zipcode": "1425",
"mapLatitude": "-34.5955856",
"mapLongitude": "-58.382166",
"price": 95000,
"currency": "USD",
"expensesPrice": 80000,
"expensesCurrency": "ARS",
"rooms": 1,
"ambiences": 2,
"bathrooms": 1,
"toilettes": 0,
"buildingArea": 45,
"landArea": 45,
"floors": 7,
"totalFloors": 12,
"apartmentsPerFloor": 4,
"yearsOld": 8,
"orientation": "1",
"airConditioner": 2,
"heatingType": 4,
"waterHeaterType": 2,
"balconyType": 1,
"hasLaundry": true,
"laundryMachine": true,
"hasSecurity": true,
"janitor": true,
"mortgageReady": true,
"terrace": true,
"mainImage": "https://meusite.com/apto-foto-1.jpg",
"images": [
{ "url": "https://meusite.com/apto-foto-1.jpg", "description": "Sala" },
{ "url": "https://meusite.com/apto-foto-2.jpg", "description": "Cozinha" },
{ "url": "https://meusite.com/apto-foto-3.jpg", "description": "Dormitório" },
{ "url": "https://meusite.com/apto-foto-4.jpg", "description": "Varanda" }
],
"published": true,
"urlWebExternal": "https://meusite.com/propriedades/apto-palermo"
}
Erros comuns
| Sintoma | Causa provável | Como corrigir |
|---|---|---|
| "O JSON não tem um formato válido" | Vírgula a mais, aspas mal fechadas, ou você usou aspas simples ' em vez de ". | Cole em https://jsonlint.com/ para encontrar o erro de sintaxe. |
| "Faltam campos requeridos" | Faltou title, description, operation, type, price, currency ou as zonas. | Veja a seção "O mínimo que você precisa" acima. |
| As imagens não carregam | As URLs não são públicas (requerem login) ou retornam 404. | Teste colando-as no navegador em modo anônimo. Se não abrem, o servidor também não pode baixá-las. |
| Importa mas as zonas ficam vazias | Você passou zone3Description em texto mas os IDs zone3 não estão resolvidos. | Preencha os IDs corretos, ou use o seletor de zonas no Editor depois de colar o JSON. |
O preço aparece como 0 | Você passou o preço como string ("95000") ou com pontos/vírgulas ("95.000"). | Passe como número sem separadores: 95000. |
rooms e ambiences ficam iguais | Confusão entre dormitórios e ambientes. | rooms=dormitórios, ambiences=total de ambientes. Um 3 ambientes com 2 dorms é rooms: 2, ambiences: 3. |
O sistema diz CODE_DUPLICATED | Você passou um code que já existe na sua conta. | Mude ou omita do JSON (Mapaprop gera um automático tipo IMP-{timestamp}). |
Validação antes de colar
- Valide o JSON em
https://jsonlint.com/ouhttps://jsonformatter.org/. Se o site marcar um erro de sintaxe, também não funcionará no Mapaprop. - Verifique que tem todos os campos obrigatórios:
title,description,operation,type,price,currency,address,zone0,zone1,zone2. - Teste com o exemplo mínimo primeiro. Se funciona, vá adicionando campos aos poucos.
Diferenças entre os 3 modos
| Aspecto | URL | HTML | JSON |
|---|---|---|---|
| Origem do dado | Web scraping ao vivo + IA | HTML colado pelo usuário | JSON colado pelo usuário |
| Confiabilidade | Alta para portais conhecidos | Alta — bypassa bloqueios | 100% — sem transformações |
| Tempo | 30-90s | 30-60s | Imediato |
| Requer conhecer o formato | Não | Não | Sim |
| Recomendado para | Uso comum | Sites com login wall | Power users / integrações |
Suporte e referências
- Doc técnica do objeto Property:
.claude/rules/java-backend/property-object-reference.md - Schema MySQL:
docs/mapaprop-mysql/mapaprop-database-mysql-report.md - Regras gerais de import:
property-import-url-rules.md - Arquitetura:
property-import-url-architecture.md - Exemplo JSON full:
mapaprop-apps/mapaprop-v2/pages/properties/property-post-v3.json
Se encontrar um caso que não cobre esta documentação, copie o relatório do modal de erro e envie em um ticket de suporte.