Importar Propiedades por JSON
Version del documento: v1.0 Fecha: 2026-04-29 Audiencia: Clientes avanzados, integradores, power users
Resumen
El modo JSON es la forma mas rapida y precisa de importar una propiedad cuando ya tenes los datos estructurados. A diferencia de URL y HTML, este modo no usa scraping ni IA: lo que vos pegas es lo que entra al sistema, sin transformaciones automaticas.
Es el modo recomendado si:
- Ya tenes un export desde otro sistema (CRM, ERP, Excel convertido a JSON, etc.)
- Estas haciendo una integracion personalizada
- Queres tener control total sobre los campos sin depender del scraper
Si nunca trabajaste con JSON, te conviene usar URL o HTML primero.
Como funciona
Pegas el JSON -> Mapaprop valida la estructura -> Te muestra los datos en el Editor -> Confirmas -> Propiedad importada
El JSON se carga directo al Editor. Ahi vas a ver todos los campos pre-llenados con lo que pasaste — podes corregir cualquier cosa antes de presionar Importar.
Estructura del JSON
El JSON es un objeto plano (sin envolvente). Si tu fuente lo envuelve en { "data": { ... } }, no hay problema — el sistema desempaca el campo data automaticamente.
Lo minimo que necesitas (ejemplo)
Con esto solo, ya podes importar una propiedad. Despues completas el resto en el Editor.
{
"title": "Departamento 2 ambientes en Palermo",
"description": "Departamento luminoso, balcon a la calle, cocina 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
}
Eso es todo. El resto de los campos (orientacion, expensas, fotos, atributos) podes agregarlos desde el Editor.
Campos: que es cada uno
Identificacion
| Campo | Tipo | Obligatorio | Ejemplo | Descripcion |
|---|---|---|---|---|
title | string | Si | "Casa con jardin" | Titulo publico de la propiedad. Maximo 200 caracteres. |
code | string | No | "DEV-12345" | Codigo interno. Si no lo pasas, Mapaprop genera uno tipo IMP-{timestamp} automatico. |
description | string | Si | "Hermoso depto..." | Descripcion larga (texto plano). |
descriptionFormatted | string | No | "Hermoso depto..." | Misma descripcion pero con saltos de linea formateados. Si no la pasas, copia description. |
urlWebExternal | string | No | "https://otrositio.com" | URL de origen, por si queres conservar el link. |
Tipo de propiedad y operacion
| Campo | Tipo | Obligatorio | Valores comunes |
|---|---|---|---|
type | int | Si | 1=Departamento, 2=Casa, 3=Quinta, 4=Terreno, 10=PH, 23=Desarrollo |
operation | int | Si | 1=Venta, 2=Alquiler, 3=Alquiler temporal |
status | int | No | 1=A estrenar, 2=Excelente, 8=Regular, etc. Default: el sistema lo infiere. |
Lista completa de tipos en docs/mapaprop-mysql/mapaprop-database-mysql-report.md.
Ubicacion
Mapaprop usa una jerarquia de zonas con 4 niveles. Tenes que pasar al menos zone0, zone1, zone2. Si conoces el barrio (zone3) tambien, mejor.
| Campo | Tipo | Obligatorio | Significado | Ejemplo (Argentina) |
|---|---|---|---|---|
zone0 | int | Si | Pais | 1 (Argentina) |
zone1 | int | Si | Provincia | 1 (Capital), 2 (Buenos Aires) |
zone2 | int | Si | Partido / Ciudad / Comuna | 23 (Palermo), 138 (La Matanza) |
zone3 | int | No | Barrio / Localidad | 1340 (Abasto) |
address | str | Si | Calle y altura | "Av. Santa Fe 3500" |
betweenStreets | str | No | Entre calles | "Entre Coronel Diaz y Pueyrredon" |
zipcode | str | No | Codigo postal | "1425" |
mapLatitude | str | No | Latitud (string con decimal) | "-34.5955856" |
mapLongitude | str | No | Longitud | "-58.382166" |
Importante: si pasas el address y los zone*, el Editor te va a mostrar la ubicacion en el mapa para que confirmes. Si no estas seguro de los IDs de zona, podes pasar solo zone3Description (texto del barrio) y el Editor te ayuda a mapearlo.
{
"address": "Av. Santa Fe 3500",
"zone3Description": "Palermo",
"zone2Description": "Capital Federal"
}
Precio
| Campo | Tipo | Obligatorio | Ejemplo | Descripcion |
|---|---|---|---|---|
price | number | Si | 95000 | Precio principal. Solo el numero, sin signos ni puntos. |
currency | string | Si | "USD" | Moneda. Valores: "USD", "ARS", "EUR", etc. |
expensesPrice | number | No | 150000 | Expensas mensuales (para alquileres y propiedades en PH). |
expensesCurrency | string | No | "ARS" | Moneda de las expensas (puede ser distinta del precio). |
taxPrice | number | No | 5000 | Impuestos / ABL. |
taxCurrency | string | No | "ARS" | Moneda de los impuestos. |
paymentPeriod | int | No | 2 | 1=Diario, 2=Mensual, 3=Anual. Default 2 (mensual). |
Caracteristicas fisicas
| Campo | Tipo | Descripcion |
|---|---|---|
landArea | int | Superficie del terreno en m². |
buildingArea | int | Superficie cubierta en m². |
rooms | int | Cantidad de dormitorios (no es lo mismo que ambientes). |
ambiences | int | Total de ambientes (incluye living, cocina, dorms). |
bathrooms | int | Baños completos. |
toilettes | int | Toilettes (medio baños). |
dependencies | int | Dependencias de servicio. |
floors | int | Piso en el que esta el departamento (si aplica). |
totalFloors | int | Cantidad total de pisos del edificio. |
apartmentsPerFloor | int | Departamentos por piso. |
garage | int | Cantidad de cocheras. |
garageType | int | 1=Cubierta, 2=Semicubierta, 3=Descubierta. |
yearsOld | int | Antiguedad en años. 0 = a estrenar. |
orientation | str | "1"=Norte, "2"=Sur, ... "8"=Suroeste. |
Cuidado: rooms ≠ ambiences. Un depto de 3 ambientes con 2 dormitorios tendria ambiences: 3 y rooms: 2.
Amenidades (booleanos)
Todos opcionales. Pasalos como true si la propiedad lo tiene, omitelos si no (no hace falta poner 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
}
Imagenes
{
"mainImage": "https://misitio.com/foto-principal.jpg",
"images": [
{ "url": "https://misitio.com/foto1.jpg", "description": "Living" },
{ "url": "https://misitio.com/foto2.jpg", "description": "Cocina" },
{ "url": "https://misitio.com/foto3.jpg", "description": "Dormitorio" }
]
}
- Las URLs tienen que ser publicas y accesibles desde Internet (Mapaprop las descarga al servidor).
- Si solo tenes una foto principal, pasa
mainImagey dejáimagesvacio o no lo pongas — el sistema arma el array a partir demainImage. - Maximo recomendado: 20 fotos por propiedad.
Estado del negocio
{
"reserved": false,
"sold": false,
"rented": false,
"suspended": false,
"published": true,
"publishedOnlyWebsite": false
}
published: falsedeja la propiedad como borrador (visible solo en tu panel, no se publica en redes ni website).publishedOnlyWebsite: truela publica solo en tu sitio sin enviarla a portales (Zonaprop, MercadoLibre, etc).
Atributos avanzados (no obligatorios)
El array attributes permite pasar amenidades con detalle (categoria, label en español, codigo legacy). Si no lo pasas, Mapaprop infiere los atributos desde los booleanos de la seccion 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
}
]
}
Solo recomendamos usar attributes si estas migrando desde un sistema que ya los exporta en este formato. Para uso normal, los booleanos alcanzan.
Ejemplo completo realista
Este es un JSON valido y completo, listo para pegar en el formulario:
{
"code": "JSON-001",
"title": "Departamento 2 ambientes en Palermo con balcon",
"description": "Departamento luminoso, en piso alto, con balcon a la calle. Cocina integrada al living. Dormitorio con placard. Baño completo con bañera. Edificio con encargado y portero electrico. Cerca de subte y colectivos. Apto credito.",
"operation": 1,
"type": 1,
"address": "Av. Santa Fe 3500",
"betweenStreets": "Entre Coronel Diaz y 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://misitio.com/depto-foto-1.jpg",
"images": [
{ "url": "https://misitio.com/depto-foto-1.jpg", "description": "Living" },
{ "url": "https://misitio.com/depto-foto-2.jpg", "description": "Cocina" },
{ "url": "https://misitio.com/depto-foto-3.jpg", "description": "Dormitorio" },
{ "url": "https://misitio.com/depto-foto-4.jpg", "description": "Balcon" }
],
"published": true,
"urlWebExternal": "https://misitio.com/propiedades/depto-palermo"
}
Errores comunes
| Sintoma | Causa probable | Como arreglarlo |
|---|---|---|
| "El JSON no tiene un formato valido" | Coma de mas, comillas mal cerradas, o usaste comillas simples ' en vez de ". | Pegalo en https://jsonlint.com/ para encontrar el error de sintaxis. |
| "Faltan campos requeridos" | Te falto title, description, operation, type, price, currency o las zonas. | Mira la seccion "Lo minimo que necesitas" arriba. |
| Las imagenes no se cargan | Las URLs no son publicas (requieren login) o devuelven 404. | Probalas pegandolas en el navegador de incognito. Si no abren, no las puede descargar el servidor tampoco. |
| Importa pero las zonas quedan vacias | Pasaste zone3Description en texto pero los IDs zone3 no estan resueltos. | Llena los IDs correctos, o usa el selector de zonas en el Editor despues de pegar el JSON. |
El precio aparece como 0 | Pasaste el precio como string ("95000") o con puntos/comas ("95.000"). | Pasalo como numero sin separadores: 95000. |
rooms y ambiences quedan iguales | Confusion entre dormitorios y ambientes. | rooms=dormitorios, ambiences=total ambientes. Un 3 ambientes con 2 dorms es rooms: 2, ambiences: 3. |
El sistema dice CODE_DUPLICATED | Pasaste un code que ya existe en tu cuenta. | Cambialo o omitelo del JSON (Mapaprop genera uno automatico tipo IMP-{timestamp}). |
Validacion antes de pegar
- Valida el JSON en
https://jsonlint.com/ohttps://jsonformatter.org/. Si el sitio te marca un error de sintaxis, no va a funcionar tampoco en Mapaprop. - Verifica que tenga todos los campos obligatorios:
title,description,operation,type,price,currency,address,zone0,zone1,zone2. - Probalo con el ejemplo minimo primero. Si funciona, vas agregando campos de a poco.
Diferencias entre los 3 modos
| Aspecto | URL | HTML | JSON |
|---|---|---|---|
| Origen del dato | Web scraping en vivo + IA | HTML pegado por el usuario | JSON pegado por el usuario |
| Confiabilidad | Alta para portales conocidos | Alta — bypassea bloqueos | 100% — sin transformaciones |
| Tiempo | 30-90s | 30-60s | Inmediato |
| Requiere conocer el formato | No | No | Si |
| Recomendado para | Uso comun | Sitios con login wall | Power users / integraciones |
Soporte y referencias
- Doc tecnica del objeto Property:
.claude/rules/java-backend/property-object-reference.md - Schema MySQL:
docs/mapaprop-mysql/mapaprop-database-mysql-report.md - Reglas generales de import:
property-import-url-rules.md - Arquitectura:
property-import-url-architecture.md - Ejemplo JSON full:
mapaprop-apps/mapaprop-v2/pages/properties/property-post-v3.json
Si encontras un caso que no cubre esta documentacion, copia el reporte del modal de error y mandalo en un ticket de soporte.