Read the bounded, customer-scoped Calls aggregate

Public customer API for the Calls workspace view: the newest page of call history with its real total, the selected call's observability detail, the workspace agents, the latest trial, and the compact wallet snapshot the shared workspace header uses. It also reports, per call, which workflow version ran and a compact path through it -- step ids, chosen routes, tool statuses and sanitized policy reasons -- plus the full turn-grouped trace for the selected call. A selected transcript turn's has_audio flag is true only while an active recording and its linked turn clip are available; clients use the authenticated recording relay rather than a storage or artifact identifier. A call that ran no workflow is ABSENT from workflow_evidence rather than present and empty. The selected call's transcript also carries one server-ordered timeline interleaving its turns with the typed tool calls the agent finished, the language switches it made and, on a call that navigated automated phone menus, the menus it heard, the keys it pressed (a value it typed is named by its call variable and never shown as digits), the waits on hold and the moment a person answered, ordered on the recording clock with a single truncation flag for both sources; turn entries reference the turns returned beside them rather than repeating their text. Every call row carries navigation: null unless the call recorded a phone-menu moment, else {menu_ms, hold_ms, person_at_ms, conversation_ms}, how the call's time split into time in menus, time on hold (a hold with no recorded end runs to the end of the call), the offset at which a person first answered (null when none did) and the time that followed. The selected call's waveform carries at most 256 peaks (a longer stored series is max-pooled, never cut) and speaker_segments: who spoke when on the recording's own clock, each with turn_id, speaker (agent or caller), start_ms and end_ms, projected only from turns whose boundary was measured on that recording, bounded by the same turn slice and reported with speaker_segments_truncated; a moment no segment covers is unattributed, not silent. The selected call's counterparty carries the other person's phone_e164 (the number called, or the caller's number on an inbound call; empty for a browser test) and contact_name, the name that number is saved under in this organization's contacts (the newest when several lists hold it; empty when none). Those rows are typed only: a tool entry carries its closed kind, an opaque reference, ok, a closed error class and a duration, and the configured tool name is resolved for display from the call's own agent configuration rather than stored - tool arguments, results, URLs, response bodies and error messages are never recorded. Each capability reports its own status and a closed reason, so a call handled before this existed, a gateway-imported call, a workflow call or an engine that does not record language switches is explicit about it and never reads as a call that made no tool calls. Bound to the bearer session organization; it never accepts an arbitrary organization, calls a provider, reconciles state, or writes data. The call's internal runtime configuration is never returned, and neither is a run's pinned contract. Both the path per row and the trace are bounded and report truncation; detail=0 omits the selected call's observability and its trace for routine freshness polls. Every response echoes calls_source_kind, the provenance it actually answered for, and calls_has_more, which says whether an older page exists -- observed by reading one row past the limit, never inferred from a page that happens to be full. Each call row carries source_kind, from the same closed set as the query parameter. The selected call's observability carries call_variables and its trace carries variables_evidence; call_variables lists what admission froze for the call -- each declared variable and built-in with its name, type, source (builtin, or the call's source: api, campaign, inbound_lookup, browser_test, simulation, trial, homepage_demo), protected, requires and state -- plus the committed confirmation record (method, match_kind, step_id, step_name, turn_index, committed_at), bounded with limit, returned and has_more; state is ready, not_admitted (no snapshot) or unreadable. A value is returned only for an ordinary variable in state shown; a protected variable never carries a value, before or after confirmation, only its state: held (until a confirmation releases it) or released with released_at_turn. variables_evidence lists the run's knowledge_match outcomes (match, mismatch, abstain) and workflow SMS-step statuses (pending, sending, sent, failed, uncertain, recorded) in run order from one bounded read, with limit, returned and has_more; never an answer, a compared value, an SMS body, a recipient or a failure text. Each call row carries failure: null until the finished call has been labelled, otherwise why it failed -- category (one closed code, empty when no failure was observed, which is not a proof the call went well), layer (telephony: it never became a conversation; media: the voice pipeline broke; agent: the AI agent or the customer's own systems failed), signals (every code observed, in precedence order), connected, and evidence_complete (whether the transcript and telemetry were complete; signals that rest on them are only derived when it is true). Labels are decided when the call ends and again as its evidence arrives; this read never decides one. failure_layer or failure_category narrows the page, calls_total and has_more to the labelled calls that match, and calls_failure_filter echoes the filter applied; a call named by call_id is still answered when it does not match.

get/v1/dashboard/calls

Request

  • Base URL: https://api.skysay.ai
  • URL: https://api.skysay.ai/v1/dashboard/calls
  • Auth: HTTP bearer

Query parameters

project_idstring

Optional project in the authenticated organization.

call_idstring

Optional canonical call ID in the selected project; it is resolved and pinned even when older than the newest page. A call_id that is not in the authenticated organization, the selected project and the requested source_kind is answered with selected_call_not_found=true, an empty selected_call_id and no selected call or detail -- never with a different call in its place; the page of calls is returned as usual. Without call_id the newest call is selected.

limitinteger

Maximum calls in the returned page.

detail'0' | '1'

Set to 0 for a freshness poll: the selected call's observability and full workflow trace are omitted, the per-row workflow evidence is not.

source_kind'live' | 'simulation_suite'

Which calls the page is about. live -- the default, and what this route has always returned -- is a call a customer or a caller actually made. simulation_suite is a Simulations Lab call: a real call row with the customer's own agent in it and a synthetic caller on the other end, created by the lab to run a scenario. The two are separate views of the same page, never mixed: one request answers for one provenance, and every figure in the response -- the page, calls_total, the selected call and the workflow evidence -- is about that provenance alone. A value outside this set is a 400 rather than a silent fall back to live.

beforestring

A page_cursor from a row of a previous page. The response continues strictly older than that ROW, so calls created since do not shift the page under you the way an offset would. Opaque: its encoding is not part of this contract.

failure_layer'telephony' | 'media' | 'agent'

Only calls labelled with a failure in this layer. A value outside the set is a 400.

failure_category'telephony_inbound_rejected' | 'telephony_invalid_number' | 'telephony_carrier_rejected' | 'telephony_busy' | 'telephony_no_answer' | 'telephony_non_human_answer' | 'telephony_hold_limit' | 'telephony_menu_no_path' | 'telephony_menu_time_limit' | 'telephony_technical_failure' | 'media_session_lost' | 'media_engine_lost' | 'media_response_stall' | 'media_caller_speech_missed' | 'media_agent_silent' | 'media_stt_stall' | 'media_model_failure' | 'media_synthesis_failure' | 'media_truncated_goodbye' | 'agent_bad_handoff' | 'agent_sms_send_failed' | 'agent_tool_failure'

Only calls whose primary failure label is this category. A value outside the set, or one outside failure_layer when both are given, is a 400.

Response

Calls workspace aggregate

Changes

No recorded changes to this operation across all 1 revision of this API.