Skip to main content
Version: v1.0

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

  1. rent_price = 8,000 MXN → below minimum (10,000) → BLOCK
  2. photos empty → no photos → DRAFT
  3. floor_level = 6 without floor_level_number → BLOCK
  4. 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

  1. You add a new property in your CRM → it appears in the feed.
  2. We detect it as new, validate it, and publish it.
  3. You receive a webhook with status PROCESSING.
  4. You modify the price in your CRM → updated_at changes.
  5. We detect it as modified and update it on Spot2.
  6. The property is deleted in your CRM → it appears in the /properties/deleted endpoint → we deactivate it.
  7. The delisting is immediate in the same sync cycle.