Skip to main content
Once an agent is live, Observe is where you see what actually happened — how many calls were answered, what callers asked about, where the agent fell short, and exactly what it did on any one conversation. Every call (voice or chat) produces a summary, a transcript, and a receipt.

The answer-first analytics card

GET /agents/{agentId}/analytics returns the money card first: total calls, answered vs. missed, containment rate, transfer rate, and recoveredRevenueUsd (captured calls × your own average ticket). Pass ?avgTicketCents= or ?avgTicketUsd= so the dollar figure is yours, and filter by from, to, and channel. For org-wide rollups across every agent, use /analytics/overview, /analytics/by-agent, and /analytics/timeseries.

Conversations, transcripts, and receipts

The history list (GET /conversations) is newest-first and full-text searchable over the transcript and the one-line summary — filter by q, agentId, from, to, channel, and outcome. Each row already carries the deterministic outcome, summary, primary topic, and sentiment. Drill into one conversation for its summary, transcript, signed recording URL (voice only), and the receipt — the ordered list of audit events that reconstructs the call turn by turn: user_utterance, agent_message, tool_call, kb_retrieval, guardrail, verification, handoff, and more. The receipt is the same event stream you watched live in Test & Simulate.

Sentiment, topics, and knowledge gaps

  • Sentiment is a per-call label — positive, neutral, negative, or frustrated — computed deterministically (no LLM). It’s triage: the rollup surfaces the worst calls to review first.
  • Topics are zero-config clusters of what callers actually say. GET /agents/{agentId}/topics ranks them by volume; drill any cluster into its conversations.
  • Knowledge gaps are deduped questions the agent couldn’t answer. List them, then PATCH a gap to dismiss it or mark it in progress — close the loop by adding knowledge.

In the API

ActionEndpointScope
Agent analytics cardGET /agents/{agentId}/analyticsanalytics:read
Per-agent / org timeseriesGET /agents/{agentId}/analytics/timeseries · GET /analytics/timeseriesanalytics:read
Org overview / per-agent leaderboardGET /analytics/overview · GET /analytics/by-agentanalytics:read
Topics (and drill-down)GET /agents/{agentId}/topics · …/topics/{clusterId}/conversationsanalytics:read
Knowledge gaps (list / curate)GET /agents/{agentId}/knowledge-gaps · PATCH …/{gapId}analytics:read · analytics:write
Call summariesGET /agents/{agentId}/callscalls:read
Conversation history (searchable)GET /conversationsanalytics:read
One conversation summaryGET /conversations/{id}calls:read
Receipt (ordered audit events)GET /conversations/{id}/receiptcalls:read
TranscriptGET /conversations/{id}/transcriptcalls:read
Signed recording URL (voice)GET /conversations/{id}/audiocalls:read
# Pull the receipt — the full event trail for one conversation
curl https://builder.flowyte.com/api/v1/conversations/CONV_ID/receipt \
  -H "Authorization: Bearer flowyte_sk_…"
Analytics and history are reporting endpoints — give read-only keys analytics:read and calls:read and nothing more. Sentiment, topics, and gaps populate only once an agent crosses a small volume floor; below it they report dataState: collecting.