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
| Action | Endpoint | Scope |
|---|
| Agent analytics card | GET /agents/{agentId}/analytics | analytics:read |
| Per-agent / org timeseries | GET /agents/{agentId}/analytics/timeseries · GET /analytics/timeseries | analytics:read |
| Org overview / per-agent leaderboard | GET /analytics/overview · GET /analytics/by-agent | analytics:read |
| Topics (and drill-down) | GET /agents/{agentId}/topics · …/topics/{clusterId}/conversations | analytics:read |
| Knowledge gaps (list / curate) | GET /agents/{agentId}/knowledge-gaps · PATCH …/{gapId} | analytics:read · analytics:write |
| Call summaries | GET /agents/{agentId}/calls | calls:read |
| Conversation history (searchable) | GET /conversations | analytics:read |
| One conversation summary | GET /conversations/{id} | calls:read |
| Receipt (ordered audit events) | GET /conversations/{id}/receipt | calls:read |
| Transcript | GET /conversations/{id}/transcript | calls:read |
| Signed recording URL (voice) | GET /conversations/{id}/audio | calls: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.