Skip to navigation

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: General API — 120 (Starter), 200 (Growth), 300 (Business) or 600 (Enterprise) requests/min per workspace. The 20/min outbound limit does not apply to this route. See 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.

ScopeGET / HEADPOST / PUT / PATCH / DELETEAdmin-only routes
readYesNoNo
writeYesYesNo
fullYesYesYes

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.

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