Ejemplos
Ejemplos concretos de request y response entre su CRM y Spot2 Ingestion.
1. Propiedad en renta
Su API devuelve
{
"external_id": "prop-001",
"property_type": "oficina",
"modality": "rent",
"title": "Oficina ejecutiva en Polanco",
"description": "Amplia oficina de 120m2 con vista panorámica.",
"price": {
"rent_price": 45000,
"sale_price": null,
"currency": "MXN"
},
"surface_m2": 120,
"parking_spots": 3,
"bathrooms": 2,
"photos": ["https://cdn.su-crm.com/01.jpg", "https://cdn.su-crm.com/02.jpg"],
"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"
},
"updated_at": "2026-06-29T14:30:00Z"
}
Resultado
Pasa todas las validaciones. Se publica activa en Spot2.
Webhook recibido
{
"external_id": "prop-001",
"status": "PROCESSING"
}
2. Propiedad en renta y venta
Su API devuelve
{
"external_id": "prop-002",
"property_type": "local",
"modality": "rent_and_sale",
"price": {
"rent_price": 35000,
"sale_price": 4500000,
"currency": "MXN"
},
"location": {
"city": "Monterrey",
"state": "Nuevo León"
},
"photos": ["https://cdn.su-crm.com/foto.jpg"],
"retail": {
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
},
"updated_at": "2026-06-29T10:00:00Z"
}
Resultado
Se publica en Spot2 con ambas modalidades disponibles.
3. Propiedad rechazada por precio bajo
Su API devuelve
{
"external_id": "prop-003",
"property_type": "local",
"price": {
"rent_price": 5000,
"currency": "MXN"
},
"location": {
"city": "Monterrey",
"state": "Nuevo León"
},
"updated_at": "2026-06-29T12:00:00Z"
}
Resultado
Se rechaza por precio debajo del mínimo. Webhook:
{
"external_id": "prop-003",
"status": "REJECTED",
"messages": ["Precio de renta por debajo del mínimo permitido (10000 MXN)"]
}
4. Propiedad con moneda USD
Su API devuelve
{
"external_id": "prop-004",
"property_type": "nave_industrial",
"modality": "sale",
"price": {
"rent_price": null,
"sale_price": 2500000,
"currency": "USD"
},
"surface_m2": 5000,
"location": {
"latitude": 32.5149,
"longitude": -117.0382,
"street": "Blvd. Industrial",
"ext_number": "500",
"city": "Tijuana",
"state": "Baja California"
},
"photos": ["https://cdn.su-crm.com/nave.jpg"],
"industrial": {
"max_height_m": 12,
"luminaries": 20,
"luminary_specs": "LED industrial 200W"
},
"updated_at": "2026-06-29T08:00:00Z"
}
Resultado
Se convierte a MXN usando el tipo de cambio del día y se publica. Si el tipo de cambio no está disponible, la propiedad se rechaza con código enrich.block_failed.
5. Propiedad con múltiples rechazos
Su API devuelve
{
"external_id": "prop-005",
"property_type": "oficina",
"price": {
"rent_price": 8000,
"currency": "MXN"
},
"location": {
"city": "Guadalajara",
"state": "Jalisco"
},
"photos": [],
"office": {
"floor_level": 6
},
"updated_at": "2026-06-29T15:00:00Z"
}
Problemas detectados
rent_price= 8,000 MXN → debajo del mínimo (10,000) → BLOCKphotosvacío → sin fotos → DRAFTfloor_level= 6 sinfloor_level_number→ BLOCK- Sin
agent→ sin contacto → DRAFT
Resultado
BLOCK tiene prioridad. No se publica. Webhook:
{
"external_id": "prop-005",
"status": "REJECTED",
"messages": [
"Precio de renta por debajo del mínimo permitido (10000 MXN)",
"floor_level_number es requerido cuando floor_level es 6 (Otro)",
"Se requiere al menos una foto para la calidad del listado",
"No hay información de contacto (teléfono o correo) disponible para el agente"
]
}
6. Terreno
Su API devuelve
{
"external_id": "prop-006",
"property_type": "terreno",
"modality": "sale",
"price": {
"sale_price": 15000000,
"currency": "MXN"
},
"land_m2": 5000,
"location": {
"latitude": 25.7824,
"longitude": -100.3419,
"street": "Av. Parque Industrial",
"neighborhood": "Parque Mitras",
"city": "García",
"state": "Nuevo León",
"postal_code": "66000"
},
"agent": {
"name": "María López",
"email": "maria@inmobiliaria.com"
},
"amenities": ["luz", "accesibilidad"],
"terrain": {
"land_use": "industrial"
},
"updated_at": "2026-06-29T16:00:00Z"
}
Resultado
land_use presente (obligatorio para terrenos). surface_m2 se toma de land_m2. Se publica.
Flujo completo
- Agrega una propiedad nueva en su CRM → aparece en el feed.
- La detectamos como nueva, validamos y publicamos.
- Recibe webhook con status
PROCESSING. - Modifica el precio en su CRM →
updated_atcambia. - La detectamos como modificada y actualizamos en Spot2.
- La propiedad es eliminada en su CRM → aparece en el endpoint
/properties/deleted→ la desactivamos. - La baja es inmediata en el mismo ciclo de sincronización.