Saltar al contenido principal
Version: v1.0.0

Ejemplos de integración

Ejemplos concretos de payloads para el contrato estándar Spot2.


Webhook estándar

PROCESSING

{
"external_id": "PROP-001",
"status": "PROCESSING"
}

REJECTED

{
"external_id": "PROP-002",
"status": "REJECTED",
"messages": [
"Al menos un precio (renta o venta) debe ser mayor a cero"
]
}

Propiedad en renta

Su API devuelve

{
"external_id": "PROP-001",
"property_type": "office",
"modality": "rent",
"title": "Oficina corporativa en Polanco",
"description": "Oficina acondicionada de 250 m2 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"
},
"photos": [
"https://cdn.su-crm.com/photo-1.jpg",
"https://cdn.su-crm.com/photo-2.jpg",
"https://cdn.su-crm.com/photo-3.jpg"
],
"amenities": [
"aire acondicionado",
"elevador"
]
}

Resultado

La propiedad pasa las validaciones bloqueantes. Ingestion envía feedback PROCESSING cuando la acepta para continuar con el flujo de publicación.

{
"external_id": "PROP-001",
"status": "PROCESSING"
}

Propiedad en renta y venta

Su API devuelve

{
"external_id": "PROP-002",
"property_type": "retail",
"modality": "rent_and_sale",
"title": "Local comercial en avenida principal",
"updated_at": "2026-07-24T15:40:43Z",
"surface_m2": 180,
"price": {
"currency": "MXN",
"rent_price": 35000,
"sale_price": 4500000
},
"location": {
"latitude": 25.6866,
"longitude": -100.3161,
"street": "Av. Constitución",
"city": "Monterrey",
"state": "Nuevo León",
"postal_code": "64000"
},
"contact": {
"name": "María López",
"email": "maria@example.com",
"phone": "528112345678"
},
"photos": [
"https://cdn.su-crm.com/local-1.jpg",
"https://cdn.su-crm.com/local-2.jpg",
"https://cdn.su-crm.com/local-3.jpg"
],
"retail": {
"min_height_m": 3.8,
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
}
}

Resultado

La propiedad continúa con ambas modalidades disponibles. Si una operación se elimina después, no la reporte en deleted_ids; actualice modality y precios en el feed principal.


Propiedad rechazada por falta de precio

Su API devuelve

{
"external_id": "PROP-003",
"property_type": "retail",
"modality": "rent",
"updated_at": "2026-07-24T15:40:43Z",
"price": {
"currency": "MXN",
"rent_price": 0,
"sale_price": null
},
"location": {
"latitude": 25.6866,
"longitude": -100.3161,
"street": "Av. Constitución",
"city": "Monterrey",
"state": "Nuevo León",
"postal_code": "64000"
},
"contact": {
"name": "Broker CRM",
"email": "broker@example.com",
"phone": "528112345678"
}
}

Resultado

Se rechaza porque al menos un precio debe ser mayor a 0.

{
"external_id": "PROP-003",
"status": "REJECTED",
"messages": [
"Al menos un precio (renta o venta) debe ser mayor a cero"
]
}

Propiedad con hallazgos DRAFT

Su API devuelve

{
"external_id": "PROP-004",
"property_type": "office",
"modality": "rent",
"updated_at": "2026-07-24T15:40:43Z",
"surface_m2": 120,
"price": {
"currency": "MXN",
"rent_price": 45000,
"sale_price": null
},
"location": {
"latitude": 20.6597,
"longitude": -103.3496,
"street": "Av. Vallarta",
"city": "Guadalajara",
"state": "Jalisco",
"postal_code": "44100"
},
"contact": {
"name": "Broker CRM",
"email": "broker@example.com",
"phone": "523312345678"
},
"photos": [
"https://cdn.su-crm.com/office-1.jpg"
],
"amenities": []
}

Problemas detectados

ProblemaSeveridad
Menos de 3 fotosDRAFT
Sin amenidadesWARN

Resultado

No se envía REJECTED porque no hay reglas BLOCK. La propiedad puede continuar como borrador o con visibilidad reducida, según el flujo downstream.


Terreno con venta en USD

Su API devuelve

{
"external_id": "PROP-005",
"property_type": "terrain",
"modality": "sale",
"title": "Terreno industrial en Querétaro",
"description": "Terreno con uso de suelo industrial.",
"updated_at": "2026-07-24T15:40:43Z",
"surface_m2": 0,
"land_m2": 5000,
"price": {
"currency": "USD",
"rent_price": null,
"sale_price": 1500000
},
"location": {
"latitude": 20.5888,
"longitude": -100.3899,
"street": "Carretera estatal 100",
"city": "Querétaro",
"state": "Querétaro",
"postal_code": "76000"
},
"contact": {
"name": "Broker CRM",
"email": "broker@example.com",
"phone": "524421234567"
},
"terrain": {
"land_use": "industrial"
},
"photos": [
"https://cdn.su-crm.com/terrain-1.jpg",
"https://cdn.su-crm.com/terrain-2.jpg",
"https://cdn.su-crm.com/terrain-3.jpg"
],
"amenities": []
}

Resultado

Para terrain, land_m2 se usa como superficie cuando surface_m2 falta o no es positiva. La moneda pública permitida es USD; Spot2 aplica validaciones sobre el valor convertido a MXN cuando corresponda.


Feed paginado

Request

GET /api/v1/spot2/properties?updated_since=2026-07-01T00:00:00Z&offset=0&limit=200 HTTP/1.1
Host: su-crm.com
x-api-key: <su-api-key>
Accept: application/json

Response

{
"data": [
{
"external_id": "PROP-001",
"property_type": "office",
"modality": "rent",
"updated_at": "2026-07-24T15:40:43Z",
"price": {
"currency": "MXN",
"rent_price": 120000,
"sale_price": null
},
"location": {
"latitude": 19.4326,
"longitude": -99.1937,
"street": "Avenida Presidente Masaryk",
"city": "Ciudad de México",
"state": "Ciudad de México",
"postal_code": "11560"
},
"contact": {
"name": "Broker CRM",
"email": "broker@example.com",
"phone": "525512345678"
}
}
],
"meta": {
"next": null,
"total_count": 1
}
}

Feed de eliminados

Request

GET /api/v1/spot2/properties/deleted?since=2026-07-01T00:00:00Z HTTP/1.1
Host: su-crm.com
x-api-key: <su-api-key>
Accept: application/json

Response

{
"deleted_ids": ["PROP-006", "PROP-007"],
"since": "2026-07-01T00:00:00Z",
"generated_at": "2026-07-24T15:40:43.143Z"
}

Si no hay bajas:

{
"deleted_ids": [],
"since": null,
"generated_at": "2026-07-24T15:40:43.143Z"
}