Skip to main content
POST
/
v1
/
calls
Send Call
curl --request POST \
  --url https://api.bland.ai/v1/calls \
  --header 'Content-Type: application/json' \
  --header 'authorization: <authorization>' \
  --data '{
  "phone_number": "<string>",
  "voice": "<string>",
  "pathway_id": "<string>",
  "pathway_version": 123,
  "task": "<string>",
  "first_sentence": "<string>",
  "persona_id": "<string>",
  "model": "<string>",
  "language": "<string>",
  "wait_for_greeting": true,
  "pronunciation_guide": [
    {}
  ],
  "temperature": 123,
  "interruption_threshold": 123,
  "from": "<string>",
  "dialing_strategy": {},
  "timezone": "<string>",
  "start_time": "<string>",
  "transfer_phone_number": "<string>",
  "transfer_list": {},
  "max_duration": 123,
  "tools": [
    {}
  ],
  "background_track": "<string>",
  "noise_cancellation": true,
  "block_interruptions": true,
  "record": true,
  "voicemail": {},
  "citation_schema_ids": [
    "<string>"
  ],
  "summary_prompt": "<string>",
  "retry": {},
  "dispositions": [
    "<string>"
  ],
  "request_data": {},
  "metadata": {},
  "webhook": "<string>",
  "webhook_events": [
    "<string>"
  ],
  "dynamic_data": [
    {}
  ],
  "keywords": [
    "<string>"
  ],
  "ignore_button_press": true,
  "precall_dtmf_sequence": "<string>"
}'
{
  "status": "success",
  "message": "Call successfully queued.",
  "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1",
  "batch_id": null
}

Overview

Send an AI phone call with a custom objective and actions. This endpoint can be used to create dynamic phone calls where the AI agent can follow instructions, use tools, and follow a conversation pathway.

Headers

authorization
string
required
Your API key for authentication.
encrypted_key
string
A special key for using a BYOT (Bring Your Own Twilio) account. Only required for sending calls from your own Twilio account.Learn more about BYOT here.

Body Parameters

Basic Parameters

phone_number
string
required
The phone number to call. Must be a valid phone number in E.164 format.
voice
string
The voice of the AI agent to use. Accepts any form of voice ID, including custom voice clones and voice presets.Default voices can be referenced directly by their name instead of an id.Usage example: voice: “maya”Bland Curated voices:
  • Josh
  • Florian
  • Derek
  • June
  • Nat
  • Paige
pathway_id
string
This is the pathway ID for the pathway you have created on our dev portal. You can access the ID of your pathways by clicking the ‘Copy ID’ button of your pathway hereNote: Certain parameters do not apply when using pathways.Example Simple Request body:
{
  "phone_number": "+1975934749",
  "pathway_id": "a0f0d4ed-f5f5-4f16-b3f9-22166594d7a7"
}
pathway_version
integer
The version number of the pathway to use for the call. Defaults to the production version.
task
string
required
Note: Do not specify if using a pathway.Provide instructions, relevant information, and examples of the ideal conversation flow.This is your prompt where you are telling the agent what to do.Recommendations:
  • Include context and a background/persona for the agent like "You are {name}, a customer service agent at {company} calling {name} about {reason}.
  • Phrase instructions like you are speaking to the agent before the call.
  • Any time you tell the agent not to do something, provide an example of what they should do instead.
  • Keep the prompt under 2,000 characters where possible.
first_sentence
string
Makes your agent say a specific phrase or sentence for it’s first response.
persona_id
string
The ID of the persona to use for the call.Personas act as pre-configured templates that automatically apply a configuration when you pass a persona_id to an outbound call. Think of them as “call presets” that you can reuse across multiple calls.When using a persona_id, any parameters specified in your request body will override the corresponding parameters from the persona’s configuration.You can access your persona IDs by clicking the “Personas” button at the bottom of the Send Call page, and then “Use and Manage”.

Model Parameters

model
string
default:"base"
Select a model to use for your call.Options: base or turbo.In nearly all cases, base is the best choice.
There are two different ways to use Bland:
  • model: base
    • The original, follows scripts/procedures most effectively.
    • Supports all features and capabilities.
    • Best for Custom Tools
  • model: turbo
    • The absolute fastest latency possible, can be verbose at times
    • Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
    • Extremely realistic conversation capabilities
language
string
default:"en-US"
Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech, and other inner workings.
The available language options are as follows:
  • babel - Babel (All Languages) - Experimental1
  • en - English
  • babel-en - English (Babel)
  • en-US - English (US)
  • en-GB - English (UK)
  • en-AU - English (Australia)
  • en-NZ - English (New Zealand)
  • en-IN - English (India)
  • es - Spanish
  • babel-es - Spanish (Babel)
  • es-419 - Spanish (Latin America)
  • fr - French
  • babel-fr - French (Babel)
  • fr-CA - French (Canada)
  • de - German
  • babel-de - German (Babel)
  • el - Greek
  • hi - Hindi
  • hi-Latn - Hindi (Latin script)
  • hu - Hungarian
  • ja - Japanese
  • ko - Korean
  • ko-KR - Korean (Korea)
  • vi - Vietnamese
  • pt - Portuguese
  • pt-BR - Portuguese (Brazil)
  • pt-PT - Portuguese (Portugal)
  • zh - Chinese (Mandarin, Simplified)
  • zh-CN - Chinese (Mandarin, Simplified, China)
  • zh-Hans - Chinese (Mandarin, Simplified, Hans)
  • zh-TW - Chinese (Mandarin, Traditional)
  • zh-Hant - Chinese (Mandarin, Traditional, Hant)
  • it - Italian
  • nl - Dutch
  • pl - Polish
  • ru - Russian
  • sv - Swedish
  • sv-SE - Swedish (Sweden)
  • da - Danish
  • da-DK - Danish (Denmark)
  • fi - Finnish
  • no - Norwegian
  • id - Indonesian
  • ms - Malay
  • tr - Turkish
  • uk - Ukrainian
  • bg - Bulgarian
  • cs - Czech
  • ro - Romanian
  • sk - Slovak
  • auto - Auto Detect (English & Spanish)
1 The Bland Babel Transcription Engine (BETA) is our new proprietary transcription engine! Babel can handle multilingual conversations by identifying and switching languages on the fly. It’s now in beta and available under the “babel” language mode. Note: For pathway calls and prompts, make sure to prompt your agent to respond in the language they are spoken to.
wait_for_greeting
boolean
default:"false"
By default, the agent starts talking as soon as the call connects.When wait_for_greeting is set to true, the agent will wait for the call recipient to speak first before responding.
pronunciation_guide
array
The pronunciation guide is an array of objects that guides the agent on how to say specific words. Use this to improve clarity for acronyms, names, brand terms, or jargon.
  [
    {
      "word": "example",
      "pronunciation": "ex-am-ple",
      "case_sensitive": "false",
      "spaced": "false"
  },
  {
    "word": "API",
    "pronunciation": "A P I",
    "case_sensitive": "true",
    "spaced": "true"
  }
]
  • word — the word you want to guide the LLM on how to pronounce
  • pronunciation — how the AI should pronounce the word, using syllables or space-separated characters. For example, "A P I" ensures each letter is spoken clearly rather than read as a word.
  • case_sensitive — whether or not to consider case. Particularly useful with names. EG: ‘Max’ the name versus ‘max’ the word. Defaults to false. Not required.
  • spaced — whether to match whole words only. When true, “high” will match “high” but not “hightop”. When false, it will match any word that contains “high”. Defaults to true. Not required.
temperature
float
default:0.7
A value between 0 and 1 that controls the randomness of the LLM. 0 will cause more deterministic outputs while 1 will cause more random.Example Values: “0.9”, “0.3”, “0.5”
interruption_threshold
number
default:"100"
Adjusts how patient the AI is when waiting for the user to finish speaking.Lower values mean the AI will respond more quickly, while higher values mean the AI will wait longer before responding.Recommended range: 50-200 • 50: Extremely quick, back and forth conversation • 100: Balanced to respond at a natural pace • 200: Very patient, allows for long pauses and interruptions. Ideal for collecting detailed information.Try to start with 100 and make small adjustments in increments of ~10 as needed for your use case.

Dispatch Parameters

from
string
Specify a phone number to call from that you own or have uploaded from your Twilio account. Country code is required, spaces or parentheses must be excluded.By default, calls are initiated from a separate pool of numbers owned by Bland. If you are using your own twilio numbers, you must specify a matching encrypted_key in the create call request headers.
dialing_strategy
object
Controls how the caller number (from) is selected when placing an outbound call.Use this field to influence how the system chooses a number that appears local or relevant to the callee, improving pickup rates. There are two supported strategies:

1. local

Automatically selects a from number that matches the callee’s area code for US-based calls. You must have purchased a local dialing add-on in the add-ons section.Example:
{
  "dialing_strategy": { "type": "local" }
}

2. custom_pooling

Selects a number from your own pre-configured pool of phone numbers. Designed for organizations that want full control over the caller IDs being used.This is an enterprise only feature, to use this feature contact your Bland representative or reach out to sales.Example:
{
  "dialing_strategy": {
    "type": "custom_pooling",
    "pool_id": "bd039087-decb-435a-a6e3-ca1ffbf89974"
  }
}
By default, Bland will choose a US-based number from our own pool of numbers.
timezone
string
default:"America/Los_Angeles"
Set the timezone for the call. Handled automatically for calls in the US.This helps significantly with use cases that rely on appointment setting, scheduling, or behaving differently based on the time of day.Timezone options are here in the TZ identifier column.
start_time
string
The time you want the call to start. If you don’t specify a time (or the time is in the past), the call will send immediately.Set your time in the format YYYY-MM-DD HH:MM:SS -HH:MM (ex. 2021-01-01 12:00:00 -05:00).The timezone is optional, and defaults to UTC if not specified.Note: Scheduled calls can be cancelled with the POST /v1/calls/:call_id/stop endpoint.
transfer_phone_number
string
A phone number that the agent can transfer to under specific conditions - such as being asked to speak to a human or supervisor. This option will be ignored for pathways.
For best results:
  • Specify conditions that the agent should transfer to a human under (examples are great!)
  • In the task, refer to the action solely as “transfer” or “transferring”.
  • Alternate phrasing such as “swap” or “switch” can mislead the agent, causing the action to be ignored.
transfer_list
object
Give your agent the ability to transfer calls to a set of phone numbers. This option will be ignored for pathways.Overrides transfer_phone_number if a transfer_list.default is specified.Will default to transfer_list.default, or the chosen phone number.Example usage to route calls to different departments:
{
  "transfer_list": {
      "default": "+12223334444",
      "sales": "+12223334444",
      "support": "+12223334444",
      "billing": "+12223334444"
  }
}
max_duration
integer
default:"30"
When the call starts, a timer is set for the max_duration minutes. At the end of that timer, if the call is still active it will be automatically ended.Example Values: 20, 2

Knowledge Parameters

tools
array
Add custom tools and knowledge bases to your call for your agent to call upon.Example:
{
  "tools": [
    "TL-ba6c4237-67c2-40e8-868b-60d429a84eda",
    "KB-30d465c0-22d0-41e0-a63d-61bcacc277e7"
  ]
}
Read more about custom tools here

Audio Parameters

background_track
string
Select an audio track that you’d like to play in the background during the call. The audio will play continuously when the agent isn’t speaking, and is incorporated into it’s speech as well.Use this to provide a more natural, seamless, engaging experience for the conversation. We’ve found this creates a significantly smoother call experience by minimizing the stark differences between total silence and the agent’s speech.Options:
  • null - Default, will play audible but quiet phone static.
  • office - Office-style soundscape. Includes faint typing, chatter, clicks, and other office sounds.
  • cafe - Cafe-like soundscape. Includes faint talking, clinking, and other cafe sounds.
  • restaurant - Similar to cafe, but more subtle.
  • none - Minimizes background noise
noise_cancellation
boolean
default:"false"
Toggles noise filtering or suppression in the audio stream to filter out background noise.
block_interruptions
boolean
default:"false"
When set to true, the AI will not respond or process interruptions from the user.
record
boolean
default:"false"
To record your phone call, set record to true. When your call completes, you can access through the recording_url field in the call details or your webhook.

Voicemail Parameters

voicemail
object
Configuration for handling voicemails during outbound calls. This object controls how the AI behaves when it encounters a voicemail, including whether to leave a message, send an SMS notification, or detect voicemails more intelligently using AI.It has the following parameters:
  • message (string): The message the AI will leave if a voicemail is detected. This message will be played after the beep, then the call will end. This field is required if action is set to leave_message.

  • action (enum): What the AI should do when it detects a voicemail. The default is "hangup". Available options:
    • "hangup": Immediately end the call without leaving a message.
    • "leave_message": Play the message and then end the call.
    • "ignore": Continue the call as if no voicemail was detected (used for IVRs or special routing).

  • sms (object): Optional. Configuration for sending an SMS notification when a voicemail is left. Contains:
    • to (string): The phone number to send the SMS to (usually the same as the original callee).
    • from (string): The phone number to send the SMS from (must be a number you own and have SMS permissions for).
    • message (string): The body of the SMS message. Keep concise and clear.

  • sensitive (boolean): When true, uses LLM-based analysis to detect frequent voicemails. The default is false.
Example:
{
  "voicemail": {
    "message": "Hi, just calling to follow up. Please call us back when you can.",
    "action": "leave_message",
    "sms": {
      "to": "+18005550123",
      "from": "+18005550678",
      "message": "We just left you a voicemail. Call us back anytime!"
    },
    "sensitive": true
  }
}

Analysis Parameters

citation_schema_ids
string[]
The citation schema is an incredibly powerful tool for running post call analysis, including specific variable extractions, conditional logic, and more.You can build a citation schema here.After building the citation schema (or schemas), you can copy their UUIDs and reference them in your API request for outgoing calls (and you can also attach them to your inbound phone numbers).Here’s an example:
{
  "citation_schema_ids": ["b7c2e1d4-8f3a-4c9e-9a2b-1e5f6d7c8a9b", "f2d3c4b5-6a7e-8d9c-0b1a-2c3d4e5f6a7b"]
}
Note: Citation schemas are very powerful and accurate, but also are more resource intensive to run. As such, for the time being, they are an enterprise-only feature.

Post Call Parameters

summary_prompt
string
(Optional) Custom instructions for how the call summary should be generated after the call completes. Use this to provide specific guidance or context for the AI when writing the post-call summary. Maximum length: 2000 characters.Example:
{
  "summary_prompt": "Summarize the call in 2-3 sentences, focusing on the customer's main concern and any next steps discussed."
}
retry
object
If the call goes to voicemail, you can set up the call to retry, after a configurable delay. You can also update the voicemail_action, and voicemail_message in the retry object, for the re-tried call.Takes in the following parameters:
  • wait (integer): The delay in seconds before the call is retried.
  • voicemail_action (enum): The action to take when the call goes to voicemail. Options: hangup, leave_message, ignore.
  • voicemail_message (string): The message to leave when the call goes to voicemail.
Example:
{
    "retry": {
        "wait": 10,
        "voicemail_action": "leave_message",
        "voicemail_message": "Hello, this is a test message."
    }
}
dispositions
string[]
A list of possible outcome tags (dispositions) you define. After the call ends, the AI reviews the transcript and picks one of these tags to describe how the call went.Tag selection is based only on the transcript, no metadata or external inputs are used.The chosen tag will appear in the disposition_tag field of the call data.
If no custom dispositions are provided, the AI will automatically select from these built-in tags:
  • INTERESTED - Customer shows clear interest in the offering
  • NOT_INTERESTED - Customer expresses lack of interest
  • FOLLOW_UP_REQUIRED - Customer needs additional follow-up
  • CALL_BACK_SCHEDULED - A callback appointment was scheduled
  • TRANSFERRED - Call was transferred to another agent/department
  • OBJECTION_RAISED - Customer raised concerns or objections
  • NEEDS_MORE_INFO - Customer requires additional information
  • NOT_QUALIFIED - Customer does not meet qualification criteria
  • NO_CONTACT_MADE - Unable to establish meaningful contact
  • COMPLETED_ACTION - Customer completed the desired action
  • DO_NOT_CONTACT - Customer requested no future contact
  • AGENT_ENDED_CALL - Call ended by AI (auto-assigned for calls >2 minutes without transcript)
  • NO_ANSWER - Call was not answered (auto-assigned by system)
  • BUSY - Number was busy (auto-assigned by system)
  • CANCELED - Call was canceled (auto-assigned by system)
  • FAILED - Call failed to connect (auto-assigned by system)
Example:
  {
    "dispositions": ["got_full_name_and_number", "no_information_provided", "transferred_to_agent"]
  }

Advanced Parameters

request_data
object
Custom key-value data you send with the call. This information is available as variables inside your prompt, pathway, or tools — but only if the call is answered.
  {
    "task": "Say hello to the user, who's name is {{name}}",
    "request_data": {
      "name": "John Doe"
    }
  }
In this case, the AI would say: “Hello, John”.
metadata
object
Add any additional information you want to associate with the call. This data is accessible for all calls, regardless of if they are picked up or not. This can be used to track calls or add custom data to the call.Anything that you put here will be returned in the post call webhook under metadata.Example:
{
  "metadata": {
    "campaign_id": "1234",
    "source": "web"
  }
}
webhook
string
When the call ends, call information is sent to this webhook URL.
webhook_events
string[]
Specify which events you want to stream to the webhook, during the call.Options:
  • queue
  • call
  • latency
  • webhook
  • tool
  • dynamic_data
  • citations (Sent separately, Enterprise only)
Example payloads:
// ex 1
{
  "message": "Call enqueued",
  "call_id": "12345678-1234-1234-1234-123456789abc",
  "category": "queue",
  "log_level": "info"
}
dynamic_data
object[]
Integrate data from external APIs into your agent’s knowledge.Set to null or an empty string to clear dynamic data settings.
  "dynamic_data": [
    {
      "url": "endpoint",
      "method": "GET",
      "body": [],
      "headers": [
        {
          "key": "Content-Type",
          "value": "application/json"
        }
      ],
      "query": [],
      "cache": true,
      "response_data": [
        {
          "context": "",
          "data": "$",
          "name": ""
        }
      ]
    }
  ],
keywords
string[]
default:"[]"
These words will be boosted in the transcription engine - recommended for proper nouns or words that are frequently mis-transcribed.For example, if the word Blandy is frequently transcribed as a homonym like “Reese” you could do this:
  {
    "keywords": ["Blandy"]
  }
For stronger keyword boosts, you can place a colon then a boost factor after the word. The default boost factor is 2.
  {
    "keywords": ["Blandy:3"]
  }
ignore_button_press
boolean
default:"false"
When true, the system will ignore DTMF input (Dual-Tone Multi-Frequency) — the tones generated when a user presses keys on their phone keypad (e.g., 0-9, *, #).
This disables any in-call actions triggered by keypad input, such as menu navigation or transfers.
Useful when your agent should handle the entire call conversationally, without responding to button presses.
precall_dtmf_sequence
string
A sequence of DTMF digits that will be played before the call starts. Acceptable characters are 0-9, *, #, and w, where w is a pause of 0.5 seconds. Example:
  {
    "precall_dtmf_sequence": "1234567890*#w"
  }

Response

status
string
Can be success or error.
message
string
A message explaining the status of the call.
call_id
string
A unique identifier for the call (present only if status is success).
batch_id
string
The batch ID of the call (present only if status is success).
errors
array
For validation errors, a detailed list of each field with an error and it’s error message.Example:
{
    "status": "error",
    "message": "Invalid parameters",
    "errors": [
        "Missing required parameter: phone_number.",
        "Missing required parameter: task.",
        "Phone number must be a string or number.",
        "Task must be a string."
    ]
}
{
  "status": "success",
  "message": "Call successfully queued.",
  "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1",
  "batch_id": null
}

Error Codes Reference

This section documents all possible error codes and HTTP status codes you can receive when making a POST request to /v1/calls.

Authentication & Authorization Errors

401 - AUTH_FAILURE
object
Authentication failed due to missing or invalid API key.
{
  "data": null,
  "errors": [
    {
      "error": "AUTH_FAILURE", 
      "message": "Unauthorized"
    }
  ]
}
Common causes:
  • Missing Authorization header
  • Invalid API key
  • Expired API key
403 - Account Flagged
object
Account has been flagged or banned for security purposes.
{
  "status": "error",
  "message": "The Bland Team has flagged your account for security purposes. As a precautionary measure against recent heightened malicious use cases, we have flagged your account for review and temporarily blocked from dispatching calls. If you need to be unblocked urgently, please email us at hello@bland.ai with your account phone number."
}

Rate Limiting Errors (HTTP 429)

429 - Call Frequency Limit
object
Calls sent too frequently to the same number.
{
  "status": "error",
  "message": "Calls can only be sent every 10 seconds to the same number. Please try again in a few seconds."
}
429 - General Rate Limit
object
Rate limit exceeded for your account.
{
  "status": "error",
  "message": "Rate limit exceeded"
}
429 - Blacklisted Number
object
Attempting to call a blacklisted number.
{
  "status": "error",
  "message": "This number is blacklisted."
}
429 - New Customer Rate Limit
object
Rate limits for newly created accounts.
{
  "status": "error",
  "message": "Rate limit exceeded for newly created accounts. Please try again soon."
}
429 - International Rate Limit
object
International calling rate limit exceeded.
{
  "status": "error",
  "message": "International rate limit exceeded for your account type."
}

Parameter Validation Errors (HTTP 400)

400 - Missing Required Parameter
object
Required parameters are missing from the request.
{
  "status": "error",
  "message": "Invalid parameters. Error: [\"Missing required parameter: phone_number.\"]",
  "errors": ["Missing required parameter: phone_number."]
}
Required parameters:
  • phone_number (always required)
  • task (required if pathway_id is not provided)
400 - Invalid Field Types
object
Field values are the wrong data type according to TypeBox validation.
{
  "status": "error", 
  "message": "Record must be a boolean"
}
Common type validation errors:
  • "Task must be a string"
  • "Record must be a boolean"
  • "Max duration must be a number"
  • "Temperature must be a number"
  • "Tools must be an array"
  • "Dynamic data must be an array"
  • "Metadata must be a record of string keys and any values"
400 - Invalid Voicemail Action
object
Voicemail action must be one of the allowed values.
{
  "status": "error",
  "message": "Invalid voicemail action. Must be one of: hangup, leave_message, leave_message_and_sms, ignore"
}
400 - Number Range Validation
object
Numeric values are outside their allowed ranges.
{
  "status": "error",
  "message": "Max duration must be at least 1"
}
400 - Invalid DTMF Sequence
object
Precall DTMF sequence contains invalid characters.
{
  "status": "error",
  "message": "Precall DTMF sequence must be a valid DTMF sequence"
}
Valid DTMF characters: 0-9, *, #, w (wait)
400 - Invalid Date Format
object
Start time must be a valid ISO date-time string.
{
  "status": "error",
  "message": "Start time must be a valid date-time format"
}
400 - Invalid Webhook URL
object
Webhook URL format is invalid.
{
  "status": "error",
  "message": "Webhook must be a valid URI"
}
400 - Invalid From Number Format
object
From number doesn’t match phone number pattern.
{
  "status": "error",
  "message": "Invalid from number format"
}
400 - Invalid Transfer Phone Format
object
Transfer phone number format validation error.
{
  "status": "error",
  "message": "Invalid transfer phone number format"
}
400 - Invalid Transfer List Format
object
Transfer list contains phone numbers with invalid format.
{
  "status": "error",
  "message": "Invalid phone number format in transfer list"
}
400 - Additional Properties Not Allowed
object
Request contains fields that are not allowed in the schema.
{
  "status": "error", 
  "message": "Additional properties are not allowed"
}
400 - Invalid Phone Number
object
Phone number format is invalid, missing country code, or invalid length.
{
  "status": "error",
  "message": "Invalid phone number. Please include a country code if outside the US."
}
Other variations:
{
  "status": "error", 
  "message": "Invalid phone number. `+1234567890123456789` has these validation errors: [specific errors]"
}
{
  "error": "Invalid phone number format"
}
Common causes:
  • Phone number too long (>15 digits) or too short (<7 digits)
  • Invalid characters in phone number
  • Missing country code for international numbers
  • Phone number fails Twilio validation
400 - Invalid Transfer Number
object
Transfer phone number is invalid.
{
  "status": "error",
  "message": "Invalid transfer_phone_number."
}
400 - Invalid Language Code
object
Language code is not supported.
{
  "status": "error",
  "message": "Invalid language code"
}
400 - Invalid Pronunciation Guide
object
Pronunciation guide format is incorrect.
{
  "status": "error",
  "message": "Invalid pronunciation guide type."
}
400 - Platform Not Supported
object
Feature not supported on the specified platform.
{
  "status": "error",
  "message": "Precall DTMF sequence is not supported for this platform."
}
400 - Invalid From Number
object
The ‘from’ number is invalid or not owned by your account.
{
  "status": "error",
  "message": "Invalid 'from' - must be a phone number string with 10 or 12 digits."
}
400 - DNC List Violation
object
Attempting to call a number on the Do Not Call list.
{
  "status": "DNC Error",
  "message": "Number found in DNC list. You cannot dial sensitive numbers. More attempts will result in being blocked."
}
400 - Transfer List Validation
object
Transfer list configuration errors.
{
  "status": "error",
  "message": "Transfer list must be an object."
}
{
  "status": "error",
  "message": "Invalid transfer phone number."
}
{
  "status": "error", 
  "message": "Transfer phone number cannot be the same as the phone number."
}
400 - Retry Parameter Validation
object
Retry configuration must be an object.
{
  "status": "error",
  "message": "Retry must be an object."
}
400 - Version Number Validation
object
Version number must be a valid number.
{
  "status": "error",
  "message": "version_number must be a number."
}
400 - Pathway Version Validation
object
Pathway version must be a number or specific string value.
{
  "status": "error",
  "message": "pathway_version needs to either be a number, or a string of 'production' or 'staging'."
}
{
  "status": "error",
  "message": "version_number must be a number or string."
}
400 - From Phone Number Validation
object
The ‘from’ number format is invalid.
{
  "status": "error",
  "message": "Invalid from phone number."
}
400 - Boolean Parameter Validation
object
Boolean parameters must be true/false or string equivalents.
{
  "status": "error",
  "message": "wait_for_greeting must be a boolean."
}
Valid for parameters: wait_for_greeting, record, answered_by_enabled, block_interruptions, sensitive_voicemail_detection, ignore_button_press
400 - First Sentence Validation
object
First sentence must be a string.
{
  "status": "error",
  "message": "First sentence must be a string. type: [actual_type]"
}
400 - Voicemail Message Validation
object
Voicemail message must be a string.
{
  "status": "error",
  "message": "Voicemail message must be a string. type: [actual_type]"
}
400 - Voicemail SMS Validation
object
Voicemail SMS configuration errors.
{
  "status": "error",
  "message": "voicemail_sms must be an object. type: [actual_type]"
}
{
  "status": "error",
  "message": "voicemail_sms.message must be a string. type: [actual_type]"
}
{
  "status": "error",
  "message": "voicemail_sms.from must be a string. type: [actual_type]"
}
400 - Interruption Threshold Validation
object
Interruption threshold must be a number.
{
  "status": "error",
  "message": "interruption_threshold must be a number."
}
400 - Webhook URL Validation
object
Webhook URL must be a valid HTTPS URL.
{
  "status": "error",
  "message": "webhook must be a string that starts with https://."
}
400 - Request Data Validation
object
Request data must be an object.
{
  "status": "error",
  "message": "request_data must be an object."
}
400 - Metadata Validation
object
Metadata must be an object.
{
  "status": "error",
  "message": "metadata must be an object."
}
400 - Analysis Schema Validation
object
Analysis schema must be an object.
{
  "status": "error",
  "message": "analysis_schema must be an object."
}
400 - Voice Parameter Validation
object
Voice parameter must be a string.
{
  "status": "error",
  "message": "Voice must be a string."
}
400 - Voicemail Action Validation
object
Voicemail action must be one of the allowed values.
{
  "status": "error",
  "message": "Invalid voicemail_action. Options are: [list_of_options]."
}
400 - Keywords Validation
object
Keywords configuration errors.
{
  "status": "error",
  "message": "Keywords must be an array of strings."
}
{
  "status": "error",
  "message": "Keywords must be strings."
}
{
  "status": "error",
  "message": "Keywords each must be less than 100 characters: [keyword]"
}
{
  "status": "error",
  "message": "Keywords must be in the format 'string' or 'string:number'."
}
{
  "status": "error",
  "message": "Keyword boosts with a colon must have a valid integer for the boost rate."
}
{
  "status": "error",
  "message": "At most 20 keywords can be added."
}
400 - Timezone Validation
object
Timezone validation errors.
{
  "status": "error",
  "message": "Timezone must be a string."
}
{
  "status": "error",
  "message": "Invalid timezone: [error_message]"
}
400 - Summary Prompt Validation
object
Summary prompt validation errors.
{
  "status": "error",
  "message": "Summary prompt must be a string."
}
{
  "status": "error",
  "message": "Summary prompt must be less than 2000 characters."
}
400 - Start Time Validation
object
Start time scheduling validation errors.
{
  "status": "error",
  "message": "start_time must be a string."
}
{
  "status": "error",
  "message": "Invalid start_time."
}
{
  "status": "error",
  "message": "Calls must be scheduled at least 5 minutes in advance, or more"
}
400 - Background Track Validation
object
Background track validation errors.
{
  "status": "error",
  "message": "background_track must be a string."
}
{
  "status": "error",
  "message": "Invalid background_track option. Options are: [list_of_options]."
}
400 - Max Duration Validation
object
Max duration validation errors.
{
  "status": "error",
  "message": "max_duration must be a number."
}
{
  "status": "error",
  "message": "max_duration must be a positive number."
}
{
  "status": "error",
  "message": "max_duration must be at most 12 hours."
}
400 - Invalid Dynamic Data
object
Dynamic data or tools configuration is invalid.
{
  "status": "error",
  "message": "Unable to parse dynamic data/tools."
}
{
  "status": "error",
  "message": "Invalid tools: [error_message]"
}
{
  "status": "error",
  "message": "Invalid dynamic data: [error_message]"
}
400 - Invalid Pathway Data
object
Pathway configuration is invalid or missing required components.
{
  "status": "error",
  "message": "Invalid pathway data - no blocks or links found for pathway {pathway_id}"
}
Other variations:
{
  "status": "error",
  "message": "Invalid pathway data"
}
400 - Invalid Start Node ID
object
The specified start node ID does not exist in the pathway.
{
  "status": "error",
  "message": "Invalid start node ID: {start_node_id}"
}
400 - Content Flagged
object
Content failed moderation and was flagged as inappropriate.
{
  "status": "error",
  "message": "Flagged Node: [flagged content]"
}
400 - Sensitive Number Protection
object
Attempting to call emergency or sensitive numbers.
{
  "status": "error",
  "message": "Cannot dial sensitive numbers. More attempts will result in being blocked."
}
400 - Unable to Save Request
object
Server unable to save the request body or call data.
{
  "status": "error",
  "message": "Unable to save request body."
}
400 - Unable to Queue Call
object
Call could not be queued for processing.
{
  "status": "error",
  "message": "Unable to queue call."
}
400 - Warm Transfer Parent Call Completed
object
Parent call for warm transfer has already completed or doesn’t exist.
{
  "status": "error",
  "message": "Parent call has completed or does not exist. Warm Transfer Request Cancelled"
}
500 - Internal Server Errors
object
General server errors and catch-all error handlers.
{
  "status": "error",
  "message": "Internal server error during flagging process"
}
Typical scenarios:
  • Uncaught exceptions in call processing
  • Third-party service failures
  • Memory allocation or resource exhaustion errors
  • Network connectivity issues
400 - Call Parameters Validation
object
Basic call parameters validation from the main validation function.
{
  "status": "error",
  "message": "Call parameters must be an object."
}

Business Logic Errors

402 - No Billing Record
object
No billing record found for your account.
{
  "status": "error",
  "message": "No billing record found."
}
402 - Insufficient Balance
object
Account balance is insufficient for the call.
{
  "status": "error",
  "message": "Insufficient balance."
}
404 - Pathway Not Found
object
The specified pathway ID does not exist or is not accessible.
{
  "status": "error",
  "message": "Pathway with ID \"{pathway_id}\" not found"
}
404 - Pathway Version Not Found
object
The specified pathway version does not exist.
{
  "status": "error",
  "message": "Pathway version with ID \"{version_number}\" not found"
}
418 - Invalid Objective
object
The objective parameter failed validation (returns validation details).
{
  "error": "OBJECTIVE_VALIDATION_ERROR",
  "details": "Custom validation response"
}

Service Errors (HTTP 500)

500 - Twilio Connection Error
object
Failed to establish connection with Twilio services.
{
  "status": "error",
  "message": "Error in creating Twilio connection."
}
500 - Invalid Encrypted Key
object
The encrypted key provided is invalid or corrupted.
{
  "status": "error",
  "message": "Invalid `encrypted_key`. Please use the correct key for your account."
}
500 - Internal Server Error
object
General internal server error during call processing.
{
  "status": "error",
  "message": "Error triggering call. Please check your twilio account for errors"
}
500 - Content Moderation Error
object
Error occurred during the content flagging process.
{
  "status": "error",
  "message": "Internal server error during flagging process"
}
500 - BYOT Number Error
object
Error retrieving Bring Your Own Twilio (BYOT) phone number.
{
  "status": "error",
  "message": "Error in getting BYOT Number"
}
500 - Dialer Data Error
object
Error retrieving dialer data from encrypted key.
{
  "status": "error",
  "message": "Error in getting dialer data from encrypted key"
}
500 - User Data Fetch Error
object
Error fetching user data for account verification.
{
  "status": "error",
  "message": "Error in fetching user data"
}
Other variations:
{
  "status": "error",
  "message": "Error in fetching parent user data"
}
500 - Retry Call Error
object
Missing retry attempt information for retry calls.
{
  "status": "error",
  "message": "Retry attempt not provided for retry call: {call_id}"
}
I