List top campaigns
Returns campaigns ranked by success rate (successes over effectiveCompleted, highest
first), each with volume, rejections, duration, sentiment, frustration, latency and
cost. Only campaigns with at least one call in the window appear; deleted campaigns
never do. The system “Manual Conversations” bucket can appear when it has calls.
Filters. days sets the window (rolling, ending now; missing or out-of-range values
become 30). direction and agentId narrow the calls counted (agentId matches the
agent that served each call). campaignId and timezone are not accepted and are
ignored, even when malformed. limit caps the rows.
What counts as a success. A completed call that became a conversation and whose
outcome is a success outcome of any category, as in GET /api/analytics/overview.
rejected counts explicit refusals only (rejected, appointment_canceled,
payment_refused, churned, candidate_unqualified), not voicemails or no-answers.
What counts as a conversation. Since 2026-09-16 a completed call is only in the
success-rate denominator when it ran 30 seconds or longer after rounding duration AND carried 8 transcript turns or more, plus at least 3 user and 3 agent speech turns when those counts are available; the rest are reported under noEffectiveContact and counted as neither a success
nor a refusal. The rule is applied when the rows are read, not stored on the call, so it
covers the whole history with the legacy duration/turn fallback until speech counts are backfilled — figures for a window you queried before that
date will not match today.
Ordering. successRate descending; campaigns with no qualifying call sort last.
Ties have no guaranteed order.
No data. An empty array when no campaign had calls. Within a row, averages are
null when nothing carried the measurement, except avgDurationSeconds, which is 0
for a voice campaign without completed calls and null for other channels.
Idempotency. Safe to retry: this is a read.
Consistency. Cached for 5 minutes, then served stale for up to 30 minutes while a
background refresh runs; each API instance also keeps a 60-second local copy. 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.
- Plan: Available on every plan. Requires an active subscription (
active,trialingorpast_due); without one the request is refused with403 BILLING_ERROR(metadata.kind: subscription_required).
Authentication
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.
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.
Query parameters
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.
Which calls to count: inbound (calls the agent answered), outbound (calls the agent placed) or all (both).
Scope every number to one agent — the agent that served each call, so manual (campaign-less) calls count. Omit it to aggregate across agents.
Maximum number of campaigns to return. Missing, non-integer or out-of-range values silently become 10; they are never rejected.
Response headers
Weak entity tag of the body. Send it in If-None-Match on the next request.

