Saltar al contenido principal
Version: v1.0.0

Esquema de propiedad

Referencia completa del formato JSON que su API debe devolver por cada propiedad. Este documento es el contrato de datos entre su CRM y Spot2 Ingestion.


Convenciones

  • Nombres de campo en snake_case.
  • Fechas en formato ISO 8601 con zona horaria (ej: 2026-06-29T14:30:00Z).
  • Textos en UTF-8.
  • Campos numéricos: punto decimal, sin separadores de miles.
  • Arrays vacíos: [], no null.
  • Campos nulos (null): equivalen a ausentes.
  • Campos desconocidos: se ignoran. Solo se procesan los campos documentados en este schema.

Estructura del JSON

Cada propiedad se representa como un objeto JSON con esta estructura:

{
"external_id": "prop-12345",
"property_type": "oficina",
"modality": "rent",
"title": "Oficina ejecutiva en Polanco",
"description": "Amplia oficina con vista panorámica...",
"updated_at": "2026-06-29T14:30:00Z",
"surface_m2": 120.5,
"land_m2": null,
"bedrooms": 0,
"bathrooms": 2.0,
"parking_spots": 3,
"photos": [
"https://cdn.su-crm.com/01.jpg",
"https://cdn.su-crm.com/02.jpg"
],
"price": {
"rent_price": 45000.00,
"sale_price": null,
"currency": "MXN"
},
"location": {
"latitude": 19.4326,
"longitude": -99.1332,
"street": "Av. Presidente Masaryk",
"ext_number": "123",
"int_number": "4A",
"neighborhood": "Polanco",
"city": "Ciudad de México",
"state": "Ciudad de México",
"postal_code": "11560"
},
"agent": {
"name": "Juan Pérez",
"email": "juan@broker.com",
"phone": "+525512345678"
},
"amenities": ["aire acondicionado", "elevador", "estacionamiento"],
"office": {
"floor_level": 5,
"floor_level_number": "Piso 5"
}
}

Estructura del objeto price

CampoTipoDescripción
rent_pricenumber o nullPrecio mensual de renta. Obligatorio si modality es rent o rent_and_sale.
sale_pricenumber o nullPrecio de venta. Obligatorio si modality es sale o rent_and_sale.
currencystringCódigo ISO 4217. Por defecto MXN. Ver catálogo de monedas.

Estructura del objeto location

CampoTipoDescripción
latitudenumber o nullLatitud decimal. Recomendado.
longitudenumber o nullLongitud decimal. Recomendado.
streetstringCalle. Obligatorio si envía coordenadas.
ext_numberstringNúmero exterior. Máximo 6 caracteres.
int_numberstringNúmero interior o departamento.
neighborhoodstringColonia o barrio.
citystringCiudad. Obligatorio.
statestringEstado. Obligatorio.
postal_codestringCódigo postal.

Estructura del objeto agent

CampoTipoDescripción
namestringNombre del agente o corredor.
emailstringCorreo electrónico. Recomendado.
phonestringTeléfono. Recomendado.

Propiedades con renta y venta

Cuando una propiedad está disponible para ambas operaciones, envíe ambos precios y establezca modality en rent_and_sale:

{
"external_id": "prop-67890",
"property_type": "local",
"modality": "rent_and_sale",
"price": {
"rent_price": 35000.00,
"sale_price": 4500000.00,
"currency": "MXN"
},
"location": {
"city": "Monterrey",
"state": "Nuevo León"
},
"updated_at": "2026-06-29T10:00:00Z"
}

Si no especifica modality, se determina automáticamente: si solo hay rent_price se asume renta, si solo sale_price venta, si ambos rent_and_sale.


Campos obligatorios

Sin estos campos, la propiedad no se publica.

CampoUbicaciónTipoDescripción
external_idraízstringIdentificador único e inmutable. Máx 255 caracteres.
property_typeraízstringUno de los 7 valores canónicos. Ver catálogo.
location.citylocationstringCiudad. No vacío.
location.statelocationstringEstado. No vacío.
price.rent_price o price.sale_pricepricenumberAl menos uno debe ser mayor a 0.
updated_atraízstringÚltima modificación en ISO 8601.

Catálogo de property_type

Solo se aceptan estos 7 valores. Se reconocen variantes (ej: "oficina virtual" se clasifica como oficina), pero recomendamos usar los valores exactos.

ValorDescripción
oficinaOficina, despacho, corporativo
localLocal comercial, tienda
bodegaBodega de almacenamiento
nave_industrialNave industrial, galpón, fábrica
terrenoTerreno, lote
edificioEdificio completo
local_en_centro_comercialLocal dentro de un centro comercial

Propiedades residenciales (casa, departamento, vivienda) se rechazan automáticamente.


Catálogo de modality

ValorSignificado
rentSolo renta
saleSolo venta
rent_and_saleAmbas operaciones

Catálogo de currency

Códigos ISO 4217. Por defecto MXN. Los precios se convierten a MXN usando el tipo de cambio del día.

CódigoMoneda
MXNPeso mexicano
USDDólar estadounidense

Si envía precios en moneda distinta a MXN y el tipo de cambio no está disponible, la propiedad no se publica. Recomendamos enviar precios en MXN.


Campos recomendados

Si faltan, la propiedad se publica pero con visibilidad reducida.

CampoUbicaciónTipoDescripción
photosraízstring[]URLs de fotos. Mínimo 1 para visibilidad pública.
location.latitude + location.longitudelocationnumberCoordenadas. Sin ellas la propiedad no aparece en el mapa.
agent.email o agent.phoneagentstringAl menos un medio de contacto.

Campos opcionales

Identidad

CampoUbicaciónTipoDescripción
titleraízstringTítulo del anuncio.
descriptionraízstringDescripción libre.

Características físicas

CampoUbicaciónTipoValidación
surface_m2raíznumber o nullSuperficie construida en m². Si > 0, mínimo 3 m².
land_m2raíznumber o nullSuperficie de terreno en m².
bedroomsraízinteger o nullRecámaras. Máximo 20.
bathroomsraíznumber o nullBaños. Acepta decimales (ej: 1.5).
parking_spotsraízinteger o nullCajones de estacionamiento.

Catálogo de amenities

Lista de amenidades que reconocemos. Cada string que envíe se compara por coincidencia de términos contra esta tabla (ignorando artículos como "de", "la", "el"). Los que no coinciden se ignoran.

AmenidadTérminos que la activan
Bañosbaño, baños, bathroom
Wifiwifi, internet
A/Caire acondicionado, climatización
Estacionamientoestacionamiento, parking, cochera
Bodegabodega, almacén
Accesibilidadaccesibilidad, rampa
Luzluz, electricidad
Sistema de seguridadseguridad, vigilancia, cámaras
Montacargasmontacargas
Pizarrónpizarrón, whiteboard
Elevadorelevador, ascensor
Terrazaterraza
Zona de limpiezalimpieza, cleaning
Divisibledivisible
Mezzaninemezzanine, entrepiso
Cocina equipadacocina equipada, kitchenette
Planta de luzplanta de luz, generador
Cocinacocina
Loftloft

Ejemplos:

  • "aire acondicionado" → A/C
  • "estacionamiento para visitas" → Estacionamiento
  • "vigilancia 24/7" → Sistema de seguridad
  • "jardín" → ignorado (no coincide)

Campos por tipo de propiedad

Algunos tipos requieren campos adicionales dentro de un objeto con el nombre del tipo.

Oficina ("property_type": "oficina" o "edificio")

El objeto office es opcional pero sus campos tienen validación si se envían.

CampoUbicaciónTipoValidación
floor_levelofficeintegerNúmero de piso (1 = planta baja). Si es 6, floor_level_number es obligatorio.
floor_level_numberofficestringEtiqueta del piso (ej: "Piso 5"). Obligatorio si floor_level es 6.

Ejemplo:

{
"property_type": "oficina",
"office": {
"floor_level": 5,
"floor_level_number": "Piso 5"
}
}

Industrial ("property_type": "nave_industrial" o "bodega")

CampoUbicaciónTipoValidación
max_height_mindustrialnumberAltura interior máxima. Máximo 30 metros.
min_area_divisible_m2industrialnumberSuperficie mínima divisible. Debe ser ≤ max_area_divisible_m2.
max_area_divisible_m2industrialnumberSuperficie máxima divisible. Debe ser ≥ min_area_divisible_m2.
luminariesindustrialintegerCantidad de luminarias. Si > 0, luminary_specs es obligatorio.
luminary_specsindustrialstringEspecificaciones de luminarias. Obligatorio si luminaries > 0.

Ejemplo:

{
"property_type": "nave_industrial",
"industrial": {
"max_height_m": 12,
"min_area_divisible_m2": 200,
"max_area_divisible_m2": 2000,
"luminaries": 20,
"luminary_specs": "LED industrial 200W"
}
}

Local ("property_type": "local" o "local_en_centro_comercial")

CampoUbicaciónTipoValidación
price_per_sqm_minretailnumberPrecio mínimo por m². Debe ser ≤ price_per_sqm_max.
price_per_sqm_maxretailnumberPrecio máximo por m². Debe ser ≥ price_per_sqm_min.

Ejemplo:

{
"property_type": "local",
"retail": {
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
}
}

Terreno ("property_type": "terreno")

CampoUbicaciónTipoValidación
land_useterrainstringUso de suelo (ej: comercial, industrial, mixto). Obligatorio para terrenos.

Ejemplo:

{
"property_type": "terreno",
"terrain": {
"land_use": "industrial"
}
}

Validaciones de precio

  • Precio mínimo: renta mensual ≥ $10,000 MXN. Venta ≥ $100,000 MXN. Precios menores se rechazan.
  • Precio por m²: se valida contra rangos estadísticos por tipo de propiedad y modalidad. Fuera de rango → visibilidad reducida.
  • Superficie: se valida contra rangos estadísticos por tipo de propiedad. Fuera de rango → visibilidad reducida.

Conversión de moneda

Si envía precios en moneda distinta a MXN:

  1. Se consulta el tipo de cambio del día.
  2. Se convierte el precio a MXN.
  3. Se aplican las validaciones sobre el valor convertido.
  4. Si el tipo de cambio no está disponible, la propiedad se rechaza.

El precio que se muestra en Spot2 siempre está en MXN. Recomendamos convertir precios a MXN del lado de su CRM antes de enviarlos.


Schema canónico vs schema del CRM

El schema documentado aquí es el formato canónico que Spot2 ingiere después del mapeo. Su CRM puede usar nombres diferentes. Spot2 se adapta vía configuración durante la integración.

Ejemplo: Tokko → Spot2

Spot2 (canónico)Tokko (nativo)
property_typeoperation_category (mapeado vía TokkoOperationType)
price.rent_priceoperation_amount cuando operation_type = "Alquiler"
price.sale_priceoperation_amount cuando operation_type = "Venta"
price.currencyoperation_currency
location.cityDerivado de operation_full_location
location.latitudegeo_lat
location.longitudegeo_long
photosphotos[].url
modalityDerivado de los operation_type del publication_ids_map