Ereignisse abrufen

Ein Strom, zwei Transportwege. Polling ist Pflicht, Webhooks sind eine optionale Ergänzung darüber.

Polling Core

GET /events?cursor=<opaque>&limit=100

{
  "events": [
    { "id": "evt_…", "type": "appointment.created", "data": { … } }
  ],
  "nextCursor": "…",
  "hasMore": false
}
Der teuerste Fehler in dieser ganzen Spezifikation

Ein abgelaufener Cursor liefert 410 Gone — niemals eine leere Seite.

Eine Synchronisierung, die stillschweigend erfolgreich ist und dabei nichts synchronisiert, ist der schlimmste denkbare Ausfall hier: Alles wirkt gesund, Termine kommen nicht an, und niemand erfährt es. Behandeln Sie 410 als Aufforderung zur vollständigen Neusynchronisierung — Aufruf ohne Cursor.

Webhooks Extended

Petla implementiert Standard Webhooks: die Kopfzeilen webhook-id, webhook-timestamp und webhook-signature; HMAC-SHA256 über {id}.{timestamp}.{body}, base64-kodiert, mit dem Präfix v1,.

Achtung

Webhooks ersetzen das Polling nicht. Sie verkürzen die Latenz. Ein Partner mit Webhooks, der nicht mehr abruft, verliert jedes Ereignis, dessen Zustellung endgültig fehlschlägt.

Ereignistypen

appointment.created · appointment.rescheduled · appointment.cancelled · appointment.updated · connection.revoked

Achtung

Offene Aufzählung. Ignorieren Sie, was Sie nicht kennen. Petla darf jederzeit einen Typ ergänzen, ohne dass das eine brechende Änderung ist.

connection.revoked

Die Praxis hat die Verbindung bei Petla beendet. Ihr System muss die Aufrufe einstellen; weitere Aufrufe liefern CONNECTION_REVOKED (401). Beendet die Praxis stattdessen bei Ihnen, rufen Sie DELETE /connections/{connectionId} auf.

Nicht tun

Das Trennen einer Verbindung darf auf keiner Seite bereits geschriebene Termine löschen.

Fehler

{
  "code": "SLOT_TAKEN",
  "status": 409,
  "requestId": "K4M2P7RX",
  "fields": { "start": "SLOT_UNAVAILABLE" }
}