Call Metrics
Access detailed information about every call through the SDK.
Getting Recent Calls
Fetch a paginated list of calls:
The response includes pagination info:
Filtering Calls
Narrow results using filter parameters:
Filter Parameters
Getting Single Call Details
Retrieve complete details for one call:
Response Fields
Accessing Transcripts
The transcript is an array of messages with speaker roles:
Accessing Recordings
Recordings are served through an authenticated two-step flow. Call the recording endpoint with your API key to get a short-lived presigned S3 URL, then download the audio from that URL.
The presigned URL expires after 15 minutes. Fetch a fresh one whenever you need the recording. Do not cache or embed it.
Fetch a recording
GET /atoms/v1/recordings/{callId}?channel=mono|dual returns { data: { url: "..." } } where url is the presigned S3 link.
Or in one line with curl:
Channel parameter
Omitting channel returns the mono composite.
Errors
The recordingUrl and recordingDualUrl fields on the call detail response, the post-conversation webhook, and the campaign CSV export contain either a raw storage URL or the authenticated endpoint URL depending on when your organization was created. Always resolve the audio through GET /atoms/v1/recordings/{callId}. That call works either way and returns the same presigned URL shape.
Legacy path
An older endpoint, GET /atoms/v1/conversation/{callId}/recording/download-url, remains available for the mono composite only. Its response envelope is { data: { presignedUrl: "..." } }. Presigned URLs expire in 15 minutes (same TTL as the new endpoint). New integrations should use /atoms/v1/recordings/{callId} for both mono and dual and for future feature parity.
Batch Search
Fetch multiple calls at once with search_calls():
Maximum 100 call IDs per request.
Performance Metrics
Each call includes latency breakdowns:
SDK Reference
Tips
What's the difference between status and disconnectionReason?
status is the outcome (completed, failed). disconnectionReason explains why it ended:
user_hangup- Caller hung upagent_hangup- Agent ended the calldial_no_answer- No pickuptimeout- Call timeout
When are recordings available?
Recordings generate after the call ends. They may take a few seconds to appear. Check if recordingUrl is non-empty before accessing.
How do I calculate average call duration?
Fetch calls with get_calls(), then calculate:
How do I find calls for a specific phone number?
Use the search parameter:
How do I get calls from a specific date range?
Currently, use pagination and filter client-side by createdAt. Date range filters are coming soon.