Server-Sent Events (SSE)
Echtzeit-Events über eine langlaufende Verbindung streamen
Zuletzt aktualisiert am
SSE bietet einen langlaufenden Stream derselben Events, die Webhooks erhalten. Verwenden Sie SSE, wenn Sie eine dauerhafte Verbindung HTTP-Callbacks vorziehen.
Endpunkt
GET /api/orgs/:orgId/realtime/subscribeAuthentifizierung
SSE verwendet dieselbe Authentifizierung wie die anderen API-Endpunkte:
- x-api-key - Ihr API-Schlüssel
Die Organisations-ID steht im Pfad der URL.
Event-Filterung
Verwenden Sie den Query-Parameter events, um nach Event-Typ zu filtern:
GET /api/orgs/:orgId/realtime/subscribe?events=invoice:created&events=invoice:paidVerwenden Sie events=*, um alle Events zu erhalten (wie wenn Sie den Parameter weglassen).
Alle Events, die Berechtigung pro Event und eine Beispiel-Payload finden Sie im Event-Index.
Einige Events liegen auf einem eigenen Kanal (Controller-Logs und Controller-I/O). Diese erhalten Sie nur mit ?channel=controller-logs oder ?channel=controller-io; der Event-Index nennt den Kanal.
Tillor liefert nur Events, für die das angemeldete Organisationsmitglied die Berechtigung hat. Ohne bank-transactions:read (oder Sync) erhalten Sie zum Beispiel keine bankAccountTransaction:*-Events, auch nicht, wenn Sie keinen events-Filter mitsenden.
Verknüpfte Daten aus einem anderen Bereich folgen denselben Regeln wie die API: Ohne customers:read kommt ein reservation:updated mit customer: null an, ohne payments:read ein invoice:paid mit payment: null. Eine Liste wird dann zu [].
Event-Format
Die Payload hat dieselbe Struktur wie Webhook-Zustellungen:
| Feld | Typ | Beschreibung |
|---|---|---|
event | string | Event-Key (z. B. invoice:created) |
data | object | Eventspezifische Payload |
timestamp | number | Unix-Timestamp (ms), zu dem das Event gesendet wurde |
traceId | string | OpenTelemetry-Trace-ID der Tillor-Aktion, die dieses Event ausgelöst hat (wie bei Webhooks) |
spanId | string (optional) | Span innerhalb dieses Traces |
Im SSE-Stream steht dieses JSON-Objekt auf der data:-Zeile; der Event-Key steht auch auf der event:-Zeile. Ein Beispiel auf Protokollebene finden Sie unter SSE-Beispiele.
Beispiel: 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);
}
}
}Beispiel: cURL
curl -N -H "x-api-key: tkn_xxx" \
-H "Accept: text/event-stream" \
"https://app.tillor.eu/api/orgs/org_abc123/realtime/subscribe"Wiederverbinden
Wenn die Verbindung abbricht, verbinden Sie sich mit derselben URL und denselben Headern erneut. Der Stream unterstützt kein Wiederaufsetzen; nach dem Wiederverbinden erhalten Sie nur neue Events.