Calls and Sessions
A call is a single conversation session between a caller and an AI agent. Every call — whether browser-based, inbound from a phone number, or outbound initiated via the API — is tracked as a first-class resource with a unique ID, a full transcript, performance metrics, and post-call analysis results.
Call Types
| Type | Description |
|---|---|
webrtc | Browser-based session initiated via connection token — used for testing agents in Studio or embedding voice in a web app |
inbound | Caller dials a Neuratel phone number; the number's assigned agent handles the call |
outbound | Call initiated via the API or a campaign — the agent dials the destination number |
campaign | Outbound call made as part of a bulk campaign — same mechanics as outbound, with campaign metadata attached |
Call Statuses
A call moves through the following statuses during its lifecycle:
| Status | Description |
|---|---|
queued | Call has been scheduled but not yet dialed |
ringing | Outbound dial is in progress; phone is ringing at the destination |
in-progress | Call is connected and the conversation is active |
completed | Call ended normally |
failed | Call could not be connected due to a technical error |
no-answer | Destination phone rang but was not answered |
busy | Destination line was busy |
canceled | Call was canceled before it connected |
Call Record
Each call produces a record containing the full session data:
Code
analysis_status is "pending" while async post-call analysis is running, "completed" once it lands, "failed" on a hard error. The four eval fields above (user_sentiment, user_sentiment_score, call_successful, call_successful_rationale) are populated only when analysis_status == "completed". See Post-call analysis for the full field set and access pattern.
End Reasons
The end_reason field records why the call ended:
| Reason | Description |
|---|---|
completed | Normal conversation end |
transferred | Agent transferred the call to another destination |
timeout | Silence timeout was exceeded with no response |
duration_limit | Call hit the configured maximum duration |
error | Call ended due to a technical error |
hangup | Call was ended remotely via the hangup API |
Transcripts
Every call generates a full turn-by-turn transcript.
Code
Fetch a call with its transcript:
Code
Use ?include=full to retrieve the transcript plus all post-call analysis results in a single response.
Recordings
Recording is configured at the agent level. When enabled, the call audio is captured and the recording URL ships on the call.summary.ready webhook (and on the recording field of GET /v1/voice-sessions/{id}) once processing is complete. The dedicated recording.ready event is defined but not yet emitted — see Webhook events for status.
Enable recording in the agent's analytics config:
Code
Call recording may be subject to consent requirements in your jurisdiction. Ensure you comply with all applicable laws before enabling recording.
Latency Metrics
Each call record includes a breakdown of processing latency:
| Metric | Description |
|---|---|
latency_ttft_ms | Time from end of user speech to agent's first token — measures LLM response start |
latency_ttfb_ms | Time from end of user speech to first audio byte — measures full pipeline |
stt_turnaround_ms | Time for speech-to-text transcription to complete |
Active Calls
Retrieve all calls currently in progress for your organization:
Code
Code
Concurrency
Check the current concurrent call count and your organization's limit:
Code
Code
Supervisor Controls
While a call is in progress, authorized team members can join it in three modes without interrupting normal operations.
Listen
Join as a hidden observer. You hear everything — both the caller and the agent — but neither party can hear you or knows you are present.
Code
Code
Code
Returns a connection token. Use it to join the session from your browser or supervisor client.
Whisper
Join with the ability to send text messages to the agent in real time. The caller cannot hear you. Use this to coach the agent without the caller knowing — for example, to provide a policy detail or suggest a next step.
Code
Code
Code
Barge
Take over the call as a full participant. The caller can hear you. The agent disconnects immediately. Use this for escalations where a human needs to take direct control.
Code
Code
Code
Hangup
End a call remotely:
Code
Call History
List Calls
Code
Filter with query parameters:
| Parameter | Description |
|---|---|
channel | phone, web, whatsapp_voice |
direction | inbound, outbound (NULL for web) |
campaign_id | Restrict to a single outbound campaign |
status | completed, failed, in-progress, etc. |
agent_id_any | Comma-separated agent IDs |
created_at_gt | Calls after this datetime (ISO 8601) |
created_at_lt | Calls before this datetime |
date_preset | today, yesterday, last_7_days, last_30_days, this_month |
duration_gt | Calls longer than N seconds |
duration_lt | Calls shorter than N seconds |
sort_order | ASC or DESC (default: DESC) |
limit | Results per page, max 1000 |
skip | Pagination offset |
Get a Single Call
Code
Webhook Events
Configure webhooks on the agent to receive real-time call events:
| Event | Description |
|---|---|
call.started | Call began |
call.ended | Call finished — includes duration, end reason, and metrics |
call.ringing | Outbound call started ringing |
call.answered | Call connected |
call.failed | Call failed to connect |
call.transferred | Call was transferred to a destination |
transcript.ready | Full transcript is available |
call.summary.ready | Post-call summary + analysis is complete. Includes recording_url if recording was enabled. |
recording.ready | Coming soon — defined but not yet emitted; recording URLs ship on call.summary.ready for now. |
Next Steps
- Analytics — Aggregate metrics, post-call analysis, and export
- Outbound Campaigns — Bulk automated outbound calling
- Monitoring — Real-time event streaming and active call visibility
