curl -X POST "https://api.telzino.com/v1/agents/123e4567-e89b-12d3-a456-426614174000/outbound-calls" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "+18135551234",
"call_context": "You are calling John to confirm his appointment tomorrow at 2pm.",
"metadata": { "crm_id": "123" },
"callback_url": "https://your-system.com/telzino/call-result"
}'
const agentId = '123e4567-e89b-12d3-a456-426614174000';
const response = await fetch(
`https://api.telzino.com/v1/agents/${agentId}/outbound-calls`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
to_number: '+18135551234',
call_context: 'You are calling John to confirm his appointment tomorrow at 2pm.',
metadata: { crm_id: '123' },
callback_url: 'https://your-system.com/telzino/call-result',
}),
}
);
const call = await response.json();
console.log(`Call ${call.id} queued`);
import requests
agent_id = '123e4567-e89b-12d3-a456-426614174000'
response = requests.post(
f'https://api.telzino.com/v1/agents/{agent_id}/outbound-calls',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
json={
'to_number': '+18135551234',
'call_context': 'You are calling John to confirm his appointment tomorrow at 2pm.',
'metadata': {'crm_id': '123'},
'callback_url': 'https://your-system.com/telzino/call-result',
},
)
call = response.json()
print(f"Call {call['id']} queued")
{
"id": "0fc6daf8-7251-4553-9488-867ba0b82d8e",
"status": "queued",
"room_name": "agent-123e4567-e89b-12d3-a456-426614174000-out-0fc6daf8-7251-4553-9488-867ba0b82d8e",
"created_at": "2026-06-11T12:49:28.898751+00:00"
}
{
"error": "invalid_request",
"error_description": "to_number must be E.164 (e.g. +15105550123)"
}
{
"error": "consent_required",
"error_description": "This agent requires a consent_basis on every outbound call"
}
{
"error": "not_found",
"error_description": "Agent not found or access denied"
}
{
"error": "policy_violation",
"error_description": "+18135551234 has reached its 3 attempts per day"
}
{
"error": "suppressed",
"error_description": "+18135551234 is on the organization's outbound suppression list"
}
{
"error": "out_of_window",
"error_description": "It is 22:14 for the callee; calls are allowed 08:00-21:00"
}
{
"error": "agent_at_capacity",
"error_description": "Agent is at its concurrent-call limit; retry later"
}
Outbound Calls
Trigger Outbound Call
Queues an outbound call: the agent dials the number and the result is delivered to your webhook
POST
/
v1
/
agents
/
{agentId}
/
outbound-calls
curl -X POST "https://api.telzino.com/v1/agents/123e4567-e89b-12d3-a456-426614174000/outbound-calls" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "+18135551234",
"call_context": "You are calling John to confirm his appointment tomorrow at 2pm.",
"metadata": { "crm_id": "123" },
"callback_url": "https://your-system.com/telzino/call-result"
}'
const agentId = '123e4567-e89b-12d3-a456-426614174000';
const response = await fetch(
`https://api.telzino.com/v1/agents/${agentId}/outbound-calls`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
to_number: '+18135551234',
call_context: 'You are calling John to confirm his appointment tomorrow at 2pm.',
metadata: { crm_id: '123' },
callback_url: 'https://your-system.com/telzino/call-result',
}),
}
);
const call = await response.json();
console.log(`Call ${call.id} queued`);
import requests
agent_id = '123e4567-e89b-12d3-a456-426614174000'
response = requests.post(
f'https://api.telzino.com/v1/agents/{agent_id}/outbound-calls',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
json={
'to_number': '+18135551234',
'call_context': 'You are calling John to confirm his appointment tomorrow at 2pm.',
'metadata': {'crm_id': '123'},
'callback_url': 'https://your-system.com/telzino/call-result',
},
)
call = response.json()
print(f"Call {call['id']} queued")
{
"id": "0fc6daf8-7251-4553-9488-867ba0b82d8e",
"status": "queued",
"room_name": "agent-123e4567-e89b-12d3-a456-426614174000-out-0fc6daf8-7251-4553-9488-867ba0b82d8e",
"created_at": "2026-06-11T12:49:28.898751+00:00"
}
{
"error": "invalid_request",
"error_description": "to_number must be E.164 (e.g. +15105550123)"
}
{
"error": "consent_required",
"error_description": "This agent requires a consent_basis on every outbound call"
}
{
"error": "not_found",
"error_description": "Agent not found or access denied"
}
{
"error": "policy_violation",
"error_description": "+18135551234 has reached its 3 attempts per day"
}
{
"error": "suppressed",
"error_description": "+18135551234 is on the organization's outbound suppression list"
}
{
"error": "out_of_window",
"error_description": "It is 22:14 for the callee; calls are allowed 08:00-21:00"
}
{
"error": "agent_at_capacity",
"error_description": "Agent is at its concurrent-call limit; retry later"
}
Path Parameters
string
required
The agent that will make the call (UUID format). Must be a Telzino AI agent you have access to.
Request Body
string
required
Destination phone number in E.164 format, e.g.
+18135551234. Numbers in any other format are rejected with 400.string
Context for this specific call, appended to the agent’s system prompt (max 4000 characters). Use it to tell the agent who it’s calling and why.Example:
"You are calling John Smith to confirm his appointment tomorrow at 2pm. If he can't make it, offer Thursday at 10am."string
Exact opening line the agent speaks when the callee answers (max 1000 characters). Overrides the agent’s Outbound Greeting setting and the auto-generated opener.Example:
"Hi, this is Ava calling from Acme Corp about your appointment."Greeting precedence when the callee answers: this greeting field → the agent’s Outbound Greeting setting → an AI-generated opener composed from call_context → the agent’s inbound greeting message.string
Message to leave if Answering Machine Detection reaches a voicemail box, for this call only. Overrides the agent’s voicemail message and suppresses its pre-recorded audio.
object
Per-call Answering Machine Detection settings, merged over the agent’s
amdConfig (per-call keys win). Same keys as the agent field: enabled, sensitivity, max_detection_ms, on_machine, on_silence, uncertain_prompt, voicemail_max_duration_ms, voicemail_beep_wait_ms. { "enabled": true } turns detection on for one call of an agent that normally has it off.object
Per-call IVR Menu Navigation settings, merged over the agent’s
ivrNavigation. Keys: enabled, target_intent, target_department, spoken_keywords, max_attempts, max_duration_ms, fallback_action, hold_max_wait_ms. Object only — the boolean shorthand the agent endpoints accept is a 400 here.array
A scripted menu for this call only, bypassing the live navigator. Ordered steps of
{ wait_for?: string, wait_ms?: number, send_dtmf: string } — up to 20, wait_ms at most 60000, send_dtmf 1–32 characters of 0-9*#, and the whole script at most 10 minutes including the presses.ivr_map and ivr_navigation need detection on for the call: with AMD off on the agent and not enabled here, the request is refused with 400, since the script could never run and the call would be placed and billed as an ordinary conversation.string
A retry policy to use for this call, overriding the agent’s
defaultRetryPolicyId for this call only. Must belong to the account, or the request is refused with 400.string
The legal basis this call is placed under:
express_written, ebr, informational_exempt or other. Required only when the agent’s contactPolicy.require_consent_basis is true, in which case omitting it returns 400 consent_required. See Outbound Compliance.string
Where that consent is recorded — a CRM id, a form submission id. Up to 200 characters; stored for the audit export, never validated.
string
The callee’s IANA timezone (e.g.
America/Denver), overriding the area-code lookup for this call when evaluating the agent’s calling hours. Use it for ported numbers or people who have moved.object
Opaque JSON object (max 16KB serialized) stored with the call and echoed back verbatim in the result webhook and call record — use it to correlate the call with records in your system (CRM IDs, campaign IDs, etc.).One key is reserved:
campaign_id, a 1–200 character string that groups calls for the audit export. It is trimmed and indexed so the export’s campaign_id filter matches it exactly; every other key is stored as sent.string
HTTPS URL that receives the result webhook when the call reaches a terminal state. Must use
https://; URLs resolving to private networks are rejected.Response
Returns202 Accepted immediately — the call is queued and dials within a few seconds. A call triggered outside the agent’s calling hours, on a retry policy that reschedules such calls, is also 202 but with status scheduled and a next_attempt_at.
string
The outbound call ID. Use it to poll status via Get Outbound Call.
string
queued on creation, or scheduled when the call was queued for the next calling window. See the call lifecycle for the full status progression.string
When a
scheduled call will dial (ISO 8601). null for a queued call.string
Internal call room identifier (also appears on the linked call log).
string
ISO 8601 timestamp of when the call was queued.
curl -X POST "https://api.telzino.com/v1/agents/123e4567-e89b-12d3-a456-426614174000/outbound-calls" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_number": "+18135551234",
"call_context": "You are calling John to confirm his appointment tomorrow at 2pm.",
"metadata": { "crm_id": "123" },
"callback_url": "https://your-system.com/telzino/call-result"
}'
const agentId = '123e4567-e89b-12d3-a456-426614174000';
const response = await fetch(
`https://api.telzino.com/v1/agents/${agentId}/outbound-calls`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
to_number: '+18135551234',
call_context: 'You are calling John to confirm his appointment tomorrow at 2pm.',
metadata: { crm_id: '123' },
callback_url: 'https://your-system.com/telzino/call-result',
}),
}
);
const call = await response.json();
console.log(`Call ${call.id} queued`);
import requests
agent_id = '123e4567-e89b-12d3-a456-426614174000'
response = requests.post(
f'https://api.telzino.com/v1/agents/{agent_id}/outbound-calls',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
json={
'to_number': '+18135551234',
'call_context': 'You are calling John to confirm his appointment tomorrow at 2pm.',
'metadata': {'crm_id': '123'},
'callback_url': 'https://your-system.com/telzino/call-result',
},
)
call = response.json()
print(f"Call {call['id']} queued")
{
"id": "0fc6daf8-7251-4553-9488-867ba0b82d8e",
"status": "queued",
"room_name": "agent-123e4567-e89b-12d3-a456-426614174000-out-0fc6daf8-7251-4553-9488-867ba0b82d8e",
"created_at": "2026-06-11T12:49:28.898751+00:00"
}
{
"error": "invalid_request",
"error_description": "to_number must be E.164 (e.g. +15105550123)"
}
{
"error": "consent_required",
"error_description": "This agent requires a consent_basis on every outbound call"
}
{
"error": "not_found",
"error_description": "Agent not found or access denied"
}
{
"error": "policy_violation",
"error_description": "+18135551234 has reached its 3 attempts per day"
}
{
"error": "suppressed",
"error_description": "+18135551234 is on the organization's outbound suppression list"
}
{
"error": "out_of_window",
"error_description": "It is 22:14 for the callee; calls are allowed 08:00-21:00"
}
{
"error": "agent_at_capacity",
"error_description": "Agent is at its concurrent-call limit; retry later"
}
Error codes
| Code | error | Meaning |
|---|---|---|
400 | invalid_request | Validation failed, the agent is not a LiveKit agent, retry_policy_id was not found, or ivr_map / ivr_navigation was sent with detection off |
400 | consent_required | The agent requires a consent_basis and none was sent |
404 | not_found | Agent not found or access denied |
409 | policy_violation | The retry policy’s per-number contact caps would be broken |
409 | suppressed | The number is on the organization’s suppression list |
409 | out_of_window | Outside the agent’s calling hours and the retry policy does not reschedule |
429 | agent_at_capacity | The agent is at its concurrent-call limit |
