Skip to Content

Server-Sent Events (SSE)

Recibe eventos en tiempo real mediante una conexión de larga duración

Última actualización el

SSE ofrece un flujo de larga duración con los mismos eventos que reciben los webhooks. Usa SSE si prefieres una conexión persistente a las llamadas HTTP de retorno.

Endpoint

GET /api/orgs/:orgId/realtime/subscribe

Autenticación

SSE usa la misma autenticación que los demás endpoints de la API:

  • x-api-key - Tu clave de API

El ID de la organización va en la ruta de la URL.

Filtrado de eventos

Usa el parámetro de consulta events para filtrar por tipo de evento:

GET /api/orgs/:orgId/realtime/subscribe?events=invoice:created&events=invoice:paid

Usa events=* para recibir todos los eventos (igual que omitir el parámetro).

Consulta el índice de eventos para ver todos los eventos, el permiso de cada uno y un ejemplo de payload.

Unos pocos eventos tienen su propio canal (logs del controlador y E/S del controlador). Solo los recibes con ?channel=controller-logs o ?channel=controller-io; el índice de eventos indica el canal.

Tillor solo entrega eventos para los que el miembro de la organización con sesión iniciada tiene permiso. Sin bank-transactions:read (o sync), por ejemplo, no recibes eventos bankAccountTransaction:*, ni siquiera si no envías ningún filtro events.

Los datos vinculados de otro dominio siguen las mismas reglas que la API: sin customers:read llega un reservation:updated con customer: null, y sin payments:read un invoice:paid con payment: null. Una lista pasa entonces a ser [].


Formato del evento

El payload tiene la misma estructura que las entregas de webhook:

CampoTipoDescripción
eventstringClave del evento (p. ej. invoice:created)
dataobjectPayload específico del evento
timestampnumberMarca de tiempo Unix (ms) del momento en que se emitió el evento
traceIdstringID de traza de OpenTelemetry de la acción de Tillor que provocó este evento (igual que en los webhooks)
spanIdstring (opcional)Span dentro de esa traza

En el flujo SSE, este objeto JSON va en la línea data:; la clave del evento también va en la línea event:. Consulta los ejemplos de SSE para un ejemplo en el cable.


Ejemplo: Node.js

const orgId = "org_abc123";
const apiKey = "tkn_xxx";

const url = `https://app.tillor.eu/api/orgs/${orgId}/realtime/subscribe?events=invoice:created&events=customer:updated`;

const response = await fetch(url, {
  headers: {
    "x-api-key": apiKey,
    "Accept": "text/event-stream",
  },
});

const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;

  const chunk = decoder.decode(value, { stream: true });
  for (const line of chunk.split("\n")) {
    if (line.startsWith("data: ")) {
      const payload = JSON.parse(line.slice(6));
      console.log(payload.event, payload.data);
    }
  }
}

Ejemplo: cURL

curl -N -H "x-api-key: tkn_xxx" \
     -H "Accept: text/event-stream" \
     "https://app.tillor.eu/api/orgs/org_abc123/realtime/subscribe"

Reconexión

Si la conexión se interrumpe, vuelve a conectarte con la misma URL y los mismos encabezados. El flujo no admite reanudación; después de reconectar solo recibes eventos nuevos.


Relacionado

  • OpenAPI - especificación completa de la API
  • API HTTP - claves de API y autenticación
  • Webhooks - los mismos eventos mediante HTTP POST
  • Ejemplos - ejemplos de código y de payload
¿Te ha resultado útil esta página?

En esta página