Skip to main content
Version: v1.0

Integration Examples

Concrete payload examples for the Spot2 standard contract.


Standard Webhook​

PROCESSING​

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

REJECTED​

{
"external_id": "PROP-002",
"status": "REJECTED",
"messages": [
"At least one price (rent or sale) must be greater than zero"
]
}

Rental Property​

Your API Returns​

{
"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.your-crm.com/photo-1.jpg",
"https://cdn.your-crm.com/photo-2.jpg",
"https://cdn.your-crm.com/photo-3.jpg"
],
"amenities": [
"aire acondicionado",
"elevador"
]
}

Result​

The property passes blocking validations. Ingestion sends PROCESSING feedback when it accepts it to continue through the publication flow.

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

Rent And Sale Property​

Your API Returns​

{
"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.your-crm.com/local-1.jpg",
"https://cdn.your-crm.com/local-2.jpg",
"https://cdn.your-crm.com/local-3.jpg"
],
"retail": {
"min_height_m": 3.8,
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
}
}

Result​

The property continues with both modalities available. If one operation is removed later, do not report it in deleted_ids; update modality and prices in the main feed.


Property Rejected For Missing Price​

Your API Returns​

{
"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"
}
}

Result​

The property is rejected because at least one price must be greater than 0.

{
"external_id": "PROP-003",
"status": "REJECTED",
"messages": [
"At least one price (rent or sale) must be greater than zero"
]
}

Property With DRAFT Findings​

Your API Returns​

{
"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.your-crm.com/office-1.jpg"
],
"amenities": []
}

Detected Issues​

IssueSeverity
Fewer than 3 photosDRAFT
No amenitiesWARN

Result​

No REJECTED is sent because there are no BLOCK rules. The property may continue as draft or with reduced visibility, depending on the downstream flow.


Land For Sale In USD​

Your API Returns​

{
"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.your-crm.com/terrain-1.jpg",
"https://cdn.your-crm.com/terrain-2.jpg",
"https://cdn.your-crm.com/terrain-3.jpg"
],
"amenities": []
}

Result​

For terrain, land_m2 is used as surface when surface_m2 is missing or non-positive. The public allowed currency is USD; Spot2 applies validations on the converted MXN value when applicable.


Paginated Feed​

Request​

GET /api/v1/spot2/properties?updated_since=2026-07-01T00:00:00Z&offset=0&limit=200 HTTP/1.1
Host: your-crm.com
x-api-key: <your-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
}
}

Deleted Feed​

Request​

GET /api/v1/spot2/properties/deleted?since=2026-07-01T00:00:00Z HTTP/1.1
Host: your-crm.com
x-api-key: <your-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"
}

If there are no deletions:

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