Client Nexus
01/08/2026, 8:19 PMAI Evy
01/08/2026, 8:19 PMAI Evy
01/08/2026, 8:20 PMAI Evy
01/08/2026, 8:20 PMAI Evy
01/08/2026, 8:20 PMClient Nexus
01/08/2026, 8:20 PMAI Evy
01/08/2026, 8:20 PMAI Evy
01/08/2026, 8:20 PMgoal_status)
The sources don't explicitly mention a goal_status field in webhook payloads. However, the call_analyzed event includes a call_analysis object for post-call analysis data. [(1) ]()
What is documented in the webhook payload:
- call_ended event contains all fields from the call object except call_analysis
- call_analyzed event contains the full call data including the call_analysis object
The call_analysis object is where custom post-call analysis data lives. You can define custom extraction fields (like goal achievement) using post_call_analysis_data when configuring your agent. [(2) ]()
So you'd likely need to:
- Define a custom analysis field for goal tracking
- Or use a custom function/tool during the call to mark goals achieved
## 2-4. "Completed" Status, "Replied" Metric, Campaign Status
I don't have documentation on these specific campaign management concepts in the available sources. These appear to be your application's business logic rather than fields Retell AI provides directly.
What Retell provides in webhooks:
- disconnection_reason (e.g., user_hangup, agent_hangup, dial_no_answer, dial_failed, etc.) [(3) ]()
- call_status (registered, ongoing, ended, error)
- transcript and call_analysis data [(1) ]()
For campaign workflow logic (when to mark leads as "completed," what constitutes "replied," when campaigns finish) , you'd typically implement this in your automation layer based on the raw call data Retell sends. The video example shows using Make.com/n8n to traAI Evy
01/08/2026, 8:20 PMAI Evy
01/08/2026, 8:20 PMClient Nexus
01/09/2026, 5:34 PMAI Evy
01/09/2026, 5:34 PMAI Evy
01/09/2026, 5:34 PMAI Evy
01/09/2026, 5:34 PMAI Evy
01/09/2026, 5:34 PMClient Nexus
01/09/2026, 9:55 PMAI Evy
01/09/2026, 9:55 PMAI Evy
01/09/2026, 9:56 PMdisconnection_reason field that indicates why the call ended or failed to connect. [(1) ]()
Common failure reasons include:
| Reason | Description |
|--------|-------------|
| dial_busy | The number dialed is busy |
| dial_failed | Dialing failed with no or unknown SIP error code |
| dial_no_answer | The number dialed did not answer |
| invalid_destination | The number dialed is invalid |
| marked_as_spam | The number dialed is marked as spam |
| user_declined | User declined the call |
| telephony_provider_permission_denied | SIP trunk credentials not authenticated |
| telephony_provider_unavailable | Telephony provider is unavailable |
How to retrieve this data:
1. **Dashboard**: Go to Call History, filter by your batch call, and view the disconnection reason for each call
2. **API**: Use the [List Calls]() endpoint to retrieve calls with their disconnection_reason field [(2) ]()
3. **Export**: Filter failed calls from Call History and export to CSV to re-upload only those contacts for retry [(3) ]()
The call_status will show not_connected for calls that failed to connect, and error for system-level failures. [(1) ]()AI Evy
01/09/2026, 9:56 PMAI Evy
01/09/2026, 9:56 PMClient Nexus
01/10/2026, 10:48 AMAI Evy
01/10/2026, 10:48 AMAI Evy
01/10/2026, 10:48 AMdisconnection_reason. [(1) ]()
Possible values include:
user_hangup, agent_hangup, call_transfer, voicemail_reached, inactivity, max_duration_reached, concurrency_limit_reached, no_valid_payment, scam_detected, dial_busy, dial_failed, dial_no_answer, invalid_destination, telephony_provider_permission_denied, telephony_provider_unavailable, sip_routing_error, marked_as_spam, user_declined, error_llm_websocket_open, error_llm_websocket_lost_connection, error_llm_websocket_runtime, error_llm_websocket_corrupt_payload, error_no_audio_received, error_asr, error_retell, error_unknown, error_user_not_joined, registered_call_timeout
## 2. Call Duration Field
The field is duration_ms (duration in milliseconds) .
You also have start_timestamp and end_timestamp (both in milliseconds since epoch) available after the call ends.
## 3. API Endpoints for Call Details
- **Get single call**: GET /v2/get-call/{call_id} [(2) ]()
- **List/filter calls**: POST /v2/list-calls [(1) ]()
## 4. Call Status Values
call_status possible values: registered, not_connected, ongoing, ended, error
## 5. Batch Call Aggregated Metrics
I don't have documentation on whether batch call responses include aggregated metrics. You would likely need to fetch calls individually using the List Calls endpoint with filter criteria.
## 6. Webhook Events for Call Completion
| Event | Description | Payload |
|-------|-------------|---------|
| call_started | Triggered when a new call begins | Basic call information |
| call_ended | Triggered when a call completes, transfers, or encounterAI Evy
01/10/2026, 10:48 AMcall_analysis |
| call_analyzed | Triggered when call analysis is complete | Full call data including call_analysis object |
[(3) ]()
Note: If the call did not connect (e.g., dial_failed, dial_no_answer, dial_busy) , the call_started webhook will not be triggered, but call_ended and call_analyzed will still fire.AI Evy
01/10/2026, 10:48 AMAI Evy
01/10/2026, 10:48 AMClient Nexus
01/10/2026, 10:55 AMAI Evy
01/10/2026, 10:55 AMAI Evy
01/10/2026, 10:56 AMcall_id is provided even for calls that don't connect. The call_status field will show not_connected for outbound calls that failed to establish a connection, and the disconnection_reason will indicate why (e.g., dial_no_answer, dial_busy, dial_failed) . [(1) ]() [(2) ]()
## 2. Voicemail Calls
When disconnection_reason is voicemail_reached, there is a call_id and recording_url available after the call ends. [(1) ]()
## 3. Field Availability Based on Call Outcome
Based on the Get Call API response documentation:
| Field | Availability |
|-------|-------------|
| call_id | Always present (required field) |
| start_timestamp | "Available after call starts" |
| end_timestamp | "Available after call ends" |
| duration_ms | "Available after call ends" |
| recording_url | "Available after call ends" |
For calls with status not_connected, the start_timestamp would not be populated since the call never started.
## 4. Data Available for Failed Dial Attempts
For calls that never connected, the following data is available:
- call_id - unique identifier for the attempt
- call_status - will be not_connected
- disconnection_reason - e.g., dial_busy, dial_no_answer, dial_failed, invalid_destination, marked_as_spam [(2) ]()
- The detailed log in the dashboard contains the SIP error code and error message for troubleshooting
I don't have documentation on whether ring duration or exact attempt timestamps are provided for non-connected calls.
Check out these potentially useful sources:
- [Get Call](AI Evy
01/10/2026, 10:56 AMAI Evy
01/10/2026, 10:56 AMClient Nexus
01/10/2026, 11:10 AMAI Evy
01/10/2026, 11:10 AMAI Evy
01/10/2026, 11:10 AMAI Evy
01/10/2026, 11:10 AMPOST /add-community-voice endpoint are: [(1) ]()
- provider_voice_id (string, required) — Voice id assigned by the provider
- voice_name (string, required) — A custom name for the voice (1-200 characters)
Optional parameters:
- voice_provider (enum) — Available options: elevenlabs, cartesia, minimax
- public_user_id (string) — Required for ElevenLabs only. User id of the voice owner.
So your current approach is close, but note the field name is public_user_id (not provider_voice_owner_id) .
javascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const voiceResponse = await client.voice.addResource({
provider_voice_id: 'provider_voice_id',
voice_name: 'x',
}) ;
console.log(voiceResponse.provider) ;
## 2. public_user_id for ElevenLabs
The documentation states this field is "Required for ElevenLabs only. User id of the voice owner."
I don't have documentation on what happens if the voice is private (no public_owner_id) .
## 3. Adding Retell Built-in Voices
I don't have documentation on whether Retell built-in voices can be added to a workspace without going through ElevenLabs.
## 4. Error Response Format
The API returns these HTTP status codes:
- 200 — Success
- 400 — Bad request
- 401 — Unauthorized
- 429 — Rate limited
- 500 — Server error
I don't have documentation on the exact error response body format.
Check out these potentially useful sources:
- [Add Voice]()
- [Search Voice]()AI Evy
01/10/2026, 11:10 AMClient Nexus
01/10/2026, 1:49 PMAI Evy
01/10/2026, 1:49 PMAI Evy
01/10/2026, 1:50 PMAI Evy
01/10/2026, 1:50 PMpublic_user_id or through your connected ElevenLabs API key.
## 2. Adding Public Library Voices Not in Your Personal ElevenLabs Library
I don't have documentation confirming whether you can add a public ElevenLabs voice that isn't in your personal library.
A Discord discussion mentions that adding custom/private ElevenLabs voices (not community voices) was not supported at the time, with a request to add it to the backlog. [(1) ]()
## 3. Minimum Required Payload for ElevenLabs Voice
Based on the API documentation, the minimum required fields are: [(2) ]()
- provider_voice_id (string, required) — Voice id assigned by the provider
- voice_name (string, required) — A custom name for the voice (1-200 characters)
For ElevenLabs specifically, public_user_id is also required:
> "Required for ElevenLabs only. User id of the voice owner."
The voice_provider field is optional (enum: elevenlabs, cartesia, minimax) .
So the minimum payload for ElevenLabs would be:
- provider_voice_id
- voice_name
- public_user_id
Check out these potentially useful sources:
- [Add Voice]()
- [Get Voice]()
Would you like a general answer on typical patterns for third-party voice provider integrations?AI Evy
01/10/2026, 1:50 PMClient Nexus
01/12/2026, 4:00 PMAI Evy
01/12/2026, 4:00 PMAI Evy
01/12/2026, 4:01 PMagent_id in Webhook Payload
Yes, Retell populates the agent_id field in webhook payloads. [(1) ]()
Based on the sample webhook payload:
json
{
"event": "call_ended",
"call": {
"call_type": "phone_call",
"from_number": "+12137771234",
"to_number": "+12137771235",
"direction": "inbound",
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"agent_id": "oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD",
"call_status": "registered",
"metadata": {},
"retell_llm_dynamic_variables": {
"customer_name": "John Doe"
},
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736,
"disconnection_reason": "user_hangup",
"transcript": "...",
"transcript_object": [ "[Object]", "[Object]", "[Object]", "[Object]" ],
"transcript_with_tool_calls": [ "[Object]", "[Object]", "[Object]", "[Object]" ],
"opt_out_sensitive_data_storage": false
}
}
## 2. agent_name in Webhook Payload
The agent_name field is not included in the webhook payload based on the documented sample.
You would need to look up the agent name using the agent_id via the Get Agent or List Agents API endpoints. The agent object includes agent_name as a field. [(2) ]()
javascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const agentResponses = await client.agent.list() ;
console.log(agentResponses) ;AI Evy
01/12/2026, 4:01 PMAI Evy
01/12/2026, 4:01 PMAI Evy
01/12/2026, 4:20 PMClient Nexus
01/12/2026, 4:20 PMAI Evy
01/12/2026, 4:20 PMAI Evy
01/12/2026, 4:20 PMagent_id is included in webhook payloads, but agent_name is not—you need to look it up via the Get Agent API [(1) ]()
- **Call data fields**: disconnection_reason, duration_ms, start_timestamp, end_timestamp, recording_url are available via Get Call API [(2) ]()
- **Voice import**: The Add Voice endpoint requires provider_voice_id, voice_name, and public_user_id (for ElevenLabs)
- **API endpoints**: Use GET /v2/get-call/{call_id} for single calls, POST /v2/list-calls for filtering
Is there something specific you'd like to follow up on, or do you have a new question?AI Evy
01/12/2026, 4:20 PMClient Nexus
01/12/2026, 4:26 PMAI Evy
01/12/2026, 4:26 PMAI Evy
01/12/2026, 4:26 PMagent_id is included in the webhook payload. The sample call_ended payload shows: [(1) ]()
json
{
"event": "call_ended",
"call": {
"call_type": "phone_call",
"from_number": "+12137771234",
"to_number": "+12137771235",
"direction": "inbound",
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"agent_id": "oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD",
"call_status": "registered",
"metadata": {},
"retell_llm_dynamic_variables": {
"customer_name": "John Doe"
},
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736,
"disconnection_reason": "user_hangup",
"transcript": "..."
}
}
## What Retell Does NOT Do
Retell does not update your database tables. Retell sends webhook events (call_started, call_ended, call_analyzed) to your endpoint—**your webhook handler** is responsible for:
- Storing agent_id in your calls table
- Updating record statuses from 'pending' to 'completed'
- Any other database operations
Whether your calls table vs agent_demo_calls table gets updated depends entirely on how you've implemented your webhook handler logic.AI Evy
01/12/2026, 4:26 PMAI Evy
01/12/2026, 4:26 PM