> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firetone.com.au/llms.txt
> Use this file to discover all available pages before exploring further.

# Live events

> A WebSocket of what happens as it happens: for wallboards and screen-pops.

`GET /api/v1/events` is a WebSocket carrying the same call events as webhooks,
live, for the organisations your key can see. It suits a wallboard or a
screen-pop in a browser. For anything that must not miss an event, use
[webhooks](/api/webhooks), because they're stored and retried and this stream
isn't.

## Connecting

A browser can't set headers on a WebSocket, so send the token as a
subprotocol:

```js theme={null}
const ws = new WebSocket("wss://api.your-host/api/v1/events", ["firetone.bearer." + key]);
ws.onmessage = (m) => {
  const ev = JSON.parse(m.data);   // { type, organisation_id, team_id, at, data }
  if (ev.type === "call.ringing") popScreen(ev.data.caller);
};
```

A server can send `Authorization: Bearer …` instead. The key needs
`calls:read`, and its IP allowlist applies.

## Messages

```json theme={null}
{ "type": "call.answered", "organisation_id": "f1be…", "at": "2026-09-15T13:50:02Z",
  "data": { "call_uuid": "b0ad…", "caller": "+61412345678", "destination": "1001", "direction": "inbound" } }
```

The types include every `call.*` event, plus the panel's own: `presence.changed`,
`stage.entered` and `stage.left`. A ping every 30 seconds keeps the
connection open. If it drops, reconnect.
