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/subscribeAutenticació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:paidUsa 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:
| Campo | Tipo | Descripción |
|---|---|---|
event | string | Clave del evento (p. ej. invoice:created) |
data | object | Payload específico del evento |
timestamp | number | Marca de tiempo Unix (ms) del momento en que se emitió el evento |
traceId | string | ID de traza de OpenTelemetry de la acción de Tillor que provocó este evento (igual que en los webhooks) |
spanId | string (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.