Examples
Concrete request and response examples between your CRM and Spot2 Ingestion.
1. Rental property
Your API returns
{
"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.your-crm.com/01.jpg", "https://cdn.your-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"
}
Result
Passes all validations. Published as active on Spot2.
Webhook received
{
"external_id": "prop-001",
"status": "PROCESSING"
}
2. Rent and sale property
Your API returns
{
"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.your-crm.com/foto.jpg"],
"retail": {
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
},
"updated_at": "2026-06-29T10:00:00Z"
}
Result
Published on Spot2 with both modalities available.
3. Property rejected for low price
Your API returns
{
"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"
}
Result
Rejected for price below minimum. Webhook:
{
"external_id": "prop-003",
"status": "REJECTED",
"messages": ["Precio de renta por debajo del mínimo permitido (10000 MXN)"]
}
4. Property with USD currency
Your API returns
{
"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.your-crm.com/nave.jpg"],
"industrial": {
"max_height_m": 12,
"luminaries": 20,
"luminary_specs": "LED industrial 200W"
},
"updated_at": "2026-06-29T08:00:00Z"
}
Result
Converted to MXN using the day's exchange rate and published. If the exchange rate is unavailable, the property is rejected with code enrich.block_failed.
5. Property with multiple rejections
Your API returns
{
"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"
}
Issues detected
rent_price= 8,000 MXN → below minimum (10,000) → BLOCKphotosempty → no photos → DRAFTfloor_level= 6 withoutfloor_level_number→ BLOCK- No
agent→ no contact → DRAFT
Result
BLOCK takes priority. Not published. 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. Land
Your API returns
{
"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"
}
Result
land_use present (required for land). surface_m2 taken from land_m2. Published.
Full flow
- You add a new property in your CRM → it appears in the feed.
- We detect it as new, validate it, and publish it.
- You receive a webhook with status
PROCESSING. - You modify the price in your CRM →
updated_atchanges. - We detect it as modified and update it on Spot2.
- The property is deleted in your CRM → it appears in the
/properties/deletedendpoint → we deactivate it. - The delisting is immediate in the same sync cycle.