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