Skip to main content

Reading the Voice → Calls console

Voice → Calls is the working surface for everything your numbers actually did. It answers “what happened on this call, and what has been happening across all of them”: a filterable call log, a per-call detail sheet with a step-by-step event timeline, and an analytics panel that aggregates the log. The guide walks the surface left to right in the order an ops review uses it: narrow the log, open one call, read its timeline, then step back to the aggregate.

Filter and segment the log

The filter bar above the log is where the click-free reading starts — most routine questions resolve there before you touch a single call.
  • View group (All / Active / Failed / Completed) — segments in one tap. Each group chip shows a count computed over your current date range and direction, so you can scan “how many failures today” without opening a filter. Click a chip again to go back to All.
  • Direction — All, Inbound, or Outbound.
  • Status chips — granular control over the exact statuses you care about: completed, in progress, ringing, queued, initiated, transferred, busy, no answer, failed, canceled. Click more than one chip to OR them; the View group and the chips are two lenses on the same column, so they never disagree.
  • Date range — presets or a custom window. The log, the group-chip counts, and the analytics panel all honor it.
  • Search — matches against caller/callee numbers and other string fields on the call envelope.
Because filters combine, “all failed outbound calls this week” is three taps, not a query. Paginate deeper into history with Load more at the bottom of the list; every filter change re-roots the pagination so you always page through a consistent set. To take the current slice out of the console, use Export. The pill above the Export button summarizes the active filter set, and the export honors it — choose CSV or JSON and you get the filtered rows, not an unfiltered dump. For a one-off, select specific rows and export only the selection.

Open the call detail sheet

Click a row to open the detail sheet — a slide-over panel that keeps the log visible underneath. The header shows the direction, the two endpoints, the effective status badge, the timestamp, and call cost when billing rated the call. Below that, in order:
  • Fraud banner — when the carrier-side attestation or scoring flagged the call, a warning banner says so above everything else.
  • AI agent handoff summary — for calls that passed through an AI agent, a card carrying the escalation reason, key topics, action items, and the slots the agent collected, so a human reviewer can pick up the thread.
  • Key fields — from, to, direction, status, start/end timestamps, and duration.
  • Recording — an in-sheet player when a recording exists, with a quality-check verdict when QC has run, and a re-run control to score it again.
  • Timeline — the diagnostic view described below.
  • Transcript and screen recordings — when the call produced them.
Use Open full detail in the sheet header for the same content as a bookmarkable page you can link from a ticket.

Read the timeline as a diagnostic view

The timeline renders the call’s event sequence in order — initiated, queued, ringing, answered, transferred, then the terminal state — with timestamps for each step. It answers “where in the flow did this call actually fail.” For example, a row showing no answer in the log tells you the terminal state; the timeline tells you whether the call rang at all before timing out, or never left the queue. Failed-call review is a timeline habit: read the last event before the terminal failure and you usually know which hop to investigate. Two readings of the same no answer badge, taken apart in the timeline:
  • No answer — rang, and fell to voicemail. The steps go initiated → ringing → no answer, with the ringing step carrying its duration against your ring-timeout setting. The callee’s phone rang (say, three rings’ worth of seconds before the timeout) and nobody picked up within the timeout. The destination is reachable; the failure is human-side. Redial or hand the row to the callback window — there is no infrastructure to chase.
  • No answer — never left the queue. The steps stop at initiated → queued, and nothing rings. The call spent its life waiting for a dialer resource or an available agent and expired there. The move is capacity-side: widen the dialer’s concurrent-call cap or the agent pool for the campaign’s window, because retrying into the same queue reproduces the same result.
The same habit reads the rest of the vocabulary. Failed with a last event at initiated points at the origination leg (carrier rejection); busy confirms the callee’s line answered with a busy signal. In every case the terminal badge says what happened and the step before it says where.

Worked example: one failed call, start to finish

An ops reviewer investigating a failed outbound call works the loop exactly this way:
  1. Isolate the failure. Click the Failed view-group chip, set Direction to Outbound, and pick Today in the date range — three taps. The Failed chip counter already told you today’s failure count before you clicked anything.
  2. Open the row. Click the failed row; the detail sheet slides over. Check for a fraud banner first — a carrier-side attestation or scoring flag changes who you escalate to. For a call that passed through an AI agent, the AI handoff summary carries the escalation reason and the slots the agent collected, so a human reviewer picks up the thread without a replay.
  3. Link it. Use Open full detail in the sheet header and copy the bookmarkable URL into the ticket or chat thread. Everyone who opens the link lands on the same call, with no instructions to dictate.
  4. Read the timeline. A no answer row whose timeline stops at queued means the call never rang, while one that shows ringing means the destination rang and timed out — the two readings above are the difference between a capacity fix and a redial.
  5. Back off to the aggregate. If this failure is not alone, the Analytics tab over the same date range shows the failure rate by day and the top failing destinations — one bad trunk route or destination cluster surfaces there before it surfaces in another ticket.

From a failed call to the rest of operations

A call row’s cost connects it to billing, and a request id connects it to the wider operations loop:
  • Cost. When billing rated the call, the detail-sheet header shows its cost. Voice charges resolve through the same shared per-event pricing step SMS charges use — the per-operator precedence of a verbatim per-carrier override over any markup rule. The MCCMNC overrides guide is written against SMS sends; the worked check for a voice row is the same in shape: find the destination’s network on the Billing → SMS rates card, and confirm the per-operator rate labeled absolute_override matches the per-carrier terms you negotiated — an override must be copied verbatim, never re-derived from a markup. A charge that disputes the card is a support signal, not a guessing game — the pricing and rate resolution concept page states the display-matches-charge invariant support applies.
  • Request id. When an event for this call surfaces on the Insights → Logs page — failed-call events appear there alongside webhook and agent events — expand the row and copy its request id. Paste that id into Developer → Request Logs or Developer → Delivery Logs to land on the exact API call or delivery behind it, payloads included. That is the anchor support traces by.
  • Messaging equivalent. When the same investigation crosses a channel — a voice call that followed up on an SMS, or an SMS that preceded a call — the Delivery Log runs the same loop for the messaging side: one search across SMS, WhatsApp, email, and voice, then the row’s timeline.

The analytics panel

The Analytics tab aggregates the log over your active date range — volume and success rate by day, call-duration distribution, peak-hour heatmap, and the top destinations and geographic breakdown of your traffic. Two reading rules that keep the numbers honest:
  • Scope: analytics aggregate only the data the console has loaded for the current window — they operate on the cursor-walked result set up to a cap. The log below has the ground truth for anything past that cap.
  • Success-rate denominator: the daily success-rate divides answered-plus-completed over terminal statuses. In-flight calls (ringing, in progress) don’t drag the rate down while they’re still live. This matches the status badges in the log — the chart and the table classify the same way.

Reading call logs over the API

Every read in the console above — the filtered log, the detail sheet, the timeline render — is performed over the same endpoints the API serves, so everything on this page translates one-to-one into a programmatic call. The filter bar, list rows, and detail sheet are all the GET /api/v1/voice/calls and GET /api/v1/voice/calls/:id surface. The walkthrough below is parity, not a separate API surface. The three filters the console filter bar chips in the worked example set — status, direction, date range — map to query params on the list endpoint. status accepts a single value or repeated keys (?status=failed&status=busy), direction is inbound or outbound, and the date range comes as ISO-8601 since / until bounds (timezone offsets are accepted). limit and the cursor from the previous response paginate.
Node.js
Every response returns the standard Orbit envelope: data holds the payload (a call object for a single read, an array of calls for the list), and meta carries request_id, timestamp, and — on the list — pagination with the has_more flag and the opaque cursor value to pass back on the next request.
200
The detail sheet’s read is a single fetch. GET /api/v1/voice/calls/:id returns the full call row — status, duration rating, fraud flag, conference-rollup shape, and the recording URL when one exists — the same payload the console’s slide-over renders.
Node.js
The endpoint map above plus the Voice API reference covers every param the console filter bar uses — status, direction, since, until, phone_number, cursor, and limit are documented there alongside the write and conference routes.

See also