List the events of a Call
GET /v1/calls/{call_id}/events
| Property | Value |
|---|---|
| Operation | list_call_events |
| Group | Calls |
| Scope | calls:read |
| Route class | read |
| Idempotency | No Idempotency-Key |
| Audit | Not audited: A metadata read; Call events carry no content. |
| Released in | 1.18.0 |
| Phase 0 host | Served (the hosted api pins 1.65.0) |
The events of one Call, oldest first by at and then seq, as identifiers, codes, numbers and booleans, never content (1.18.0). From 1.27.0 the api stores each event when it records the change the event describes (workspace ADR 0076), so a Call answers its events so far while it runs: its creation, ringing, answer, an end request, its end and what LiveKit reported before the end. The events the worker reports through its trace marks (settings.resolved, provider.failover, recording.uploaded, dial.answered and disclosure.played) are recorded at finalize and take their place by at, so a page read before finalize can lack events that a later read shows before the last row it returned; a reader that needs every event reads the list again once the Call has ended. A Call finalized before the api stored its events is served from its trace marks, with the five earlier types only.
Request
Set VOCAL_API to the base URL of your API and VOCAL_API_KEY to an API key with the calls:read scope (Authentication and keys). Replace each placeholder, such as agt_... or <name>, with your own value.
curl "$VOCAL_API/v1/calls/call_.../events" \
-H "Authorization: Bearer $VOCAL_API_KEY"const response = await fetch(`${process.env.VOCAL_API}/v1/calls/call_.../events`, {
headers: {
Authorization: `Bearer ${process.env.VOCAL_API_KEY}`,
},
});
console.log(response.status, await response.text());import os
import requests
response = requests.get(
f"{os.environ['VOCAL_API']}/v1/calls/call_.../events",
headers={
"Authorization": f"Bearer {os.environ['VOCAL_API_KEY']}",
},
)
print(response.status_code, response.text)Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
call_id | path | CallId | yes | The id of a Call: call_ and the row's UUIDv7 in 26 Crockford base32 characters. Opaque and safe to log. |
limit | query | integer | no | The page size, 1 to 100. |
cursor | query | string | no | The opaque next_cursor of the previous page; it binds the filters it was issued under. |
Responses
| Status | Content type | Shape | Error codes |
|---|---|---|---|
200 | application/json | CallEventList | |
400 | application/json | ErrorEnvelope | invalid_request, invalid_cursor |
401 | application/json | ErrorEnvelope | unauthenticated |
403 | application/json | ErrorEnvelope | forbidden |
404 | application/json | ErrorEnvelope | not_found |
429 | application/json | ErrorEnvelope | rate_limited |
500 | application/json | ErrorEnvelope | internal_error |
Fields of the 200 answer
The shape is CallEventList.
| Field | Type | Required | Description |
|---|---|---|---|
data | array of CallEvent | yes | The Call events of this page, oldest first, by at and then seq. |
has_more | boolean | yes | True when a further page exists. |
next_cursor | string or null | yes | The cursor of the next page, or null on the last page. |
object | "list" | yes |