Retrieve a call

View as Markdown
Returns one call with every stored column (including `transcript`, transfer fields and telemetry), plus the derived `analysis`, `has_recording`, `agent_name`, `campaign_name` and `contact_name`. Use it after a `call.completed` / `call.failed` webhook, or to poll a call you placed with `POST /api/calls`. **Consistency.** Cached for up to 5 minutes per call; the cache is invalidated when the call is closed (post-call webhook, reconciler, manual hang-up). Transcript and analysis arrive after the call ends and can lag it by seconds to minutes. **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. 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).

Path parameters

callIdstringRequiredformat: "uuid"

The call’s id. Must be a UUID (400 Invalid call ID otherwise).

Response

The call.
dataobject

A call as the API serializes it. Field names are snake_case (raw database columns); timestamps are ISO-8601 strings. Vendor identifiers (carrier call SID, voice-provider conversation id) are never returned.

Which fields are present depends on the endpoint:

  • GET /api/calls/{callId} returns every field below.
  • GET /api/calls (list) returns a slimmer row: it omits transcript, first_response_ms, transfer_call_sid, transferred_at, transferred_to, kpi_data, llm_cost_usd, llm_input_tokens, llm_output_tokens, sentiment_timeline, telemetry_fetched_at, tool_call_count, mcp_call_count, rag_lookup_count, tool_result_bytes and dnc_scanned_at.
  • POST /api/calls returns the stored row without the derived fields (analysis, has_recording, agent_name, campaign_name, contact_name).

Telemetry fields are null when not measured, which is not the same as 0. Every field is server-generated; calls cannot be edited through the API.

Errors

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