GEThttps://core-api.heysadie.ai/calls/insights
ids success data insights id startedAt endedAt callDuration hasRecording pipeline eou model avgMs llm tts summary totalTurns userTurns agentTurns toolCalls toolFailures interruptions avgLatencyMs avgTranscriptionDelayMs avgEndOfUtteranceDelayMs agentProcessingMs performance turnIndex role e2eLatencyMs llmTtftMs llmTtftTotalMs ttsTtfbMs transcriptionDelayMs endOfUtteranceDelayMs interrupted llmCacheStatus llmPromptTokens llmCompletionTokens llmTokensPerSecond ttsAudioDurationMs ttsCharacterCount timeline type transcript offsetMs content latencyMs name arguments result error missing reason metadata timestamp version path code message details fieldGet insights for several calls
Retrieve session insights for up to 25 calls in one request. Session insights describe how one call actually ran. They carry the models that served it, the per-turn performance the voice pipeline recorded (end-to-end latency, LLM time to first token, TTS time to first byte, transcription delay, end-of-utterance delay), a rolled-up summary, and a timeline of what the caller said, what the assistant answered, and every tool call and its result. Metrics are ingested asynchronously, so a call that has just ended carries no insights for a short while after it hangs up. Pass `ids` as a comma-separated list of the same call ids GET /calls/:id takes, with no duplicates, for example `?ids=<uuid>,<uuid>`. `insights` comes back in the order the ids were sent, minus the ones that produced nothing. `missing` names each of those with a reason. `call_not_found` means this tenant has no such call. `metrics_not_found` means the call exists but has no metrics yet. A request where every id is missing is still a 200.
Try it in the API ExplorerExample request
curl "https://core-api.heysadie.ai/calls/insights?ids=string" \
-H "Authorization: ApiKey YOUR_API_KEY"Authentication
Authenticate with an API key in the Authorization header using the ApiKey scheme. See Authentication for how keys work and where to get them.
AuthorizationstringrequiredAPI key in the ApiKey scheme: ApiKey YOUR_API_KEY. Tenant keys authorize their own tenant; organization keys can act on any tenant in the organization.
X-Tenant-Idstring (uuid)optionalRequired when authenticating with an organization key: it selects the tenant the request acts on. Omit with tenant keys.
Request
Query parameters
idsstringrequiredComma-separated call ids to fetch insights for, for example `?ids=<uuid>,<uuid>`. Same ids as GET /calls/:id. Must be unique, at least 1 and at most 25.
Responses
successbooleanrequiredtrue on every 2xx
dataobjectoptionalThe result
Show 2 child properties
insightsobject[]requiredShow 9 item properties
idstringrequiredstartedAtstring (date-time) | string (date) | number | nullrequiredendedAtstring (date-time) | string (date) | number | nullrequiredcallDurationnumber | nullrequiredhasRecordingbooleanrequiredWhether a recording exists for this call. Fetch it from GET /calls/{id}; this endpoint does not return the URL.
pipelineobjectrequiredPer-stage view of the voice pipeline. Each stage names the model that ran and the average milliseconds it added to a turn. An average is null when no turn reported that metric.
Show 3 child properties
eouobjectrequiredShow 2 child properties
modelstring | nullrequiredEnd-of-utterance (turn detection) model that decided when the caller stopped speaking.
avgMsnumber | nullrequiredMean endOfUtteranceDelayMs across the turns that reported one.
llmobjectrequiredShow 2 child properties
modelstring | nullrequiredavgMsnumber | nullrequiredMean llmTtftMs (time to first token) across the turns that reported one.
ttsobjectrequiredShow 2 child properties
modelstring | nullrequiredavgMsnumber | nullrequiredMean ttsTtfbMs (time to first byte of audio) across the turns that reported one.
summaryobjectrequiredShow 10 child properties
totalTurnsnumberrequireduserTurnsnumberrequiredagentTurnsnumberrequiredTurns the agent actually processed, counted from the performance metrics rather than the transcript.
toolCallsnumberrequiredtoolFailuresnumberrequiredinterruptionsnumberrequiredavgLatencyMsnumber | nullrequiredavgTranscriptionDelayMsnumber | nullrequiredavgEndOfUtteranceDelayMsnumber | nullrequiredagentProcessingMsnumber | nullrequiredTotal time the agent spent producing its turns, avgLatencyMs multiplied by agentTurns. Null when no turn reported an end-to-end latency.
performanceobject[]requiredShow 15 item properties
turnIndexnumberrequiredroleenumrequired"assistant"e2eLatencyMsnumber | nullrequiredllmTtftMsnumber | nullrequiredllmTtftTotalMsnumber | nulloptionalttsTtfbMsnumber | nullrequiredtranscriptionDelayMsnumber | nullrequiredendOfUtteranceDelayMsnumber | nulloptionalinterruptedbooleanrequiredllmCacheStatusstring | nullrequiredllmPromptTokensnumber | nullrequiredllmCompletionTokensnumber | nullrequiredllmTokensPerSecondnumber | nullrequiredttsAudioDurationMsnumber | nullrequiredttsCharacterCountnumber | nullrequiredtimelineobject[]requiredShow 18 item properties
typeenumrequired"user_speech"transcriptstringrequiredoffsetMsnumberrequiredtypeenumrequired"agent_response"contentstringrequiredinterruptedbooleanrequiredlatencyMsnumber | nullrequiredoffsetMsnumberrequiredtypeenumrequired"tool_call"namestringrequiredargumentsmap<string, any>requiredoffsetMsnumberrequiredtypeenumrequired"tool_result"namestringrequiredsuccessbooleanrequiredresultstring | nullrequirederrorstring | nullrequiredoffsetMsnumberrequiredmissingobject[]requiredShow 2 item properties
idstringrequiredreasonenumrequired"call_not_found""metrics_not_found"metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
400The request is invalid. `details` lists each field that failed
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 3 child properties
codeenumrequiredA parameter or body field broke a rule
"VALIDATION_ERROR"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
detailsobject[]optionalOne entry per field that failed
Show 2 item properties
fieldstringrequiredThe offending field
messagestringrequiredThe rule it broke
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
401Missing or invalid credentials
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredNo valid credentials
"UNAUTHORIZED"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
403The credentials are valid but may not use this route
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredThe credentials may not use this route
"FORBIDDEN"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
404Not found, or outside the caller's scope
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredAn id names nothing the caller can see
"RESOURCE_NOT_FOUND"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
500An unexpected server error
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequiredAn unexpected server failure
"INTERNAL_SERVER_ERROR"messagestringrequiredHuman-readable explanation. Do not parse it; branch on `code`
metadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
502
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequired"PERFORMANCE_SERVICE_ERROR"messagestringrequiredmetadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested
503
successbooleanrequiredfalse on every error
errorobjectoptionalWhat went wrong: a stable `code` to branch on and a human-readable `message`
Show 2 child properties
codeenumrequired"PERFORMANCE_SERVICE_UNREACHABLE""PERFORMANCE_SERVICE_NOT_CONFIGURED"messagestringrequiredmetadataobjectoptionalRequest metadata
Show 3 child properties
timestampstringrequiredWhen the server answered, ISO 8601 UTC
versionstringrequiredAPI version
pathstringoptionalThe URL that was requested