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 define el contrato estándar para integraciones nuevas con Spot2 Ingestion.


Convenciones

  • Nombres de campo en snake_case.
  • Fechas en formato ISO 8601 con zona horaria cuando esté disponible, por ejemplo 2026-07-24T15:40:43Z.
  • Textos en UTF-8.
  • Campos numéricos con punto decimal y sin separadores de miles.
  • Arrays vacíos como [], no como 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:

{
"external_id": "PROP-001",
"property_type": "office",
"modality": "rent",
"title": "Oficina corporativa en Polanco",
"description": "Oficina acondicionada con estacionamiento y aire acondicionado.",
"updated_at": "2026-07-24T15:40:43Z",
"surface_m2": 250.5,
"land_m2": null,
"bedrooms": 0,
"bathrooms": 2.5,
"parking_spots": 4,
"price": {
"currency": "MXN",
"rent_price": 120000,
"sale_price": null
},
"location": {
"latitude": 19.4326,
"longitude": -99.1937,
"street": "Avenida Presidente Masaryk",
"ext_number": "123",
"int_number": "4B",
"neighborhood": "Polanco",
"city": "Ciudad de México",
"state": "Ciudad de México",
"postal_code": "11560"
},
"contact": {
"name": "Broker CRM",
"phone": "525512345678",
"email": "broker@example.com"
},
"office": {
"floor_level": 6,
"floor_level_number": "4"
},
"industrial": {},
"retail": {},
"terrain": {},
"photos": [
"https://cdn.su-crm.com/photo-1.jpg",
"https://cdn.su-crm.com/photo-2.jpg"
],
"amenities": [
"aire acondicionado",
"elevador"
]
}

Identidad y clasificación

CampoUbicaciónTipoRequisito
external_idraízstringObligatorio. Identificador único e inmutable en su sistema. También se acepta id como fallback, pero recomendamos enviar siempre external_id.
property_typeraízstringObligatorio. Uno de office, retail, industrial, terrain.
modalityraízstringObligatorio. Uno de rent, sale, rent_and_sale. Si falta o no se reconoce, se interpreta como rent; envíelo siempre explícito.
titleraízstringOpcional. Si falta, se genera un título operativo a partir del external_id.
descriptionraízstringOpcional, pero recomendado. Se conserva como descripción externa para auditoría y mejora de contenido.
updated_atraízstringRecomendado. Última modificación en su CRM. Se usa para incrementalidad y para detectar inventario posiblemente inactivo.

Catálogo de property_type

Spot2 Ingestion procesa estas 4 familias comerciales:

ValorUso
officeOficinas, corporativos, despachos, consultorios y coworking.
retailLocales comerciales, tiendas, restaurantes, showrooms y espacios en centros comerciales.
industrialBodegas, naves industriales, centros de distribución, fábricas y parques industriales.
terrainTerrenos y lotes comerciales o industriales.

No envíe propiedades residenciales. Casas, departamentos, vivienda y usos principalmente habitacionales se rechazan automáticamente.

Ejemplos de normalización

Si su CRM maneja subtipos internos, normalícelos antes de exponer el feed:

Subtipo interno del CRMEnviar como property_type
oficina, edificio, corporativo, despacho, consultorio, coworkingoffice
local, local comercial, tienda, restaurante, showroom, centro comercial, hotel, bar, cafetería, farmacia, gimnasio, spa, boutiqueretail
bodega, bodega industrial, nave industrial, warehouse, galpón, depósito, parque industrialindustrial
terreno, terreno comercial, terreno industrial, lote, land, plotterrain

Catálogo de modality

ValorSignificado
rentSolo renta.
saleSolo venta.
rent_and_saleDisponible en renta y venta. Envíe ambos precios.

Precio

El objeto price agrupa precios y moneda:

CampoTipoRequisito
rent_pricenumber o nullObligatorio con valor mayor a 0 si modality es rent o rent_and_sale.
sale_pricenumber o nullObligatorio con valor mayor a 0 si modality es sale o rent_and_sale.
currencystringRecomendado. Valores públicos permitidos: MXN, USD. Si falta, se interpreta como MXN.

Ejemplo para renta y venta:

{
"external_id": "PROP-002",
"property_type": "retail",
"modality": "rent_and_sale",
"price": {
"rent_price": 35000,
"sale_price": 4500000,
"currency": "MXN"
}
}

Monedas soportadas

CódigoMoneda
MXNPeso mexicano.
USDDólar estadounidense.

Recomendamos enviar precios en MXN. Si envía USD, Spot2 aplica las validaciones sobre el valor convertido a MXN cuando corresponda.


Ubicación

El objeto location describe dirección y coordenadas:

CampoTipoRequisito
citystringObligatorio para publicar.
statestringObligatorio para publicar.
postal_codestringObligatorio. Debe poder resolverse durante enriquecimiento.
streetstringObligatorio. Se requiere junto con las coordenadas.
ext_numberstringOpcional. Máximo 6 caracteres.
int_numberstringOpcional. Máximo 6 caracteres si se envía.
neighborhoodstringOpcional. Colonia, barrio o zona.
latitudenumberObligatorio. Debe ser distinto de 0.
longitudenumberObligatorio. Debe ser distinto de 0.

Si las coordenadas están confiablemente fuera de México, la propiedad puede publicarse como borrador o con visibilidad reducida.


Contacto

El objeto contact contiene datos del agente o contacto comercial:

CampoTipoRequisito
namestringObligatorio. Nombre del contacto comercial.
emailstringObligatorio. Correo electrónico del contacto.
phonestringObligatorio. Teléfono del contacto.

Si el contacto está bloqueado por políticas de calidad o seguridad, la propiedad no se publica.


Características físicas

CampoUbicaciónTipoRequisito
surface_m2raíznumber o nullRecomendado. Superficie construida en m². Si falta o es no positiva, se trata como desconocida.
land_m2raíznumber o nullRecomendado para terrenos. En terrain, se usa como fallback de superficie cuando surface_m2 falta o es no positiva.
bedroomsraízinteger o nullOpcional. Si se envía, máximo 20.
bathroomsraíznumber o nullOpcional. Acepta decimales, por ejemplo 2.5.
parking_spotsraízinteger o nullOpcional. 0 es válido y significa sin cajones. Si falta, se omite del payload de publicación.

Fotos

CampoTipoRequisito
photosstring[]Recomendado. Sin fotos, o con menos de 3 fotos, la propiedad puede publicarse como borrador o con visibilidad reducida. Recomendamos 3 o más.

Reglas:

  • Envíe URLs públicas http o https; https es recomendado.
  • El orden del array define prioridad visual; la primera imagen se usa como principal cuando aplica.
  • Spot2 puede limitar el payload final de fotos a 20 URLs.

Amenidades

amenities es un array de textos. Se aceptan etiquetas en español o inglés y se mapean al catálogo interno cuando coinciden con una amenidad conocida. Las amenidades no reconocidas se ignoran y no causan rechazo.

También inferimos algunas amenidades desde campos numéricos: bathrooms > 0 agrega baños y parking_spots > 0 agrega estacionamiento.

Valores recomendados:

Valor recomendadoAmenidad
bathrooms o bañosBaños
wifiWi-Fi
air_conditioning o aire acondicionadoAire acondicionado
parking o estacionamientoEstacionamiento
warehouse o bodegaBodega
accessibility o accesibilidadAccesibilidad
electricity o luzElectricidad
security_system o sistema de seguridadSistema de seguridad
forklift o montacargasMontacargas
whiteboard o pizarrónPizarrón
elevator o elevadorElevador
terrace o terrazaTerraza
cleaning_area o zona de limpiezaZona de limpieza
divisiblePosibilidad de dividirse
mezzanineMezzanine
equipped_kitchen o cocina equipadaCocina equipada
backup_generator o planta de luzPlanta de luz
kitchen o cocinaCocina
loft o tapancoTapanco / loft

Campos por tipo de propiedad

Los objetos office, industrial, retail y terrain son opcionales, pero algunos campos tienen validaciones cuando se envían.

Oficina ("property_type": "office")

CampoUbicaciónTipoValidación
floor_levelofficeintegerOpcional. Si es 6, floor_level_number es obligatorio.
floor_level_numberofficestring o numberObligatorio cuando floor_level = 6.
{
"property_type": "office",
"office": {
"floor_level": 6,
"floor_level_number": "4"
}
}

Industrial ("property_type": "industrial")

CampoUbicaciónTipoValidación
min_height_mindustrialnumber o nullAltura libre mínima. Si falta, se interpreta como 0.
max_height_mindustrialnumber o nullAltura libre máxima. Si se envía, min_height_m no debe ser mayor que este valor.
min_area_divisible_m2industrialnumber o nullSuperficie mínima divisible. Debe ser menor o igual que max_area_divisible_m2 cuando ambos existen.
max_area_divisible_m2industrialnumber o nullSuperficie máxima divisible. Debe ser mayor o igual que min_area_divisible_m2 cuando ambos existen.
luminariesindustrialinteger o nullSi es mayor que 0, luminary_specs es obligatorio.
luminary_specsindustrialstring o nullEspecificaciones de luminarias. Obligatorio cuando luminaries > 0.
{
"property_type": "industrial",
"industrial": {
"min_height_m": 4.5,
"max_height_m": 9.2,
"min_area_divisible_m2": 200,
"max_area_divisible_m2": 2000,
"luminaries": 20,
"luminary_specs": "LED industrial 200W"
}
}

Local comercial ("property_type": "retail")

CampoUbicaciónTipoValidación
min_height_mretailnumber o nullAltura libre mínima. Si falta, se interpreta como 0.
price_per_sqm_minretailnumber o nullPrecio mínimo por m². Debe ser menor o igual que price_per_sqm_max cuando ambos existen.
price_per_sqm_maxretailnumber o nullPrecio máximo por m². Debe ser mayor o igual que price_per_sqm_min cuando ambos existen.
{
"property_type": "retail",
"retail": {
"min_height_m": 3.8,
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
}
}

Terreno ("property_type": "terrain")

CampoUbicaciónTipoValidación
land_useterrainstringObligatorio para terrenos cuando el campo está presente en el payload mapeado. Recomendamos enviarlo siempre.
{
"property_type": "terrain",
"surface_m2": 0,
"land_m2": 5000,
"terrain": {
"land_use": "industrial"
}
}

Reglas de publicación

La propiedad se evalúa con tres severidades:

SeveridadResultado
BLOCKNo se publica. Debe corregir el dato en su CRM.
DRAFTSe publica como borrador o con visibilidad interna reducida.
WARNSe publica normalmente, pero queda registrada la falta de amenidades.

Resumen de requisitos críticos para evitar BLOCK:

  • external_id presente.
  • property_type comercial y reconocible.
  • modality válida.
  • Al menos un precio mayor a 0.
  • location.city, location.state, location.street, location.latitude y location.longitude presentes.
  • postal_code resoluble después del enriquecimiento.
  • Números exterior e interior de máximo 6 caracteres cuando se envían.
  • contact.name, contact.email y contact.phone presentes.
  • Reglas por tipo válidas.
  • El contacto no debe estar bloqueado.
  • La descripción no debe indicar una propiedad residencial.

Para el catálogo completo de reglas, consulte Reglas de validación.


Integraciones custom

Si su CRM no puede exponer este contrato exacto, la integración requiere un adapter custom fuera de este documento.