List calls

View as Markdown
Returns the workspace's calls, inbound and outbound, newest first (`created_at` descending), optionally filtered by agent and/or campaign. Use `GET /api/calls/{callId}` for the transcript and the detail-only columns. Two pagination styles are supported; use one or the other: - **Cursor**: pass the previous page's `nextCursor` as `cursor`. `nextCursor` is non-null whenever the page came back full (exactly `limit` rows), so the last page can be followed by one empty page. The cursor is the `created_at` of the last row and pages with a strict "created before" comparison. - **Offset**: pass `offset` for a numbered pager. When `offset` is greater than 0 it takes precedence and `cursor` is ignored. `total` is always the count of every call matching the filters. List rows omit the large or detail-only columns (`transcript`, `transfer_*`, `kpi_data`, token counts, `sentiment_timeline`, execution counters and a few more); see the `Call` schema for the exact list. Vendor identifiers (carrier call SID, voice-provider conversation id) are never returned. **Consistency.** Pages are cached for up to 60 seconds per exact combination of parameters. A manual hang-up invalidates the cache; post-call updates may take up to a minute to appear here, while `GET /api/calls/{callId}` is invalidated on the same events. **Idempotency.** Read-only; safe to retry. **Access** - **Required scope:** `read` (or `write`). - **Rate limit:** Outbound — 20 requests/min per workspace, shared by every `/api/calls` endpoint including reads. See [Rate limits](/rate-limits). - **Plan:** Available on every plan.

Authentication

AuthorizationBearer
Workspace API key: `jl_` followed by 64 lowercase hex characters, created by the workspace owner in the dashboard (**Settings → API Keys**) and sent as `Authorization: Bearer jl_...`. The plaintext is shown once, at creation; Jelliu stores only a SHA-256 hash. A workspace can hold up to 25 active keys. | Scope | GET / HEAD | POST / PUT / PATCH / DELETE | Admin-only routes | | --- | --- | --- | --- | | `read` | Yes | No | No | | `write` | Yes | Yes | No | | `full` | Yes | Yes | Yes | Operations restricted to admins or owners reject keys without the `full` scope with `403`, and say so in their description. No key, whatever its scope, can mint or revoke API keys or rotate a webhook secret — that requires a signed-in owner session. A revoked key stops authenticating within about 10 seconds. See [Authentication](/authentication).

Query parameters

limitintegerOptional1-100Defaults to 50

Page size, 1 to 100. A value outside the range or not an integer is rejected with 400 (it is not clamped).

cursordatetimeOptional

The nextCursor of the previous page (an ISO-8601 created_at timestamp). Returns calls created strictly before it. The value is not validated, so pass back exactly what you received. Ignored when offset is greater than 0.

offsetintegerOptional0-100000Defaults to 0

Rows to skip for numbered pagination, 0 to 100000 (400 outside the range). Takes precedence over cursor when greater than 0.

agentIdstringOptionalformat: "uuid"

Only calls served by this agent. Must be a UUID (400 otherwise). An agent of another workspace simply matches nothing.

campaignIdstringOptionalformat: "uuid"

Only calls filed under this campaign. Must be a UUID (400 otherwise).

Response

One page of calls.
dataobject

Errors

400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
429
Too Many Requests Error