Retrieve conversation quality

View as Markdown
Returns how the calls went, as opposed to how they ended: agent response latency (average, median, p90, worst), who did the talking, turns and interruptions, sentiment and frustration, cost in credits and USD, the voice provider's success score, average duration, and the most common termination reasons, languages and call sources. Every block carries its own `sampleSize`: the calls that actually had that measurement. Telemetry (latency, talk time, turns, cost, success score, termination reason, language, source) was first captured on 2026-09-03, so older calls are excluded from those blocks unless they were backfilled. Always read an average together with its sample size. **Filters.** `days` sets the window (rolling, ending now; missing or out-of-range values become 30; echoed as `windowDays`). `direction`, `campaignId` and `agentId` narrow every block. `timezone` is accepted but not used (a value longer than 50 characters is still a `400`). **No data.** Sample sizes, `totalCalls` and `frustratedCalls` are `0`; every average, sum and derived rate is `null`; `terminationReasons`, `languages` and `sources` are empty arrays. Each list holds at most 12 entries, most frequent first. **Idempotency.** Safe to retry: this is a read. **Consistency.** Cached for 120 seconds, then served stale for up to 15 minutes while a background refresh runs. The response carries a weak `ETag` for `If-None-Match`. **Access** - **Required scope:** `read`. Signed-in users need the owner, admin, member or viewer role. - **Rate limit:** Analytics — 30 requests/min per workspace, in addition to the general API budget of your plan. See [Rate limits](/rate-limits). - **Plan:** Available on every plan. A workspace without an active subscription (active, trialing or past due) gets `403 BILLING_ERROR`.

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

daysintegerOptional1-365Defaults to 30

Size of the reporting window in days, ending now. On most analytics routes a missing or out-of-range value falls back to 30 instead of being rejected; the operation says when it is strict.

directionenumOptionalDefaults to all

Which calls to count: inbound (calls the agent answered), outbound (calls the agent placed) or all (both).

Allowed values:
campaignIdstringOptionalformat: "uuid"
Scope every number to one campaign of the workspace. Omit it to aggregate across all campaigns and manual calls.
agentIdstringOptionalformat: "uuid"

Scope every number to one agent — the agent that served each call, so manual (campaign-less) calls count. Omit it to aggregate across agents.

Response headers

ETagstringOptional

Weak entity tag of the body. Send it in If-None-Match on the next request.

Response

Quality overview for the window.
dataobjectOptional

How the calls in the window went. Each block reports the sampleSize it was computed over (calls that carry that measurement). Telemetry exists for calls completed from 2026-09-03 onwards, plus any backfilled ones. Without data, sample sizes are 0, values are null and lists are empty.

Errors

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