Report this device as unreachable
Call on teardown so the device leaves the fan-out immediately rather than ringing out for up to one heartbeat interval.
Authorization
deviceAuth A per-device secret issued by POST /v1/devices/enroll, presented as
Authorization: Device <secret>.
A distinct scheme rather than another bearer flavour: the bearer namespace already carries workspace API keys and session JWTs, and a device secret authorises far less than either — it can mint a WebRTC token for its own identity and report presence, and nothing else.
In: header
Response Body
curl -X DELETE "https://example.com/v1/devices/presence"Report this device as reachable POST
Call every 30 seconds while the app is able to take calls. A device that stops beating leaves the extension's fan-out within about a minute; the line's other devices are unaffected.
Stream terminal calls for this device's number GET
Server-Sent Events change-feed of calls that have ENDED on the authenticated device's DID. Scope comes from the device's own line, never from a request parameter. This is not a history endpoint: a fresh connect with no `Last-Event-ID` starts LIVE from now, not a replay — the app loads its recents list and pages back through history via `GET /v1/calls`, which is cursor-paginated for lazy scrolling. Send the `id:` of the last event you processed as `Last-Event-ID` to resume; a malformed cursor is refused (400) rather than coerced to "start live", since that would look like silent data loss to the client. Frames carry only `call_id`, `status`, `missed` and `ended_at` — a pointer, not the full record — so clients fetch the authoritative row from `GET /v1/calls/{id}`. Redelivery is intentional: a call is re-sent whenever its row is updated after hangup (billing, recording-ready), and a fresh connection re-reads a few seconds of overlap to protect against transaction-commit skew. Clients MUST deduplicate on `call_id`. An `event: truncated` frame means more calls remain past this page; reconnect immediately with the advanced cursor and repeat until a connect yields none. An `event: reconnect` frame means the connection reached its 15-minute lifetime cap; reconnect the same way. `: keepalive` comment lines have no `event:` field and should be ignored.