Open a Server-Sent Events stream that emits each new streamable in-app notification for the traveler as soon as it is persisted, without polling. Every notification frame carries an id: cursor; reconnect with it in Last-Event-ID (or ?since=) to receive every row created since, in order and without repeats. The inbox (GET /v1/me/notifications) stays authoritative and also holds the inbox-only notification types.
Frame vocabulary — two named SSE events, each on its own event:/data: line pair:
-
event: notification— a new streamable in-appNotificationrow for the authenticated traveler.idis an opaque cursor: send the last one received asLast-Event-ID(or?since=) on reconnect to resume after it.datais the JSON-serialisedNotificationOutobject, the same shape returned byGET /v1/me/notifications.event_typesays which event the notification is about; the 200 response lists one example per value. Ignore values you do not recognise:id: AQAGUqHcVHoAAY8sPhI0eryN7wAAAAAAAQ event: notification data: {"id":"00000000-0000-4000-8000-000000000006","trip_id":"00000000-0000-4000-8000-0000000000a1","segment_id":"00000000-0000-4000-8000-0000000000b1","event_type":"segment.delayed","severity":"warning","title":"Delay — Flight","body":"Your trip is delayed by 45m.","deep_link":"bizaway://trips/00000000-0000-4000-8000-0000000000a1?segment=00000000-0000-4000-8000-0000000000b1","channel":"push","dispatched_at":"2026-11-03T07:40:00Z","read_at":null,"is_dedup_skipped":false,"delivery_status":"pending","created_at":"2026-11-03T07:40:00Z"} -
event: done— the server is closing the connection (graceful shutdown).datais always an empty object; reconnect to resume real-time delivery:event: done data: {}
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
401Authentication required
422Last-Event-ID or since is not a valid cursor
429Too many concurrent SSE connections for this traveler
503Fanout or database not available