Saltar al contenido principal
Version: v1.0.0

Protocolo de sincronización

Contrato para los endpoints REST que su CRM debe exponer para integrarse con Spot2 Ingestion.


Endpoint de propiedades

Endpoint principal que devuelve las publicaciones activas que el usuario marcó explícitamente para aparecer en Spot2.

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

Parámetros

ParámetroTipoObligatorioDescripción
updated_sinceISO 8601No en primer ciclo; sí en ciclos incrementalesDevuelve publicaciones seleccionadas para Spot2 modificadas desde esta fecha.
offsetintegerDesplazamiento offset-based. El primer request usa 0.
limitintegerTamaño de página solicitado. El valor estándar es 200.

Comportamiento

  • En el primer ciclo no enviamos updated_since; su API debe devolver el catálogo completo de publicaciones activas seleccionadas para Spot2.
  • Después de un ciclo exitoso, enviamos updated_since con el timestamp del último ciclo exitoso.
  • Su API debe devolver solo publicaciones seleccionadas para Spot2 con cambios posteriores a updated_since.
  • Si una propiedad sigue activa en su CRM pero el usuario la retiró de la selección para Spot2, repórtela en el endpoint de eliminados.
  • Si no hay resultados, puede responder 200 con data: [] y meta.next: null, o 204 No Content.

Formato de respuesta

Recomendamos devolver las propiedades bajo data y la paginación bajo meta:

{
"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": "/api/v1/spot2/properties?updated_since=2026-07-01T00:00:00Z&offset=200&limit=200",
"total_count": 580
}
}
CampoTipoDescripción
dataobject[]Lista de propiedades. Cada objeto sigue el Esquema de propiedad.
meta.nextstring o nullURL o indicador de siguiente página. null o ausente cuando no hay más páginas.
meta.total_countintegerOpcional. Total esperado para auditoría.

El contrato estándar recomienda data, pero Spot2 también tolera objects o items como nombre del array de propiedades. Para integraciones nuevas use data.

Paginación

La paginación es offset-based:

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

Spot2 continúa mientras meta.next tenga un valor. El ciclo termina cuando meta.next viene null, vacío o ausente.

Códigos HTTP

StatusSignificado
200Éxito. Feed recibido correctamente.
204Feed vacío. No hay propiedades para procesar en esa página o ciclo.
400Parámetro inválido, por ejemplo updated_since mal formateado.
401 / 403Credencial inválida o sin permiso.
429Rate limit temporal.
503Mantenimiento temporal.

Endpoint de eliminados

Endpoint obligatorio para reportar propiedades eliminadas del CRM o retiradas de la selección para Spot2.

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

Parámetros

ParámetroTipoObligatorioDescripción
sinceISO 8601No en primer ciclo; sí en ciclos incrementalesDevuelve external_id eliminados o retirados de Spot2 desde esta fecha.

En el primer ciclo no enviamos since. Su API puede devolver todos los IDs eliminados que conserve o un conjunto vacío.

Formato de respuesta

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

Si no hay bajas, responda:

{
"deleted_ids": [],
"since": null,
"generated_at": "2026-07-24T15:40:43.143Z"
}
CampoTipoDescripción
deleted_idsstring[]external_id de propiedades eliminadas o retiradas de la selección para Spot2. Obligatorio, incluso si está vacío.
sinceISO 8601 o nullEco del cursor recibido, o null cuando no aplica.
generated_atISO 8601 o nullTimestamp de generación de la respuesta.

También puede responder 204 No Content; Spot2 lo interpreta como deleted_ids: [].

Retención

Su CRM debe retener el historial de eliminaciones al menos 30 días. Si since es más antiguo que su ventana de retención, devuelva todos los IDs eliminados que tenga disponibles.


Autenticación

El contrato estándar recomienda API key por header:

x-api-key: <su-api-key>

También podemos configurar Bearer Token si su plataforma lo requiere:

Authorization: Bearer <su-token>

Requisitos:

  • Credencial dedicada para Spot2.
  • Alcance de solo lectura sobre propiedades y eliminados.
  • Sin expiración automática. Si necesita rotarla, coordine una ventana de transición.

Rate limits y timeout

  • Límite recomendado: al menos 60 requests por minuto para la credencial de Spot2.
  • Si necesita aplicar rate limit o mantenimiento temporal, responda con un código HTTP claro (429 o 503) y un mensaje JSON legible.
  • Timeout operativo estándar: hasta 300 segundos por request. Recomendamos que su API responda mucho antes de ese límite.

Qué no hacer

  • No devuelva todo el inventario del CRM; devuelva solo publicaciones seleccionadas para Spot2.
  • No cambie el orden de los items entre requests paginados del mismo ciclo.
  • No use paginación infinita sin indicador de fin.
  • No reporte eliminaciones por ausencia en el feed principal. Use siempre /properties/deleted.
  • No incluya credenciales en query params.

Próxima lectura