@vapi-ai/web 2.2.6 → 2.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/api.ts +1177 -838
  2. package/dist/api.d.ts +1031 -595
  3. package/dist/api.js +33 -0
  4. package/package.json +3 -2
package/dist/api.d.ts CHANGED
@@ -166,19 +166,51 @@ export interface OpenAIMessage {
166
166
  content: string | null;
167
167
  role: 'assistant' | 'function' | 'user' | 'system' | 'tool';
168
168
  }
169
+ export interface Mono {
170
+ /** This is the combined recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`. */
171
+ combinedUrl?: string;
172
+ /** This is the mono recording url for the assistant. To enable, set `assistant.artifactPlan.recordingEnabled`. */
173
+ assistantUrl?: string;
174
+ /** This is the mono recording url for the customer. To enable, set `assistant.artifactPlan.recordingEnabled`. */
175
+ customerUrl?: string;
176
+ }
177
+ export interface Recording {
178
+ /** This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`. */
179
+ stereoUrl?: string;
180
+ /** This is the video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. */
181
+ videoUrl?: string;
182
+ /** This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. This can be used to align the playback of the recording with artifact.messages timestamps. */
183
+ videoRecordingStartDelaySeconds?: number;
184
+ /** This is the mono recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`. */
185
+ mono?: Mono;
186
+ }
169
187
  export interface Artifact {
170
188
  /** These are the messages that were spoken during the call. */
171
189
  messages?: (UserMessage | SystemMessage | BotMessage | ToolCallMessage | ToolCallResultMessage)[];
172
190
  /** These are the messages that were spoken during the call, formatted for OpenAI. */
173
191
  messagesOpenAIFormatted?: OpenAIMessage[];
174
- /** This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`. */
192
+ /**
193
+ * This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
194
+ * @deprecated
195
+ */
175
196
  recordingUrl?: string;
176
- /** This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`. */
197
+ /**
198
+ * This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
199
+ * @deprecated
200
+ */
177
201
  stereoRecordingUrl?: string;
178
- /** This is video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. */
202
+ /**
203
+ * This is video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`.
204
+ * @deprecated
205
+ */
179
206
  videoRecordingUrl?: string;
180
- /** This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. This can be used to align the playback of the recording with artifact.messages timestamps. */
207
+ /**
208
+ * This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. This can be used to align the playback of the recording with artifact.messages timestamps.
209
+ * @deprecated
210
+ */
181
211
  videoRecordingStartDelaySeconds?: number;
212
+ /** This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`. */
213
+ recording?: Recording;
182
214
  /** This is the transcript of the call. This is derived from `artifact.messages` but provided for convenience. */
183
215
  transcript?: string;
184
216
  /** This is the packet capture url for the call. This is only available for `phone` type calls where phone number's provider is `vapi` or `byo-phone-number`. */
@@ -326,9 +358,9 @@ export interface DeepgramTranscriber {
326
358
  /** This is the transcription provider that will be used. */
327
359
  provider: 'deepgram';
328
360
  /** This is the Deepgram model that will be used. A list of models can be found here: https://developers.deepgram.com/docs/models-languages-overview */
329
- model?: 'nova-3' | 'nova-3-general' | 'nova-3-medical' | 'nova-2' | 'nova-2-general' | 'nova-2-meeting' | 'nova-2-phonecall' | 'nova-2-finance' | 'nova-2-conversationalai' | 'nova-2-voicemail' | 'nova-2-video' | 'nova-2-medical' | 'nova-2-drivethru' | 'nova-2-automotive' | 'nova' | 'nova-general' | 'nova-phonecall' | 'nova-medical' | 'enhanced' | 'enhanced-general' | 'enhanced-meeting' | 'enhanced-phonecall' | 'enhanced-finance' | 'base' | 'base-general' | 'base-meeting' | 'base-phonecall' | 'base-finance' | 'base-conversationalai' | 'base-voicemail' | 'base-video' | string;
361
+ model?: 'nova-3' | 'nova-3-general' | 'nova-3-medical' | 'nova-2' | 'nova-2-general' | 'nova-2-meeting' | 'nova-2-phonecall' | 'nova-2-finance' | 'nova-2-conversationalai' | 'nova-2-voicemail' | 'nova-2-video' | 'nova-2-medical' | 'nova-2-drivethru' | 'nova-2-automotive' | 'nova' | 'nova-general' | 'nova-phonecall' | 'nova-medical' | 'enhanced' | 'enhanced-general' | 'enhanced-meeting' | 'enhanced-phonecall' | 'enhanced-finance' | 'base' | 'base-general' | 'base-meeting' | 'base-phonecall' | 'base-finance' | 'base-conversationalai' | 'base-voicemail' | 'base-video' | 'whisper' | string;
330
362
  /** This is the language that will be set for the transcription. The list of languages Deepgram supports can be found here: https://developers.deepgram.com/docs/models-languages-overview */
331
- language?: 'bg' | 'ca' | 'cs' | 'da' | 'da-DK' | 'de' | 'de-CH' | 'el' | 'en' | 'en-AU' | 'en-GB' | 'en-IN' | 'en-NZ' | 'en-US' | 'es' | 'es-419' | 'es-LATAM' | 'et' | 'fi' | 'fr' | 'fr-CA' | 'hi' | 'hi-Latn' | 'hu' | 'id' | 'it' | 'ja' | 'ko' | 'ko-KR' | 'lt' | 'lv' | 'ms' | 'multi' | 'nl' | 'nl-BE' | 'no' | 'pl' | 'pt' | 'pt-BR' | 'ro' | 'ru' | 'sk' | 'sv' | 'sv-SE' | 'ta' | 'taq' | 'th' | 'th-TH' | 'tr' | 'uk' | 'vi' | 'zh' | 'zh-CN' | 'zh-HK' | 'zh-Hans' | 'zh-Hant' | 'zh-TW';
363
+ language?: 'ar' | 'az' | 'ba' | 'bg' | 'br' | 'ca' | 'cs' | 'da' | 'da-DK' | 'de' | 'de-CH' | 'el' | 'en' | 'en-AU' | 'en-GB' | 'en-IN' | 'en-NZ' | 'en-US' | 'es' | 'es-419' | 'es-LATAM' | 'et' | 'eu' | 'fi' | 'fr' | 'fr-CA' | 'ha' | 'haw' | 'he' | 'hi' | 'hi-Latn' | 'hu' | 'id' | 'is' | 'it' | 'ja' | 'jw' | 'kn' | 'ko' | 'ko-KR' | 'ln' | 'lt' | 'lv' | 'mk' | 'ms' | 'multi' | 'nl' | 'nl-BE' | 'no' | 'pl' | 'pt' | 'pt-BR' | 'ro' | 'ru' | 'sk' | 'sl' | 'sn' | 'so' | 'sr' | 'su' | 'sv' | 'sv-SE' | 'ta' | 'taq' | 'th' | 'th-TH' | 'tr' | 'tt' | 'uk' | 'ur' | 'vi' | 'yo' | 'zh' | 'zh-CN' | 'zh-HK' | 'zh-Hans' | 'zh-Hant' | 'zh-TW';
332
364
  /**
333
365
  * This will be use smart format option provided by Deepgram. It's default disabled because it can sometimes format numbers as times but it's getting better.
334
366
  * @example false
@@ -485,7 +517,7 @@ export interface GoogleTranscriber {
485
517
  /** This is the transcription provider that will be used. */
486
518
  provider: 'google';
487
519
  /** This is the model that will be used for the transcription. */
488
- model?: 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
520
+ model?: 'gemini-2.5-flash-preview-04-17' | 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
489
521
  /** This is the language that will be set for the transcription. */
490
522
  language?: 'Multilingual' | 'Arabic' | 'Bengali' | 'Bulgarian' | 'Chinese' | 'Croatian' | 'Czech' | 'Danish' | 'Dutch' | 'English' | 'Estonian' | 'Finnish' | 'French' | 'German' | 'Greek' | 'Hebrew' | 'Hindi' | 'Hungarian' | 'Indonesian' | 'Italian' | 'Japanese' | 'Korean' | 'Latvian' | 'Lithuanian' | 'Norwegian' | 'Polish' | 'Portuguese' | 'Romanian' | 'Russian' | 'Serbian' | 'Slovak' | 'Slovenian' | 'Spanish' | 'Swahili' | 'Swedish' | 'Thai' | 'Turkish' | 'Ukrainian' | 'Vietnamese';
491
523
  /** This is the plan for voice provider fallbacks in the event that the primary voice provider fails. */
@@ -582,9 +614,9 @@ export interface FallbackDeepgramTranscriber {
582
614
  /** This is the transcription provider that will be used. */
583
615
  provider: 'deepgram';
584
616
  /** This is the Deepgram model that will be used. A list of models can be found here: https://developers.deepgram.com/docs/models-languages-overview */
585
- model?: 'nova-3' | 'nova-3-general' | 'nova-3-medical' | 'nova-2' | 'nova-2-general' | 'nova-2-meeting' | 'nova-2-phonecall' | 'nova-2-finance' | 'nova-2-conversationalai' | 'nova-2-voicemail' | 'nova-2-video' | 'nova-2-medical' | 'nova-2-drivethru' | 'nova-2-automotive' | 'nova' | 'nova-general' | 'nova-phonecall' | 'nova-medical' | 'enhanced' | 'enhanced-general' | 'enhanced-meeting' | 'enhanced-phonecall' | 'enhanced-finance' | 'base' | 'base-general' | 'base-meeting' | 'base-phonecall' | 'base-finance' | 'base-conversationalai' | 'base-voicemail' | 'base-video' | string;
617
+ model?: 'nova-3' | 'nova-3-general' | 'nova-3-medical' | 'nova-2' | 'nova-2-general' | 'nova-2-meeting' | 'nova-2-phonecall' | 'nova-2-finance' | 'nova-2-conversationalai' | 'nova-2-voicemail' | 'nova-2-video' | 'nova-2-medical' | 'nova-2-drivethru' | 'nova-2-automotive' | 'nova' | 'nova-general' | 'nova-phonecall' | 'nova-medical' | 'enhanced' | 'enhanced-general' | 'enhanced-meeting' | 'enhanced-phonecall' | 'enhanced-finance' | 'base' | 'base-general' | 'base-meeting' | 'base-phonecall' | 'base-finance' | 'base-conversationalai' | 'base-voicemail' | 'base-video' | 'whisper' | string;
586
618
  /** This is the language that will be set for the transcription. The list of languages Deepgram supports can be found here: https://developers.deepgram.com/docs/models-languages-overview */
587
- language?: 'bg' | 'ca' | 'cs' | 'da' | 'da-DK' | 'de' | 'de-CH' | 'el' | 'en' | 'en-AU' | 'en-GB' | 'en-IN' | 'en-NZ' | 'en-US' | 'es' | 'es-419' | 'es-LATAM' | 'et' | 'fi' | 'fr' | 'fr-CA' | 'hi' | 'hi-Latn' | 'hu' | 'id' | 'it' | 'ja' | 'ko' | 'ko-KR' | 'lt' | 'lv' | 'ms' | 'multi' | 'nl' | 'nl-BE' | 'no' | 'pl' | 'pt' | 'pt-BR' | 'ro' | 'ru' | 'sk' | 'sv' | 'sv-SE' | 'ta' | 'taq' | 'th' | 'th-TH' | 'tr' | 'uk' | 'vi' | 'zh' | 'zh-CN' | 'zh-HK' | 'zh-Hans' | 'zh-Hant' | 'zh-TW';
619
+ language?: 'ar' | 'az' | 'ba' | 'bg' | 'br' | 'ca' | 'cs' | 'da' | 'da-DK' | 'de' | 'de-CH' | 'el' | 'en' | 'en-AU' | 'en-GB' | 'en-IN' | 'en-NZ' | 'en-US' | 'es' | 'es-419' | 'es-LATAM' | 'et' | 'eu' | 'fi' | 'fr' | 'fr-CA' | 'ha' | 'haw' | 'he' | 'hi' | 'hi-Latn' | 'hu' | 'id' | 'is' | 'it' | 'ja' | 'jw' | 'kn' | 'ko' | 'ko-KR' | 'ln' | 'lt' | 'lv' | 'mk' | 'ms' | 'multi' | 'nl' | 'nl-BE' | 'no' | 'pl' | 'pt' | 'pt-BR' | 'ro' | 'ru' | 'sk' | 'sl' | 'sn' | 'so' | 'sr' | 'su' | 'sv' | 'sv-SE' | 'ta' | 'taq' | 'th' | 'th-TH' | 'tr' | 'tt' | 'uk' | 'ur' | 'vi' | 'yo' | 'zh' | 'zh-CN' | 'zh-HK' | 'zh-Hans' | 'zh-Hant' | 'zh-TW';
588
620
  /**
589
621
  * This will be use smart format option provided by Deepgram. It's default disabled because it can sometimes format numbers as times but it's getting better.
590
622
  * @example false
@@ -731,7 +763,7 @@ export interface FallbackGoogleTranscriber {
731
763
  /** This is the transcription provider that will be used. */
732
764
  provider: 'google';
733
765
  /** This is the model that will be used for the transcription. */
734
- model?: 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
766
+ model?: 'gemini-2.5-flash-preview-04-17' | 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
735
767
  /** This is the language that will be set for the transcription. */
736
768
  language?: 'Multilingual' | 'Arabic' | 'Bengali' | 'Bulgarian' | 'Chinese' | 'Croatian' | 'Czech' | 'Danish' | 'Dutch' | 'English' | 'Estonian' | 'Finnish' | 'French' | 'German' | 'Greek' | 'Hebrew' | 'Hindi' | 'Hungarian' | 'Indonesian' | 'Italian' | 'Japanese' | 'Korean' | 'Latvian' | 'Lithuanian' | 'Norwegian' | 'Polish' | 'Portuguese' | 'Romanian' | 'Russian' | 'Serbian' | 'Slovak' | 'Slovenian' | 'Spanish' | 'Swahili' | 'Swedish' | 'Thai' | 'Turkish' | 'Ukrainian' | 'Vietnamese';
737
769
  }
@@ -770,7 +802,7 @@ export interface Condition {
770
802
  * This is the value you want to compare against the parameter.
771
803
  * @maxLength 1000
772
804
  */
773
- value: object;
805
+ value: string;
774
806
  }
775
807
  export interface ToolMessageStart {
776
808
  /**
@@ -1397,6 +1429,19 @@ export interface TransferDestinationStep {
1397
1429
  /** This is the description of the destination, used by the AI to choose when and how to transfer the call. */
1398
1430
  description?: string;
1399
1431
  }
1432
+ export interface TransferFallbackPlan {
1433
+ /** This is the message the assistant will deliver to the customer if the transfer fails. */
1434
+ message: string | CustomMessage;
1435
+ /**
1436
+ * This controls what happens after delivering the failure message to the customer.
1437
+ * - true: End the call after delivering the failure message (default)
1438
+ * - false: Keep the assistant on the call to continue handling the customer's request
1439
+ *
1440
+ * @default true
1441
+ * @default true
1442
+ */
1443
+ endCallEnabled?: boolean;
1444
+ }
1400
1445
  export interface SummaryPlan {
1401
1446
  /**
1402
1447
  * These are the messages used to generate the summary.
@@ -1452,15 +1497,16 @@ export interface TransferPlan {
1452
1497
  * - `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`: The assistant dials the destination, waits for the operator to speak, delivers the `message` to the destination party, and then connects the customer.
1453
1498
  * - `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary`: The assistant dials the destination, waits for the operator to speak, provides a summary of the call to the destination party, and then connects the customer.
1454
1499
  * - `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the destination call leg, connects the customer, and leaves the call.
1500
+ * - `warm-transfer-experimental`: The assistant puts the customer on hold, dials the destination, and if the destination answers (and is human), delivers a message or summary before connecting the customer. If the destination is unreachable or not human (e.g., with voicemail detection), the assistant delivers the `fallbackMessage` to the customer and optionally ends the call.
1455
1501
  *
1456
1502
  * @default 'blind-transfer'
1457
1503
  */
1458
- mode: 'blind-transfer' | 'blind-transfer-add-summary-to-sip-header' | 'warm-transfer-say-message' | 'warm-transfer-say-summary' | 'warm-transfer-twiml' | 'warm-transfer-wait-for-operator-to-speak-first-and-then-say-message' | 'warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary';
1504
+ mode: 'blind-transfer' | 'blind-transfer-add-summary-to-sip-header' | 'warm-transfer-say-message' | 'warm-transfer-say-summary' | 'warm-transfer-twiml' | 'warm-transfer-wait-for-operator-to-speak-first-and-then-say-message' | 'warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary' | 'warm-transfer-experimental';
1459
1505
  /**
1460
1506
  * This is the message the assistant will deliver to the destination party before connecting the customer.
1461
1507
  *
1462
1508
  * Usage:
1463
- * - Used only when `mode` is `blind-transfer-add-summary-to-sip-header`, `warm-transfer-say-message` or `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`.
1509
+ * - Used only when `mode` is `blind-transfer-add-summary-to-sip-header`, `warm-transfer-say-message`, `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`, or `warm-transfer-experimental`.
1464
1510
  */
1465
1511
  message?: string | CustomMessage;
1466
1512
  /**
@@ -1471,6 +1517,17 @@ export interface TransferPlan {
1471
1517
  * @default "refer"
1472
1518
  */
1473
1519
  sipVerb?: 'refer' | 'bye' | 'dial';
1520
+ /**
1521
+ * This is the URL to an audio file played while the customer is on hold during transfer.
1522
+ *
1523
+ * Usage:
1524
+ * - Used only when `mode` is `warm-transfer-experimental`.
1525
+ * - Used when transferring calls to play hold audio for the customer.
1526
+ * - Must be a publicly accessible URL to an audio file.
1527
+ * - Supported formats: MP3 and WAV.
1528
+ * - If not provided, the default hold audio will be used.
1529
+ */
1530
+ holdAudioUrl?: string;
1474
1531
  /**
1475
1532
  * This is the TwiML instructions to execute on the destination call leg before connecting the customer.
1476
1533
  *
@@ -1492,9 +1549,23 @@ export interface TransferPlan {
1492
1549
  * This is the plan for generating a summary of the call to present to the destination party.
1493
1550
  *
1494
1551
  * Usage:
1495
- * - Used only when `mode` is `blind-transfer-add-summary-to-sip-header` or `warm-transfer-say-summary` or `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary`.
1552
+ * - Used only when `mode` is `blind-transfer-add-summary-to-sip-header` or `warm-transfer-say-summary` or `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary` or `warm-transfer-experimental`.
1496
1553
  */
1497
1554
  summaryPlan?: SummaryPlan;
1555
+ /**
1556
+ * This flag includes the sipHeaders from above in the refer to sip uri as url encoded query params.
1557
+ *
1558
+ * @default false
1559
+ */
1560
+ sipHeadersInReferToEnabled?: boolean;
1561
+ /**
1562
+ * This configures the fallback plan when the transfer fails (destination unreachable, busy, or not human).
1563
+ *
1564
+ * Usage:
1565
+ * - Used only when `mode` is `warm-transfer-experimental`.
1566
+ * - If not provided when using `warm-transfer-experimental`, a default message will be used.
1567
+ */
1568
+ fallbackPlan?: TransferFallbackPlan;
1498
1569
  }
1499
1570
  export interface TransferDestinationNumber {
1500
1571
  /**
@@ -1677,7 +1748,7 @@ export interface KnowledgeBase {
1677
1748
  */
1678
1749
  provider: 'google';
1679
1750
  /** The model to use for the knowledge base */
1680
- model?: 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
1751
+ model?: 'gemini-2.5-flash-preview-04-17' | 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
1681
1752
  /** A description of the knowledge base */
1682
1753
  description: string;
1683
1754
  /** The file IDs associated with this knowledge base */
@@ -2276,7 +2347,7 @@ export interface GoogleModel {
2276
2347
  /** This is the ID of the knowledge base the model will use. */
2277
2348
  knowledgeBaseId?: string;
2278
2349
  /** This is the Google model that will be used. */
2279
- model: 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
2350
+ model: 'gemini-2.5-flash-preview-04-17' | 'gemini-2.0-flash-thinking-exp' | 'gemini-2.0-pro-exp-02-05' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-preview-02-05' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-realtime-exp' | 'gemini-1.5-flash' | 'gemini-1.5-flash-002' | 'gemini-1.5-pro' | 'gemini-1.5-pro-002' | 'gemini-1.0-pro';
2280
2351
  provider: 'google';
2281
2352
  /**
2282
2353
  * This is the session configuration for the Gemini Flash 2.0 Multimodal Live API.
@@ -2439,12 +2510,12 @@ export interface OpenAIModel {
2439
2510
  /** This is the provider that will be used for the model. */
2440
2511
  provider: 'openai';
2441
2512
  /** This is the OpenAI model that will be used. */
2442
- model: 'gpt-4.1' | 'gpt-4.1-mini' | 'gpt-4.1-nano' | 'gpt-4.5-preview' | 'chatgpt-4o-latest' | 'o3-mini' | 'o1-preview' | 'o1-preview-2024-09-12' | 'o1-mini' | 'o1-mini-2024-09-12' | 'gpt-4o-realtime-preview-2024-10-01' | 'gpt-4o-realtime-preview-2024-12-17' | 'gpt-4o-mini-realtime-preview-2024-12-17' | 'gpt-4o-mini-2024-07-18' | 'gpt-4o-mini' | 'gpt-4o' | 'gpt-4o-2024-05-13' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-11-20' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | 'gpt-3.5-turbo-0613';
2513
+ model: 'gpt-4.1' | 'gpt-4.1-mini' | 'gpt-4.1-nano' | 'gpt-4.5-preview' | 'chatgpt-4o-latest' | 'o3' | 'o3-mini' | 'o4-mini' | 'o1-preview' | 'o1-preview-2024-09-12' | 'o1-mini' | 'o1-mini-2024-09-12' | 'gpt-4o-realtime-preview-2024-10-01' | 'gpt-4o-realtime-preview-2024-12-17' | 'gpt-4o-mini-realtime-preview-2024-12-17' | 'gpt-4o-mini-2024-07-18' | 'gpt-4o-mini' | 'gpt-4o' | 'gpt-4o-2024-05-13' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-11-20' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | 'gpt-3.5-turbo-0613';
2443
2514
  /**
2444
2515
  * These are the fallback models that will be used if the primary model fails. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest fallbacks that make sense.
2445
2516
  * @example ["gpt-4-0125-preview","gpt-4-0613"]
2446
2517
  */
2447
- fallbackModels?: 'gpt-4.1' | 'gpt-4.1-mini' | 'gpt-4.1-nano' | 'gpt-4.5-preview' | 'chatgpt-4o-latest' | 'o3-mini' | 'o1-preview' | 'o1-preview-2024-09-12' | 'o1-mini' | 'o1-mini-2024-09-12' | 'gpt-4o-realtime-preview-2024-10-01' | 'gpt-4o-realtime-preview-2024-12-17' | 'gpt-4o-mini-realtime-preview-2024-12-17' | 'gpt-4o-mini-2024-07-18' | 'gpt-4o-mini' | 'gpt-4o' | 'gpt-4o-2024-05-13' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-11-20' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | 'gpt-3.5-turbo-0613';
2518
+ fallbackModels?: 'gpt-4.1' | 'gpt-4.1-mini' | 'gpt-4.1-nano' | 'gpt-4.5-preview' | 'chatgpt-4o-latest' | 'o3' | 'o3-mini' | 'o4-mini' | 'o1-preview' | 'o1-preview-2024-09-12' | 'o1-mini' | 'o1-mini-2024-09-12' | 'gpt-4o-realtime-preview-2024-10-01' | 'gpt-4o-realtime-preview-2024-12-17' | 'gpt-4o-mini-realtime-preview-2024-12-17' | 'gpt-4o-mini-2024-07-18' | 'gpt-4o-mini' | 'gpt-4o' | 'gpt-4o-2024-05-13' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-11-20' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | 'gpt-3.5-turbo-0613';
2448
2519
  /**
2449
2520
  * This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
2450
2521
  * @min 0
@@ -2631,6 +2702,116 @@ export interface TogetherAIModel {
2631
2702
  */
2632
2703
  numFastTurns?: number;
2633
2704
  }
2705
+ export interface Start {
2706
+ type: 'start';
2707
+ /** @maxLength 80 */
2708
+ name: string;
2709
+ /** This is for metadata you want to store on the task. */
2710
+ metadata?: object;
2711
+ }
2712
+ export interface Assistant {
2713
+ type: 'assistant';
2714
+ assistantId: string;
2715
+ /** @maxLength 80 */
2716
+ name: string;
2717
+ /** This is for metadata you want to store on the task. */
2718
+ metadata?: object;
2719
+ }
2720
+ export interface Say {
2721
+ type: 'say';
2722
+ /** @maxLength 1000 */
2723
+ exact?: string;
2724
+ /** @maxLength 1000 */
2725
+ prompt?: string;
2726
+ /** @maxLength 80 */
2727
+ name: string;
2728
+ /** This is for metadata you want to store on the task. */
2729
+ metadata?: object;
2730
+ }
2731
+ export interface SayHook {
2732
+ type: 'say';
2733
+ /** This is for metadata you want to store on the task. */
2734
+ metadata?: object;
2735
+ /** @maxLength 1000 */
2736
+ exact?: string;
2737
+ /** @maxLength 1000 */
2738
+ prompt?: string;
2739
+ }
2740
+ export interface Hook {
2741
+ /** @maxLength 80 */
2742
+ on: 'task.start' | 'task.output.confirmation' | 'task.delayed';
2743
+ do: SayHook[];
2744
+ }
2745
+ export interface Gather {
2746
+ type: 'gather';
2747
+ output: JsonSchema;
2748
+ /** This is whether or not the workflow should read back the gathered data to the user, and ask about its correctness. */
2749
+ confirmContent?: boolean;
2750
+ /**
2751
+ * This is a list of hooks for a task.
2752
+ * Each hook is a list of tasks to run on a trigger (such as on start, on failure, etc).
2753
+ * Only Say is supported for now.
2754
+ */
2755
+ hooks?: Hook[];
2756
+ /** This is the number of times we should try to gather the information from the user before we failover to the fail path. An example of this would be a user refusing to give their phone number for privacy reasons, and then going down a different path on account of this */
2757
+ maxRetries?: number;
2758
+ /** This is a liquid templating string. On the first call to Gather, the template will be filled out with variables from the context, and will be spoken verbatim to the user. An example would be "Base on your zipcode, it looks like you could be in one of these counties: {{ counties | join: ", " }}. Which one do you live in?" */
2759
+ literalTemplate?: string;
2760
+ /** @maxLength 80 */
2761
+ name: string;
2762
+ /** This is for metadata you want to store on the task. */
2763
+ metadata?: object;
2764
+ }
2765
+ export interface ApiRequest {
2766
+ type: 'apiRequest';
2767
+ method: 'POST' | 'GET';
2768
+ /** Api endpoint to send requests to. */
2769
+ url: string;
2770
+ /**
2771
+ * These are the custom headers to include in the Api Request sent.
2772
+ *
2773
+ * Each key-value pair represents a header name and its value.
2774
+ */
2775
+ headers?: JsonSchema;
2776
+ /**
2777
+ * This defined the JSON body of your Api Request. For example, if `body_schema`
2778
+ * included "my_field": "my_gather_statement.user_age", then the json body sent to the server would have that particular value assign to it.
2779
+ * Right now, only data from gather statements are supported.
2780
+ */
2781
+ body?: JsonSchema;
2782
+ /**
2783
+ * This is the mode of the Api Request.
2784
+ * We only support BLOCKING and BACKGROUND for now.
2785
+ */
2786
+ mode: 'blocking' | 'background';
2787
+ /**
2788
+ * This is a list of hooks for a task.
2789
+ * Each hook is a list of tasks to run on a trigger (such as on start, on failure, etc).
2790
+ * Only Say is supported for now.
2791
+ */
2792
+ hooks?: Hook[];
2793
+ /** This is the schema for the outputs of the Api Request. */
2794
+ output?: JsonSchema;
2795
+ /** @maxLength 80 */
2796
+ name: string;
2797
+ /** This is for metadata you want to store on the task. */
2798
+ metadata?: object;
2799
+ }
2800
+ export interface Hangup {
2801
+ type: 'hangup';
2802
+ /** @maxLength 80 */
2803
+ name: string;
2804
+ /** This is for metadata you want to store on the task. */
2805
+ metadata?: object;
2806
+ }
2807
+ export interface Transfer {
2808
+ type: 'transfer';
2809
+ destination: object;
2810
+ /** @maxLength 80 */
2811
+ name: string;
2812
+ /** This is for metadata you want to store on the task. */
2813
+ metadata?: object;
2814
+ }
2634
2815
  export interface AIEdgeCondition {
2635
2816
  type: 'ai';
2636
2817
  /**
@@ -2641,7 +2822,7 @@ export interface AIEdgeCondition {
2641
2822
  }
2642
2823
  export interface LogicEdgeCondition {
2643
2824
  type: 'logic';
2644
- /** @maxLength 100 */
2825
+ /** @maxLength 1000 */
2645
2826
  liquid: string;
2646
2827
  }
2647
2828
  export interface FailedEdgeCondition {
@@ -2656,16 +2837,10 @@ export interface Edge {
2656
2837
  /** This is for metadata you want to store on the edge. */
2657
2838
  metadata?: object;
2658
2839
  }
2659
- export interface Workflow {
2660
- nodes: (Say | Gather | ApiRequest | Hangup | Transfer)[];
2840
+ export interface WorkflowUserEditable {
2841
+ nodes: (Start | Assistant | Say | Gather | ApiRequest | Hangup | Transfer)[];
2661
2842
  /** These are the options for the workflow's LLM. */
2662
2843
  model?: AnthropicModel | AnyscaleModel | CerebrasModel | CustomLLMModel | DeepInfraModel | DeepSeekModel | GoogleModel | GroqModel | InflectionAIModel | OpenAIModel | OpenRouterModel | PerplexityAIModel | TogetherAIModel | XaiModel;
2663
- id: string;
2664
- orgId: string;
2665
- /** @format date-time */
2666
- createdAt: string;
2667
- /** @format date-time */
2668
- updatedAt: string;
2669
2844
  /** @maxLength 80 */
2670
2845
  name: string;
2671
2846
  edges: Edge[];
@@ -2693,7 +2868,7 @@ export interface VapiModel {
2693
2868
  /** This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead. */
2694
2869
  workflowId?: string;
2695
2870
  /** This is the workflow that will be used for the call. To use an existing workflow, use `workflowId` instead. */
2696
- workflow?: Workflow;
2871
+ workflow?: WorkflowUserEditable;
2697
2872
  /** This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b */
2698
2873
  model: string;
2699
2874
  /**
@@ -2948,6 +3123,12 @@ export interface FallbackPlan {
2948
3123
  voices: (FallbackAzureVoice | FallbackCartesiaVoice | FallbackHumeVoice | FallbackCustomVoice | FallbackDeepgramVoice | FallbackElevenLabsVoice | FallbackVapiVoice | FallbackLMNTVoice | FallbackOpenAIVoice | FallbackPlayHTVoice | FallbackRimeAIVoice | FallbackSmallestAIVoice | FallbackTavusVoice)[];
2949
3124
  }
2950
3125
  export interface AzureVoice {
3126
+ /**
3127
+ * This is the flag to toggle voice caching for the assistant.
3128
+ * @default true
3129
+ * @example true
3130
+ */
3131
+ cachingEnabled?: boolean;
2951
3132
  /** This is the voice provider that will be used. */
2952
3133
  provider: 'azure';
2953
3134
  /** This is the provider-specific ID that will be used. */
@@ -2969,6 +3150,12 @@ export interface CartesiaExperimentalControls {
2969
3150
  emotion?: 'anger:lowest' | 'anger:low' | 'anger:high' | 'anger:highest' | 'positivity:lowest' | 'positivity:low' | 'positivity:high' | 'positivity:highest' | 'surprise:lowest' | 'surprise:low' | 'surprise:high' | 'surprise:highest' | 'sadness:lowest' | 'sadness:low' | 'sadness:high' | 'sadness:highest' | 'curiosity:lowest' | 'curiosity:low' | 'curiosity:high' | 'curiosity:highest';
2970
3151
  }
2971
3152
  export interface CartesiaVoice {
3153
+ /**
3154
+ * This is the flag to toggle voice caching for the assistant.
3155
+ * @default true
3156
+ * @example true
3157
+ */
3158
+ cachingEnabled?: boolean;
2972
3159
  /** This is the voice provider that will be used. */
2973
3160
  provider: 'cartesia';
2974
3161
  /** The ID of the particular voice you want to use. */
@@ -2991,6 +3178,12 @@ export interface CartesiaVoice {
2991
3178
  fallbackPlan?: FallbackPlan;
2992
3179
  }
2993
3180
  export interface CustomVoice {
3181
+ /**
3182
+ * This is the flag to toggle voice caching for the assistant.
3183
+ * @default true
3184
+ * @example true
3185
+ */
3186
+ cachingEnabled?: boolean;
2994
3187
  /** This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported. */
2995
3188
  provider: 'custom-voice';
2996
3189
  /** This is the plan for chunking the model output before it is sent to the voice provider. */
@@ -3024,6 +3217,12 @@ export interface CustomVoice {
3024
3217
  fallbackPlan?: FallbackPlan;
3025
3218
  }
3026
3219
  export interface DeepgramVoice {
3220
+ /**
3221
+ * This is the flag to toggle voice caching for the assistant.
3222
+ * @default true
3223
+ * @example true
3224
+ */
3225
+ cachingEnabled?: boolean;
3027
3226
  /** This is the voice provider that will be used. */
3028
3227
  provider: 'deepgram';
3029
3228
  /**
@@ -3052,6 +3251,12 @@ export interface DeepgramVoice {
3052
3251
  fallbackPlan?: FallbackPlan;
3053
3252
  }
3054
3253
  export interface ElevenLabsVoice {
3254
+ /**
3255
+ * This is the flag to toggle voice caching for the assistant.
3256
+ * @default true
3257
+ * @example true
3258
+ */
3259
+ cachingEnabled?: boolean;
3055
3260
  /** This is the voice provider that will be used. */
3056
3261
  provider: '11labs';
3057
3262
  /** This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library. */
@@ -3121,6 +3326,12 @@ export interface ElevenLabsVoice {
3121
3326
  fallbackPlan?: FallbackPlan;
3122
3327
  }
3123
3328
  export interface HumeVoice {
3329
+ /**
3330
+ * This is the flag to toggle voice caching for the assistant.
3331
+ * @default true
3332
+ * @example true
3333
+ */
3334
+ cachingEnabled?: boolean;
3124
3335
  /** This is the voice provider that will be used. */
3125
3336
  provider: 'hume';
3126
3337
  /**
@@ -3148,6 +3359,12 @@ export interface HumeVoice {
3148
3359
  fallbackPlan?: FallbackPlan;
3149
3360
  }
3150
3361
  export interface LMNTVoice {
3362
+ /**
3363
+ * This is the flag to toggle voice caching for the assistant.
3364
+ * @default true
3365
+ * @example true
3366
+ */
3367
+ cachingEnabled?: boolean;
3151
3368
  /** This is the voice provider that will be used. */
3152
3369
  provider: 'lmnt';
3153
3370
  /** This is the provider-specific ID that will be used. */
@@ -3165,6 +3382,12 @@ export interface LMNTVoice {
3165
3382
  fallbackPlan?: FallbackPlan;
3166
3383
  }
3167
3384
  export interface NeuphonicVoice {
3385
+ /**
3386
+ * This is the flag to toggle voice caching for the assistant.
3387
+ * @default true
3388
+ * @example true
3389
+ */
3390
+ cachingEnabled?: boolean;
3168
3391
  /** This is the voice provider that will be used. */
3169
3392
  provider: 'neuphonic';
3170
3393
  /** This is the provider-specific ID that will be used. */
@@ -3192,6 +3415,12 @@ export interface NeuphonicVoice {
3192
3415
  fallbackPlan?: FallbackPlan;
3193
3416
  }
3194
3417
  export interface OpenAIVoice {
3418
+ /**
3419
+ * This is the flag to toggle voice caching for the assistant.
3420
+ * @default true
3421
+ * @example true
3422
+ */
3423
+ cachingEnabled?: boolean;
3195
3424
  /** This is the voice provider that will be used. */
3196
3425
  provider: 'openai';
3197
3426
  /**
@@ -3220,6 +3449,12 @@ export interface OpenAIVoice {
3220
3449
  fallbackPlan?: FallbackPlan;
3221
3450
  }
3222
3451
  export interface PlayHTVoice {
3452
+ /**
3453
+ * This is the flag to toggle voice caching for the assistant.
3454
+ * @default true
3455
+ * @example true
3456
+ */
3457
+ cachingEnabled?: boolean;
3223
3458
  /** This is the voice provider that will be used. */
3224
3459
  provider: 'playht';
3225
3460
  /** This is the provider-specific ID that will be used. */
@@ -3274,6 +3509,12 @@ export interface PlayHTVoice {
3274
3509
  fallbackPlan?: FallbackPlan;
3275
3510
  }
3276
3511
  export interface RimeAIVoice {
3512
+ /**
3513
+ * This is the flag to toggle voice caching for the assistant.
3514
+ * @default true
3515
+ * @example true
3516
+ */
3517
+ cachingEnabled?: boolean;
3277
3518
  /** This is the voice provider that will be used. */
3278
3519
  provider: 'rime-ai';
3279
3520
  /** This is the provider-specific ID that will be used. */
@@ -3315,6 +3556,12 @@ export interface RimeAIVoice {
3315
3556
  fallbackPlan?: FallbackPlan;
3316
3557
  }
3317
3558
  export interface SmallestAIVoice {
3559
+ /**
3560
+ * This is the flag to toggle voice caching for the assistant.
3561
+ * @default true
3562
+ * @example true
3563
+ */
3564
+ cachingEnabled?: boolean;
3318
3565
  /** This is the voice provider that will be used. */
3319
3566
  provider: 'smallest-ai';
3320
3567
  /** This is the provider-specific ID that will be used. */
@@ -3372,6 +3619,12 @@ export interface TavusConversationProperties {
3372
3619
  awsAssumeRoleArn?: string;
3373
3620
  }
3374
3621
  export interface TavusVoice {
3622
+ /**
3623
+ * This is the flag to toggle voice caching for the assistant.
3624
+ * @default true
3625
+ * @example true
3626
+ */
3627
+ cachingEnabled?: boolean;
3375
3628
  /** This is the voice provider that will be used. */
3376
3629
  provider: 'tavus';
3377
3630
  /** This is the provider-specific ID that will be used. */
@@ -3394,6 +3647,12 @@ export interface TavusVoice {
3394
3647
  fallbackPlan?: FallbackPlan;
3395
3648
  }
3396
3649
  export interface VapiVoice {
3650
+ /**
3651
+ * This is the flag to toggle voice caching for the assistant.
3652
+ * @default true
3653
+ * @example true
3654
+ */
3655
+ cachingEnabled?: boolean;
3397
3656
  /** This is the voice provider that will be used. */
3398
3657
  provider: 'vapi';
3399
3658
  /** The voices provided by Vapi */
@@ -3420,6 +3679,12 @@ export interface VapiVoice {
3420
3679
  fallbackPlan?: FallbackPlan;
3421
3680
  }
3422
3681
  export interface FallbackAzureVoice {
3682
+ /**
3683
+ * This is the flag to toggle voice caching for the assistant.
3684
+ * @default true
3685
+ * @example true
3686
+ */
3687
+ cachingEnabled?: boolean;
3423
3688
  /** This is the voice provider that will be used. */
3424
3689
  provider: 'azure';
3425
3690
  /** This is the provider-specific ID that will be used. */
@@ -3434,6 +3699,12 @@ export interface FallbackAzureVoice {
3434
3699
  chunkPlan?: ChunkPlan;
3435
3700
  }
3436
3701
  export interface FallbackCartesiaVoice {
3702
+ /**
3703
+ * This is the flag to toggle voice caching for the assistant.
3704
+ * @default true
3705
+ * @example true
3706
+ */
3707
+ cachingEnabled?: boolean;
3437
3708
  /** This is the voice provider that will be used. */
3438
3709
  provider: 'cartesia';
3439
3710
  /** The ID of the particular voice you want to use. */
@@ -3454,6 +3725,12 @@ export interface FallbackCartesiaVoice {
3454
3725
  chunkPlan?: ChunkPlan;
3455
3726
  }
3456
3727
  export interface FallbackCustomVoice {
3728
+ /**
3729
+ * This is the flag to toggle voice caching for the assistant.
3730
+ * @default true
3731
+ * @example true
3732
+ */
3733
+ cachingEnabled?: boolean;
3457
3734
  /** This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported. */
3458
3735
  provider: 'custom-voice';
3459
3736
  /**
@@ -3485,6 +3762,12 @@ export interface FallbackCustomVoice {
3485
3762
  chunkPlan?: ChunkPlan;
3486
3763
  }
3487
3764
  export interface FallbackDeepgramVoice {
3765
+ /**
3766
+ * This is the flag to toggle voice caching for the assistant.
3767
+ * @default true
3768
+ * @example true
3769
+ */
3770
+ cachingEnabled?: boolean;
3488
3771
  /** This is the voice provider that will be used. */
3489
3772
  provider: 'deepgram';
3490
3773
  /**
@@ -3511,6 +3794,12 @@ export interface FallbackDeepgramVoice {
3511
3794
  chunkPlan?: ChunkPlan;
3512
3795
  }
3513
3796
  export interface FallbackElevenLabsVoice {
3797
+ /**
3798
+ * This is the flag to toggle voice caching for the assistant.
3799
+ * @default true
3800
+ * @example true
3801
+ */
3802
+ cachingEnabled?: boolean;
3514
3803
  /** This is the voice provider that will be used. */
3515
3804
  provider: '11labs';
3516
3805
  /** This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library. */
@@ -3578,6 +3867,12 @@ export interface FallbackElevenLabsVoice {
3578
3867
  chunkPlan?: ChunkPlan;
3579
3868
  }
3580
3869
  export interface FallbackHumeVoice {
3870
+ /**
3871
+ * This is the flag to toggle voice caching for the assistant.
3872
+ * @default true
3873
+ * @example true
3874
+ */
3875
+ cachingEnabled?: boolean;
3581
3876
  /** This is the voice provider that will be used. */
3582
3877
  provider: 'hume';
3583
3878
  /**
@@ -3603,6 +3898,12 @@ export interface FallbackHumeVoice {
3603
3898
  chunkPlan?: ChunkPlan;
3604
3899
  }
3605
3900
  export interface FallbackLMNTVoice {
3901
+ /**
3902
+ * This is the flag to toggle voice caching for the assistant.
3903
+ * @default true
3904
+ * @example true
3905
+ */
3906
+ cachingEnabled?: boolean;
3606
3907
  /** This is the voice provider that will be used. */
3607
3908
  provider: 'lmnt';
3608
3909
  /** This is the provider-specific ID that will be used. */
@@ -3618,6 +3919,12 @@ export interface FallbackLMNTVoice {
3618
3919
  chunkPlan?: ChunkPlan;
3619
3920
  }
3620
3921
  export interface FallbackNeuphonicVoice {
3922
+ /**
3923
+ * This is the flag to toggle voice caching for the assistant.
3924
+ * @default true
3925
+ * @example true
3926
+ */
3927
+ cachingEnabled?: boolean;
3621
3928
  /** This is the voice provider that will be used. */
3622
3929
  provider: 'neuphonic';
3623
3930
  /** This is the provider-specific ID that will be used. */
@@ -3643,6 +3950,12 @@ export interface FallbackNeuphonicVoice {
3643
3950
  chunkPlan?: ChunkPlan;
3644
3951
  }
3645
3952
  export interface FallbackOpenAIVoice {
3953
+ /**
3954
+ * This is the flag to toggle voice caching for the assistant.
3955
+ * @default true
3956
+ * @example true
3957
+ */
3958
+ cachingEnabled?: boolean;
3646
3959
  /** This is the voice provider that will be used. */
3647
3960
  provider: 'openai';
3648
3961
  /**
@@ -3669,6 +3982,12 @@ export interface FallbackOpenAIVoice {
3669
3982
  chunkPlan?: ChunkPlan;
3670
3983
  }
3671
3984
  export interface FallbackPlayHTVoice {
3985
+ /**
3986
+ * This is the flag to toggle voice caching for the assistant.
3987
+ * @default true
3988
+ * @example true
3989
+ */
3990
+ cachingEnabled?: boolean;
3672
3991
  /** This is the voice provider that will be used. */
3673
3992
  provider: 'playht';
3674
3993
  /** This is the provider-specific ID that will be used. */
@@ -3721,6 +4040,12 @@ export interface FallbackPlayHTVoice {
3721
4040
  chunkPlan?: ChunkPlan;
3722
4041
  }
3723
4042
  export interface FallbackRimeAIVoice {
4043
+ /**
4044
+ * This is the flag to toggle voice caching for the assistant.
4045
+ * @default true
4046
+ * @example true
4047
+ */
4048
+ cachingEnabled?: boolean;
3724
4049
  /** This is the voice provider that will be used. */
3725
4050
  provider: 'rime-ai';
3726
4051
  /** This is the provider-specific ID that will be used. */
@@ -3760,7 +4085,13 @@ export interface FallbackRimeAIVoice {
3760
4085
  chunkPlan?: ChunkPlan;
3761
4086
  }
3762
4087
  export interface FallbackSmallestAIVoice {
3763
- /** This is the voice provider that will be used. */
4088
+ /**
4089
+ * This is the flag to toggle voice caching for the assistant.
4090
+ * @default true
4091
+ * @example true
4092
+ */
4093
+ cachingEnabled?: boolean;
4094
+ /** This is the voice provider that will be used. */
3764
4095
  provider: 'smallest-ai';
3765
4096
  /** This is the provider-specific ID that will be used. */
3766
4097
  voiceId: 'emily' | 'jasmine' | 'arman' | 'james' | 'mithali' | 'aravind' | 'raj' | 'diya' | 'raman' | 'ananya' | 'isha' | 'william' | 'aarav' | 'monika' | 'niharika' | 'deepika' | 'raghav' | 'kajal' | 'radhika' | 'mansi' | 'nisha' | 'saurabh' | 'pooja' | 'saina' | 'sanya' | string;
@@ -3775,6 +4106,12 @@ export interface FallbackSmallestAIVoice {
3775
4106
  chunkPlan?: ChunkPlan;
3776
4107
  }
3777
4108
  export interface FallbackTavusVoice {
4109
+ /**
4110
+ * This is the flag to toggle voice caching for the assistant.
4111
+ * @default true
4112
+ * @example true
4113
+ */
4114
+ cachingEnabled?: boolean;
3778
4115
  /** This is the voice provider that will be used. */
3779
4116
  provider: 'tavus';
3780
4117
  /** This is the provider-specific ID that will be used. */
@@ -3795,6 +4132,12 @@ export interface FallbackTavusVoice {
3795
4132
  chunkPlan?: ChunkPlan;
3796
4133
  }
3797
4134
  export interface FallbackVapiVoice {
4135
+ /**
4136
+ * This is the flag to toggle voice caching for the assistant.
4137
+ * @default true
4138
+ * @example true
4139
+ */
4140
+ cachingEnabled?: boolean;
3798
4141
  /** This is the voice provider that will be used. */
3799
4142
  provider: 'vapi';
3800
4143
  /** The voices provided by Vapi */
@@ -4100,7 +4443,7 @@ export interface CreateCloudflareCredentialDTO {
4100
4443
  name?: string;
4101
4444
  }
4102
4445
  export interface OAuth2AuthenticationPlan {
4103
- type: 'oauth2';
4446
+ type: 'oauth2' | 'aws-sts';
4104
4447
  /** This is the OAuth2 URL. */
4105
4448
  url: string;
4106
4449
  /** This is the OAuth2 client ID. */
@@ -4508,7 +4851,11 @@ export interface CreateTogetherAICredentialDTO {
4508
4851
  export interface CreateTwilioCredentialDTO {
4509
4852
  provider: 'twilio';
4510
4853
  /** This is not returned in the API. */
4511
- authToken: string;
4854
+ authToken?: string;
4855
+ /** This is not returned in the API. */
4856
+ apiKey?: string;
4857
+ /** This is not returned in the API. */
4858
+ apiSecret?: string;
4512
4859
  accountSid: string;
4513
4860
  /**
4514
4861
  * This is the name of credential. This is just for your reference.
@@ -4603,31 +4950,130 @@ export interface TransferAssistantHookAction {
4603
4950
  /** This is the destination details for the transfer - can be a phone number or SIP URI */
4604
4951
  destination?: TransferDestinationNumber | TransferDestinationSip;
4605
4952
  }
4953
+ export interface FunctionCallAssistantHookAction {
4954
+ /**
4955
+ * This determines if the tool is async.
4956
+ *
4957
+ * If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.
4958
+ *
4959
+ * If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.
4960
+ *
4961
+ * Defaults to synchronous (`false`).
4962
+ * @example false
4963
+ */
4964
+ async?: boolean;
4965
+ /**
4966
+ * These are the messages that will be spoken to the user as the tool is running.
4967
+ *
4968
+ * For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.
4969
+ */
4970
+ messages?: (ToolMessageStart | ToolMessageComplete | ToolMessageFailed | ToolMessageDelayed)[];
4971
+ /** The type of tool. "function" for Function tool. */
4972
+ type: 'function';
4973
+ /**
4974
+ * This is the function definition of the tool.
4975
+ *
4976
+ * For `endCall`, `transferCall`, and `dtmf` tools, this is auto-filled based on tool-specific fields like `tool.destinations`. But, even in those cases, you can provide a custom function definition for advanced use cases.
4977
+ *
4978
+ * An example of an advanced use case is if you want to customize the message that's spoken for `endCall` tool. You can specify a function where it returns an argument "reason". Then, in `messages` array, you can have many "request-complete" messages. One of these messages will be triggered if the `messages[].conditions` matches the "reason" argument.
4979
+ */
4980
+ function?: OpenAIFunction;
4981
+ /**
4982
+ * This is the server that will be hit when this tool is requested by the model.
4983
+ *
4984
+ * All requests will be sent with the call object among other things. You can find more details in the Server URL documentation.
4985
+ *
4986
+ * This overrides the serverUrl set on the org and the phoneNumber. Order of precedence: highest tool.server.url, then assistant.serverUrl, then phoneNumber.serverUrl, then org.serverUrl.
4987
+ */
4988
+ server?: Server;
4989
+ }
4990
+ export interface AssistantHookFilter {
4991
+ /**
4992
+ * This is the type of filter - currently only "oneOf" is supported
4993
+ * @maxLength 1000
4994
+ */
4995
+ type: 'oneOf';
4996
+ /**
4997
+ * This is the key to filter on (e.g. "call.endedReason")
4998
+ * @maxLength 1000
4999
+ */
5000
+ key: string;
5001
+ /** This is the array of possible values to match against */
5002
+ oneOf: string[];
5003
+ }
5004
+ export interface AssistantHookCallEnding {
5005
+ /**
5006
+ * This is the event that triggers this hook
5007
+ * @maxLength 1000
5008
+ */
5009
+ on: 'call.ending';
5010
+ /** This is the set of actions to perform when the hook triggers */
5011
+ do: (TransferAssistantHookAction | FunctionCallAssistantHookAction)[];
5012
+ /** This is the set of filters that must match for the hook to trigger */
5013
+ filters?: AssistantHookFilter[];
5014
+ }
5015
+ export interface VoicemailDetectionBackoffPlan {
5016
+ /**
5017
+ * This is the number of seconds to wait before starting the first retry attempt.
5018
+ * @min 0
5019
+ * @default 5
5020
+ */
5021
+ startAtSeconds?: number;
5022
+ /**
5023
+ * This is the interval in seconds between retry attempts.
5024
+ * @min 2.5
5025
+ * @default 5
5026
+ */
5027
+ frequencySeconds?: number;
5028
+ /**
5029
+ * This is the maximum number of retry attempts before giving up.
5030
+ * @min 1
5031
+ * @max 10
5032
+ * @default 6
5033
+ */
5034
+ maxRetries?: number;
5035
+ }
4606
5036
  export interface GoogleVoicemailDetectionPlan {
4607
- /** This is the provider to use for voicemail detection. */
4608
- provider: 'google';
4609
5037
  /**
4610
- * This is how long should we listen in order to determine if we were sent to voicemail or not?
5038
+ * This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message
4611
5039
  *
4612
- * @default 15
4613
- * @min 5
5040
+ * - If we detect a voicemail beep before this, we will speak the message at that point.
5041
+ *
5042
+ * - Setting too low a value means that the bot will start speaking its voicemail message too early. If it does so before the actual beep, it will get cut off. You should definitely tune this to your use case.
5043
+ *
5044
+ * @default 30
5045
+ * @min 0
4614
5046
  * @max 60
4615
- * @default 25
5047
+ * @min 0
5048
+ * @max 30
5049
+ * @default 30
4616
5050
  */
4617
- voicemailExpectedDurationSeconds: number;
5051
+ beepMaxAwaitSeconds?: number;
5052
+ /** This is the provider to use for voicemail detection. */
5053
+ provider: 'google';
5054
+ /** This is the backoff plan for the voicemail detection. */
5055
+ backoffPlan?: VoicemailDetectionBackoffPlan;
4618
5056
  }
4619
5057
  export interface OpenAIVoicemailDetectionPlan {
4620
- /** This is the provider to use for voicemail detection. */
4621
- provider: 'openai';
4622
5058
  /**
4623
- * This is how long should we listen in order to determine if we were sent to voicemail or not?
5059
+ * This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message
4624
5060
  *
4625
- * @default 15
4626
- * @min 5
5061
+ * - If we detect a voicemail beep before this, we will speak the message at that point.
5062
+ *
5063
+ * - Setting too low a value means that the bot will start speaking its voicemail message too early. If it does so before the actual beep, it will get cut off. You should definitely tune this to your use case.
5064
+ *
5065
+ * @default 30
5066
+ * @min 0
4627
5067
  * @max 60
4628
- * @default 25
5068
+ * @min 0
5069
+ * @max 30
5070
+ * @default 30
4629
5071
  */
4630
- voicemailExpectedDurationSeconds: number;
5072
+ beepMaxAwaitSeconds?: number;
5073
+ /** This is the provider to use for voicemail detection. */
5074
+ provider: 'openai';
5075
+ /** This is the backoff plan for the voicemail detection. */
5076
+ backoffPlan?: VoicemailDetectionBackoffPlan;
4631
5077
  }
4632
5078
  export interface TwilioVoicemailDetectionPlan {
4633
5079
  /** This is the provider to use for voicemail detection. */
@@ -4704,6 +5150,27 @@ export interface TwilioVoicemailDetectionPlan {
4704
5150
  */
4705
5151
  machineDetectionSilenceTimeout?: number;
4706
5152
  }
5153
+ export interface VapiVoicemailDetectionPlan {
5154
+ /**
5155
+ * This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message
5156
+ *
5157
+ * - If we detect a voicemail beep before this, we will speak the message at that point.
5158
+ *
5159
+ * - Setting too low a value means that the bot will start speaking its voicemail message too early. If it does so before the actual beep, it will get cut off. You should definitely tune this to your use case.
5160
+ *
5161
+ * @default 30
5162
+ * @min 0
5163
+ * @max 60
5164
+ * @min 0
5165
+ * @max 30
5166
+ * @default 30
5167
+ */
5168
+ beepMaxAwaitSeconds?: number;
5169
+ /** This is the provider to use for voicemail detection. */
5170
+ provider: 'vapi';
5171
+ /** This is the backoff plan for the voicemail detection. */
5172
+ backoffPlan?: VoicemailDetectionBackoffPlan;
5173
+ }
4707
5174
  export interface CompliancePlan {
4708
5175
  /**
4709
5176
  * When this is enabled, no logs, recordings, or transcriptions will be stored.
@@ -5096,7 +5563,7 @@ export interface StartSpeakingPlan {
5096
5563
  * @deprecated
5097
5564
  * @example false
5098
5565
  */
5099
- smartEndpointingEnabled?: object;
5566
+ smartEndpointingEnabled?: boolean | 'livekit';
5100
5567
  /**
5101
5568
  * This is the plan for smart endpointing. Pick between Vapi smart endpointing or LiveKit smart endpointing (or nothing). We strongly recommend using livekit endpointing when working in English. LiveKit endpointing is not supported in other languages, yet.
5102
5569
  *
@@ -5217,32 +5684,6 @@ export interface MonitorPlan {
5217
5684
  */
5218
5685
  controlEnabled?: boolean;
5219
5686
  }
5220
- export interface AssistantHookFilter {
5221
- /**
5222
- * This is the type of filter - currently only "oneOf" is supported
5223
- * @maxLength 1000
5224
- */
5225
- type: 'oneOf';
5226
- /**
5227
- * This is the key to filter on (e.g. "call.endedReason")
5228
- * @maxLength 1000
5229
- */
5230
- key: string;
5231
- /** This is the array of possible values to match against */
5232
- oneOf: string[];
5233
- }
5234
- export type AssistantHookActionBase = object;
5235
- export interface AssistantHooks {
5236
- /**
5237
- * This is the event that triggers this hook
5238
- * @maxLength 1000
5239
- */
5240
- on: 'call.ending';
5241
- /** This is the set of filters that must match for the hook to trigger */
5242
- filters?: AssistantHookFilter[];
5243
- /** This is the set of actions to perform when the hook triggers */
5244
- do: AssistantHookActionBase[];
5245
- }
5246
5687
  export interface KeypadInputPlan {
5247
5688
  /**
5248
5689
  * This keeps track of whether the user has enabled keypad input.
@@ -5303,17 +5744,9 @@ export interface CreateAssistantDTO {
5303
5744
  * This uses Twilio's built-in detection while the VoicemailTool relies on the model to detect if a voicemail was reached.
5304
5745
  * You can use neither of them, one of them, or both of them. By default, Twilio built-in detection is enabled while VoicemailTool is not.
5305
5746
  */
5306
- voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan;
5307
- /**
5308
- * These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started. You can check the shape of the messages in ClientMessage schema.
5309
- * @example ["conversation-update","function-call","hang","model-output","speech-update","status-update","transfer-update","transcript","tool-calls","user-interrupted","voice-input","workflow.node.started"]
5310
- */
5311
- clientMessages?: 'conversation-update' | 'function-call' | 'function-call-result' | 'hang' | 'language-changed' | 'metadata' | 'model-output' | 'speech-update' | 'status-update' | 'transcript' | 'tool-calls' | 'tool-calls-result' | 'transfer-update' | 'user-interrupted' | 'voice-input' | 'workflow.node.started';
5312
- /**
5313
- * These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,user-interrupted. You can check the shape of the messages in ServerMessage schema.
5314
- * @example ["conversation-update","end-of-call-report","function-call","hang","speech-update","status-update","tool-calls","transfer-destination-request","user-interrupted"]
5315
- */
5316
- serverMessages?: 'conversation-update' | 'end-of-call-report' | 'function-call' | 'hang' | 'language-changed' | 'language-change-detected' | 'model-output' | 'phone-call-control' | 'speech-update' | 'status-update' | 'transcript' | "transcript[transcriptType='final']" | 'tool-calls' | 'transfer-destination-request' | 'transfer-update' | 'user-interrupted' | 'voice-input';
5747
+ voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan | VapiVoicemailDetectionPlan;
5748
+ clientMessages: object[][];
5749
+ serverMessages: object[][];
5317
5750
  /**
5318
5751
  * How many seconds of silence to wait before ending the call. Defaults to 30.
5319
5752
  *
@@ -5459,6 +5892,8 @@ export interface CreateAssistantDTO {
5459
5892
  } & CreateGoogleSheetsOAuth2AuthorizationCredentialDTO) | ({
5460
5893
  provider: 'slack.oauth2-authorization';
5461
5894
  } & CreateSlackOAuth2AuthorizationCredentialDTO))[];
5895
+ /** This is a set of actions that will be performed on certain events. */
5896
+ hooks?: AssistantHookCallEnding[];
5462
5897
  /**
5463
5898
  * This is the name of the assistant.
5464
5899
  *
@@ -5541,8 +5976,6 @@ export interface CreateAssistantDTO {
5541
5976
  * 3. org.serverUrl
5542
5977
  */
5543
5978
  server?: Server;
5544
- /** This is a set of actions that will be performed on certain events. */
5545
- hooks?: AssistantHooks[];
5546
5979
  keypadInputPlan?: KeypadInputPlan;
5547
5980
  }
5548
5981
  export interface AssistantOverrides {
@@ -5581,17 +6014,9 @@ export interface AssistantOverrides {
5581
6014
  * This uses Twilio's built-in detection while the VoicemailTool relies on the model to detect if a voicemail was reached.
5582
6015
  * You can use neither of them, one of them, or both of them. By default, Twilio built-in detection is enabled while VoicemailTool is not.
5583
6016
  */
5584
- voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan;
5585
- /**
5586
- * These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started. You can check the shape of the messages in ClientMessage schema.
5587
- * @example ["conversation-update","function-call","hang","model-output","speech-update","status-update","transfer-update","transcript","tool-calls","user-interrupted","voice-input","workflow.node.started"]
5588
- */
5589
- clientMessages?: 'conversation-update' | 'function-call' | 'function-call-result' | 'hang' | 'language-changed' | 'metadata' | 'model-output' | 'speech-update' | 'status-update' | 'transcript' | 'tool-calls' | 'tool-calls-result' | 'transfer-update' | 'user-interrupted' | 'voice-input' | 'workflow.node.started';
5590
- /**
5591
- * These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,user-interrupted. You can check the shape of the messages in ServerMessage schema.
5592
- * @example ["conversation-update","end-of-call-report","function-call","hang","speech-update","status-update","tool-calls","transfer-destination-request","user-interrupted"]
5593
- */
5594
- serverMessages?: 'conversation-update' | 'end-of-call-report' | 'function-call' | 'hang' | 'language-changed' | 'language-change-detected' | 'model-output' | 'phone-call-control' | 'speech-update' | 'status-update' | 'transcript' | "transcript[transcriptType='final']" | 'tool-calls' | 'transfer-destination-request' | 'transfer-update' | 'user-interrupted' | 'voice-input';
6017
+ voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan | VapiVoicemailDetectionPlan;
6018
+ clientMessages: object[][];
6019
+ serverMessages: object[][];
5595
6020
  /**
5596
6021
  * How many seconds of silence to wait before ending the call. Defaults to 30.
5597
6022
  *
@@ -5737,6 +6162,8 @@ export interface AssistantOverrides {
5737
6162
  } & CreateGoogleSheetsOAuth2AuthorizationCredentialDTO) | ({
5738
6163
  provider: 'slack.oauth2-authorization';
5739
6164
  } & CreateSlackOAuth2AuthorizationCredentialDTO))[];
6165
+ /** This is a set of actions that will be performed on certain events. */
6166
+ hooks?: AssistantHookCallEnding[];
5740
6167
  /**
5741
6168
  * These are values that will be used to replace the template variables in the assistant messages and other text-based fields.
5742
6169
  * This uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html
@@ -5829,8 +6256,6 @@ export interface AssistantOverrides {
5829
6256
  * 3. org.serverUrl
5830
6257
  */
5831
6258
  server?: Server;
5832
- /** This is a set of actions that will be performed on certain events. */
5833
- hooks?: AssistantHooks[];
5834
6259
  keypadInputPlan?: KeypadInputPlan;
5835
6260
  }
5836
6261
  export interface SquadMemberDTO {
@@ -5863,6 +6288,29 @@ export interface CreateSquadDTO {
5863
6288
  */
5864
6289
  membersOverrides?: AssistantOverrides;
5865
6290
  }
6291
+ export interface CreateWorkflowDTO {
6292
+ nodes: (Start | Assistant | Say | Gather | ApiRequest | Hangup | Transfer)[];
6293
+ /** These are the options for the workflow's LLM. */
6294
+ model?: AnthropicModel | AnyscaleModel | CerebrasModel | CustomLLMModel | DeepInfraModel | DeepSeekModel | GoogleModel | GroqModel | InflectionAIModel | OpenAIModel | OpenRouterModel | PerplexityAIModel | TogetherAIModel | XaiModel;
6295
+ /** @maxLength 80 */
6296
+ name: string;
6297
+ edges: Edge[];
6298
+ }
6299
+ export interface TransferPhoneNumberHookAction {
6300
+ /** This is the type of action - must be "transfer" */
6301
+ type: 'transfer';
6302
+ /** This is the destination details for the transfer - can be a phone number or SIP URI */
6303
+ destination?: TransferDestinationNumber | TransferDestinationSip;
6304
+ }
6305
+ export interface SayPhoneNumberHookAction {
6306
+ /** This is the type of action - must be "say" */
6307
+ type: 'say';
6308
+ /**
6309
+ * This is the message to say
6310
+ * @maxLength 4000
6311
+ */
6312
+ exact: string;
6313
+ }
5866
6314
  export interface PhoneNumberHookCallRinging {
5867
6315
  /**
5868
6316
  * This is the event to trigger the hook on
@@ -5870,7 +6318,7 @@ export interface PhoneNumberHookCallRinging {
5870
6318
  */
5871
6319
  on: 'call.ringing';
5872
6320
  /** This is the set of actions to perform when the hook triggers */
5873
- do: any[];
6321
+ do: (TransferPhoneNumberHookAction | SayPhoneNumberHookAction)[];
5874
6322
  }
5875
6323
  export interface ImportTwilioPhoneNumberDTO {
5876
6324
  /**
@@ -5884,6 +6332,16 @@ export interface ImportTwilioPhoneNumberDTO {
5884
6332
  fallbackDestination?: TransferDestinationNumber | TransferDestinationSip;
5885
6333
  /** This is the hooks that will be used for incoming calls to this phone number. */
5886
6334
  hooks?: PhoneNumberHookCallRinging[];
6335
+ /**
6336
+ * Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.
6337
+ *
6338
+ * If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
6339
+ * If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.
6340
+ *
6341
+ * @default true
6342
+ * @default true
6343
+ */
6344
+ smsEnabled?: boolean;
5887
6345
  /**
5888
6346
  * These are the digits of the phone number you own on your Twilio.
5889
6347
  * @deprecated
@@ -5892,7 +6350,11 @@ export interface ImportTwilioPhoneNumberDTO {
5892
6350
  /** This is your Twilio Account SID that will be used to handle this phone number. */
5893
6351
  twilioAccountSid: string;
5894
6352
  /** This is the Twilio Auth Token that will be used to handle this phone number. */
5895
- twilioAuthToken: string;
6353
+ twilioAuthToken?: string;
6354
+ /** This is the Twilio API Key that will be used to handle this phone number. If AuthToken is provided, this will be ignored. */
6355
+ twilioApiKey?: string;
6356
+ /** This is the Twilio API Secret that will be used to handle this phone number. If AuthToken is provided, this will be ignored. */
6357
+ twilioApiSecret?: string;
5896
6358
  /**
5897
6359
  * This is the name of the phone number. This is just for your own reference.
5898
6360
  * @maxLength 40
@@ -5901,13 +6363,19 @@ export interface ImportTwilioPhoneNumberDTO {
5901
6363
  /**
5902
6364
  * This is the assistant that will be used for incoming calls to this phone number.
5903
6365
  *
5904
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
6366
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
5905
6367
  */
5906
6368
  assistantId?: string;
6369
+ /**
6370
+ * This is the workflow that will be used for incoming calls to this phone number.
6371
+ *
6372
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
6373
+ */
6374
+ workflowId?: string;
5907
6375
  /**
5908
6376
  * This is the squad that will be used for incoming calls to this phone number.
5909
6377
  *
5910
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
6378
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
5911
6379
  */
5912
6380
  squadId?: string;
5913
6381
  /**
@@ -5978,7 +6446,7 @@ export interface Call {
5978
6446
  /** This is the type of call. */
5979
6447
  type?: 'inboundPhoneCall' | 'outboundPhoneCall' | 'webCall' | 'vapi.websocketCall';
5980
6448
  /** These are the costs of individual components of the call in USD. */
5981
- costs?: (TransportCost | TranscriberCost | ModelCost | VoiceCost | VapiCost | VoicemailDetectionCost | AnalysisCost)[];
6449
+ costs?: (TransportCost | TranscriberCost | ModelCost | VoiceCost | VapiCost | VoicemailDetectionCost | AnalysisCost | KnowledgeBaseCost)[];
5982
6450
  messages?: (UserMessage | SystemMessage | BotMessage | ToolCallMessage | ToolCallResultMessage)[];
5983
6451
  /**
5984
6452
  * This is the provider of the call.
@@ -5995,7 +6463,7 @@ export interface Call {
5995
6463
  /** This is the status of the call. */
5996
6464
  status?: 'scheduled' | 'queued' | 'ringing' | 'in-progress' | 'forwarding' | 'ended';
5997
6465
  /** This is the explanation for how the call ended. */
5998
- endedReason?: 'call-start-error-neither-assistant-nor-server-set' | 'assistant-request-failed' | 'assistant-request-returned-error' | 'assistant-request-returned-unspeakable-error' | 'assistant-request-returned-invalid-assistant' | 'assistant-request-returned-no-assistant' | 'assistant-request-returned-forwarding-phone-number' | 'call.start.error-get-org' | 'call.start.error-get-subscription' | 'call.start.error-get-assistant' | 'call.start.error-get-phone-number' | 'call.start.error-get-customer' | 'call.start.error-get-resources-validation' | 'call.start.error-vapi-number-international' | 'call.start.error-vapi-number-outbound-daily-limit' | 'call.start.error-get-transport' | 'assistant-not-valid' | 'database-error' | 'assistant-not-found' | 'pipeline-error-openai-voice-failed' | 'pipeline-error-cartesia-voice-failed' | 'pipeline-error-deepgram-voice-failed' | 'pipeline-error-eleven-labs-voice-failed' | 'pipeline-error-playht-voice-failed' | 'pipeline-error-lmnt-voice-failed' | 'pipeline-error-azure-voice-failed' | 'pipeline-error-rime-ai-voice-failed' | 'pipeline-error-smallest-ai-voice-failed' | 'pipeline-error-neuphonic-voice-failed' | 'pipeline-error-hume-voice-failed' | 'pipeline-error-sesame-voice-failed' | 'pipeline-error-tavus-video-failed' | 'call.in-progress.error-vapifault-openai-voice-failed' | 'call.in-progress.error-vapifault-cartesia-voice-failed' | 'call.in-progress.error-vapifault-deepgram-voice-failed' | 'call.in-progress.error-vapifault-eleven-labs-voice-failed' | 'call.in-progress.error-vapifault-playht-voice-failed' | 'call.in-progress.error-vapifault-lmnt-voice-failed' | 'call.in-progress.error-vapifault-azure-voice-failed' | 'call.in-progress.error-vapifault-rime-ai-voice-failed' | 'call.in-progress.error-vapifault-smallest-ai-voice-failed' | 'call.in-progress.error-vapifault-neuphonic-voice-failed' | 'call.in-progress.error-vapifault-hume-voice-failed' | 'call.in-progress.error-vapifault-sesame-voice-failed' | 'call.in-progress.error-vapifault-tavus-video-failed' | 'pipeline-error-vapi-llm-failed' | 'pipeline-error-vapi-400-bad-request-validation-failed' | 'pipeline-error-vapi-401-unauthorized' | 'pipeline-error-vapi-403-model-access-denied' | 'pipeline-error-vapi-429-exceeded-quota' | 'pipeline-error-vapi-500-server-error' | 'pipeline-error-vapi-503-server-overloaded-error' | 'call.in-progress.error-vapifault-vapi-llm-failed' | 'call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-vapi-401-unauthorized' | 'call.in-progress.error-vapifault-vapi-403-model-access-denied' | 'call.in-progress.error-vapifault-vapi-429-exceeded-quota' | 'call.in-progress.error-providerfault-vapi-500-server-error' | 'call.in-progress.error-providerfault-vapi-503-server-overloaded-error' | 'pipeline-error-deepgram-transcriber-failed' | 'call.in-progress.error-vapifault-deepgram-transcriber-failed' | 'pipeline-error-gladia-transcriber-failed' | 'call.in-progress.error-vapifault-gladia-transcriber-failed' | 'pipeline-error-speechmatics-transcriber-failed' | 'call.in-progress.error-vapifault-speechmatics-transcriber-failed' | 'pipeline-error-assembly-ai-transcriber-failed' | 'pipeline-error-assembly-ai-returning-400-insufficent-funds' | 'pipeline-error-assembly-ai-returning-400-paid-only-feature' | 'pipeline-error-assembly-ai-returning-401-invalid-credentials' | 'pipeline-error-assembly-ai-returning-500-invalid-schema' | 'pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed' | 'call.in-progress.error-vapifault-assembly-ai-transcriber-failed' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature' | 'call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed' | 'pipeline-error-talkscriber-transcriber-failed' | 'call.in-progress.error-vapifault-talkscriber-transcriber-failed' | 'pipeline-error-azure-speech-transcriber-failed' | 'call.in-progress.error-vapifault-azure-speech-transcriber-failed' | 'call.in-progress.error-pipeline-no-available-llm-model' | 'worker-shutdown' | 'unknown-error' | 'vonage-disconnected' | 'vonage-failed-to-connect-call' | 'vonage-completed' | 'phone-call-provider-bypass-enabled-but-no-call-received' | 'call.in-progress.error-vapifault-transport-never-connected' | 'call.in-progress.error-vapifault-transport-connected-but-call-not-active' | 'call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing' | 'call.in-progress.error-vapifault-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-groq-llm-failed' | 'call.in-progress.error-vapifault-google-llm-failed' | 'call.in-progress.error-vapifault-xai-llm-failed' | 'call.in-progress.error-vapifault-mistral-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-cerebras-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-llm-failed' | 'pipeline-error-openai-400-bad-request-validation-failed' | 'pipeline-error-openai-401-unauthorized' | 'pipeline-error-openai-401-incorrect-api-key' | 'pipeline-error-openai-401-account-not-in-organization' | 'pipeline-error-openai-403-model-access-denied' | 'pipeline-error-openai-429-exceeded-quota' | 'pipeline-error-openai-429-rate-limit-reached' | 'pipeline-error-openai-500-server-error' | 'pipeline-error-openai-503-server-overloaded-error' | 'pipeline-error-openai-llm-failed' | 'call.in-progress.error-vapifault-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openai-401-unauthorized' | 'call.in-progress.error-vapifault-openai-401-incorrect-api-key' | 'call.in-progress.error-vapifault-openai-401-account-not-in-organization' | 'call.in-progress.error-vapifault-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-openai-429-exceeded-quota' | 'call.in-progress.error-vapifault-openai-429-rate-limit-reached' | 'call.in-progress.error-providerfault-openai-500-server-error' | 'call.in-progress.error-providerfault-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-400-bad-request-validation-failed' | 'pipeline-error-azure-openai-401-unauthorized' | 'pipeline-error-azure-openai-403-model-access-denied' | 'pipeline-error-azure-openai-429-exceeded-quota' | 'pipeline-error-azure-openai-500-server-error' | 'pipeline-error-azure-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-azure-openai-401-unauthorized' | 'call.in-progress.error-vapifault-azure-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-azure-openai-429-exceeded-quota' | 'call.in-progress.error-providerfault-azure-openai-500-server-error' | 'call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error' | 'pipeline-error-google-400-bad-request-validation-failed' | 'pipeline-error-google-401-unauthorized' | 'pipeline-error-google-403-model-access-denied' | 'pipeline-error-google-429-exceeded-quota' | 'pipeline-error-google-500-server-error' | 'pipeline-error-google-503-server-overloaded-error' | 'pipeline-error-google-llm-failed' | 'call.in-progress.error-vapifault-google-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-google-401-unauthorized' | 'call.in-progress.error-vapifault-google-403-model-access-denied' | 'call.in-progress.error-vapifault-google-429-exceeded-quota' | 'call.in-progress.error-providerfault-google-500-server-error' | 'call.in-progress.error-providerfault-google-503-server-overloaded-error' | 'pipeline-error-xai-400-bad-request-validation-failed' | 'pipeline-error-xai-401-unauthorized' | 'pipeline-error-xai-403-model-access-denied' | 'pipeline-error-xai-429-exceeded-quota' | 'pipeline-error-xai-500-server-error' | 'pipeline-error-xai-503-server-overloaded-error' | 'pipeline-error-xai-llm-failed' | 'call.in-progress.error-vapifault-xai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-xai-401-unauthorized' | 'call.in-progress.error-vapifault-xai-403-model-access-denied' | 'call.in-progress.error-vapifault-xai-429-exceeded-quota' | 'call.in-progress.error-providerfault-xai-500-server-error' | 'call.in-progress.error-providerfault-xai-503-server-overloaded-error' | 'pipeline-error-mistral-400-bad-request-validation-failed' | 'pipeline-error-mistral-401-unauthorized' | 'pipeline-error-mistral-403-model-access-denied' | 'pipeline-error-mistral-429-exceeded-quota' | 'pipeline-error-mistral-500-server-error' | 'pipeline-error-mistral-503-server-overloaded-error' | 'pipeline-error-mistral-llm-failed' | 'call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-mistral-401-unauthorized' | 'call.in-progress.error-vapifault-mistral-403-model-access-denied' | 'call.in-progress.error-vapifault-mistral-429-exceeded-quota' | 'call.in-progress.error-providerfault-mistral-500-server-error' | 'call.in-progress.error-providerfault-mistral-503-server-overloaded-error' | 'pipeline-error-inflection-ai-400-bad-request-validation-failed' | 'pipeline-error-inflection-ai-401-unauthorized' | 'pipeline-error-inflection-ai-403-model-access-denied' | 'pipeline-error-inflection-ai-429-exceeded-quota' | 'pipeline-error-inflection-ai-500-server-error' | 'pipeline-error-inflection-ai-503-server-overloaded-error' | 'pipeline-error-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-inflection-ai-401-unauthorized' | 'call.in-progress.error-vapifault-inflection-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-inflection-ai-500-server-error' | 'call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error' | 'pipeline-error-deep-seek-400-bad-request-validation-failed' | 'pipeline-error-deep-seek-401-unauthorized' | 'pipeline-error-deep-seek-403-model-access-denied' | 'pipeline-error-deep-seek-429-exceeded-quota' | 'pipeline-error-deep-seek-500-server-error' | 'pipeline-error-deep-seek-503-server-overloaded-error' | 'pipeline-error-deep-seek-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deep-seek-401-unauthorized' | 'call.in-progress.error-vapifault-deep-seek-403-model-access-denied' | 'call.in-progress.error-vapifault-deep-seek-429-exceeded-quota' | 'call.in-progress.error-providerfault-deep-seek-500-server-error' | 'call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error' | 'pipeline-error-groq-400-bad-request-validation-failed' | 'pipeline-error-groq-401-unauthorized' | 'pipeline-error-groq-403-model-access-denied' | 'pipeline-error-groq-429-exceeded-quota' | 'pipeline-error-groq-500-server-error' | 'pipeline-error-groq-503-server-overloaded-error' | 'pipeline-error-groq-llm-failed' | 'call.in-progress.error-vapifault-groq-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-groq-401-unauthorized' | 'call.in-progress.error-vapifault-groq-403-model-access-denied' | 'call.in-progress.error-vapifault-groq-429-exceeded-quota' | 'call.in-progress.error-providerfault-groq-500-server-error' | 'call.in-progress.error-providerfault-groq-503-server-overloaded-error' | 'pipeline-error-cerebras-400-bad-request-validation-failed' | 'pipeline-error-cerebras-401-unauthorized' | 'pipeline-error-cerebras-403-model-access-denied' | 'pipeline-error-cerebras-429-exceeded-quota' | 'pipeline-error-cerebras-500-server-error' | 'pipeline-error-cerebras-503-server-overloaded-error' | 'pipeline-error-cerebras-llm-failed' | 'call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-cerebras-401-unauthorized' | 'call.in-progress.error-vapifault-cerebras-403-model-access-denied' | 'call.in-progress.error-vapifault-cerebras-429-exceeded-quota' | 'call.in-progress.error-providerfault-cerebras-500-server-error' | 'call.in-progress.error-providerfault-cerebras-503-server-overloaded-error' | 'pipeline-error-anthropic-400-bad-request-validation-failed' | 'pipeline-error-anthropic-401-unauthorized' | 'pipeline-error-anthropic-403-model-access-denied' | 'pipeline-error-anthropic-429-exceeded-quota' | 'pipeline-error-anthropic-500-server-error' | 'pipeline-error-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-500-server-error' | 'call.in-progress.error-providerfault-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-400-bad-request-validation-failed' | 'pipeline-error-anthropic-bedrock-401-unauthorized' | 'pipeline-error-anthropic-bedrock-403-model-access-denied' | 'pipeline-error-anthropic-bedrock-429-exceeded-quota' | 'pipeline-error-anthropic-bedrock-500-server-error' | 'pipeline-error-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-bedrock-500-server-error' | 'call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-400-bad-request-validation-failed' | 'pipeline-error-anthropic-vertex-401-unauthorized' | 'pipeline-error-anthropic-vertex-403-model-access-denied' | 'pipeline-error-anthropic-vertex-429-exceeded-quota' | 'pipeline-error-anthropic-vertex-500-server-error' | 'pipeline-error-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-vertex-500-server-error' | 'call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-together-ai-400-bad-request-validation-failed' | 'pipeline-error-together-ai-401-unauthorized' | 'pipeline-error-together-ai-403-model-access-denied' | 'pipeline-error-together-ai-429-exceeded-quota' | 'pipeline-error-together-ai-500-server-error' | 'pipeline-error-together-ai-503-server-overloaded-error' | 'pipeline-error-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-together-ai-401-unauthorized' | 'call.in-progress.error-vapifault-together-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-together-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-together-ai-500-server-error' | 'call.in-progress.error-providerfault-together-ai-503-server-overloaded-error' | 'pipeline-error-anyscale-400-bad-request-validation-failed' | 'pipeline-error-anyscale-401-unauthorized' | 'pipeline-error-anyscale-403-model-access-denied' | 'pipeline-error-anyscale-429-exceeded-quota' | 'pipeline-error-anyscale-500-server-error' | 'pipeline-error-anyscale-503-server-overloaded-error' | 'pipeline-error-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anyscale-401-unauthorized' | 'call.in-progress.error-vapifault-anyscale-403-model-access-denied' | 'call.in-progress.error-vapifault-anyscale-429-exceeded-quota' | 'call.in-progress.error-providerfault-anyscale-500-server-error' | 'call.in-progress.error-providerfault-anyscale-503-server-overloaded-error' | 'pipeline-error-openrouter-400-bad-request-validation-failed' | 'pipeline-error-openrouter-401-unauthorized' | 'pipeline-error-openrouter-403-model-access-denied' | 'pipeline-error-openrouter-429-exceeded-quota' | 'pipeline-error-openrouter-500-server-error' | 'pipeline-error-openrouter-503-server-overloaded-error' | 'pipeline-error-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openrouter-401-unauthorized' | 'call.in-progress.error-vapifault-openrouter-403-model-access-denied' | 'call.in-progress.error-vapifault-openrouter-429-exceeded-quota' | 'call.in-progress.error-providerfault-openrouter-500-server-error' | 'call.in-progress.error-providerfault-openrouter-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-400-bad-request-validation-failed' | 'pipeline-error-perplexity-ai-401-unauthorized' | 'pipeline-error-perplexity-ai-403-model-access-denied' | 'pipeline-error-perplexity-ai-429-exceeded-quota' | 'pipeline-error-perplexity-ai-500-server-error' | 'pipeline-error-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-perplexity-ai-401-unauthorized' | 'call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-perplexity-ai-500-server-error' | 'call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-deepinfra-400-bad-request-validation-failed' | 'pipeline-error-deepinfra-401-unauthorized' | 'pipeline-error-deepinfra-403-model-access-denied' | 'pipeline-error-deepinfra-429-exceeded-quota' | 'pipeline-error-deepinfra-500-server-error' | 'pipeline-error-deepinfra-503-server-overloaded-error' | 'pipeline-error-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deepinfra-401-unauthorized' | 'call.in-progress.error-vapifault-deepinfra-403-model-access-denied' | 'call.in-progress.error-vapifault-deepinfra-429-exceeded-quota' | 'call.in-progress.error-providerfault-deepinfra-500-server-error' | 'call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error' | 'pipeline-error-runpod-400-bad-request-validation-failed' | 'pipeline-error-runpod-401-unauthorized' | 'pipeline-error-runpod-403-model-access-denied' | 'pipeline-error-runpod-429-exceeded-quota' | 'pipeline-error-runpod-500-server-error' | 'pipeline-error-runpod-503-server-overloaded-error' | 'pipeline-error-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-runpod-401-unauthorized' | 'call.in-progress.error-vapifault-runpod-403-model-access-denied' | 'call.in-progress.error-vapifault-runpod-429-exceeded-quota' | 'call.in-progress.error-providerfault-runpod-500-server-error' | 'call.in-progress.error-providerfault-runpod-503-server-overloaded-error' | 'pipeline-error-custom-llm-400-bad-request-validation-failed' | 'pipeline-error-custom-llm-401-unauthorized' | 'pipeline-error-custom-llm-403-model-access-denied' | 'pipeline-error-custom-llm-429-exceeded-quota' | 'pipeline-error-custom-llm-500-server-error' | 'pipeline-error-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-custom-llm-401-unauthorized' | 'call.in-progress.error-vapifault-custom-llm-403-model-access-denied' | 'call.in-progress.error-vapifault-custom-llm-429-exceeded-quota' | 'call.in-progress.error-providerfault-custom-llm-500-server-error' | 'call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-voice-failed' | 'pipeline-error-cartesia-socket-hang-up' | 'pipeline-error-cartesia-requested-payment' | 'pipeline-error-cartesia-500-server-error' | 'pipeline-error-cartesia-503-server-error' | 'pipeline-error-cartesia-522-server-error' | 'call.in-progress.error-vapifault-cartesia-socket-hang-up' | 'call.in-progress.error-vapifault-cartesia-requested-payment' | 'call.in-progress.error-providerfault-cartesia-500-server-error' | 'call.in-progress.error-providerfault-cartesia-503-server-error' | 'call.in-progress.error-providerfault-cartesia-522-server-error' | 'pipeline-error-eleven-labs-voice-not-found' | 'pipeline-error-eleven-labs-quota-exceeded' | 'pipeline-error-eleven-labs-unauthorized-access' | 'pipeline-error-eleven-labs-unauthorized-to-access-model' | 'pipeline-error-eleven-labs-professional-voices-only-for-creator-plus' | 'pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'pipeline-error-eleven-labs-system-busy-and-requested-upgrade' | 'pipeline-error-eleven-labs-voice-not-fine-tuned' | 'pipeline-error-eleven-labs-invalid-api-key' | 'pipeline-error-eleven-labs-invalid-voice-samples' | 'pipeline-error-eleven-labs-voice-disabled-by-owner' | 'pipeline-error-eleven-labs-blocked-account-in-probation' | 'pipeline-error-eleven-labs-blocked-content-against-their-policy' | 'pipeline-error-eleven-labs-missing-samples-for-voice-clone' | 'pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'pipeline-error-eleven-labs-voice-not-allowed-for-free-users' | 'pipeline-error-eleven-labs-max-character-limit-exceeded' | 'pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'pipeline-error-eleven-labs-500-server-error' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-found' | 'call.in-progress.error-vapifault-eleven-labs-quota-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-access' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model' | 'call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus' | 'call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned' | 'call.in-progress.error-vapifault-eleven-labs-invalid-api-key' | 'call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples' | 'call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner' | 'call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation' | 'call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy' | 'call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users' | 'call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'call.in-progress.error-providerfault-eleven-labs-500-server-error' | 'pipeline-error-playht-request-timed-out' | 'pipeline-error-playht-invalid-voice' | 'pipeline-error-playht-unexpected-error' | 'pipeline-error-playht-out-of-credits' | 'pipeline-error-playht-invalid-emotion' | 'pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri' | 'pipeline-error-playht-401-unauthorized' | 'pipeline-error-playht-403-forbidden-out-of-characters' | 'pipeline-error-playht-403-forbidden-api-access-not-available' | 'pipeline-error-playht-429-exceeded-quota' | 'pipeline-error-playht-502-gateway-error' | 'pipeline-error-playht-504-gateway-error' | 'call.in-progress.error-vapifault-playht-request-timed-out' | 'call.in-progress.error-vapifault-playht-invalid-voice' | 'call.in-progress.error-vapifault-playht-unexpected-error' | 'call.in-progress.error-vapifault-playht-out-of-credits' | 'call.in-progress.error-vapifault-playht-invalid-emotion' | 'call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri' | 'call.in-progress.error-vapifault-playht-401-unauthorized' | 'call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters' | 'call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available' | 'call.in-progress.error-vapifault-playht-429-exceeded-quota' | 'call.in-progress.error-providerfault-playht-502-gateway-error' | 'call.in-progress.error-providerfault-playht-504-gateway-error' | 'pipeline-error-custom-transcriber-failed' | 'call.in-progress.error-vapifault-custom-transcriber-failed' | 'pipeline-error-eleven-labs-transcriber-failed' | 'call.in-progress.error-vapifault-eleven-labs-transcriber-failed' | 'pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination' | 'pipeline-error-deepgram-returning-401-invalid-credentials' | 'pipeline-error-deepgram-returning-403-model-access-denied' | 'pipeline-error-deepgram-returning-404-not-found' | 'pipeline-error-deepgram-returning-500-invalid-json' | 'pipeline-error-deepgram-returning-502-network-error' | 'pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach' | 'call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination' | 'call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-deepgram-returning-404-not-found' | 'call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied' | 'call.in-progress.error-providerfault-deepgram-returning-500-invalid-json' | 'call.in-progress.error-providerfault-deepgram-returning-502-network-error' | 'call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach' | 'pipeline-error-google-transcriber-failed' | 'call.in-progress.error-vapifault-google-transcriber-failed' | 'pipeline-error-openai-transcriber-failed' | 'call.in-progress.error-vapifault-openai-transcriber-failed' | 'assistant-ended-call' | 'assistant-said-end-call-phrase' | 'assistant-ended-call-with-hangup-task' | 'assistant-ended-call-after-message-spoken' | 'assistant-forwarded-call' | 'assistant-join-timed-out' | 'call.in-progress.error-assistant-did-not-receive-customer-audio' | 'customer-busy' | 'customer-ended-call' | 'customer-did-not-answer' | 'customer-did-not-give-microphone-permission' | 'exceeded-max-duration' | 'manually-canceled' | 'phone-call-provider-closed-websocket' | 'silence-timed-out' | 'call.in-progress.error-sip-telephony-provider-failed-to-connect-call' | 'call.ringing.hook-executed-say' | 'call.ringing.hook-executed-transfer' | 'twilio-failed-to-connect-call' | 'twilio-reported-customer-misdialed' | 'vonage-rejected' | 'voicemail';
6466
+ endedReason?: 'call-start-error-neither-assistant-nor-server-set' | 'assistant-request-failed' | 'assistant-request-returned-error' | 'assistant-request-returned-unspeakable-error' | 'assistant-request-returned-invalid-assistant' | 'assistant-request-returned-no-assistant' | 'assistant-request-returned-forwarding-phone-number' | 'call.start.error-get-org' | 'call.start.error-get-subscription' | 'call.start.error-get-assistant' | 'call.start.error-get-phone-number' | 'call.start.error-get-customer' | 'call.start.error-get-resources-validation' | 'call.start.error-vapi-number-international' | 'call.start.error-vapi-number-outbound-daily-limit' | 'call.start.error-get-transport' | 'assistant-not-valid' | 'database-error' | 'assistant-not-found' | 'pipeline-error-openai-voice-failed' | 'pipeline-error-cartesia-voice-failed' | 'pipeline-error-deepgram-voice-failed' | 'pipeline-error-eleven-labs-voice-failed' | 'pipeline-error-playht-voice-failed' | 'pipeline-error-lmnt-voice-failed' | 'pipeline-error-azure-voice-failed' | 'pipeline-error-rime-ai-voice-failed' | 'pipeline-error-smallest-ai-voice-failed' | 'pipeline-error-neuphonic-voice-failed' | 'pipeline-error-hume-voice-failed' | 'pipeline-error-sesame-voice-failed' | 'pipeline-error-tavus-video-failed' | 'call.in-progress.error-vapifault-openai-voice-failed' | 'call.in-progress.error-vapifault-cartesia-voice-failed' | 'call.in-progress.error-vapifault-deepgram-voice-failed' | 'call.in-progress.error-vapifault-eleven-labs-voice-failed' | 'call.in-progress.error-vapifault-playht-voice-failed' | 'call.in-progress.error-vapifault-lmnt-voice-failed' | 'call.in-progress.error-vapifault-azure-voice-failed' | 'call.in-progress.error-vapifault-rime-ai-voice-failed' | 'call.in-progress.error-vapifault-smallest-ai-voice-failed' | 'call.in-progress.error-vapifault-neuphonic-voice-failed' | 'call.in-progress.error-vapifault-hume-voice-failed' | 'call.in-progress.error-vapifault-sesame-voice-failed' | 'call.in-progress.error-vapifault-tavus-video-failed' | 'pipeline-error-vapi-llm-failed' | 'pipeline-error-vapi-400-bad-request-validation-failed' | 'pipeline-error-vapi-401-unauthorized' | 'pipeline-error-vapi-403-model-access-denied' | 'pipeline-error-vapi-429-exceeded-quota' | 'pipeline-error-vapi-500-server-error' | 'pipeline-error-vapi-503-server-overloaded-error' | 'call.in-progress.error-vapifault-vapi-llm-failed' | 'call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-vapi-401-unauthorized' | 'call.in-progress.error-vapifault-vapi-403-model-access-denied' | 'call.in-progress.error-vapifault-vapi-429-exceeded-quota' | 'call.in-progress.error-providerfault-vapi-500-server-error' | 'call.in-progress.error-providerfault-vapi-503-server-overloaded-error' | 'pipeline-error-deepgram-transcriber-failed' | 'call.in-progress.error-vapifault-deepgram-transcriber-failed' | 'pipeline-error-gladia-transcriber-failed' | 'call.in-progress.error-vapifault-gladia-transcriber-failed' | 'pipeline-error-speechmatics-transcriber-failed' | 'call.in-progress.error-vapifault-speechmatics-transcriber-failed' | 'pipeline-error-assembly-ai-transcriber-failed' | 'pipeline-error-assembly-ai-returning-400-insufficent-funds' | 'pipeline-error-assembly-ai-returning-400-paid-only-feature' | 'pipeline-error-assembly-ai-returning-401-invalid-credentials' | 'pipeline-error-assembly-ai-returning-500-invalid-schema' | 'pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed' | 'call.in-progress.error-vapifault-assembly-ai-transcriber-failed' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature' | 'call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed' | 'pipeline-error-talkscriber-transcriber-failed' | 'call.in-progress.error-vapifault-talkscriber-transcriber-failed' | 'pipeline-error-azure-speech-transcriber-failed' | 'call.in-progress.error-vapifault-azure-speech-transcriber-failed' | 'call.in-progress.error-pipeline-no-available-llm-model' | 'worker-shutdown' | 'unknown-error' | 'vonage-disconnected' | 'vonage-failed-to-connect-call' | 'vonage-completed' | 'phone-call-provider-bypass-enabled-but-no-call-received' | 'call.in-progress.error-providerfault-transport-never-connected' | 'call.in-progress.error-vapifault-worker-not-available' | 'call.in-progress.error-vapifault-transport-never-connected' | 'call.in-progress.error-vapifault-transport-connected-but-call-not-active' | 'call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing' | 'call.in-progress.error-vapifault-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-groq-llm-failed' | 'call.in-progress.error-vapifault-google-llm-failed' | 'call.in-progress.error-vapifault-xai-llm-failed' | 'call.in-progress.error-vapifault-mistral-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-cerebras-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-llm-failed' | 'pipeline-error-openai-400-bad-request-validation-failed' | 'pipeline-error-openai-401-unauthorized' | 'pipeline-error-openai-401-incorrect-api-key' | 'pipeline-error-openai-401-account-not-in-organization' | 'pipeline-error-openai-403-model-access-denied' | 'pipeline-error-openai-429-exceeded-quota' | 'pipeline-error-openai-429-rate-limit-reached' | 'pipeline-error-openai-500-server-error' | 'pipeline-error-openai-503-server-overloaded-error' | 'pipeline-error-openai-llm-failed' | 'call.in-progress.error-vapifault-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openai-401-unauthorized' | 'call.in-progress.error-vapifault-openai-401-incorrect-api-key' | 'call.in-progress.error-vapifault-openai-401-account-not-in-organization' | 'call.in-progress.error-vapifault-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-openai-429-exceeded-quota' | 'call.in-progress.error-vapifault-openai-429-rate-limit-reached' | 'call.in-progress.error-providerfault-openai-500-server-error' | 'call.in-progress.error-providerfault-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-400-bad-request-validation-failed' | 'pipeline-error-azure-openai-401-unauthorized' | 'pipeline-error-azure-openai-403-model-access-denied' | 'pipeline-error-azure-openai-429-exceeded-quota' | 'pipeline-error-azure-openai-500-server-error' | 'pipeline-error-azure-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-azure-openai-401-unauthorized' | 'call.in-progress.error-vapifault-azure-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-azure-openai-429-exceeded-quota' | 'call.in-progress.error-providerfault-azure-openai-500-server-error' | 'call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error' | 'pipeline-error-google-400-bad-request-validation-failed' | 'pipeline-error-google-401-unauthorized' | 'pipeline-error-google-403-model-access-denied' | 'pipeline-error-google-429-exceeded-quota' | 'pipeline-error-google-500-server-error' | 'pipeline-error-google-503-server-overloaded-error' | 'pipeline-error-google-llm-failed' | 'call.in-progress.error-vapifault-google-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-google-401-unauthorized' | 'call.in-progress.error-vapifault-google-403-model-access-denied' | 'call.in-progress.error-vapifault-google-429-exceeded-quota' | 'call.in-progress.error-providerfault-google-500-server-error' | 'call.in-progress.error-providerfault-google-503-server-overloaded-error' | 'pipeline-error-xai-400-bad-request-validation-failed' | 'pipeline-error-xai-401-unauthorized' | 'pipeline-error-xai-403-model-access-denied' | 'pipeline-error-xai-429-exceeded-quota' | 'pipeline-error-xai-500-server-error' | 'pipeline-error-xai-503-server-overloaded-error' | 'pipeline-error-xai-llm-failed' | 'call.in-progress.error-vapifault-xai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-xai-401-unauthorized' | 'call.in-progress.error-vapifault-xai-403-model-access-denied' | 'call.in-progress.error-vapifault-xai-429-exceeded-quota' | 'call.in-progress.error-providerfault-xai-500-server-error' | 'call.in-progress.error-providerfault-xai-503-server-overloaded-error' | 'pipeline-error-mistral-400-bad-request-validation-failed' | 'pipeline-error-mistral-401-unauthorized' | 'pipeline-error-mistral-403-model-access-denied' | 'pipeline-error-mistral-429-exceeded-quota' | 'pipeline-error-mistral-500-server-error' | 'pipeline-error-mistral-503-server-overloaded-error' | 'pipeline-error-mistral-llm-failed' | 'call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-mistral-401-unauthorized' | 'call.in-progress.error-vapifault-mistral-403-model-access-denied' | 'call.in-progress.error-vapifault-mistral-429-exceeded-quota' | 'call.in-progress.error-providerfault-mistral-500-server-error' | 'call.in-progress.error-providerfault-mistral-503-server-overloaded-error' | 'pipeline-error-inflection-ai-400-bad-request-validation-failed' | 'pipeline-error-inflection-ai-401-unauthorized' | 'pipeline-error-inflection-ai-403-model-access-denied' | 'pipeline-error-inflection-ai-429-exceeded-quota' | 'pipeline-error-inflection-ai-500-server-error' | 'pipeline-error-inflection-ai-503-server-overloaded-error' | 'pipeline-error-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-inflection-ai-401-unauthorized' | 'call.in-progress.error-vapifault-inflection-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-inflection-ai-500-server-error' | 'call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error' | 'pipeline-error-deep-seek-400-bad-request-validation-failed' | 'pipeline-error-deep-seek-401-unauthorized' | 'pipeline-error-deep-seek-403-model-access-denied' | 'pipeline-error-deep-seek-429-exceeded-quota' | 'pipeline-error-deep-seek-500-server-error' | 'pipeline-error-deep-seek-503-server-overloaded-error' | 'pipeline-error-deep-seek-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deep-seek-401-unauthorized' | 'call.in-progress.error-vapifault-deep-seek-403-model-access-denied' | 'call.in-progress.error-vapifault-deep-seek-429-exceeded-quota' | 'call.in-progress.error-providerfault-deep-seek-500-server-error' | 'call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error' | 'pipeline-error-groq-400-bad-request-validation-failed' | 'pipeline-error-groq-401-unauthorized' | 'pipeline-error-groq-403-model-access-denied' | 'pipeline-error-groq-429-exceeded-quota' | 'pipeline-error-groq-500-server-error' | 'pipeline-error-groq-503-server-overloaded-error' | 'pipeline-error-groq-llm-failed' | 'call.in-progress.error-vapifault-groq-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-groq-401-unauthorized' | 'call.in-progress.error-vapifault-groq-403-model-access-denied' | 'call.in-progress.error-vapifault-groq-429-exceeded-quota' | 'call.in-progress.error-providerfault-groq-500-server-error' | 'call.in-progress.error-providerfault-groq-503-server-overloaded-error' | 'pipeline-error-cerebras-400-bad-request-validation-failed' | 'pipeline-error-cerebras-401-unauthorized' | 'pipeline-error-cerebras-403-model-access-denied' | 'pipeline-error-cerebras-429-exceeded-quota' | 'pipeline-error-cerebras-500-server-error' | 'pipeline-error-cerebras-503-server-overloaded-error' | 'pipeline-error-cerebras-llm-failed' | 'call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-cerebras-401-unauthorized' | 'call.in-progress.error-vapifault-cerebras-403-model-access-denied' | 'call.in-progress.error-vapifault-cerebras-429-exceeded-quota' | 'call.in-progress.error-providerfault-cerebras-500-server-error' | 'call.in-progress.error-providerfault-cerebras-503-server-overloaded-error' | 'pipeline-error-anthropic-400-bad-request-validation-failed' | 'pipeline-error-anthropic-401-unauthorized' | 'pipeline-error-anthropic-403-model-access-denied' | 'pipeline-error-anthropic-429-exceeded-quota' | 'pipeline-error-anthropic-500-server-error' | 'pipeline-error-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-500-server-error' | 'call.in-progress.error-providerfault-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-400-bad-request-validation-failed' | 'pipeline-error-anthropic-bedrock-401-unauthorized' | 'pipeline-error-anthropic-bedrock-403-model-access-denied' | 'pipeline-error-anthropic-bedrock-429-exceeded-quota' | 'pipeline-error-anthropic-bedrock-500-server-error' | 'pipeline-error-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-bedrock-500-server-error' | 'call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-400-bad-request-validation-failed' | 'pipeline-error-anthropic-vertex-401-unauthorized' | 'pipeline-error-anthropic-vertex-403-model-access-denied' | 'pipeline-error-anthropic-vertex-429-exceeded-quota' | 'pipeline-error-anthropic-vertex-500-server-error' | 'pipeline-error-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-vertex-500-server-error' | 'call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-together-ai-400-bad-request-validation-failed' | 'pipeline-error-together-ai-401-unauthorized' | 'pipeline-error-together-ai-403-model-access-denied' | 'pipeline-error-together-ai-429-exceeded-quota' | 'pipeline-error-together-ai-500-server-error' | 'pipeline-error-together-ai-503-server-overloaded-error' | 'pipeline-error-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-together-ai-401-unauthorized' | 'call.in-progress.error-vapifault-together-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-together-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-together-ai-500-server-error' | 'call.in-progress.error-providerfault-together-ai-503-server-overloaded-error' | 'pipeline-error-anyscale-400-bad-request-validation-failed' | 'pipeline-error-anyscale-401-unauthorized' | 'pipeline-error-anyscale-403-model-access-denied' | 'pipeline-error-anyscale-429-exceeded-quota' | 'pipeline-error-anyscale-500-server-error' | 'pipeline-error-anyscale-503-server-overloaded-error' | 'pipeline-error-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anyscale-401-unauthorized' | 'call.in-progress.error-vapifault-anyscale-403-model-access-denied' | 'call.in-progress.error-vapifault-anyscale-429-exceeded-quota' | 'call.in-progress.error-providerfault-anyscale-500-server-error' | 'call.in-progress.error-providerfault-anyscale-503-server-overloaded-error' | 'pipeline-error-openrouter-400-bad-request-validation-failed' | 'pipeline-error-openrouter-401-unauthorized' | 'pipeline-error-openrouter-403-model-access-denied' | 'pipeline-error-openrouter-429-exceeded-quota' | 'pipeline-error-openrouter-500-server-error' | 'pipeline-error-openrouter-503-server-overloaded-error' | 'pipeline-error-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openrouter-401-unauthorized' | 'call.in-progress.error-vapifault-openrouter-403-model-access-denied' | 'call.in-progress.error-vapifault-openrouter-429-exceeded-quota' | 'call.in-progress.error-providerfault-openrouter-500-server-error' | 'call.in-progress.error-providerfault-openrouter-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-400-bad-request-validation-failed' | 'pipeline-error-perplexity-ai-401-unauthorized' | 'pipeline-error-perplexity-ai-403-model-access-denied' | 'pipeline-error-perplexity-ai-429-exceeded-quota' | 'pipeline-error-perplexity-ai-500-server-error' | 'pipeline-error-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-perplexity-ai-401-unauthorized' | 'call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-perplexity-ai-500-server-error' | 'call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-deepinfra-400-bad-request-validation-failed' | 'pipeline-error-deepinfra-401-unauthorized' | 'pipeline-error-deepinfra-403-model-access-denied' | 'pipeline-error-deepinfra-429-exceeded-quota' | 'pipeline-error-deepinfra-500-server-error' | 'pipeline-error-deepinfra-503-server-overloaded-error' | 'pipeline-error-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deepinfra-401-unauthorized' | 'call.in-progress.error-vapifault-deepinfra-403-model-access-denied' | 'call.in-progress.error-vapifault-deepinfra-429-exceeded-quota' | 'call.in-progress.error-providerfault-deepinfra-500-server-error' | 'call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error' | 'pipeline-error-runpod-400-bad-request-validation-failed' | 'pipeline-error-runpod-401-unauthorized' | 'pipeline-error-runpod-403-model-access-denied' | 'pipeline-error-runpod-429-exceeded-quota' | 'pipeline-error-runpod-500-server-error' | 'pipeline-error-runpod-503-server-overloaded-error' | 'pipeline-error-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-runpod-401-unauthorized' | 'call.in-progress.error-vapifault-runpod-403-model-access-denied' | 'call.in-progress.error-vapifault-runpod-429-exceeded-quota' | 'call.in-progress.error-providerfault-runpod-500-server-error' | 'call.in-progress.error-providerfault-runpod-503-server-overloaded-error' | 'pipeline-error-custom-llm-400-bad-request-validation-failed' | 'pipeline-error-custom-llm-401-unauthorized' | 'pipeline-error-custom-llm-403-model-access-denied' | 'pipeline-error-custom-llm-429-exceeded-quota' | 'pipeline-error-custom-llm-500-server-error' | 'pipeline-error-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-custom-llm-401-unauthorized' | 'call.in-progress.error-vapifault-custom-llm-403-model-access-denied' | 'call.in-progress.error-vapifault-custom-llm-429-exceeded-quota' | 'call.in-progress.error-providerfault-custom-llm-500-server-error' | 'call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-voice-failed' | 'pipeline-error-cartesia-socket-hang-up' | 'pipeline-error-cartesia-requested-payment' | 'pipeline-error-cartesia-500-server-error' | 'pipeline-error-cartesia-503-server-error' | 'pipeline-error-cartesia-522-server-error' | 'call.in-progress.error-vapifault-cartesia-socket-hang-up' | 'call.in-progress.error-vapifault-cartesia-requested-payment' | 'call.in-progress.error-providerfault-cartesia-500-server-error' | 'call.in-progress.error-providerfault-cartesia-503-server-error' | 'call.in-progress.error-providerfault-cartesia-522-server-error' | 'pipeline-error-eleven-labs-voice-not-found' | 'pipeline-error-eleven-labs-quota-exceeded' | 'pipeline-error-eleven-labs-unauthorized-access' | 'pipeline-error-eleven-labs-unauthorized-to-access-model' | 'pipeline-error-eleven-labs-professional-voices-only-for-creator-plus' | 'pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'pipeline-error-eleven-labs-system-busy-and-requested-upgrade' | 'pipeline-error-eleven-labs-voice-not-fine-tuned' | 'pipeline-error-eleven-labs-invalid-api-key' | 'pipeline-error-eleven-labs-invalid-voice-samples' | 'pipeline-error-eleven-labs-voice-disabled-by-owner' | 'pipeline-error-eleven-labs-blocked-account-in-probation' | 'pipeline-error-eleven-labs-blocked-content-against-their-policy' | 'pipeline-error-eleven-labs-missing-samples-for-voice-clone' | 'pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'pipeline-error-eleven-labs-voice-not-allowed-for-free-users' | 'pipeline-error-eleven-labs-max-character-limit-exceeded' | 'pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'pipeline-error-eleven-labs-500-server-error' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-found' | 'call.in-progress.error-vapifault-eleven-labs-quota-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-access' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model' | 'call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus' | 'call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned' | 'call.in-progress.error-vapifault-eleven-labs-invalid-api-key' | 'call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples' | 'call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner' | 'call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation' | 'call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy' | 'call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users' | 'call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'call.in-progress.error-providerfault-eleven-labs-500-server-error' | 'pipeline-error-playht-request-timed-out' | 'pipeline-error-playht-invalid-voice' | 'pipeline-error-playht-unexpected-error' | 'pipeline-error-playht-out-of-credits' | 'pipeline-error-playht-invalid-emotion' | 'pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri' | 'pipeline-error-playht-401-unauthorized' | 'pipeline-error-playht-403-forbidden-out-of-characters' | 'pipeline-error-playht-403-forbidden-api-access-not-available' | 'pipeline-error-playht-429-exceeded-quota' | 'pipeline-error-playht-502-gateway-error' | 'pipeline-error-playht-504-gateway-error' | 'call.in-progress.error-vapifault-playht-request-timed-out' | 'call.in-progress.error-vapifault-playht-invalid-voice' | 'call.in-progress.error-vapifault-playht-unexpected-error' | 'call.in-progress.error-vapifault-playht-out-of-credits' | 'call.in-progress.error-vapifault-playht-invalid-emotion' | 'call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri' | 'call.in-progress.error-vapifault-playht-401-unauthorized' | 'call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters' | 'call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available' | 'call.in-progress.error-vapifault-playht-429-exceeded-quota' | 'call.in-progress.error-providerfault-playht-502-gateway-error' | 'call.in-progress.error-providerfault-playht-504-gateway-error' | 'pipeline-error-custom-transcriber-failed' | 'call.in-progress.error-vapifault-custom-transcriber-failed' | 'pipeline-error-eleven-labs-transcriber-failed' | 'call.in-progress.error-vapifault-eleven-labs-transcriber-failed' | 'pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination' | 'pipeline-error-deepgram-returning-401-invalid-credentials' | 'pipeline-error-deepgram-returning-403-model-access-denied' | 'pipeline-error-deepgram-returning-404-not-found' | 'pipeline-error-deepgram-returning-500-invalid-json' | 'pipeline-error-deepgram-returning-502-network-error' | 'pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach' | 'call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination' | 'call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-deepgram-returning-404-not-found' | 'call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied' | 'call.in-progress.error-providerfault-deepgram-returning-500-invalid-json' | 'call.in-progress.error-providerfault-deepgram-returning-502-network-error' | 'call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach' | 'pipeline-error-google-transcriber-failed' | 'call.in-progress.error-vapifault-google-transcriber-failed' | 'pipeline-error-openai-transcriber-failed' | 'call.in-progress.error-vapifault-openai-transcriber-failed' | 'assistant-ended-call' | 'assistant-said-end-call-phrase' | 'assistant-ended-call-with-hangup-task' | 'assistant-ended-call-after-message-spoken' | 'assistant-forwarded-call' | 'assistant-join-timed-out' | 'call.in-progress.error-assistant-did-not-receive-customer-audio' | 'customer-busy' | 'customer-ended-call' | 'customer-did-not-answer' | 'customer-did-not-give-microphone-permission' | 'exceeded-max-duration' | 'manually-canceled' | 'phone-call-provider-closed-websocket' | 'call.forwarding.operator-busy' | 'silence-timed-out' | 'call.in-progress.error-sip-telephony-provider-failed-to-connect-call' | 'call.ringing.hook-executed-say' | 'call.ringing.hook-executed-transfer' | 'twilio-failed-to-connect-call' | 'twilio-reported-customer-misdialed' | 'vonage-rejected' | 'voicemail';
5999
6467
  /** This is the destination where the call ended up being transferred to. If the call was not transferred, this will be empty. */
6000
6468
  destination?: TransferDestinationNumber | TransferDestinationSip;
6001
6469
  /** This is the unique identifier for the call. */
@@ -6040,16 +6508,56 @@ export interface Call {
6040
6508
  * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6041
6509
  */
6042
6510
  phoneCallProviderId?: string;
6043
- /** This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead. */
6511
+ /**
6512
+ * This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead.
6513
+ * Usage:
6514
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6515
+ * To start the call with Squad as entrypoint, use squad or squadId
6516
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6517
+ */
6044
6518
  assistantId?: string;
6045
- /** This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead. */
6519
+ /**
6520
+ * This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.
6521
+ * Usage:
6522
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6523
+ * To start the call with Squad as entrypoint, use squad or squadId
6524
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6525
+ */
6046
6526
  assistant?: CreateAssistantDTO;
6047
6527
  /** These are the overrides for the `assistant` or `assistantId`'s settings and template variables. */
6048
6528
  assistantOverrides?: AssistantOverrides;
6049
- /** This is the squad that will be used for the call. To use a transient squad, use `squad` instead. */
6529
+ /**
6530
+ * This is the squad that will be used for the call. To use a transient squad, use `squad` instead.
6531
+ * Usage:
6532
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6533
+ * To start the call with Squad as entrypoint, use squad or squadId
6534
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6535
+ */
6050
6536
  squadId?: string;
6051
- /** This is a squad that will be used for the call. To use an existing squad, use `squadId` instead. */
6537
+ /**
6538
+ * This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.
6539
+ * Usage:
6540
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6541
+ * To start the call with Squad as entrypoint, use squad or squadId
6542
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6543
+ */
6052
6544
  squad?: CreateSquadDTO;
6545
+ /**
6546
+ * This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.
6547
+ * Usage:
6548
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6549
+ * To start the call with Squad as entrypoint, use squad or squadId
6550
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6551
+ */
6552
+ workflowId?: string;
6553
+ /**
6554
+ * This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.
6555
+ * Usage:
6556
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6557
+ * To start the call with Squad as entrypoint, use squad or squadId
6558
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6559
+ */
6560
+ workflow?: CreateWorkflowDTO;
6053
6561
  /**
6054
6562
  * This is the phone number that will be used for the call. To use a transient number, use `phoneNumber` instead.
6055
6563
  *
@@ -6110,16 +6618,56 @@ export interface CreateCallDTO {
6110
6618
  schedulePlan?: SchedulePlan;
6111
6619
  /** This is the transport of the call. */
6112
6620
  transport?: object;
6113
- /** This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead. */
6621
+ /**
6622
+ * This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead.
6623
+ * Usage:
6624
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6625
+ * To start the call with Squad as entrypoint, use squad or squadId
6626
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6627
+ */
6114
6628
  assistantId?: string;
6115
- /** This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead. */
6629
+ /**
6630
+ * This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.
6631
+ * Usage:
6632
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6633
+ * To start the call with Squad as entrypoint, use squad or squadId
6634
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6635
+ */
6116
6636
  assistant?: CreateAssistantDTO;
6117
6637
  /** These are the overrides for the `assistant` or `assistantId`'s settings and template variables. */
6118
6638
  assistantOverrides?: AssistantOverrides;
6119
- /** This is the squad that will be used for the call. To use a transient squad, use `squad` instead. */
6639
+ /**
6640
+ * This is the squad that will be used for the call. To use a transient squad, use `squad` instead.
6641
+ * Usage:
6642
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6643
+ * To start the call with Squad as entrypoint, use squad or squadId
6644
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6645
+ */
6120
6646
  squadId?: string;
6121
- /** This is a squad that will be used for the call. To use an existing squad, use `squadId` instead. */
6647
+ /**
6648
+ * This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.
6649
+ * Usage:
6650
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6651
+ * To start the call with Squad as entrypoint, use squad or squadId
6652
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6653
+ */
6122
6654
  squad?: CreateSquadDTO;
6655
+ /**
6656
+ * This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.
6657
+ * Usage:
6658
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6659
+ * To start the call with Squad as entrypoint, use squad or squadId
6660
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6661
+ */
6662
+ workflowId?: string;
6663
+ /**
6664
+ * This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.
6665
+ * Usage:
6666
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6667
+ * To start the call with Squad as entrypoint, use squad or squadId
6668
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6669
+ */
6670
+ workflow?: CreateWorkflowDTO;
6123
6671
  /**
6124
6672
  * This is the phone number that will be used for the call. To use a transient number, use `phoneNumber` instead.
6125
6673
  *
@@ -6170,477 +6718,167 @@ export interface CreateOutboundCallDTO {
6170
6718
  schedulePlan?: SchedulePlan;
6171
6719
  /** This is the transport of the call. */
6172
6720
  transport?: object;
6173
- /** This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead. */
6721
+ /**
6722
+ * This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead.
6723
+ * Usage:
6724
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6725
+ * To start the call with Squad as entrypoint, use squad or squadId
6726
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6727
+ */
6174
6728
  assistantId?: string;
6175
- /** This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead. */
6729
+ /**
6730
+ * This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.
6731
+ * Usage:
6732
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6733
+ * To start the call with Squad as entrypoint, use squad or squadId
6734
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6735
+ */
6176
6736
  assistant?: CreateAssistantDTO;
6177
6737
  /** These are the overrides for the `assistant` or `assistantId`'s settings and template variables. */
6178
6738
  assistantOverrides?: AssistantOverrides;
6179
- /** This is the squad that will be used for the call. To use a transient squad, use `squad` instead. */
6739
+ /**
6740
+ * This is the squad that will be used for the call. To use a transient squad, use `squad` instead.
6741
+ * Usage:
6742
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6743
+ * To start the call with Squad as entrypoint, use squad or squadId
6744
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6745
+ */
6180
6746
  squadId?: string;
6181
- /** This is a squad that will be used for the call. To use an existing squad, use `squadId` instead. */
6747
+ /**
6748
+ * This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.
6749
+ * Usage:
6750
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6751
+ * To start the call with Squad as entrypoint, use squad or squadId
6752
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6753
+ */
6182
6754
  squad?: CreateSquadDTO;
6183
6755
  /**
6184
- * This is the phone number that will be used for the call. To use a transient number, use `phoneNumber` instead.
6185
- *
6186
- * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6187
- */
6188
- phoneNumberId?: string;
6189
- /**
6190
- * This is the phone number that will be used for the call. To use an existing number, use `phoneNumberId` instead.
6191
- *
6192
- * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6193
- */
6194
- phoneNumber?: ImportTwilioPhoneNumberDTO;
6195
- /**
6196
- * This is the customer that will be called. To call a transient customer , use `customer` instead.
6197
- *
6198
- * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6199
- */
6200
- customerId?: string;
6201
- /**
6202
- * This is the customer that will be called. To call an existing customer, use `customerId` instead.
6203
- *
6204
- * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6205
- */
6206
- customer?: CreateCustomerDTO;
6207
- }
6208
- export interface CreateWebCallDTO {
6209
- /** This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead. */
6210
- assistantId?: string;
6211
- /** This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead. */
6212
- assistant?: CreateAssistantDTO;
6213
- /** These are the overrides for the `assistant` or `assistantId`'s settings and template variables. */
6214
- assistantOverrides?: AssistantOverrides;
6215
- /** This is the squad that will be used for the call. To use a transient squad, use `squad` instead. */
6216
- squadId?: string;
6217
- /** This is a squad that will be used for the call. To use an existing squad, use `squadId` instead. */
6218
- squad?: CreateSquadDTO;
6219
- }
6220
- export interface UpdateCallDTO {
6221
- /**
6222
- * This is the name of the call. This is just for your own reference.
6223
- * @maxLength 40
6224
- */
6225
- name?: string;
6226
- }
6227
- export type ChatServiceResponse = object;
6228
- export interface ChatCompletionMessageMetadata {
6229
- taskName: string;
6230
- taskType: string;
6231
- taskOutput: string;
6232
- taskState?: object;
6233
- nodeTrace?: string[];
6234
- }
6235
- export interface ChatCompletionMessageWorkflows {
6236
- role: object;
6237
- content: string | null;
6238
- metadata?: ChatCompletionMessageMetadata;
6239
- }
6240
- export interface Say {
6241
- type: 'say';
6242
- /** @maxLength 1000 */
6243
- exact?: string;
6244
- /** @maxLength 1000 */
6245
- prompt?: string;
6246
- /** @maxLength 80 */
6247
- name: string;
6248
- /** This is for metadata you want to store on the task. */
6249
- metadata?: object;
6250
- }
6251
- export interface SayHook {
6252
- type: 'say';
6253
- /** This is for metadata you want to store on the task. */
6254
- metadata?: object;
6255
- /** @maxLength 1000 */
6256
- exact?: string;
6257
- /** @maxLength 1000 */
6258
- prompt?: string;
6259
- }
6260
- export interface Hook {
6261
- /** @maxLength 80 */
6262
- on: 'task.start' | 'task.output.confirmation' | 'task.delayed';
6263
- do: SayHook[];
6264
- }
6265
- export interface Gather {
6266
- type: 'gather';
6267
- output: JsonSchema;
6268
- /** This is whether or not the workflow should read back the gathered data to the user, and ask about its correctness. */
6269
- confirmContent?: boolean;
6270
- /**
6271
- * This is a list of hooks for a task.
6272
- * Each hook is a list of tasks to run on a trigger (such as on start, on failure, etc).
6273
- * Only Say is supported for now.
6274
- */
6275
- hooks?: Hook[];
6276
- /** This is the number of times we should try to gather the information from the user before we failover to the fail path. An example of this would be a user refusing to give their phone number for privacy reasons, and then going down a different path on account of this */
6277
- maxRetries?: number;
6278
- /** This is a liquid templating string. On the first call to Gather, the template will be filled out with variables from the context, and will be spoken verbatim to the user. An example would be "Base on your zipcode, it looks like you could be in one of these counties: {{ counties | join: ", " }}. Which one do you live in?" */
6279
- literalTemplate?: string;
6280
- /** @maxLength 80 */
6281
- name: string;
6282
- /** This is for metadata you want to store on the task. */
6283
- metadata?: object;
6284
- }
6285
- export interface ApiRequest {
6286
- type: 'apiRequest';
6287
- method: 'POST' | 'GET';
6288
- /** Api endpoint to send requests to. */
6289
- url: string;
6290
- /**
6291
- * These are the custom headers to include in the Api Request sent.
6292
- *
6293
- * Each key-value pair represents a header name and its value.
6294
- */
6295
- headers?: JsonSchema;
6296
- /**
6297
- * This defined the JSON body of your Api Request. For example, if `body_schema`
6298
- * included "my_field": "my_gather_statement.user_age", then the json body sent to the server would have that particular value assign to it.
6299
- * Right now, only data from gather statements are supported.
6300
- */
6301
- body?: JsonSchema;
6302
- /**
6303
- * This is the mode of the Api Request.
6304
- * We only support BLOCKING and BACKGROUND for now.
6305
- */
6306
- mode: 'blocking' | 'background';
6307
- /**
6308
- * This is a list of hooks for a task.
6309
- * Each hook is a list of tasks to run on a trigger (such as on start, on failure, etc).
6310
- * Only Say is supported for now.
6756
+ * This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.
6757
+ * Usage:
6758
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6759
+ * To start the call with Squad as entrypoint, use squad or squadId
6760
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6311
6761
  */
6312
- hooks?: Hook[];
6313
- /** This is the schema for the outputs of the Api Request. */
6314
- output?: JsonSchema;
6315
- /** @maxLength 80 */
6316
- name: string;
6317
- /** This is for metadata you want to store on the task. */
6318
- metadata?: object;
6319
- }
6320
- export interface Hangup {
6321
- type: 'hangup';
6322
- /** @maxLength 80 */
6323
- name: string;
6324
- /** This is for metadata you want to store on the task. */
6325
- metadata?: object;
6326
- }
6327
- export interface Transfer {
6328
- type: 'transfer';
6329
- destination: object;
6330
- /** @maxLength 80 */
6331
- name: string;
6332
- /** This is for metadata you want to store on the task. */
6333
- metadata?: object;
6334
- }
6335
- export interface CreateWorkflowDTO {
6336
- nodes: (Say | Gather | ApiRequest | Hangup | Transfer)[];
6337
- /** These are the options for the workflow's LLM. */
6338
- model?: AnthropicModel | AnyscaleModel | CerebrasModel | CustomLLMModel | DeepInfraModel | DeepSeekModel | GoogleModel | GroqModel | InflectionAIModel | OpenAIModel | OpenRouterModel | PerplexityAIModel | TogetherAIModel | XaiModel;
6339
- /** @maxLength 80 */
6340
- name: string;
6341
- edges: Edge[];
6342
- }
6343
- export interface ChatCompletionsDTO {
6344
- messages: ChatCompletionMessageWorkflows[];
6345
6762
  workflowId?: string;
6346
- workflow?: CreateWorkflowDTO;
6347
- }
6348
- export interface Assistant {
6349
- /** These are the options for the assistant's transcriber. */
6350
- transcriber?: AssemblyAITranscriber | AzureSpeechTranscriber | CustomTranscriber | DeepgramTranscriber | ElevenLabsTranscriber | GladiaTranscriber | SpeechmaticsTranscriber | TalkscriberTranscriber | GoogleTranscriber | OpenAITranscriber;
6351
- /** These are the options for the assistant's LLM. */
6352
- model?: AnyscaleModel | AnthropicModel | CerebrasModel | CustomLLMModel | DeepInfraModel | DeepSeekModel | GoogleModel | GroqModel | InflectionAIModel | OpenAIModel | OpenRouterModel | PerplexityAIModel | TogetherAIModel | VapiModel | XaiModel;
6353
- /**
6354
- * These are the options for the assistant's voice.
6355
- * @default {"provider":"playht","voiceId":"jennifer"}
6356
- */
6357
- voice?: AzureVoice | CartesiaVoice | CustomVoice | DeepgramVoice | ElevenLabsVoice | HumeVoice | LMNTVoice | NeuphonicVoice | OpenAIVoice | PlayHTVoice | RimeAIVoice | SmallestAIVoice | TavusVoice | VapiVoice;
6358
6763
  /**
6359
- * This is the first message that the assistant will say. This can also be a URL to a containerized audio file (mp3, wav, etc.).
6360
- *
6361
- * If unspecified, assistant will wait for user to speak and use the model to respond once they speak.
6362
- * @example "Hello! How can I help you today?"
6363
- */
6364
- firstMessage?: string;
6365
- /** @default false */
6366
- firstMessageInterruptionsEnabled?: boolean;
6367
- /**
6368
- * This is the mode for the first message. Default is 'assistant-speaks-first'.
6369
- *
6370
- * Use:
6371
- * - 'assistant-speaks-first' to have the assistant speak first.
6372
- * - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.
6373
- * - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message generated by the model based on the conversation state. (`assistant.model.messages` at call start, `call.messages` at squad transfer points).
6374
- *
6375
- * @default 'assistant-speaks-first'
6376
- * @example "assistant-speaks-first"
6377
- */
6378
- firstMessageMode?: 'assistant-speaks-first' | 'assistant-speaks-first-with-model-generated-message' | 'assistant-waits-for-user';
6379
- /**
6380
- * These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].
6381
- * This uses Twilio's built-in detection while the VoicemailTool relies on the model to detect if a voicemail was reached.
6382
- * You can use neither of them, one of them, or both of them. By default, Twilio built-in detection is enabled while VoicemailTool is not.
6383
- */
6384
- voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan;
6385
- /**
6386
- * These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started. You can check the shape of the messages in ClientMessage schema.
6387
- * @example ["conversation-update","function-call","hang","model-output","speech-update","status-update","transfer-update","transcript","tool-calls","user-interrupted","voice-input","workflow.node.started"]
6388
- */
6389
- clientMessages?: 'conversation-update' | 'function-call' | 'function-call-result' | 'hang' | 'language-changed' | 'metadata' | 'model-output' | 'speech-update' | 'status-update' | 'transcript' | 'tool-calls' | 'tool-calls-result' | 'transfer-update' | 'user-interrupted' | 'voice-input' | 'workflow.node.started';
6390
- /**
6391
- * These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,user-interrupted. You can check the shape of the messages in ServerMessage schema.
6392
- * @example ["conversation-update","end-of-call-report","function-call","hang","speech-update","status-update","tool-calls","transfer-destination-request","user-interrupted"]
6393
- */
6394
- serverMessages?: 'conversation-update' | 'end-of-call-report' | 'function-call' | 'hang' | 'language-changed' | 'language-change-detected' | 'model-output' | 'phone-call-control' | 'speech-update' | 'status-update' | 'transcript' | "transcript[transcriptType='final']" | 'tool-calls' | 'transfer-destination-request' | 'transfer-update' | 'user-interrupted' | 'voice-input';
6395
- /**
6396
- * How many seconds of silence to wait before ending the call. Defaults to 30.
6397
- *
6398
- * @default 30
6399
- * @min 10
6400
- * @max 3600
6401
- * @example 30
6402
- */
6403
- silenceTimeoutSeconds?: number;
6404
- /**
6405
- * This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.
6406
- *
6407
- * @default 600 (10 minutes)
6408
- * @min 10
6409
- * @max 43200
6410
- * @example 600
6411
- */
6412
- maxDurationSeconds?: number;
6413
- /**
6414
- * This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.
6415
- * You can also provide a custom sound by providing a URL to an audio file.
6416
- * @maxLength 1000
6417
- */
6418
- backgroundSound?: 'off' | 'office' | string;
6419
- /**
6420
- * This enables filtering of noise and background speech while the user is talking.
6421
- *
6422
- * Default `false` while in beta.
6423
- *
6424
- * @default false
6425
- * @example false
6426
- */
6427
- backgroundDenoisingEnabled?: boolean;
6428
- /**
6429
- * This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.
6430
- *
6431
- * Default `false` while in beta.
6432
- *
6433
- * @default false
6434
- * @example false
6435
- */
6436
- modelOutputInMessagesEnabled?: boolean;
6437
- /** These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You can store multiple configurations for different transport providers. For a call, only the configuration matching the call transport provider is used. */
6438
- transportConfigurations?: TransportConfigurationTwilio[];
6439
- /**
6440
- * This is the plan for observability configuration of assistant's calls.
6441
- * Currently supports Langfuse for tracing and monitoring.
6764
+ * This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.
6765
+ * Usage:
6766
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6767
+ * To start the call with Squad as entrypoint, use squad or squadId
6768
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6442
6769
  */
6443
- observabilityPlan?: LangfuseObservabilityPlan;
6444
- /** These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials. */
6445
- credentials?: (({
6446
- provider: '11labs';
6447
- } & CreateElevenLabsCredentialDTO) | ({
6448
- provider: 'anthropic';
6449
- } & CreateAnthropicCredentialDTO) | ({
6450
- provider: 'anyscale';
6451
- } & CreateAnyscaleCredentialDTO) | ({
6452
- provider: 'assembly-ai';
6453
- } & CreateAssemblyAICredentialDTO) | ({
6454
- provider: 'azure-openai';
6455
- } & CreateAzureOpenAICredentialDTO) | ({
6456
- provider: 'azure';
6457
- } & CreateAzureCredentialDTO) | ({
6458
- provider: 'byo-sip-trunk';
6459
- } & CreateByoSipTrunkCredentialDTO) | ({
6460
- provider: 'cartesia';
6461
- } & CreateCartesiaCredentialDTO) | ({
6462
- provider: 'cerebras';
6463
- } & CreateCerebrasCredentialDTO) | ({
6464
- provider: 'cloudflare';
6465
- } & CreateCloudflareCredentialDTO) | ({
6466
- provider: 'custom-llm';
6467
- } & CreateCustomLLMCredentialDTO) | ({
6468
- provider: 'deepgram';
6469
- } & CreateDeepgramCredentialDTO) | ({
6470
- provider: 'deepinfra';
6471
- } & CreateDeepInfraCredentialDTO) | ({
6472
- provider: 'deep-seek';
6473
- } & CreateDeepSeekCredentialDTO) | ({
6474
- provider: 'gcp';
6475
- } & CreateGcpCredentialDTO) | ({
6476
- provider: 'gladia';
6477
- } & CreateGladiaCredentialDTO) | ({
6478
- provider: 'gohighlevel';
6479
- } & CreateGoHighLevelCredentialDTO) | ({
6480
- provider: 'google';
6481
- } & CreateGoogleCredentialDTO) | ({
6482
- provider: 'groq';
6483
- } & CreateGroqCredentialDTO) | ({
6484
- provider: 'inflection-ai';
6485
- } & CreateInflectionAICredentialDTO) | ({
6486
- provider: 'langfuse';
6487
- } & CreateLangfuseCredentialDTO) | ({
6488
- provider: 'lmnt';
6489
- } & CreateLmntCredentialDTO) | ({
6490
- provider: 'make';
6491
- } & CreateMakeCredentialDTO) | ({
6492
- provider: 'openai';
6493
- } & CreateOpenAICredentialDTO) | ({
6494
- provider: 'openrouter';
6495
- } & CreateOpenRouterCredentialDTO) | ({
6496
- provider: 'perplexity-ai';
6497
- } & CreatePerplexityAICredentialDTO) | ({
6498
- provider: 'playht';
6499
- } & CreatePlayHTCredentialDTO) | ({
6500
- provider: 'rime-ai';
6501
- } & CreateRimeAICredentialDTO) | ({
6502
- provider: 'runpod';
6503
- } & CreateRunpodCredentialDTO) | ({
6504
- provider: 's3';
6505
- } & CreateS3CredentialDTO) | ({
6506
- provider: 'supabase';
6507
- } & CreateSupabaseCredentialDTO) | ({
6508
- provider: 'smallest-ai';
6509
- } & CreateSmallestAICredentialDTO) | ({
6510
- provider: 'tavus';
6511
- } & CreateTavusCredentialDTO) | ({
6512
- provider: 'together-ai';
6513
- } & CreateTogetherAICredentialDTO) | ({
6514
- provider: 'twilio';
6515
- } & CreateTwilioCredentialDTO) | ({
6516
- provider: 'vonage';
6517
- } & CreateVonageCredentialDTO) | ({
6518
- provider: 'webhook';
6519
- } & CreateWebhookCredentialDTO) | ({
6520
- provider: 'xai';
6521
- } & CreateXAiCredentialDTO) | ({
6522
- provider: 'neuphonic';
6523
- } & CreateNeuphonicCredentialDTO) | ({
6524
- provider: 'hume';
6525
- } & CreateHumeCredentialDTO) | ({
6526
- provider: 'mistral';
6527
- } & CreateMistralCredentialDTO) | ({
6528
- provider: 'speechmatics';
6529
- } & CreateSpeechmaticsCredentialDTO) | ({
6530
- provider: 'trieve';
6531
- } & CreateTrieveCredentialDTO) | ({
6532
- provider: 'google.calendar.oauth2-client';
6533
- } & CreateGoogleCalendarOAuth2ClientCredentialDTO) | ({
6534
- provider: 'google.calendar.oauth2-authorization';
6535
- } & CreateGoogleCalendarOAuth2AuthorizationCredentialDTO) | ({
6536
- provider: 'google.sheets.oauth2-authorization';
6537
- } & CreateGoogleSheetsOAuth2AuthorizationCredentialDTO) | ({
6538
- provider: 'slack.oauth2-authorization';
6539
- } & CreateSlackOAuth2AuthorizationCredentialDTO))[];
6770
+ workflow?: CreateWorkflowDTO;
6540
6771
  /**
6541
- * This is the name of the assistant.
6772
+ * This is the phone number that will be used for the call. To use a transient number, use `phoneNumber` instead.
6542
6773
  *
6543
- * This is required when you want to transfer between assistants in a call.
6544
- * @maxLength 40
6774
+ * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6545
6775
  */
6546
- name?: string;
6776
+ phoneNumberId?: string;
6547
6777
  /**
6548
- * This is the message that the assistant will say if the call is forwarded to voicemail.
6778
+ * This is the phone number that will be used for the call. To use an existing number, use `phoneNumberId` instead.
6549
6779
  *
6550
- * If unspecified, it will hang up.
6551
- * @maxLength 1000
6780
+ * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6552
6781
  */
6553
- voicemailMessage?: string;
6782
+ phoneNumber?: ImportTwilioPhoneNumberDTO;
6554
6783
  /**
6555
- * This is the message that the assistant will say if it ends the call.
6784
+ * This is the customer that will be called. To call a transient customer , use `customer` instead.
6556
6785
  *
6557
- * If unspecified, it will hang up without saying anything.
6558
- * @maxLength 1000
6786
+ * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6559
6787
  */
6560
- endCallMessage?: string;
6561
- /** This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive. */
6562
- endCallPhrases?: string[];
6563
- compliancePlan?: CompliancePlan;
6564
- /** This is for metadata you want to store on the assistant. */
6565
- metadata?: object;
6566
- /** This is the plan for analysis of assistant's calls. Stored in `call.analysis`. */
6567
- analysisPlan?: AnalysisPlan;
6788
+ customerId?: string;
6568
6789
  /**
6569
- * This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.
6790
+ * This is the customer that will be called. To call an existing customer, use `customerId` instead.
6570
6791
  *
6571
- * Note: `recordingEnabled` is currently at the root level. It will be moved to `artifactPlan` in the future, but will remain backwards compatible.
6792
+ * Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
6572
6793
  */
6573
- artifactPlan?: ArtifactPlan;
6794
+ customer?: CreateCustomerDTO;
6795
+ }
6796
+ export interface CreateWebCallDTO {
6574
6797
  /**
6575
- * This is the plan for static predefined messages that can be spoken by the assistant during the call, like `idleMessages`.
6576
- *
6577
- * Note: `firstMessage`, `voicemailMessage`, and `endCallMessage` are currently at the root level. They will be moved to `messagePlan` in the future, but will remain backwards compatible.
6798
+ * This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead.
6799
+ * Usage:
6800
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6801
+ * To start the call with Squad as entrypoint, use squad or squadId
6802
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6578
6803
  */
6579
- messagePlan?: MessagePlan;
6804
+ assistantId?: string;
6580
6805
  /**
6581
- * This is the plan for when the assistant should start talking.
6582
- *
6583
- * You should configure this if you're running into these issues:
6584
- * - The assistant is too slow to start talking after the customer is done speaking.
6585
- * - The assistant is too fast to start talking after the customer is done speaking.
6586
- * - The assistant is so fast that it's actually interrupting the customer.
6806
+ * This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.
6807
+ * Usage:
6808
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6809
+ * To start the call with Squad as entrypoint, use squad or squadId
6810
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6587
6811
  */
6588
- startSpeakingPlan?: StartSpeakingPlan;
6812
+ assistant?: CreateAssistantDTO;
6813
+ /** These are the overrides for the `assistant` or `assistantId`'s settings and template variables. */
6814
+ assistantOverrides?: AssistantOverrides;
6589
6815
  /**
6590
- * This is the plan for when assistant should stop talking on customer interruption.
6591
- *
6592
- * You should configure this if you're running into these issues:
6593
- * - The assistant is too slow to recognize customer's interruption.
6594
- * - The assistant is too fast to recognize customer's interruption.
6595
- * - The assistant is getting interrupted by phrases that are just acknowledgments.
6596
- * - The assistant is getting interrupted by background noises.
6597
- * - The assistant is not properly stopping -- it starts talking right after getting interrupted.
6816
+ * This is the squad that will be used for the call. To use a transient squad, use `squad` instead.
6817
+ * Usage:
6818
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6819
+ * To start the call with Squad as entrypoint, use squad or squadId
6820
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6598
6821
  */
6599
- stopSpeakingPlan?: StopSpeakingPlan;
6822
+ squadId?: string;
6600
6823
  /**
6601
- * This is the plan for real-time monitoring of the assistant's calls.
6602
- *
6824
+ * This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.
6603
6825
  * Usage:
6604
- * - To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.
6605
- * - To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.
6606
- *
6607
- * Note, `serverMessages`, `clientMessages`, `serverUrl` and `serverUrlSecret` are currently at the root level but will be moved to `monitorPlan` in the future. Will remain backwards compatible
6826
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6827
+ * To start the call with Squad as entrypoint, use squad or squadId
6828
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6608
6829
  */
6609
- monitorPlan?: MonitorPlan;
6610
- /** These are the credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can provide a subset using this. */
6611
- credentialIds?: string[];
6830
+ squad?: CreateSquadDTO;
6612
6831
  /**
6613
- * This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.
6614
- *
6615
- * The order of precedence is:
6616
- *
6617
- * 1. assistant.server.url
6618
- * 2. phoneNumber.serverUrl
6619
- * 3. org.serverUrl
6832
+ * This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.
6833
+ * Usage:
6834
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6835
+ * To start the call with Squad as entrypoint, use squad or squadId
6836
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6620
6837
  */
6621
- server?: Server;
6622
- /** This is a set of actions that will be performed on certain events. */
6623
- hooks?: AssistantHooks[];
6624
- keypadInputPlan?: KeypadInputPlan;
6625
- /** This is the unique identifier for the assistant. */
6626
- id: string;
6627
- /** This is the unique identifier for the org that this assistant belongs to. */
6628
- orgId: string;
6838
+ workflowId?: string;
6629
6839
  /**
6630
- * This is the ISO 8601 date-time string of when the assistant was created.
6631
- * @format date-time
6840
+ * This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.
6841
+ * Usage:
6842
+ * To start the call with Assistant as entrypoint, use assistant or assistantId
6843
+ * To start the call with Squad as entrypoint, use squad or squadId
6844
+ * To start the call with Workflow as entrypoint, use workflow or workflowId
6632
6845
  */
6633
- createdAt: string;
6846
+ workflow?: CreateWorkflowDTO;
6847
+ }
6848
+ export interface UpdateCallDTO {
6634
6849
  /**
6635
- * This is the ISO 8601 date-time string of when the assistant was last updated.
6636
- * @format date-time
6850
+ * This is the name of the call. This is just for your own reference.
6851
+ * @maxLength 40
6637
6852
  */
6638
- updatedAt: string;
6853
+ name?: string;
6854
+ }
6855
+ export type ChatServiceResponse = object;
6856
+ export interface ChatCompletionMessageMetadata {
6857
+ taskName: string;
6858
+ taskType: string;
6859
+ taskOutput: string;
6860
+ taskState?: object;
6861
+ nodeTrace?: string[];
6862
+ }
6863
+ export interface ChatCompletionMessageWorkflows {
6864
+ role: object;
6865
+ content: string | null;
6866
+ metadata?: ChatCompletionMessageMetadata;
6867
+ }
6868
+ export interface ChatCompletionsDTO {
6869
+ messages: ChatCompletionMessageWorkflows[];
6870
+ workflowId?: string;
6871
+ workflow?: CreateWorkflowDTO;
6639
6872
  }
6640
6873
  export interface AssistantPaginatedResponse {
6641
6874
  results: Assistant[];
6642
6875
  metadata: PaginationMeta;
6643
6876
  }
6877
+ export interface AssistantVersionPaginatedResponse {
6878
+ results: any[];
6879
+ metadata: PaginationMeta;
6880
+ nextPageState?: string;
6881
+ }
6644
6882
  export interface UpdateAssistantDTO {
6645
6883
  /** These are the options for the assistant's transcriber. */
6646
6884
  transcriber?: AssemblyAITranscriber | AzureSpeechTranscriber | CustomTranscriber | DeepgramTranscriber | ElevenLabsTranscriber | GladiaTranscriber | SpeechmaticsTranscriber | TalkscriberTranscriber | GoogleTranscriber | OpenAITranscriber;
@@ -6677,17 +6915,9 @@ export interface UpdateAssistantDTO {
6677
6915
  * This uses Twilio's built-in detection while the VoicemailTool relies on the model to detect if a voicemail was reached.
6678
6916
  * You can use neither of them, one of them, or both of them. By default, Twilio built-in detection is enabled while VoicemailTool is not.
6679
6917
  */
6680
- voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan;
6681
- /**
6682
- * These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started. You can check the shape of the messages in ClientMessage schema.
6683
- * @example ["conversation-update","function-call","hang","model-output","speech-update","status-update","transfer-update","transcript","tool-calls","user-interrupted","voice-input","workflow.node.started"]
6684
- */
6685
- clientMessages?: 'conversation-update' | 'function-call' | 'function-call-result' | 'hang' | 'language-changed' | 'metadata' | 'model-output' | 'speech-update' | 'status-update' | 'transcript' | 'tool-calls' | 'tool-calls-result' | 'transfer-update' | 'user-interrupted' | 'voice-input' | 'workflow.node.started';
6686
- /**
6687
- * These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,user-interrupted. You can check the shape of the messages in ServerMessage schema.
6688
- * @example ["conversation-update","end-of-call-report","function-call","hang","speech-update","status-update","tool-calls","transfer-destination-request","user-interrupted"]
6689
- */
6690
- serverMessages?: 'conversation-update' | 'end-of-call-report' | 'function-call' | 'hang' | 'language-changed' | 'language-change-detected' | 'model-output' | 'phone-call-control' | 'speech-update' | 'status-update' | 'transcript' | "transcript[transcriptType='final']" | 'tool-calls' | 'transfer-destination-request' | 'transfer-update' | 'user-interrupted' | 'voice-input';
6918
+ voicemailDetection?: GoogleVoicemailDetectionPlan | OpenAIVoicemailDetectionPlan | TwilioVoicemailDetectionPlan | VapiVoicemailDetectionPlan;
6919
+ clientMessages: object[][];
6920
+ serverMessages: object[][];
6691
6921
  /**
6692
6922
  * How many seconds of silence to wait before ending the call. Defaults to 30.
6693
6923
  *
@@ -6833,6 +7063,8 @@ export interface UpdateAssistantDTO {
6833
7063
  } & CreateGoogleSheetsOAuth2AuthorizationCredentialDTO) | ({
6834
7064
  provider: 'slack.oauth2-authorization';
6835
7065
  } & CreateSlackOAuth2AuthorizationCredentialDTO))[];
7066
+ /** This is a set of actions that will be performed on certain events. */
7067
+ hooks?: AssistantHookCallEnding[];
6836
7068
  /**
6837
7069
  * This is the name of the assistant.
6838
7070
  *
@@ -6915,8 +7147,6 @@ export interface UpdateAssistantDTO {
6915
7147
  * 3. org.serverUrl
6916
7148
  */
6917
7149
  server?: Server;
6918
- /** This is a set of actions that will be performed on certain events. */
6919
- hooks?: AssistantHooks[];
6920
7150
  keypadInputPlan?: KeypadInputPlan;
6921
7151
  }
6922
7152
  export interface ByoPhoneNumber {
@@ -6970,13 +7200,19 @@ export interface ByoPhoneNumber {
6970
7200
  /**
6971
7201
  * This is the assistant that will be used for incoming calls to this phone number.
6972
7202
  *
6973
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7203
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
6974
7204
  */
6975
7205
  assistantId?: string;
7206
+ /**
7207
+ * This is the workflow that will be used for incoming calls to this phone number.
7208
+ *
7209
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7210
+ */
7211
+ workflowId?: string;
6976
7212
  /**
6977
7213
  * This is the squad that will be used for incoming calls to this phone number.
6978
7214
  *
6979
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7215
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
6980
7216
  */
6981
7217
  squadId?: string;
6982
7218
  /**
@@ -7016,6 +7252,16 @@ export interface TwilioPhoneNumber {
7016
7252
  hooks?: PhoneNumberHookCallRinging[];
7017
7253
  /** This is to use numbers bought on Twilio. */
7018
7254
  provider: 'twilio';
7255
+ /**
7256
+ * Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.
7257
+ *
7258
+ * If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
7259
+ * If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.
7260
+ *
7261
+ * @default true
7262
+ * @default true
7263
+ */
7264
+ smsEnabled?: boolean;
7019
7265
  /** This is the unique identifier for the phone number. */
7020
7266
  id: string;
7021
7267
  /** This is the unique identifier for the org that this phone number belongs to. */
@@ -7032,6 +7278,12 @@ export interface TwilioPhoneNumber {
7032
7278
  updatedAt: string;
7033
7279
  /** This is the status of the phone number. */
7034
7280
  status?: 'active' | 'activating' | 'blocked';
7281
+ /** This is the Twilio Auth Token for the phone number. */
7282
+ twilioAuthToken?: string;
7283
+ /** This is the Twilio API Key for the phone number. */
7284
+ twilioApiKey?: string;
7285
+ /** This is the Twilio API Secret for the phone number. */
7286
+ twilioApiSecret?: string;
7035
7287
  /**
7036
7288
  * This is the name of the phone number. This is just for your own reference.
7037
7289
  * @maxLength 40
@@ -7040,13 +7292,19 @@ export interface TwilioPhoneNumber {
7040
7292
  /**
7041
7293
  * This is the assistant that will be used for incoming calls to this phone number.
7042
7294
  *
7043
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7295
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7044
7296
  */
7045
7297
  assistantId?: string;
7298
+ /**
7299
+ * This is the workflow that will be used for incoming calls to this phone number.
7300
+ *
7301
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7302
+ */
7303
+ workflowId?: string;
7046
7304
  /**
7047
7305
  * This is the squad that will be used for incoming calls to this phone number.
7048
7306
  *
7049
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7307
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7050
7308
  */
7051
7309
  squadId?: string;
7052
7310
  /**
@@ -7063,8 +7321,6 @@ export interface TwilioPhoneNumber {
7063
7321
  number: string;
7064
7322
  /** This is the Twilio Account SID for the phone number. */
7065
7323
  twilioAccountSid: string;
7066
- /** This is the Twilio Auth Token for the phone number. */
7067
- twilioAuthToken: string;
7068
7324
  }
7069
7325
  export interface VonagePhoneNumber {
7070
7326
  /**
@@ -7104,13 +7360,19 @@ export interface VonagePhoneNumber {
7104
7360
  /**
7105
7361
  * This is the assistant that will be used for incoming calls to this phone number.
7106
7362
  *
7107
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7363
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7108
7364
  */
7109
7365
  assistantId?: string;
7366
+ /**
7367
+ * This is the workflow that will be used for incoming calls to this phone number.
7368
+ *
7369
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7370
+ */
7371
+ workflowId?: string;
7110
7372
  /**
7111
7373
  * This is the squad that will be used for incoming calls to this phone number.
7112
7374
  *
7113
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7375
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7114
7376
  */
7115
7377
  squadId?: string;
7116
7378
  /**
@@ -7184,13 +7446,19 @@ export interface VapiPhoneNumber {
7184
7446
  /**
7185
7447
  * This is the assistant that will be used for incoming calls to this phone number.
7186
7448
  *
7187
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7449
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7188
7450
  */
7189
7451
  assistantId?: string;
7452
+ /**
7453
+ * This is the workflow that will be used for incoming calls to this phone number.
7454
+ *
7455
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7456
+ */
7457
+ workflowId?: string;
7190
7458
  /**
7191
7459
  * This is the squad that will be used for incoming calls to this phone number.
7192
7460
  *
7193
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7461
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7194
7462
  */
7195
7463
  squadId?: string;
7196
7464
  /**
@@ -7260,13 +7528,19 @@ export interface TelnyxPhoneNumber {
7260
7528
  /**
7261
7529
  * This is the assistant that will be used for incoming calls to this phone number.
7262
7530
  *
7263
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7531
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7264
7532
  */
7265
7533
  assistantId?: string;
7534
+ /**
7535
+ * This is the workflow that will be used for incoming calls to this phone number.
7536
+ *
7537
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7538
+ */
7539
+ workflowId?: string;
7266
7540
  /**
7267
7541
  * This is the squad that will be used for incoming calls to this phone number.
7268
7542
  *
7269
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7543
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7270
7544
  */
7271
7545
  squadId?: string;
7272
7546
  /**
@@ -7331,13 +7605,19 @@ export interface CreateByoPhoneNumberDTO {
7331
7605
  /**
7332
7606
  * This is the assistant that will be used for incoming calls to this phone number.
7333
7607
  *
7334
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7608
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7335
7609
  */
7336
7610
  assistantId?: string;
7611
+ /**
7612
+ * This is the workflow that will be used for incoming calls to this phone number.
7613
+ *
7614
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7615
+ */
7616
+ workflowId?: string;
7337
7617
  /**
7338
7618
  * This is the squad that will be used for incoming calls to this phone number.
7339
7619
  *
7340
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7620
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7341
7621
  */
7342
7622
  squadId?: string;
7343
7623
  /**
@@ -7365,12 +7645,26 @@ export interface CreateTwilioPhoneNumberDTO {
7365
7645
  hooks?: PhoneNumberHookCallRinging[];
7366
7646
  /** This is to use numbers bought on Twilio. */
7367
7647
  provider: 'twilio';
7648
+ /**
7649
+ * Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.
7650
+ *
7651
+ * If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
7652
+ * If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.
7653
+ *
7654
+ * @default true
7655
+ * @default true
7656
+ */
7657
+ smsEnabled?: boolean;
7368
7658
  /** These are the digits of the phone number you own on your Twilio. */
7369
7659
  number: string;
7370
7660
  /** This is the Twilio Account SID for the phone number. */
7371
7661
  twilioAccountSid: string;
7372
7662
  /** This is the Twilio Auth Token for the phone number. */
7373
- twilioAuthToken: string;
7663
+ twilioAuthToken?: string;
7664
+ /** This is the Twilio API Key for the phone number. */
7665
+ twilioApiKey?: string;
7666
+ /** This is the Twilio API Secret for the phone number. */
7667
+ twilioApiSecret?: string;
7374
7668
  /**
7375
7669
  * This is the name of the phone number. This is just for your own reference.
7376
7670
  * @maxLength 40
@@ -7379,13 +7673,19 @@ export interface CreateTwilioPhoneNumberDTO {
7379
7673
  /**
7380
7674
  * This is the assistant that will be used for incoming calls to this phone number.
7381
7675
  *
7382
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7676
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7383
7677
  */
7384
7678
  assistantId?: string;
7679
+ /**
7680
+ * This is the workflow that will be used for incoming calls to this phone number.
7681
+ *
7682
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7683
+ */
7684
+ workflowId?: string;
7385
7685
  /**
7386
7686
  * This is the squad that will be used for incoming calls to this phone number.
7387
7687
  *
7388
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7688
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7389
7689
  */
7390
7690
  squadId?: string;
7391
7691
  /**
@@ -7425,13 +7725,19 @@ export interface CreateVonagePhoneNumberDTO {
7425
7725
  /**
7426
7726
  * This is the assistant that will be used for incoming calls to this phone number.
7427
7727
  *
7428
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7728
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7429
7729
  */
7430
7730
  assistantId?: string;
7731
+ /**
7732
+ * This is the workflow that will be used for incoming calls to this phone number.
7733
+ *
7734
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7735
+ */
7736
+ workflowId?: string;
7431
7737
  /**
7432
7738
  * This is the squad that will be used for incoming calls to this phone number.
7433
7739
  *
7434
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7740
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7435
7741
  */
7436
7742
  squadId?: string;
7437
7743
  /**
@@ -7485,13 +7791,19 @@ export interface CreateVapiPhoneNumberDTO {
7485
7791
  /**
7486
7792
  * This is the assistant that will be used for incoming calls to this phone number.
7487
7793
  *
7488
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7794
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7489
7795
  */
7490
7796
  assistantId?: string;
7797
+ /**
7798
+ * This is the workflow that will be used for incoming calls to this phone number.
7799
+ *
7800
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7801
+ */
7802
+ workflowId?: string;
7491
7803
  /**
7492
7804
  * This is the squad that will be used for incoming calls to this phone number.
7493
7805
  *
7494
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7806
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7495
7807
  */
7496
7808
  squadId?: string;
7497
7809
  /**
@@ -7531,13 +7843,19 @@ export interface CreateTelnyxPhoneNumberDTO {
7531
7843
  /**
7532
7844
  * This is the assistant that will be used for incoming calls to this phone number.
7533
7845
  *
7534
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7846
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7535
7847
  */
7536
7848
  assistantId?: string;
7849
+ /**
7850
+ * This is the workflow that will be used for incoming calls to this phone number.
7851
+ *
7852
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7853
+ */
7854
+ workflowId?: string;
7537
7855
  /**
7538
7856
  * This is the squad that will be used for incoming calls to this phone number.
7539
7857
  *
7540
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7858
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7541
7859
  */
7542
7860
  squadId?: string;
7543
7861
  /**
@@ -7584,13 +7902,19 @@ export interface UpdateByoPhoneNumberDTO {
7584
7902
  /**
7585
7903
  * This is the assistant that will be used for incoming calls to this phone number.
7586
7904
  *
7587
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7905
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7588
7906
  */
7589
7907
  assistantId?: string;
7908
+ /**
7909
+ * This is the workflow that will be used for incoming calls to this phone number.
7910
+ *
7911
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7912
+ */
7913
+ workflowId?: string;
7590
7914
  /**
7591
7915
  * This is the squad that will be used for incoming calls to this phone number.
7592
7916
  *
7593
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7917
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7594
7918
  */
7595
7919
  squadId?: string;
7596
7920
  /**
@@ -7628,6 +7952,16 @@ export interface UpdateTwilioPhoneNumberDTO {
7628
7952
  fallbackDestination?: TransferDestinationNumber | TransferDestinationSip;
7629
7953
  /** This is the hooks that will be used for incoming calls to this phone number. */
7630
7954
  hooks?: PhoneNumberHookCallRinging[];
7955
+ /**
7956
+ * Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.
7957
+ *
7958
+ * If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
7959
+ * If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.
7960
+ *
7961
+ * @default true
7962
+ * @default true
7963
+ */
7964
+ smsEnabled?: boolean;
7631
7965
  /**
7632
7966
  * This is the name of the phone number. This is just for your own reference.
7633
7967
  * @maxLength 40
@@ -7636,13 +7970,19 @@ export interface UpdateTwilioPhoneNumberDTO {
7636
7970
  /**
7637
7971
  * This is the assistant that will be used for incoming calls to this phone number.
7638
7972
  *
7639
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7973
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7640
7974
  */
7641
7975
  assistantId?: string;
7976
+ /**
7977
+ * This is the workflow that will be used for incoming calls to this phone number.
7978
+ *
7979
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7980
+ */
7981
+ workflowId?: string;
7642
7982
  /**
7643
7983
  * This is the squad that will be used for incoming calls to this phone number.
7644
7984
  *
7645
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7985
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7646
7986
  */
7647
7987
  squadId?: string;
7648
7988
  /**
@@ -7661,6 +8001,10 @@ export interface UpdateTwilioPhoneNumberDTO {
7661
8001
  twilioAccountSid?: string;
7662
8002
  /** This is the Twilio Auth Token for the phone number. */
7663
8003
  twilioAuthToken?: string;
8004
+ /** This is the Twilio API Key for the phone number. */
8005
+ twilioApiKey?: string;
8006
+ /** This is the Twilio API Secret for the phone number. */
8007
+ twilioApiSecret?: string;
7664
8008
  }
7665
8009
  export interface UpdateVonagePhoneNumberDTO {
7666
8010
  /**
@@ -7682,13 +8026,19 @@ export interface UpdateVonagePhoneNumberDTO {
7682
8026
  /**
7683
8027
  * This is the assistant that will be used for incoming calls to this phone number.
7684
8028
  *
7685
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8029
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7686
8030
  */
7687
8031
  assistantId?: string;
8032
+ /**
8033
+ * This is the workflow that will be used for incoming calls to this phone number.
8034
+ *
8035
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8036
+ */
8037
+ workflowId?: string;
7688
8038
  /**
7689
8039
  * This is the squad that will be used for incoming calls to this phone number.
7690
8040
  *
7691
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8041
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7692
8042
  */
7693
8043
  squadId?: string;
7694
8044
  /**
@@ -7726,13 +8076,19 @@ export interface UpdateVapiPhoneNumberDTO {
7726
8076
  /**
7727
8077
  * This is the assistant that will be used for incoming calls to this phone number.
7728
8078
  *
7729
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8079
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7730
8080
  */
7731
8081
  assistantId?: string;
8082
+ /**
8083
+ * This is the workflow that will be used for incoming calls to this phone number.
8084
+ *
8085
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8086
+ */
8087
+ workflowId?: string;
7732
8088
  /**
7733
8089
  * This is the squad that will be used for incoming calls to this phone number.
7734
8090
  *
7735
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8091
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7736
8092
  */
7737
8093
  squadId?: string;
7738
8094
  /**
@@ -7778,13 +8134,19 @@ export interface UpdateTelnyxPhoneNumberDTO {
7778
8134
  /**
7779
8135
  * This is the assistant that will be used for incoming calls to this phone number.
7780
8136
  *
7781
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8137
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7782
8138
  */
7783
8139
  assistantId?: string;
8140
+ /**
8141
+ * This is the workflow that will be used for incoming calls to this phone number.
8142
+ *
8143
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8144
+ */
8145
+ workflowId?: string;
7784
8146
  /**
7785
8147
  * This is the squad that will be used for incoming calls to this phone number.
7786
8148
  *
7787
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8149
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7788
8150
  */
7789
8151
  squadId?: string;
7790
8152
  /**
@@ -7829,13 +8191,19 @@ export interface ImportVonagePhoneNumberDTO {
7829
8191
  /**
7830
8192
  * This is the assistant that will be used for incoming calls to this phone number.
7831
8193
  *
7832
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8194
+ * If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7833
8195
  */
7834
8196
  assistantId?: string;
8197
+ /**
8198
+ * This is the workflow that will be used for incoming calls to this phone number.
8199
+ *
8200
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8201
+ */
8202
+ workflowId?: string;
7835
8203
  /**
7836
8204
  * This is the squad that will be used for incoming calls to this phone number.
7837
8205
  *
7838
- * If neither `assistantId` nor `squadId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
8206
+ * If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is expected.
7839
8207
  */
7840
8208
  squadId?: string;
7841
8209
  /**
@@ -9866,8 +10234,22 @@ export interface TrieveKnowledgeBaseImport {
9866
10234
  /** This is the `datasetId` of the dataset on your Trieve account. */
9867
10235
  providerId: string;
9868
10236
  }
10237
+ export interface Workflow {
10238
+ nodes: (Start | Assistant | Say | Gather | ApiRequest | Hangup | Transfer)[];
10239
+ /** These are the options for the workflow's LLM. */
10240
+ model?: AnthropicModel | AnyscaleModel | CerebrasModel | CustomLLMModel | DeepInfraModel | DeepSeekModel | GoogleModel | GroqModel | InflectionAIModel | OpenAIModel | OpenRouterModel | PerplexityAIModel | TogetherAIModel | XaiModel;
10241
+ id: string;
10242
+ orgId: string;
10243
+ /** @format date-time */
10244
+ createdAt: string;
10245
+ /** @format date-time */
10246
+ updatedAt: string;
10247
+ /** @maxLength 80 */
10248
+ name: string;
10249
+ edges: Edge[];
10250
+ }
9869
10251
  export interface UpdateWorkflowDTO {
9870
- nodes?: (Say | Gather | ApiRequest | Hangup | Transfer)[];
10252
+ nodes?: (Start | Assistant | Say | Gather | ApiRequest | Hangup | Transfer)[];
9871
10253
  /** These are the options for the workflow's LLM. */
9872
10254
  model?: AnthropicModel | AnyscaleModel | CerebrasModel | CustomLLMModel | DeepInfraModel | DeepSeekModel | GoogleModel | GroqModel | InflectionAIModel | OpenAIModel | OpenRouterModel | PerplexityAIModel | TogetherAIModel | XaiModel;
9873
10255
  /** @maxLength 80 */
@@ -10240,7 +10622,7 @@ export interface TestSuiteTestScorerAI {
10240
10622
  type: 'ai';
10241
10623
  /**
10242
10624
  * This is the rubric used by the AI scorer.
10243
- * @maxLength 1000
10625
+ * @maxLength 10000
10244
10626
  */
10245
10627
  rubric: string;
10246
10628
  }
@@ -10268,7 +10650,7 @@ export interface TestSuiteRunScorerAI {
10268
10650
  reasoning: string;
10269
10651
  /**
10270
10652
  * This is the rubric used by the AI scorer.
10271
- * @maxLength 1000
10653
+ * @maxLength 10000
10272
10654
  */
10273
10655
  rubric: string;
10274
10656
  }
@@ -10751,6 +11133,8 @@ export interface Org {
10751
11133
  stripeSubscriptionStatus?: string;
10752
11134
  /** This is the plan for the org. */
10753
11135
  plan?: OrgPlan;
11136
+ /** This is the secret key used for signing JWT tokens for the org. */
11137
+ jwtSecret?: string;
10754
11138
  /**
10755
11139
  * This is the name of the org. This is just for your own reference.
10756
11140
  * @maxLength 40
@@ -10867,6 +11251,10 @@ export interface UpdateUserRoleDTO {
10867
11251
  userId: string;
10868
11252
  role: 'admin' | 'editor' | 'viewer';
10869
11253
  }
11254
+ export interface JwtResponse {
11255
+ accessToken: string;
11256
+ aud: object;
11257
+ }
10870
11258
  export interface TokenRestrictions {
10871
11259
  /** This determines whether the token is enabled or disabled. Default is true, it's enabled. */
10872
11260
  enabled?: boolean;
@@ -12039,7 +12427,11 @@ export interface TrieveCredential {
12039
12427
  export interface TwilioCredential {
12040
12428
  provider: 'twilio';
12041
12429
  /** This is not returned in the API. */
12042
- authToken: string;
12430
+ authToken?: string;
12431
+ /** This is not returned in the API. */
12432
+ apiKey?: string;
12433
+ /** This is not returned in the API. */
12434
+ apiSecret?: string;
12043
12435
  /** This is the unique identifier for the credential. */
12044
12436
  id: string;
12045
12437
  /** This is the unique identifier for the org that this credential belongs to. */
@@ -12856,6 +13248,10 @@ export interface UpdateTrieveCredentialDTO {
12856
13248
  export interface UpdateTwilioCredentialDTO {
12857
13249
  /** This is not returned in the API. */
12858
13250
  authToken?: string;
13251
+ /** This is not returned in the API. */
13252
+ apiKey?: string;
13253
+ /** This is not returned in the API. */
13254
+ apiSecret?: string;
12859
13255
  /**
12860
13256
  * This is the name of credential. This is just for your reference.
12861
13257
  * @minLength 1
@@ -13395,7 +13791,7 @@ export interface ServerMessageEndOfCallReport {
13395
13791
  /** This is the type of the message. "end-of-call-report" is sent when the call ends and post-processing is complete. */
13396
13792
  type: 'end-of-call-report';
13397
13793
  /** This is the reason the call ended. This can also be found at `call.endedReason` on GET /call/:id. */
13398
- endedReason: 'call-start-error-neither-assistant-nor-server-set' | 'assistant-request-failed' | 'assistant-request-returned-error' | 'assistant-request-returned-unspeakable-error' | 'assistant-request-returned-invalid-assistant' | 'assistant-request-returned-no-assistant' | 'assistant-request-returned-forwarding-phone-number' | 'call.start.error-get-org' | 'call.start.error-get-subscription' | 'call.start.error-get-assistant' | 'call.start.error-get-phone-number' | 'call.start.error-get-customer' | 'call.start.error-get-resources-validation' | 'call.start.error-vapi-number-international' | 'call.start.error-vapi-number-outbound-daily-limit' | 'call.start.error-get-transport' | 'assistant-not-valid' | 'database-error' | 'assistant-not-found' | 'pipeline-error-openai-voice-failed' | 'pipeline-error-cartesia-voice-failed' | 'pipeline-error-deepgram-voice-failed' | 'pipeline-error-eleven-labs-voice-failed' | 'pipeline-error-playht-voice-failed' | 'pipeline-error-lmnt-voice-failed' | 'pipeline-error-azure-voice-failed' | 'pipeline-error-rime-ai-voice-failed' | 'pipeline-error-smallest-ai-voice-failed' | 'pipeline-error-neuphonic-voice-failed' | 'pipeline-error-hume-voice-failed' | 'pipeline-error-sesame-voice-failed' | 'pipeline-error-tavus-video-failed' | 'call.in-progress.error-vapifault-openai-voice-failed' | 'call.in-progress.error-vapifault-cartesia-voice-failed' | 'call.in-progress.error-vapifault-deepgram-voice-failed' | 'call.in-progress.error-vapifault-eleven-labs-voice-failed' | 'call.in-progress.error-vapifault-playht-voice-failed' | 'call.in-progress.error-vapifault-lmnt-voice-failed' | 'call.in-progress.error-vapifault-azure-voice-failed' | 'call.in-progress.error-vapifault-rime-ai-voice-failed' | 'call.in-progress.error-vapifault-smallest-ai-voice-failed' | 'call.in-progress.error-vapifault-neuphonic-voice-failed' | 'call.in-progress.error-vapifault-hume-voice-failed' | 'call.in-progress.error-vapifault-sesame-voice-failed' | 'call.in-progress.error-vapifault-tavus-video-failed' | 'pipeline-error-vapi-llm-failed' | 'pipeline-error-vapi-400-bad-request-validation-failed' | 'pipeline-error-vapi-401-unauthorized' | 'pipeline-error-vapi-403-model-access-denied' | 'pipeline-error-vapi-429-exceeded-quota' | 'pipeline-error-vapi-500-server-error' | 'pipeline-error-vapi-503-server-overloaded-error' | 'call.in-progress.error-vapifault-vapi-llm-failed' | 'call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-vapi-401-unauthorized' | 'call.in-progress.error-vapifault-vapi-403-model-access-denied' | 'call.in-progress.error-vapifault-vapi-429-exceeded-quota' | 'call.in-progress.error-providerfault-vapi-500-server-error' | 'call.in-progress.error-providerfault-vapi-503-server-overloaded-error' | 'pipeline-error-deepgram-transcriber-failed' | 'call.in-progress.error-vapifault-deepgram-transcriber-failed' | 'pipeline-error-gladia-transcriber-failed' | 'call.in-progress.error-vapifault-gladia-transcriber-failed' | 'pipeline-error-speechmatics-transcriber-failed' | 'call.in-progress.error-vapifault-speechmatics-transcriber-failed' | 'pipeline-error-assembly-ai-transcriber-failed' | 'pipeline-error-assembly-ai-returning-400-insufficent-funds' | 'pipeline-error-assembly-ai-returning-400-paid-only-feature' | 'pipeline-error-assembly-ai-returning-401-invalid-credentials' | 'pipeline-error-assembly-ai-returning-500-invalid-schema' | 'pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed' | 'call.in-progress.error-vapifault-assembly-ai-transcriber-failed' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature' | 'call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed' | 'pipeline-error-talkscriber-transcriber-failed' | 'call.in-progress.error-vapifault-talkscriber-transcriber-failed' | 'pipeline-error-azure-speech-transcriber-failed' | 'call.in-progress.error-vapifault-azure-speech-transcriber-failed' | 'call.in-progress.error-pipeline-no-available-llm-model' | 'worker-shutdown' | 'unknown-error' | 'vonage-disconnected' | 'vonage-failed-to-connect-call' | 'vonage-completed' | 'phone-call-provider-bypass-enabled-but-no-call-received' | 'call.in-progress.error-vapifault-transport-never-connected' | 'call.in-progress.error-vapifault-transport-connected-but-call-not-active' | 'call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing' | 'call.in-progress.error-vapifault-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-groq-llm-failed' | 'call.in-progress.error-vapifault-google-llm-failed' | 'call.in-progress.error-vapifault-xai-llm-failed' | 'call.in-progress.error-vapifault-mistral-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-cerebras-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-llm-failed' | 'pipeline-error-openai-400-bad-request-validation-failed' | 'pipeline-error-openai-401-unauthorized' | 'pipeline-error-openai-401-incorrect-api-key' | 'pipeline-error-openai-401-account-not-in-organization' | 'pipeline-error-openai-403-model-access-denied' | 'pipeline-error-openai-429-exceeded-quota' | 'pipeline-error-openai-429-rate-limit-reached' | 'pipeline-error-openai-500-server-error' | 'pipeline-error-openai-503-server-overloaded-error' | 'pipeline-error-openai-llm-failed' | 'call.in-progress.error-vapifault-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openai-401-unauthorized' | 'call.in-progress.error-vapifault-openai-401-incorrect-api-key' | 'call.in-progress.error-vapifault-openai-401-account-not-in-organization' | 'call.in-progress.error-vapifault-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-openai-429-exceeded-quota' | 'call.in-progress.error-vapifault-openai-429-rate-limit-reached' | 'call.in-progress.error-providerfault-openai-500-server-error' | 'call.in-progress.error-providerfault-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-400-bad-request-validation-failed' | 'pipeline-error-azure-openai-401-unauthorized' | 'pipeline-error-azure-openai-403-model-access-denied' | 'pipeline-error-azure-openai-429-exceeded-quota' | 'pipeline-error-azure-openai-500-server-error' | 'pipeline-error-azure-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-azure-openai-401-unauthorized' | 'call.in-progress.error-vapifault-azure-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-azure-openai-429-exceeded-quota' | 'call.in-progress.error-providerfault-azure-openai-500-server-error' | 'call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error' | 'pipeline-error-google-400-bad-request-validation-failed' | 'pipeline-error-google-401-unauthorized' | 'pipeline-error-google-403-model-access-denied' | 'pipeline-error-google-429-exceeded-quota' | 'pipeline-error-google-500-server-error' | 'pipeline-error-google-503-server-overloaded-error' | 'pipeline-error-google-llm-failed' | 'call.in-progress.error-vapifault-google-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-google-401-unauthorized' | 'call.in-progress.error-vapifault-google-403-model-access-denied' | 'call.in-progress.error-vapifault-google-429-exceeded-quota' | 'call.in-progress.error-providerfault-google-500-server-error' | 'call.in-progress.error-providerfault-google-503-server-overloaded-error' | 'pipeline-error-xai-400-bad-request-validation-failed' | 'pipeline-error-xai-401-unauthorized' | 'pipeline-error-xai-403-model-access-denied' | 'pipeline-error-xai-429-exceeded-quota' | 'pipeline-error-xai-500-server-error' | 'pipeline-error-xai-503-server-overloaded-error' | 'pipeline-error-xai-llm-failed' | 'call.in-progress.error-vapifault-xai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-xai-401-unauthorized' | 'call.in-progress.error-vapifault-xai-403-model-access-denied' | 'call.in-progress.error-vapifault-xai-429-exceeded-quota' | 'call.in-progress.error-providerfault-xai-500-server-error' | 'call.in-progress.error-providerfault-xai-503-server-overloaded-error' | 'pipeline-error-mistral-400-bad-request-validation-failed' | 'pipeline-error-mistral-401-unauthorized' | 'pipeline-error-mistral-403-model-access-denied' | 'pipeline-error-mistral-429-exceeded-quota' | 'pipeline-error-mistral-500-server-error' | 'pipeline-error-mistral-503-server-overloaded-error' | 'pipeline-error-mistral-llm-failed' | 'call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-mistral-401-unauthorized' | 'call.in-progress.error-vapifault-mistral-403-model-access-denied' | 'call.in-progress.error-vapifault-mistral-429-exceeded-quota' | 'call.in-progress.error-providerfault-mistral-500-server-error' | 'call.in-progress.error-providerfault-mistral-503-server-overloaded-error' | 'pipeline-error-inflection-ai-400-bad-request-validation-failed' | 'pipeline-error-inflection-ai-401-unauthorized' | 'pipeline-error-inflection-ai-403-model-access-denied' | 'pipeline-error-inflection-ai-429-exceeded-quota' | 'pipeline-error-inflection-ai-500-server-error' | 'pipeline-error-inflection-ai-503-server-overloaded-error' | 'pipeline-error-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-inflection-ai-401-unauthorized' | 'call.in-progress.error-vapifault-inflection-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-inflection-ai-500-server-error' | 'call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error' | 'pipeline-error-deep-seek-400-bad-request-validation-failed' | 'pipeline-error-deep-seek-401-unauthorized' | 'pipeline-error-deep-seek-403-model-access-denied' | 'pipeline-error-deep-seek-429-exceeded-quota' | 'pipeline-error-deep-seek-500-server-error' | 'pipeline-error-deep-seek-503-server-overloaded-error' | 'pipeline-error-deep-seek-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deep-seek-401-unauthorized' | 'call.in-progress.error-vapifault-deep-seek-403-model-access-denied' | 'call.in-progress.error-vapifault-deep-seek-429-exceeded-quota' | 'call.in-progress.error-providerfault-deep-seek-500-server-error' | 'call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error' | 'pipeline-error-groq-400-bad-request-validation-failed' | 'pipeline-error-groq-401-unauthorized' | 'pipeline-error-groq-403-model-access-denied' | 'pipeline-error-groq-429-exceeded-quota' | 'pipeline-error-groq-500-server-error' | 'pipeline-error-groq-503-server-overloaded-error' | 'pipeline-error-groq-llm-failed' | 'call.in-progress.error-vapifault-groq-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-groq-401-unauthorized' | 'call.in-progress.error-vapifault-groq-403-model-access-denied' | 'call.in-progress.error-vapifault-groq-429-exceeded-quota' | 'call.in-progress.error-providerfault-groq-500-server-error' | 'call.in-progress.error-providerfault-groq-503-server-overloaded-error' | 'pipeline-error-cerebras-400-bad-request-validation-failed' | 'pipeline-error-cerebras-401-unauthorized' | 'pipeline-error-cerebras-403-model-access-denied' | 'pipeline-error-cerebras-429-exceeded-quota' | 'pipeline-error-cerebras-500-server-error' | 'pipeline-error-cerebras-503-server-overloaded-error' | 'pipeline-error-cerebras-llm-failed' | 'call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-cerebras-401-unauthorized' | 'call.in-progress.error-vapifault-cerebras-403-model-access-denied' | 'call.in-progress.error-vapifault-cerebras-429-exceeded-quota' | 'call.in-progress.error-providerfault-cerebras-500-server-error' | 'call.in-progress.error-providerfault-cerebras-503-server-overloaded-error' | 'pipeline-error-anthropic-400-bad-request-validation-failed' | 'pipeline-error-anthropic-401-unauthorized' | 'pipeline-error-anthropic-403-model-access-denied' | 'pipeline-error-anthropic-429-exceeded-quota' | 'pipeline-error-anthropic-500-server-error' | 'pipeline-error-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-500-server-error' | 'call.in-progress.error-providerfault-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-400-bad-request-validation-failed' | 'pipeline-error-anthropic-bedrock-401-unauthorized' | 'pipeline-error-anthropic-bedrock-403-model-access-denied' | 'pipeline-error-anthropic-bedrock-429-exceeded-quota' | 'pipeline-error-anthropic-bedrock-500-server-error' | 'pipeline-error-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-bedrock-500-server-error' | 'call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-400-bad-request-validation-failed' | 'pipeline-error-anthropic-vertex-401-unauthorized' | 'pipeline-error-anthropic-vertex-403-model-access-denied' | 'pipeline-error-anthropic-vertex-429-exceeded-quota' | 'pipeline-error-anthropic-vertex-500-server-error' | 'pipeline-error-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-vertex-500-server-error' | 'call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-together-ai-400-bad-request-validation-failed' | 'pipeline-error-together-ai-401-unauthorized' | 'pipeline-error-together-ai-403-model-access-denied' | 'pipeline-error-together-ai-429-exceeded-quota' | 'pipeline-error-together-ai-500-server-error' | 'pipeline-error-together-ai-503-server-overloaded-error' | 'pipeline-error-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-together-ai-401-unauthorized' | 'call.in-progress.error-vapifault-together-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-together-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-together-ai-500-server-error' | 'call.in-progress.error-providerfault-together-ai-503-server-overloaded-error' | 'pipeline-error-anyscale-400-bad-request-validation-failed' | 'pipeline-error-anyscale-401-unauthorized' | 'pipeline-error-anyscale-403-model-access-denied' | 'pipeline-error-anyscale-429-exceeded-quota' | 'pipeline-error-anyscale-500-server-error' | 'pipeline-error-anyscale-503-server-overloaded-error' | 'pipeline-error-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anyscale-401-unauthorized' | 'call.in-progress.error-vapifault-anyscale-403-model-access-denied' | 'call.in-progress.error-vapifault-anyscale-429-exceeded-quota' | 'call.in-progress.error-providerfault-anyscale-500-server-error' | 'call.in-progress.error-providerfault-anyscale-503-server-overloaded-error' | 'pipeline-error-openrouter-400-bad-request-validation-failed' | 'pipeline-error-openrouter-401-unauthorized' | 'pipeline-error-openrouter-403-model-access-denied' | 'pipeline-error-openrouter-429-exceeded-quota' | 'pipeline-error-openrouter-500-server-error' | 'pipeline-error-openrouter-503-server-overloaded-error' | 'pipeline-error-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openrouter-401-unauthorized' | 'call.in-progress.error-vapifault-openrouter-403-model-access-denied' | 'call.in-progress.error-vapifault-openrouter-429-exceeded-quota' | 'call.in-progress.error-providerfault-openrouter-500-server-error' | 'call.in-progress.error-providerfault-openrouter-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-400-bad-request-validation-failed' | 'pipeline-error-perplexity-ai-401-unauthorized' | 'pipeline-error-perplexity-ai-403-model-access-denied' | 'pipeline-error-perplexity-ai-429-exceeded-quota' | 'pipeline-error-perplexity-ai-500-server-error' | 'pipeline-error-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-perplexity-ai-401-unauthorized' | 'call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-perplexity-ai-500-server-error' | 'call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-deepinfra-400-bad-request-validation-failed' | 'pipeline-error-deepinfra-401-unauthorized' | 'pipeline-error-deepinfra-403-model-access-denied' | 'pipeline-error-deepinfra-429-exceeded-quota' | 'pipeline-error-deepinfra-500-server-error' | 'pipeline-error-deepinfra-503-server-overloaded-error' | 'pipeline-error-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deepinfra-401-unauthorized' | 'call.in-progress.error-vapifault-deepinfra-403-model-access-denied' | 'call.in-progress.error-vapifault-deepinfra-429-exceeded-quota' | 'call.in-progress.error-providerfault-deepinfra-500-server-error' | 'call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error' | 'pipeline-error-runpod-400-bad-request-validation-failed' | 'pipeline-error-runpod-401-unauthorized' | 'pipeline-error-runpod-403-model-access-denied' | 'pipeline-error-runpod-429-exceeded-quota' | 'pipeline-error-runpod-500-server-error' | 'pipeline-error-runpod-503-server-overloaded-error' | 'pipeline-error-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-runpod-401-unauthorized' | 'call.in-progress.error-vapifault-runpod-403-model-access-denied' | 'call.in-progress.error-vapifault-runpod-429-exceeded-quota' | 'call.in-progress.error-providerfault-runpod-500-server-error' | 'call.in-progress.error-providerfault-runpod-503-server-overloaded-error' | 'pipeline-error-custom-llm-400-bad-request-validation-failed' | 'pipeline-error-custom-llm-401-unauthorized' | 'pipeline-error-custom-llm-403-model-access-denied' | 'pipeline-error-custom-llm-429-exceeded-quota' | 'pipeline-error-custom-llm-500-server-error' | 'pipeline-error-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-custom-llm-401-unauthorized' | 'call.in-progress.error-vapifault-custom-llm-403-model-access-denied' | 'call.in-progress.error-vapifault-custom-llm-429-exceeded-quota' | 'call.in-progress.error-providerfault-custom-llm-500-server-error' | 'call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-voice-failed' | 'pipeline-error-cartesia-socket-hang-up' | 'pipeline-error-cartesia-requested-payment' | 'pipeline-error-cartesia-500-server-error' | 'pipeline-error-cartesia-503-server-error' | 'pipeline-error-cartesia-522-server-error' | 'call.in-progress.error-vapifault-cartesia-socket-hang-up' | 'call.in-progress.error-vapifault-cartesia-requested-payment' | 'call.in-progress.error-providerfault-cartesia-500-server-error' | 'call.in-progress.error-providerfault-cartesia-503-server-error' | 'call.in-progress.error-providerfault-cartesia-522-server-error' | 'pipeline-error-eleven-labs-voice-not-found' | 'pipeline-error-eleven-labs-quota-exceeded' | 'pipeline-error-eleven-labs-unauthorized-access' | 'pipeline-error-eleven-labs-unauthorized-to-access-model' | 'pipeline-error-eleven-labs-professional-voices-only-for-creator-plus' | 'pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'pipeline-error-eleven-labs-system-busy-and-requested-upgrade' | 'pipeline-error-eleven-labs-voice-not-fine-tuned' | 'pipeline-error-eleven-labs-invalid-api-key' | 'pipeline-error-eleven-labs-invalid-voice-samples' | 'pipeline-error-eleven-labs-voice-disabled-by-owner' | 'pipeline-error-eleven-labs-blocked-account-in-probation' | 'pipeline-error-eleven-labs-blocked-content-against-their-policy' | 'pipeline-error-eleven-labs-missing-samples-for-voice-clone' | 'pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'pipeline-error-eleven-labs-voice-not-allowed-for-free-users' | 'pipeline-error-eleven-labs-max-character-limit-exceeded' | 'pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'pipeline-error-eleven-labs-500-server-error' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-found' | 'call.in-progress.error-vapifault-eleven-labs-quota-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-access' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model' | 'call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus' | 'call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned' | 'call.in-progress.error-vapifault-eleven-labs-invalid-api-key' | 'call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples' | 'call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner' | 'call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation' | 'call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy' | 'call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users' | 'call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'call.in-progress.error-providerfault-eleven-labs-500-server-error' | 'pipeline-error-playht-request-timed-out' | 'pipeline-error-playht-invalid-voice' | 'pipeline-error-playht-unexpected-error' | 'pipeline-error-playht-out-of-credits' | 'pipeline-error-playht-invalid-emotion' | 'pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri' | 'pipeline-error-playht-401-unauthorized' | 'pipeline-error-playht-403-forbidden-out-of-characters' | 'pipeline-error-playht-403-forbidden-api-access-not-available' | 'pipeline-error-playht-429-exceeded-quota' | 'pipeline-error-playht-502-gateway-error' | 'pipeline-error-playht-504-gateway-error' | 'call.in-progress.error-vapifault-playht-request-timed-out' | 'call.in-progress.error-vapifault-playht-invalid-voice' | 'call.in-progress.error-vapifault-playht-unexpected-error' | 'call.in-progress.error-vapifault-playht-out-of-credits' | 'call.in-progress.error-vapifault-playht-invalid-emotion' | 'call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri' | 'call.in-progress.error-vapifault-playht-401-unauthorized' | 'call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters' | 'call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available' | 'call.in-progress.error-vapifault-playht-429-exceeded-quota' | 'call.in-progress.error-providerfault-playht-502-gateway-error' | 'call.in-progress.error-providerfault-playht-504-gateway-error' | 'pipeline-error-custom-transcriber-failed' | 'call.in-progress.error-vapifault-custom-transcriber-failed' | 'pipeline-error-eleven-labs-transcriber-failed' | 'call.in-progress.error-vapifault-eleven-labs-transcriber-failed' | 'pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination' | 'pipeline-error-deepgram-returning-401-invalid-credentials' | 'pipeline-error-deepgram-returning-403-model-access-denied' | 'pipeline-error-deepgram-returning-404-not-found' | 'pipeline-error-deepgram-returning-500-invalid-json' | 'pipeline-error-deepgram-returning-502-network-error' | 'pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach' | 'call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination' | 'call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-deepgram-returning-404-not-found' | 'call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied' | 'call.in-progress.error-providerfault-deepgram-returning-500-invalid-json' | 'call.in-progress.error-providerfault-deepgram-returning-502-network-error' | 'call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach' | 'pipeline-error-google-transcriber-failed' | 'call.in-progress.error-vapifault-google-transcriber-failed' | 'pipeline-error-openai-transcriber-failed' | 'call.in-progress.error-vapifault-openai-transcriber-failed' | 'assistant-ended-call' | 'assistant-said-end-call-phrase' | 'assistant-ended-call-with-hangup-task' | 'assistant-ended-call-after-message-spoken' | 'assistant-forwarded-call' | 'assistant-join-timed-out' | 'call.in-progress.error-assistant-did-not-receive-customer-audio' | 'customer-busy' | 'customer-ended-call' | 'customer-did-not-answer' | 'customer-did-not-give-microphone-permission' | 'exceeded-max-duration' | 'manually-canceled' | 'phone-call-provider-closed-websocket' | 'silence-timed-out' | 'call.in-progress.error-sip-telephony-provider-failed-to-connect-call' | 'call.ringing.hook-executed-say' | 'call.ringing.hook-executed-transfer' | 'twilio-failed-to-connect-call' | 'twilio-reported-customer-misdialed' | 'vonage-rejected' | 'voicemail';
13794
+ endedReason: 'call-start-error-neither-assistant-nor-server-set' | 'assistant-request-failed' | 'assistant-request-returned-error' | 'assistant-request-returned-unspeakable-error' | 'assistant-request-returned-invalid-assistant' | 'assistant-request-returned-no-assistant' | 'assistant-request-returned-forwarding-phone-number' | 'call.start.error-get-org' | 'call.start.error-get-subscription' | 'call.start.error-get-assistant' | 'call.start.error-get-phone-number' | 'call.start.error-get-customer' | 'call.start.error-get-resources-validation' | 'call.start.error-vapi-number-international' | 'call.start.error-vapi-number-outbound-daily-limit' | 'call.start.error-get-transport' | 'assistant-not-valid' | 'database-error' | 'assistant-not-found' | 'pipeline-error-openai-voice-failed' | 'pipeline-error-cartesia-voice-failed' | 'pipeline-error-deepgram-voice-failed' | 'pipeline-error-eleven-labs-voice-failed' | 'pipeline-error-playht-voice-failed' | 'pipeline-error-lmnt-voice-failed' | 'pipeline-error-azure-voice-failed' | 'pipeline-error-rime-ai-voice-failed' | 'pipeline-error-smallest-ai-voice-failed' | 'pipeline-error-neuphonic-voice-failed' | 'pipeline-error-hume-voice-failed' | 'pipeline-error-sesame-voice-failed' | 'pipeline-error-tavus-video-failed' | 'call.in-progress.error-vapifault-openai-voice-failed' | 'call.in-progress.error-vapifault-cartesia-voice-failed' | 'call.in-progress.error-vapifault-deepgram-voice-failed' | 'call.in-progress.error-vapifault-eleven-labs-voice-failed' | 'call.in-progress.error-vapifault-playht-voice-failed' | 'call.in-progress.error-vapifault-lmnt-voice-failed' | 'call.in-progress.error-vapifault-azure-voice-failed' | 'call.in-progress.error-vapifault-rime-ai-voice-failed' | 'call.in-progress.error-vapifault-smallest-ai-voice-failed' | 'call.in-progress.error-vapifault-neuphonic-voice-failed' | 'call.in-progress.error-vapifault-hume-voice-failed' | 'call.in-progress.error-vapifault-sesame-voice-failed' | 'call.in-progress.error-vapifault-tavus-video-failed' | 'pipeline-error-vapi-llm-failed' | 'pipeline-error-vapi-400-bad-request-validation-failed' | 'pipeline-error-vapi-401-unauthorized' | 'pipeline-error-vapi-403-model-access-denied' | 'pipeline-error-vapi-429-exceeded-quota' | 'pipeline-error-vapi-500-server-error' | 'pipeline-error-vapi-503-server-overloaded-error' | 'call.in-progress.error-vapifault-vapi-llm-failed' | 'call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-vapi-401-unauthorized' | 'call.in-progress.error-vapifault-vapi-403-model-access-denied' | 'call.in-progress.error-vapifault-vapi-429-exceeded-quota' | 'call.in-progress.error-providerfault-vapi-500-server-error' | 'call.in-progress.error-providerfault-vapi-503-server-overloaded-error' | 'pipeline-error-deepgram-transcriber-failed' | 'call.in-progress.error-vapifault-deepgram-transcriber-failed' | 'pipeline-error-gladia-transcriber-failed' | 'call.in-progress.error-vapifault-gladia-transcriber-failed' | 'pipeline-error-speechmatics-transcriber-failed' | 'call.in-progress.error-vapifault-speechmatics-transcriber-failed' | 'pipeline-error-assembly-ai-transcriber-failed' | 'pipeline-error-assembly-ai-returning-400-insufficent-funds' | 'pipeline-error-assembly-ai-returning-400-paid-only-feature' | 'pipeline-error-assembly-ai-returning-401-invalid-credentials' | 'pipeline-error-assembly-ai-returning-500-invalid-schema' | 'pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed' | 'call.in-progress.error-vapifault-assembly-ai-transcriber-failed' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature' | 'call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed' | 'pipeline-error-talkscriber-transcriber-failed' | 'call.in-progress.error-vapifault-talkscriber-transcriber-failed' | 'pipeline-error-azure-speech-transcriber-failed' | 'call.in-progress.error-vapifault-azure-speech-transcriber-failed' | 'call.in-progress.error-pipeline-no-available-llm-model' | 'worker-shutdown' | 'unknown-error' | 'vonage-disconnected' | 'vonage-failed-to-connect-call' | 'vonage-completed' | 'phone-call-provider-bypass-enabled-but-no-call-received' | 'call.in-progress.error-providerfault-transport-never-connected' | 'call.in-progress.error-vapifault-worker-not-available' | 'call.in-progress.error-vapifault-transport-never-connected' | 'call.in-progress.error-vapifault-transport-connected-but-call-not-active' | 'call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing' | 'call.in-progress.error-vapifault-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-groq-llm-failed' | 'call.in-progress.error-vapifault-google-llm-failed' | 'call.in-progress.error-vapifault-xai-llm-failed' | 'call.in-progress.error-vapifault-mistral-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-cerebras-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-llm-failed' | 'pipeline-error-openai-400-bad-request-validation-failed' | 'pipeline-error-openai-401-unauthorized' | 'pipeline-error-openai-401-incorrect-api-key' | 'pipeline-error-openai-401-account-not-in-organization' | 'pipeline-error-openai-403-model-access-denied' | 'pipeline-error-openai-429-exceeded-quota' | 'pipeline-error-openai-429-rate-limit-reached' | 'pipeline-error-openai-500-server-error' | 'pipeline-error-openai-503-server-overloaded-error' | 'pipeline-error-openai-llm-failed' | 'call.in-progress.error-vapifault-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openai-401-unauthorized' | 'call.in-progress.error-vapifault-openai-401-incorrect-api-key' | 'call.in-progress.error-vapifault-openai-401-account-not-in-organization' | 'call.in-progress.error-vapifault-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-openai-429-exceeded-quota' | 'call.in-progress.error-vapifault-openai-429-rate-limit-reached' | 'call.in-progress.error-providerfault-openai-500-server-error' | 'call.in-progress.error-providerfault-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-400-bad-request-validation-failed' | 'pipeline-error-azure-openai-401-unauthorized' | 'pipeline-error-azure-openai-403-model-access-denied' | 'pipeline-error-azure-openai-429-exceeded-quota' | 'pipeline-error-azure-openai-500-server-error' | 'pipeline-error-azure-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-azure-openai-401-unauthorized' | 'call.in-progress.error-vapifault-azure-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-azure-openai-429-exceeded-quota' | 'call.in-progress.error-providerfault-azure-openai-500-server-error' | 'call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error' | 'pipeline-error-google-400-bad-request-validation-failed' | 'pipeline-error-google-401-unauthorized' | 'pipeline-error-google-403-model-access-denied' | 'pipeline-error-google-429-exceeded-quota' | 'pipeline-error-google-500-server-error' | 'pipeline-error-google-503-server-overloaded-error' | 'pipeline-error-google-llm-failed' | 'call.in-progress.error-vapifault-google-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-google-401-unauthorized' | 'call.in-progress.error-vapifault-google-403-model-access-denied' | 'call.in-progress.error-vapifault-google-429-exceeded-quota' | 'call.in-progress.error-providerfault-google-500-server-error' | 'call.in-progress.error-providerfault-google-503-server-overloaded-error' | 'pipeline-error-xai-400-bad-request-validation-failed' | 'pipeline-error-xai-401-unauthorized' | 'pipeline-error-xai-403-model-access-denied' | 'pipeline-error-xai-429-exceeded-quota' | 'pipeline-error-xai-500-server-error' | 'pipeline-error-xai-503-server-overloaded-error' | 'pipeline-error-xai-llm-failed' | 'call.in-progress.error-vapifault-xai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-xai-401-unauthorized' | 'call.in-progress.error-vapifault-xai-403-model-access-denied' | 'call.in-progress.error-vapifault-xai-429-exceeded-quota' | 'call.in-progress.error-providerfault-xai-500-server-error' | 'call.in-progress.error-providerfault-xai-503-server-overloaded-error' | 'pipeline-error-mistral-400-bad-request-validation-failed' | 'pipeline-error-mistral-401-unauthorized' | 'pipeline-error-mistral-403-model-access-denied' | 'pipeline-error-mistral-429-exceeded-quota' | 'pipeline-error-mistral-500-server-error' | 'pipeline-error-mistral-503-server-overloaded-error' | 'pipeline-error-mistral-llm-failed' | 'call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-mistral-401-unauthorized' | 'call.in-progress.error-vapifault-mistral-403-model-access-denied' | 'call.in-progress.error-vapifault-mistral-429-exceeded-quota' | 'call.in-progress.error-providerfault-mistral-500-server-error' | 'call.in-progress.error-providerfault-mistral-503-server-overloaded-error' | 'pipeline-error-inflection-ai-400-bad-request-validation-failed' | 'pipeline-error-inflection-ai-401-unauthorized' | 'pipeline-error-inflection-ai-403-model-access-denied' | 'pipeline-error-inflection-ai-429-exceeded-quota' | 'pipeline-error-inflection-ai-500-server-error' | 'pipeline-error-inflection-ai-503-server-overloaded-error' | 'pipeline-error-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-inflection-ai-401-unauthorized' | 'call.in-progress.error-vapifault-inflection-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-inflection-ai-500-server-error' | 'call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error' | 'pipeline-error-deep-seek-400-bad-request-validation-failed' | 'pipeline-error-deep-seek-401-unauthorized' | 'pipeline-error-deep-seek-403-model-access-denied' | 'pipeline-error-deep-seek-429-exceeded-quota' | 'pipeline-error-deep-seek-500-server-error' | 'pipeline-error-deep-seek-503-server-overloaded-error' | 'pipeline-error-deep-seek-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deep-seek-401-unauthorized' | 'call.in-progress.error-vapifault-deep-seek-403-model-access-denied' | 'call.in-progress.error-vapifault-deep-seek-429-exceeded-quota' | 'call.in-progress.error-providerfault-deep-seek-500-server-error' | 'call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error' | 'pipeline-error-groq-400-bad-request-validation-failed' | 'pipeline-error-groq-401-unauthorized' | 'pipeline-error-groq-403-model-access-denied' | 'pipeline-error-groq-429-exceeded-quota' | 'pipeline-error-groq-500-server-error' | 'pipeline-error-groq-503-server-overloaded-error' | 'pipeline-error-groq-llm-failed' | 'call.in-progress.error-vapifault-groq-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-groq-401-unauthorized' | 'call.in-progress.error-vapifault-groq-403-model-access-denied' | 'call.in-progress.error-vapifault-groq-429-exceeded-quota' | 'call.in-progress.error-providerfault-groq-500-server-error' | 'call.in-progress.error-providerfault-groq-503-server-overloaded-error' | 'pipeline-error-cerebras-400-bad-request-validation-failed' | 'pipeline-error-cerebras-401-unauthorized' | 'pipeline-error-cerebras-403-model-access-denied' | 'pipeline-error-cerebras-429-exceeded-quota' | 'pipeline-error-cerebras-500-server-error' | 'pipeline-error-cerebras-503-server-overloaded-error' | 'pipeline-error-cerebras-llm-failed' | 'call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-cerebras-401-unauthorized' | 'call.in-progress.error-vapifault-cerebras-403-model-access-denied' | 'call.in-progress.error-vapifault-cerebras-429-exceeded-quota' | 'call.in-progress.error-providerfault-cerebras-500-server-error' | 'call.in-progress.error-providerfault-cerebras-503-server-overloaded-error' | 'pipeline-error-anthropic-400-bad-request-validation-failed' | 'pipeline-error-anthropic-401-unauthorized' | 'pipeline-error-anthropic-403-model-access-denied' | 'pipeline-error-anthropic-429-exceeded-quota' | 'pipeline-error-anthropic-500-server-error' | 'pipeline-error-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-500-server-error' | 'call.in-progress.error-providerfault-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-400-bad-request-validation-failed' | 'pipeline-error-anthropic-bedrock-401-unauthorized' | 'pipeline-error-anthropic-bedrock-403-model-access-denied' | 'pipeline-error-anthropic-bedrock-429-exceeded-quota' | 'pipeline-error-anthropic-bedrock-500-server-error' | 'pipeline-error-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-bedrock-500-server-error' | 'call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-400-bad-request-validation-failed' | 'pipeline-error-anthropic-vertex-401-unauthorized' | 'pipeline-error-anthropic-vertex-403-model-access-denied' | 'pipeline-error-anthropic-vertex-429-exceeded-quota' | 'pipeline-error-anthropic-vertex-500-server-error' | 'pipeline-error-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-vertex-500-server-error' | 'call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-together-ai-400-bad-request-validation-failed' | 'pipeline-error-together-ai-401-unauthorized' | 'pipeline-error-together-ai-403-model-access-denied' | 'pipeline-error-together-ai-429-exceeded-quota' | 'pipeline-error-together-ai-500-server-error' | 'pipeline-error-together-ai-503-server-overloaded-error' | 'pipeline-error-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-together-ai-401-unauthorized' | 'call.in-progress.error-vapifault-together-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-together-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-together-ai-500-server-error' | 'call.in-progress.error-providerfault-together-ai-503-server-overloaded-error' | 'pipeline-error-anyscale-400-bad-request-validation-failed' | 'pipeline-error-anyscale-401-unauthorized' | 'pipeline-error-anyscale-403-model-access-denied' | 'pipeline-error-anyscale-429-exceeded-quota' | 'pipeline-error-anyscale-500-server-error' | 'pipeline-error-anyscale-503-server-overloaded-error' | 'pipeline-error-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anyscale-401-unauthorized' | 'call.in-progress.error-vapifault-anyscale-403-model-access-denied' | 'call.in-progress.error-vapifault-anyscale-429-exceeded-quota' | 'call.in-progress.error-providerfault-anyscale-500-server-error' | 'call.in-progress.error-providerfault-anyscale-503-server-overloaded-error' | 'pipeline-error-openrouter-400-bad-request-validation-failed' | 'pipeline-error-openrouter-401-unauthorized' | 'pipeline-error-openrouter-403-model-access-denied' | 'pipeline-error-openrouter-429-exceeded-quota' | 'pipeline-error-openrouter-500-server-error' | 'pipeline-error-openrouter-503-server-overloaded-error' | 'pipeline-error-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openrouter-401-unauthorized' | 'call.in-progress.error-vapifault-openrouter-403-model-access-denied' | 'call.in-progress.error-vapifault-openrouter-429-exceeded-quota' | 'call.in-progress.error-providerfault-openrouter-500-server-error' | 'call.in-progress.error-providerfault-openrouter-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-400-bad-request-validation-failed' | 'pipeline-error-perplexity-ai-401-unauthorized' | 'pipeline-error-perplexity-ai-403-model-access-denied' | 'pipeline-error-perplexity-ai-429-exceeded-quota' | 'pipeline-error-perplexity-ai-500-server-error' | 'pipeline-error-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-perplexity-ai-401-unauthorized' | 'call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-perplexity-ai-500-server-error' | 'call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-deepinfra-400-bad-request-validation-failed' | 'pipeline-error-deepinfra-401-unauthorized' | 'pipeline-error-deepinfra-403-model-access-denied' | 'pipeline-error-deepinfra-429-exceeded-quota' | 'pipeline-error-deepinfra-500-server-error' | 'pipeline-error-deepinfra-503-server-overloaded-error' | 'pipeline-error-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deepinfra-401-unauthorized' | 'call.in-progress.error-vapifault-deepinfra-403-model-access-denied' | 'call.in-progress.error-vapifault-deepinfra-429-exceeded-quota' | 'call.in-progress.error-providerfault-deepinfra-500-server-error' | 'call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error' | 'pipeline-error-runpod-400-bad-request-validation-failed' | 'pipeline-error-runpod-401-unauthorized' | 'pipeline-error-runpod-403-model-access-denied' | 'pipeline-error-runpod-429-exceeded-quota' | 'pipeline-error-runpod-500-server-error' | 'pipeline-error-runpod-503-server-overloaded-error' | 'pipeline-error-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-runpod-401-unauthorized' | 'call.in-progress.error-vapifault-runpod-403-model-access-denied' | 'call.in-progress.error-vapifault-runpod-429-exceeded-quota' | 'call.in-progress.error-providerfault-runpod-500-server-error' | 'call.in-progress.error-providerfault-runpod-503-server-overloaded-error' | 'pipeline-error-custom-llm-400-bad-request-validation-failed' | 'pipeline-error-custom-llm-401-unauthorized' | 'pipeline-error-custom-llm-403-model-access-denied' | 'pipeline-error-custom-llm-429-exceeded-quota' | 'pipeline-error-custom-llm-500-server-error' | 'pipeline-error-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-custom-llm-401-unauthorized' | 'call.in-progress.error-vapifault-custom-llm-403-model-access-denied' | 'call.in-progress.error-vapifault-custom-llm-429-exceeded-quota' | 'call.in-progress.error-providerfault-custom-llm-500-server-error' | 'call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-voice-failed' | 'pipeline-error-cartesia-socket-hang-up' | 'pipeline-error-cartesia-requested-payment' | 'pipeline-error-cartesia-500-server-error' | 'pipeline-error-cartesia-503-server-error' | 'pipeline-error-cartesia-522-server-error' | 'call.in-progress.error-vapifault-cartesia-socket-hang-up' | 'call.in-progress.error-vapifault-cartesia-requested-payment' | 'call.in-progress.error-providerfault-cartesia-500-server-error' | 'call.in-progress.error-providerfault-cartesia-503-server-error' | 'call.in-progress.error-providerfault-cartesia-522-server-error' | 'pipeline-error-eleven-labs-voice-not-found' | 'pipeline-error-eleven-labs-quota-exceeded' | 'pipeline-error-eleven-labs-unauthorized-access' | 'pipeline-error-eleven-labs-unauthorized-to-access-model' | 'pipeline-error-eleven-labs-professional-voices-only-for-creator-plus' | 'pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'pipeline-error-eleven-labs-system-busy-and-requested-upgrade' | 'pipeline-error-eleven-labs-voice-not-fine-tuned' | 'pipeline-error-eleven-labs-invalid-api-key' | 'pipeline-error-eleven-labs-invalid-voice-samples' | 'pipeline-error-eleven-labs-voice-disabled-by-owner' | 'pipeline-error-eleven-labs-blocked-account-in-probation' | 'pipeline-error-eleven-labs-blocked-content-against-their-policy' | 'pipeline-error-eleven-labs-missing-samples-for-voice-clone' | 'pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'pipeline-error-eleven-labs-voice-not-allowed-for-free-users' | 'pipeline-error-eleven-labs-max-character-limit-exceeded' | 'pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'pipeline-error-eleven-labs-500-server-error' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-found' | 'call.in-progress.error-vapifault-eleven-labs-quota-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-access' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model' | 'call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus' | 'call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned' | 'call.in-progress.error-vapifault-eleven-labs-invalid-api-key' | 'call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples' | 'call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner' | 'call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation' | 'call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy' | 'call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users' | 'call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'call.in-progress.error-providerfault-eleven-labs-500-server-error' | 'pipeline-error-playht-request-timed-out' | 'pipeline-error-playht-invalid-voice' | 'pipeline-error-playht-unexpected-error' | 'pipeline-error-playht-out-of-credits' | 'pipeline-error-playht-invalid-emotion' | 'pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri' | 'pipeline-error-playht-401-unauthorized' | 'pipeline-error-playht-403-forbidden-out-of-characters' | 'pipeline-error-playht-403-forbidden-api-access-not-available' | 'pipeline-error-playht-429-exceeded-quota' | 'pipeline-error-playht-502-gateway-error' | 'pipeline-error-playht-504-gateway-error' | 'call.in-progress.error-vapifault-playht-request-timed-out' | 'call.in-progress.error-vapifault-playht-invalid-voice' | 'call.in-progress.error-vapifault-playht-unexpected-error' | 'call.in-progress.error-vapifault-playht-out-of-credits' | 'call.in-progress.error-vapifault-playht-invalid-emotion' | 'call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri' | 'call.in-progress.error-vapifault-playht-401-unauthorized' | 'call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters' | 'call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available' | 'call.in-progress.error-vapifault-playht-429-exceeded-quota' | 'call.in-progress.error-providerfault-playht-502-gateway-error' | 'call.in-progress.error-providerfault-playht-504-gateway-error' | 'pipeline-error-custom-transcriber-failed' | 'call.in-progress.error-vapifault-custom-transcriber-failed' | 'pipeline-error-eleven-labs-transcriber-failed' | 'call.in-progress.error-vapifault-eleven-labs-transcriber-failed' | 'pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination' | 'pipeline-error-deepgram-returning-401-invalid-credentials' | 'pipeline-error-deepgram-returning-403-model-access-denied' | 'pipeline-error-deepgram-returning-404-not-found' | 'pipeline-error-deepgram-returning-500-invalid-json' | 'pipeline-error-deepgram-returning-502-network-error' | 'pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach' | 'call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination' | 'call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-deepgram-returning-404-not-found' | 'call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied' | 'call.in-progress.error-providerfault-deepgram-returning-500-invalid-json' | 'call.in-progress.error-providerfault-deepgram-returning-502-network-error' | 'call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach' | 'pipeline-error-google-transcriber-failed' | 'call.in-progress.error-vapifault-google-transcriber-failed' | 'pipeline-error-openai-transcriber-failed' | 'call.in-progress.error-vapifault-openai-transcriber-failed' | 'assistant-ended-call' | 'assistant-said-end-call-phrase' | 'assistant-ended-call-with-hangup-task' | 'assistant-ended-call-after-message-spoken' | 'assistant-forwarded-call' | 'assistant-join-timed-out' | 'call.in-progress.error-assistant-did-not-receive-customer-audio' | 'customer-busy' | 'customer-ended-call' | 'customer-did-not-answer' | 'customer-did-not-give-microphone-permission' | 'exceeded-max-duration' | 'manually-canceled' | 'phone-call-provider-closed-websocket' | 'call.forwarding.operator-busy' | 'silence-timed-out' | 'call.in-progress.error-sip-telephony-provider-failed-to-connect-call' | 'call.ringing.hook-executed-say' | 'call.ringing.hook-executed-transfer' | 'twilio-failed-to-connect-call' | 'twilio-reported-customer-misdialed' | 'vonage-rejected' | 'voicemail';
13399
13795
  /** This is the cost of the call in USD. This can also be found at `call.cost` on GET /call/:id. */
13400
13796
  cost?: number;
13401
13797
  /** These are the costs of individual components of the call in USD. This can also be found at `call.costs` on GET /call/:id. */
@@ -13725,7 +14121,7 @@ export interface ServerMessageStatusUpdate {
13725
14121
  /** This is the status of the call. */
13726
14122
  status: 'scheduled' | 'queued' | 'ringing' | 'in-progress' | 'forwarding' | 'ended';
13727
14123
  /** This is the reason the call ended. This is only sent if the status is "ended". */
13728
- endedReason?: 'call-start-error-neither-assistant-nor-server-set' | 'assistant-request-failed' | 'assistant-request-returned-error' | 'assistant-request-returned-unspeakable-error' | 'assistant-request-returned-invalid-assistant' | 'assistant-request-returned-no-assistant' | 'assistant-request-returned-forwarding-phone-number' | 'call.start.error-get-org' | 'call.start.error-get-subscription' | 'call.start.error-get-assistant' | 'call.start.error-get-phone-number' | 'call.start.error-get-customer' | 'call.start.error-get-resources-validation' | 'call.start.error-vapi-number-international' | 'call.start.error-vapi-number-outbound-daily-limit' | 'call.start.error-get-transport' | 'assistant-not-valid' | 'database-error' | 'assistant-not-found' | 'pipeline-error-openai-voice-failed' | 'pipeline-error-cartesia-voice-failed' | 'pipeline-error-deepgram-voice-failed' | 'pipeline-error-eleven-labs-voice-failed' | 'pipeline-error-playht-voice-failed' | 'pipeline-error-lmnt-voice-failed' | 'pipeline-error-azure-voice-failed' | 'pipeline-error-rime-ai-voice-failed' | 'pipeline-error-smallest-ai-voice-failed' | 'pipeline-error-neuphonic-voice-failed' | 'pipeline-error-hume-voice-failed' | 'pipeline-error-sesame-voice-failed' | 'pipeline-error-tavus-video-failed' | 'call.in-progress.error-vapifault-openai-voice-failed' | 'call.in-progress.error-vapifault-cartesia-voice-failed' | 'call.in-progress.error-vapifault-deepgram-voice-failed' | 'call.in-progress.error-vapifault-eleven-labs-voice-failed' | 'call.in-progress.error-vapifault-playht-voice-failed' | 'call.in-progress.error-vapifault-lmnt-voice-failed' | 'call.in-progress.error-vapifault-azure-voice-failed' | 'call.in-progress.error-vapifault-rime-ai-voice-failed' | 'call.in-progress.error-vapifault-smallest-ai-voice-failed' | 'call.in-progress.error-vapifault-neuphonic-voice-failed' | 'call.in-progress.error-vapifault-hume-voice-failed' | 'call.in-progress.error-vapifault-sesame-voice-failed' | 'call.in-progress.error-vapifault-tavus-video-failed' | 'pipeline-error-vapi-llm-failed' | 'pipeline-error-vapi-400-bad-request-validation-failed' | 'pipeline-error-vapi-401-unauthorized' | 'pipeline-error-vapi-403-model-access-denied' | 'pipeline-error-vapi-429-exceeded-quota' | 'pipeline-error-vapi-500-server-error' | 'pipeline-error-vapi-503-server-overloaded-error' | 'call.in-progress.error-vapifault-vapi-llm-failed' | 'call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-vapi-401-unauthorized' | 'call.in-progress.error-vapifault-vapi-403-model-access-denied' | 'call.in-progress.error-vapifault-vapi-429-exceeded-quota' | 'call.in-progress.error-providerfault-vapi-500-server-error' | 'call.in-progress.error-providerfault-vapi-503-server-overloaded-error' | 'pipeline-error-deepgram-transcriber-failed' | 'call.in-progress.error-vapifault-deepgram-transcriber-failed' | 'pipeline-error-gladia-transcriber-failed' | 'call.in-progress.error-vapifault-gladia-transcriber-failed' | 'pipeline-error-speechmatics-transcriber-failed' | 'call.in-progress.error-vapifault-speechmatics-transcriber-failed' | 'pipeline-error-assembly-ai-transcriber-failed' | 'pipeline-error-assembly-ai-returning-400-insufficent-funds' | 'pipeline-error-assembly-ai-returning-400-paid-only-feature' | 'pipeline-error-assembly-ai-returning-401-invalid-credentials' | 'pipeline-error-assembly-ai-returning-500-invalid-schema' | 'pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed' | 'call.in-progress.error-vapifault-assembly-ai-transcriber-failed' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature' | 'call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed' | 'pipeline-error-talkscriber-transcriber-failed' | 'call.in-progress.error-vapifault-talkscriber-transcriber-failed' | 'pipeline-error-azure-speech-transcriber-failed' | 'call.in-progress.error-vapifault-azure-speech-transcriber-failed' | 'call.in-progress.error-pipeline-no-available-llm-model' | 'worker-shutdown' | 'unknown-error' | 'vonage-disconnected' | 'vonage-failed-to-connect-call' | 'vonage-completed' | 'phone-call-provider-bypass-enabled-but-no-call-received' | 'call.in-progress.error-vapifault-transport-never-connected' | 'call.in-progress.error-vapifault-transport-connected-but-call-not-active' | 'call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing' | 'call.in-progress.error-vapifault-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-groq-llm-failed' | 'call.in-progress.error-vapifault-google-llm-failed' | 'call.in-progress.error-vapifault-xai-llm-failed' | 'call.in-progress.error-vapifault-mistral-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-cerebras-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-llm-failed' | 'pipeline-error-openai-400-bad-request-validation-failed' | 'pipeline-error-openai-401-unauthorized' | 'pipeline-error-openai-401-incorrect-api-key' | 'pipeline-error-openai-401-account-not-in-organization' | 'pipeline-error-openai-403-model-access-denied' | 'pipeline-error-openai-429-exceeded-quota' | 'pipeline-error-openai-429-rate-limit-reached' | 'pipeline-error-openai-500-server-error' | 'pipeline-error-openai-503-server-overloaded-error' | 'pipeline-error-openai-llm-failed' | 'call.in-progress.error-vapifault-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openai-401-unauthorized' | 'call.in-progress.error-vapifault-openai-401-incorrect-api-key' | 'call.in-progress.error-vapifault-openai-401-account-not-in-organization' | 'call.in-progress.error-vapifault-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-openai-429-exceeded-quota' | 'call.in-progress.error-vapifault-openai-429-rate-limit-reached' | 'call.in-progress.error-providerfault-openai-500-server-error' | 'call.in-progress.error-providerfault-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-400-bad-request-validation-failed' | 'pipeline-error-azure-openai-401-unauthorized' | 'pipeline-error-azure-openai-403-model-access-denied' | 'pipeline-error-azure-openai-429-exceeded-quota' | 'pipeline-error-azure-openai-500-server-error' | 'pipeline-error-azure-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-azure-openai-401-unauthorized' | 'call.in-progress.error-vapifault-azure-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-azure-openai-429-exceeded-quota' | 'call.in-progress.error-providerfault-azure-openai-500-server-error' | 'call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error' | 'pipeline-error-google-400-bad-request-validation-failed' | 'pipeline-error-google-401-unauthorized' | 'pipeline-error-google-403-model-access-denied' | 'pipeline-error-google-429-exceeded-quota' | 'pipeline-error-google-500-server-error' | 'pipeline-error-google-503-server-overloaded-error' | 'pipeline-error-google-llm-failed' | 'call.in-progress.error-vapifault-google-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-google-401-unauthorized' | 'call.in-progress.error-vapifault-google-403-model-access-denied' | 'call.in-progress.error-vapifault-google-429-exceeded-quota' | 'call.in-progress.error-providerfault-google-500-server-error' | 'call.in-progress.error-providerfault-google-503-server-overloaded-error' | 'pipeline-error-xai-400-bad-request-validation-failed' | 'pipeline-error-xai-401-unauthorized' | 'pipeline-error-xai-403-model-access-denied' | 'pipeline-error-xai-429-exceeded-quota' | 'pipeline-error-xai-500-server-error' | 'pipeline-error-xai-503-server-overloaded-error' | 'pipeline-error-xai-llm-failed' | 'call.in-progress.error-vapifault-xai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-xai-401-unauthorized' | 'call.in-progress.error-vapifault-xai-403-model-access-denied' | 'call.in-progress.error-vapifault-xai-429-exceeded-quota' | 'call.in-progress.error-providerfault-xai-500-server-error' | 'call.in-progress.error-providerfault-xai-503-server-overloaded-error' | 'pipeline-error-mistral-400-bad-request-validation-failed' | 'pipeline-error-mistral-401-unauthorized' | 'pipeline-error-mistral-403-model-access-denied' | 'pipeline-error-mistral-429-exceeded-quota' | 'pipeline-error-mistral-500-server-error' | 'pipeline-error-mistral-503-server-overloaded-error' | 'pipeline-error-mistral-llm-failed' | 'call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-mistral-401-unauthorized' | 'call.in-progress.error-vapifault-mistral-403-model-access-denied' | 'call.in-progress.error-vapifault-mistral-429-exceeded-quota' | 'call.in-progress.error-providerfault-mistral-500-server-error' | 'call.in-progress.error-providerfault-mistral-503-server-overloaded-error' | 'pipeline-error-inflection-ai-400-bad-request-validation-failed' | 'pipeline-error-inflection-ai-401-unauthorized' | 'pipeline-error-inflection-ai-403-model-access-denied' | 'pipeline-error-inflection-ai-429-exceeded-quota' | 'pipeline-error-inflection-ai-500-server-error' | 'pipeline-error-inflection-ai-503-server-overloaded-error' | 'pipeline-error-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-inflection-ai-401-unauthorized' | 'call.in-progress.error-vapifault-inflection-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-inflection-ai-500-server-error' | 'call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error' | 'pipeline-error-deep-seek-400-bad-request-validation-failed' | 'pipeline-error-deep-seek-401-unauthorized' | 'pipeline-error-deep-seek-403-model-access-denied' | 'pipeline-error-deep-seek-429-exceeded-quota' | 'pipeline-error-deep-seek-500-server-error' | 'pipeline-error-deep-seek-503-server-overloaded-error' | 'pipeline-error-deep-seek-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deep-seek-401-unauthorized' | 'call.in-progress.error-vapifault-deep-seek-403-model-access-denied' | 'call.in-progress.error-vapifault-deep-seek-429-exceeded-quota' | 'call.in-progress.error-providerfault-deep-seek-500-server-error' | 'call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error' | 'pipeline-error-groq-400-bad-request-validation-failed' | 'pipeline-error-groq-401-unauthorized' | 'pipeline-error-groq-403-model-access-denied' | 'pipeline-error-groq-429-exceeded-quota' | 'pipeline-error-groq-500-server-error' | 'pipeline-error-groq-503-server-overloaded-error' | 'pipeline-error-groq-llm-failed' | 'call.in-progress.error-vapifault-groq-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-groq-401-unauthorized' | 'call.in-progress.error-vapifault-groq-403-model-access-denied' | 'call.in-progress.error-vapifault-groq-429-exceeded-quota' | 'call.in-progress.error-providerfault-groq-500-server-error' | 'call.in-progress.error-providerfault-groq-503-server-overloaded-error' | 'pipeline-error-cerebras-400-bad-request-validation-failed' | 'pipeline-error-cerebras-401-unauthorized' | 'pipeline-error-cerebras-403-model-access-denied' | 'pipeline-error-cerebras-429-exceeded-quota' | 'pipeline-error-cerebras-500-server-error' | 'pipeline-error-cerebras-503-server-overloaded-error' | 'pipeline-error-cerebras-llm-failed' | 'call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-cerebras-401-unauthorized' | 'call.in-progress.error-vapifault-cerebras-403-model-access-denied' | 'call.in-progress.error-vapifault-cerebras-429-exceeded-quota' | 'call.in-progress.error-providerfault-cerebras-500-server-error' | 'call.in-progress.error-providerfault-cerebras-503-server-overloaded-error' | 'pipeline-error-anthropic-400-bad-request-validation-failed' | 'pipeline-error-anthropic-401-unauthorized' | 'pipeline-error-anthropic-403-model-access-denied' | 'pipeline-error-anthropic-429-exceeded-quota' | 'pipeline-error-anthropic-500-server-error' | 'pipeline-error-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-500-server-error' | 'call.in-progress.error-providerfault-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-400-bad-request-validation-failed' | 'pipeline-error-anthropic-bedrock-401-unauthorized' | 'pipeline-error-anthropic-bedrock-403-model-access-denied' | 'pipeline-error-anthropic-bedrock-429-exceeded-quota' | 'pipeline-error-anthropic-bedrock-500-server-error' | 'pipeline-error-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-bedrock-500-server-error' | 'call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-400-bad-request-validation-failed' | 'pipeline-error-anthropic-vertex-401-unauthorized' | 'pipeline-error-anthropic-vertex-403-model-access-denied' | 'pipeline-error-anthropic-vertex-429-exceeded-quota' | 'pipeline-error-anthropic-vertex-500-server-error' | 'pipeline-error-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-vertex-500-server-error' | 'call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-together-ai-400-bad-request-validation-failed' | 'pipeline-error-together-ai-401-unauthorized' | 'pipeline-error-together-ai-403-model-access-denied' | 'pipeline-error-together-ai-429-exceeded-quota' | 'pipeline-error-together-ai-500-server-error' | 'pipeline-error-together-ai-503-server-overloaded-error' | 'pipeline-error-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-together-ai-401-unauthorized' | 'call.in-progress.error-vapifault-together-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-together-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-together-ai-500-server-error' | 'call.in-progress.error-providerfault-together-ai-503-server-overloaded-error' | 'pipeline-error-anyscale-400-bad-request-validation-failed' | 'pipeline-error-anyscale-401-unauthorized' | 'pipeline-error-anyscale-403-model-access-denied' | 'pipeline-error-anyscale-429-exceeded-quota' | 'pipeline-error-anyscale-500-server-error' | 'pipeline-error-anyscale-503-server-overloaded-error' | 'pipeline-error-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anyscale-401-unauthorized' | 'call.in-progress.error-vapifault-anyscale-403-model-access-denied' | 'call.in-progress.error-vapifault-anyscale-429-exceeded-quota' | 'call.in-progress.error-providerfault-anyscale-500-server-error' | 'call.in-progress.error-providerfault-anyscale-503-server-overloaded-error' | 'pipeline-error-openrouter-400-bad-request-validation-failed' | 'pipeline-error-openrouter-401-unauthorized' | 'pipeline-error-openrouter-403-model-access-denied' | 'pipeline-error-openrouter-429-exceeded-quota' | 'pipeline-error-openrouter-500-server-error' | 'pipeline-error-openrouter-503-server-overloaded-error' | 'pipeline-error-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openrouter-401-unauthorized' | 'call.in-progress.error-vapifault-openrouter-403-model-access-denied' | 'call.in-progress.error-vapifault-openrouter-429-exceeded-quota' | 'call.in-progress.error-providerfault-openrouter-500-server-error' | 'call.in-progress.error-providerfault-openrouter-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-400-bad-request-validation-failed' | 'pipeline-error-perplexity-ai-401-unauthorized' | 'pipeline-error-perplexity-ai-403-model-access-denied' | 'pipeline-error-perplexity-ai-429-exceeded-quota' | 'pipeline-error-perplexity-ai-500-server-error' | 'pipeline-error-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-perplexity-ai-401-unauthorized' | 'call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-perplexity-ai-500-server-error' | 'call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-deepinfra-400-bad-request-validation-failed' | 'pipeline-error-deepinfra-401-unauthorized' | 'pipeline-error-deepinfra-403-model-access-denied' | 'pipeline-error-deepinfra-429-exceeded-quota' | 'pipeline-error-deepinfra-500-server-error' | 'pipeline-error-deepinfra-503-server-overloaded-error' | 'pipeline-error-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deepinfra-401-unauthorized' | 'call.in-progress.error-vapifault-deepinfra-403-model-access-denied' | 'call.in-progress.error-vapifault-deepinfra-429-exceeded-quota' | 'call.in-progress.error-providerfault-deepinfra-500-server-error' | 'call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error' | 'pipeline-error-runpod-400-bad-request-validation-failed' | 'pipeline-error-runpod-401-unauthorized' | 'pipeline-error-runpod-403-model-access-denied' | 'pipeline-error-runpod-429-exceeded-quota' | 'pipeline-error-runpod-500-server-error' | 'pipeline-error-runpod-503-server-overloaded-error' | 'pipeline-error-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-runpod-401-unauthorized' | 'call.in-progress.error-vapifault-runpod-403-model-access-denied' | 'call.in-progress.error-vapifault-runpod-429-exceeded-quota' | 'call.in-progress.error-providerfault-runpod-500-server-error' | 'call.in-progress.error-providerfault-runpod-503-server-overloaded-error' | 'pipeline-error-custom-llm-400-bad-request-validation-failed' | 'pipeline-error-custom-llm-401-unauthorized' | 'pipeline-error-custom-llm-403-model-access-denied' | 'pipeline-error-custom-llm-429-exceeded-quota' | 'pipeline-error-custom-llm-500-server-error' | 'pipeline-error-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-custom-llm-401-unauthorized' | 'call.in-progress.error-vapifault-custom-llm-403-model-access-denied' | 'call.in-progress.error-vapifault-custom-llm-429-exceeded-quota' | 'call.in-progress.error-providerfault-custom-llm-500-server-error' | 'call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-voice-failed' | 'pipeline-error-cartesia-socket-hang-up' | 'pipeline-error-cartesia-requested-payment' | 'pipeline-error-cartesia-500-server-error' | 'pipeline-error-cartesia-503-server-error' | 'pipeline-error-cartesia-522-server-error' | 'call.in-progress.error-vapifault-cartesia-socket-hang-up' | 'call.in-progress.error-vapifault-cartesia-requested-payment' | 'call.in-progress.error-providerfault-cartesia-500-server-error' | 'call.in-progress.error-providerfault-cartesia-503-server-error' | 'call.in-progress.error-providerfault-cartesia-522-server-error' | 'pipeline-error-eleven-labs-voice-not-found' | 'pipeline-error-eleven-labs-quota-exceeded' | 'pipeline-error-eleven-labs-unauthorized-access' | 'pipeline-error-eleven-labs-unauthorized-to-access-model' | 'pipeline-error-eleven-labs-professional-voices-only-for-creator-plus' | 'pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'pipeline-error-eleven-labs-system-busy-and-requested-upgrade' | 'pipeline-error-eleven-labs-voice-not-fine-tuned' | 'pipeline-error-eleven-labs-invalid-api-key' | 'pipeline-error-eleven-labs-invalid-voice-samples' | 'pipeline-error-eleven-labs-voice-disabled-by-owner' | 'pipeline-error-eleven-labs-blocked-account-in-probation' | 'pipeline-error-eleven-labs-blocked-content-against-their-policy' | 'pipeline-error-eleven-labs-missing-samples-for-voice-clone' | 'pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'pipeline-error-eleven-labs-voice-not-allowed-for-free-users' | 'pipeline-error-eleven-labs-max-character-limit-exceeded' | 'pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'pipeline-error-eleven-labs-500-server-error' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-found' | 'call.in-progress.error-vapifault-eleven-labs-quota-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-access' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model' | 'call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus' | 'call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned' | 'call.in-progress.error-vapifault-eleven-labs-invalid-api-key' | 'call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples' | 'call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner' | 'call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation' | 'call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy' | 'call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users' | 'call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'call.in-progress.error-providerfault-eleven-labs-500-server-error' | 'pipeline-error-playht-request-timed-out' | 'pipeline-error-playht-invalid-voice' | 'pipeline-error-playht-unexpected-error' | 'pipeline-error-playht-out-of-credits' | 'pipeline-error-playht-invalid-emotion' | 'pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri' | 'pipeline-error-playht-401-unauthorized' | 'pipeline-error-playht-403-forbidden-out-of-characters' | 'pipeline-error-playht-403-forbidden-api-access-not-available' | 'pipeline-error-playht-429-exceeded-quota' | 'pipeline-error-playht-502-gateway-error' | 'pipeline-error-playht-504-gateway-error' | 'call.in-progress.error-vapifault-playht-request-timed-out' | 'call.in-progress.error-vapifault-playht-invalid-voice' | 'call.in-progress.error-vapifault-playht-unexpected-error' | 'call.in-progress.error-vapifault-playht-out-of-credits' | 'call.in-progress.error-vapifault-playht-invalid-emotion' | 'call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri' | 'call.in-progress.error-vapifault-playht-401-unauthorized' | 'call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters' | 'call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available' | 'call.in-progress.error-vapifault-playht-429-exceeded-quota' | 'call.in-progress.error-providerfault-playht-502-gateway-error' | 'call.in-progress.error-providerfault-playht-504-gateway-error' | 'pipeline-error-custom-transcriber-failed' | 'call.in-progress.error-vapifault-custom-transcriber-failed' | 'pipeline-error-eleven-labs-transcriber-failed' | 'call.in-progress.error-vapifault-eleven-labs-transcriber-failed' | 'pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination' | 'pipeline-error-deepgram-returning-401-invalid-credentials' | 'pipeline-error-deepgram-returning-403-model-access-denied' | 'pipeline-error-deepgram-returning-404-not-found' | 'pipeline-error-deepgram-returning-500-invalid-json' | 'pipeline-error-deepgram-returning-502-network-error' | 'pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach' | 'call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination' | 'call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-deepgram-returning-404-not-found' | 'call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied' | 'call.in-progress.error-providerfault-deepgram-returning-500-invalid-json' | 'call.in-progress.error-providerfault-deepgram-returning-502-network-error' | 'call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach' | 'pipeline-error-google-transcriber-failed' | 'call.in-progress.error-vapifault-google-transcriber-failed' | 'pipeline-error-openai-transcriber-failed' | 'call.in-progress.error-vapifault-openai-transcriber-failed' | 'assistant-ended-call' | 'assistant-said-end-call-phrase' | 'assistant-ended-call-with-hangup-task' | 'assistant-ended-call-after-message-spoken' | 'assistant-forwarded-call' | 'assistant-join-timed-out' | 'call.in-progress.error-assistant-did-not-receive-customer-audio' | 'customer-busy' | 'customer-ended-call' | 'customer-did-not-answer' | 'customer-did-not-give-microphone-permission' | 'exceeded-max-duration' | 'manually-canceled' | 'phone-call-provider-closed-websocket' | 'silence-timed-out' | 'call.in-progress.error-sip-telephony-provider-failed-to-connect-call' | 'call.ringing.hook-executed-say' | 'call.ringing.hook-executed-transfer' | 'twilio-failed-to-connect-call' | 'twilio-reported-customer-misdialed' | 'vonage-rejected' | 'voicemail';
14124
+ endedReason?: 'call-start-error-neither-assistant-nor-server-set' | 'assistant-request-failed' | 'assistant-request-returned-error' | 'assistant-request-returned-unspeakable-error' | 'assistant-request-returned-invalid-assistant' | 'assistant-request-returned-no-assistant' | 'assistant-request-returned-forwarding-phone-number' | 'call.start.error-get-org' | 'call.start.error-get-subscription' | 'call.start.error-get-assistant' | 'call.start.error-get-phone-number' | 'call.start.error-get-customer' | 'call.start.error-get-resources-validation' | 'call.start.error-vapi-number-international' | 'call.start.error-vapi-number-outbound-daily-limit' | 'call.start.error-get-transport' | 'assistant-not-valid' | 'database-error' | 'assistant-not-found' | 'pipeline-error-openai-voice-failed' | 'pipeline-error-cartesia-voice-failed' | 'pipeline-error-deepgram-voice-failed' | 'pipeline-error-eleven-labs-voice-failed' | 'pipeline-error-playht-voice-failed' | 'pipeline-error-lmnt-voice-failed' | 'pipeline-error-azure-voice-failed' | 'pipeline-error-rime-ai-voice-failed' | 'pipeline-error-smallest-ai-voice-failed' | 'pipeline-error-neuphonic-voice-failed' | 'pipeline-error-hume-voice-failed' | 'pipeline-error-sesame-voice-failed' | 'pipeline-error-tavus-video-failed' | 'call.in-progress.error-vapifault-openai-voice-failed' | 'call.in-progress.error-vapifault-cartesia-voice-failed' | 'call.in-progress.error-vapifault-deepgram-voice-failed' | 'call.in-progress.error-vapifault-eleven-labs-voice-failed' | 'call.in-progress.error-vapifault-playht-voice-failed' | 'call.in-progress.error-vapifault-lmnt-voice-failed' | 'call.in-progress.error-vapifault-azure-voice-failed' | 'call.in-progress.error-vapifault-rime-ai-voice-failed' | 'call.in-progress.error-vapifault-smallest-ai-voice-failed' | 'call.in-progress.error-vapifault-neuphonic-voice-failed' | 'call.in-progress.error-vapifault-hume-voice-failed' | 'call.in-progress.error-vapifault-sesame-voice-failed' | 'call.in-progress.error-vapifault-tavus-video-failed' | 'pipeline-error-vapi-llm-failed' | 'pipeline-error-vapi-400-bad-request-validation-failed' | 'pipeline-error-vapi-401-unauthorized' | 'pipeline-error-vapi-403-model-access-denied' | 'pipeline-error-vapi-429-exceeded-quota' | 'pipeline-error-vapi-500-server-error' | 'pipeline-error-vapi-503-server-overloaded-error' | 'call.in-progress.error-vapifault-vapi-llm-failed' | 'call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-vapi-401-unauthorized' | 'call.in-progress.error-vapifault-vapi-403-model-access-denied' | 'call.in-progress.error-vapifault-vapi-429-exceeded-quota' | 'call.in-progress.error-providerfault-vapi-500-server-error' | 'call.in-progress.error-providerfault-vapi-503-server-overloaded-error' | 'pipeline-error-deepgram-transcriber-failed' | 'call.in-progress.error-vapifault-deepgram-transcriber-failed' | 'pipeline-error-gladia-transcriber-failed' | 'call.in-progress.error-vapifault-gladia-transcriber-failed' | 'pipeline-error-speechmatics-transcriber-failed' | 'call.in-progress.error-vapifault-speechmatics-transcriber-failed' | 'pipeline-error-assembly-ai-transcriber-failed' | 'pipeline-error-assembly-ai-returning-400-insufficent-funds' | 'pipeline-error-assembly-ai-returning-400-paid-only-feature' | 'pipeline-error-assembly-ai-returning-401-invalid-credentials' | 'pipeline-error-assembly-ai-returning-500-invalid-schema' | 'pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed' | 'call.in-progress.error-vapifault-assembly-ai-transcriber-failed' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds' | 'call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature' | 'call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema' | 'call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed' | 'pipeline-error-talkscriber-transcriber-failed' | 'call.in-progress.error-vapifault-talkscriber-transcriber-failed' | 'pipeline-error-azure-speech-transcriber-failed' | 'call.in-progress.error-vapifault-azure-speech-transcriber-failed' | 'call.in-progress.error-pipeline-no-available-llm-model' | 'worker-shutdown' | 'unknown-error' | 'vonage-disconnected' | 'vonage-failed-to-connect-call' | 'vonage-completed' | 'phone-call-provider-bypass-enabled-but-no-call-received' | 'call.in-progress.error-providerfault-transport-never-connected' | 'call.in-progress.error-vapifault-worker-not-available' | 'call.in-progress.error-vapifault-transport-never-connected' | 'call.in-progress.error-vapifault-transport-connected-but-call-not-active' | 'call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing' | 'call.in-progress.error-vapifault-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-groq-llm-failed' | 'call.in-progress.error-vapifault-google-llm-failed' | 'call.in-progress.error-vapifault-xai-llm-failed' | 'call.in-progress.error-vapifault-mistral-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-cerebras-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-llm-failed' | 'pipeline-error-openai-400-bad-request-validation-failed' | 'pipeline-error-openai-401-unauthorized' | 'pipeline-error-openai-401-incorrect-api-key' | 'pipeline-error-openai-401-account-not-in-organization' | 'pipeline-error-openai-403-model-access-denied' | 'pipeline-error-openai-429-exceeded-quota' | 'pipeline-error-openai-429-rate-limit-reached' | 'pipeline-error-openai-500-server-error' | 'pipeline-error-openai-503-server-overloaded-error' | 'pipeline-error-openai-llm-failed' | 'call.in-progress.error-vapifault-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openai-401-unauthorized' | 'call.in-progress.error-vapifault-openai-401-incorrect-api-key' | 'call.in-progress.error-vapifault-openai-401-account-not-in-organization' | 'call.in-progress.error-vapifault-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-openai-429-exceeded-quota' | 'call.in-progress.error-vapifault-openai-429-rate-limit-reached' | 'call.in-progress.error-providerfault-openai-500-server-error' | 'call.in-progress.error-providerfault-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-400-bad-request-validation-failed' | 'pipeline-error-azure-openai-401-unauthorized' | 'pipeline-error-azure-openai-403-model-access-denied' | 'pipeline-error-azure-openai-429-exceeded-quota' | 'pipeline-error-azure-openai-500-server-error' | 'pipeline-error-azure-openai-503-server-overloaded-error' | 'pipeline-error-azure-openai-llm-failed' | 'call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-azure-openai-401-unauthorized' | 'call.in-progress.error-vapifault-azure-openai-403-model-access-denied' | 'call.in-progress.error-vapifault-azure-openai-429-exceeded-quota' | 'call.in-progress.error-providerfault-azure-openai-500-server-error' | 'call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error' | 'pipeline-error-google-400-bad-request-validation-failed' | 'pipeline-error-google-401-unauthorized' | 'pipeline-error-google-403-model-access-denied' | 'pipeline-error-google-429-exceeded-quota' | 'pipeline-error-google-500-server-error' | 'pipeline-error-google-503-server-overloaded-error' | 'pipeline-error-google-llm-failed' | 'call.in-progress.error-vapifault-google-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-google-401-unauthorized' | 'call.in-progress.error-vapifault-google-403-model-access-denied' | 'call.in-progress.error-vapifault-google-429-exceeded-quota' | 'call.in-progress.error-providerfault-google-500-server-error' | 'call.in-progress.error-providerfault-google-503-server-overloaded-error' | 'pipeline-error-xai-400-bad-request-validation-failed' | 'pipeline-error-xai-401-unauthorized' | 'pipeline-error-xai-403-model-access-denied' | 'pipeline-error-xai-429-exceeded-quota' | 'pipeline-error-xai-500-server-error' | 'pipeline-error-xai-503-server-overloaded-error' | 'pipeline-error-xai-llm-failed' | 'call.in-progress.error-vapifault-xai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-xai-401-unauthorized' | 'call.in-progress.error-vapifault-xai-403-model-access-denied' | 'call.in-progress.error-vapifault-xai-429-exceeded-quota' | 'call.in-progress.error-providerfault-xai-500-server-error' | 'call.in-progress.error-providerfault-xai-503-server-overloaded-error' | 'pipeline-error-mistral-400-bad-request-validation-failed' | 'pipeline-error-mistral-401-unauthorized' | 'pipeline-error-mistral-403-model-access-denied' | 'pipeline-error-mistral-429-exceeded-quota' | 'pipeline-error-mistral-500-server-error' | 'pipeline-error-mistral-503-server-overloaded-error' | 'pipeline-error-mistral-llm-failed' | 'call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-mistral-401-unauthorized' | 'call.in-progress.error-vapifault-mistral-403-model-access-denied' | 'call.in-progress.error-vapifault-mistral-429-exceeded-quota' | 'call.in-progress.error-providerfault-mistral-500-server-error' | 'call.in-progress.error-providerfault-mistral-503-server-overloaded-error' | 'pipeline-error-inflection-ai-400-bad-request-validation-failed' | 'pipeline-error-inflection-ai-401-unauthorized' | 'pipeline-error-inflection-ai-403-model-access-denied' | 'pipeline-error-inflection-ai-429-exceeded-quota' | 'pipeline-error-inflection-ai-500-server-error' | 'pipeline-error-inflection-ai-503-server-overloaded-error' | 'pipeline-error-inflection-ai-llm-failed' | 'call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-inflection-ai-401-unauthorized' | 'call.in-progress.error-vapifault-inflection-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-inflection-ai-500-server-error' | 'call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error' | 'pipeline-error-deep-seek-400-bad-request-validation-failed' | 'pipeline-error-deep-seek-401-unauthorized' | 'pipeline-error-deep-seek-403-model-access-denied' | 'pipeline-error-deep-seek-429-exceeded-quota' | 'pipeline-error-deep-seek-500-server-error' | 'pipeline-error-deep-seek-503-server-overloaded-error' | 'pipeline-error-deep-seek-llm-failed' | 'call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deep-seek-401-unauthorized' | 'call.in-progress.error-vapifault-deep-seek-403-model-access-denied' | 'call.in-progress.error-vapifault-deep-seek-429-exceeded-quota' | 'call.in-progress.error-providerfault-deep-seek-500-server-error' | 'call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error' | 'pipeline-error-groq-400-bad-request-validation-failed' | 'pipeline-error-groq-401-unauthorized' | 'pipeline-error-groq-403-model-access-denied' | 'pipeline-error-groq-429-exceeded-quota' | 'pipeline-error-groq-500-server-error' | 'pipeline-error-groq-503-server-overloaded-error' | 'pipeline-error-groq-llm-failed' | 'call.in-progress.error-vapifault-groq-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-groq-401-unauthorized' | 'call.in-progress.error-vapifault-groq-403-model-access-denied' | 'call.in-progress.error-vapifault-groq-429-exceeded-quota' | 'call.in-progress.error-providerfault-groq-500-server-error' | 'call.in-progress.error-providerfault-groq-503-server-overloaded-error' | 'pipeline-error-cerebras-400-bad-request-validation-failed' | 'pipeline-error-cerebras-401-unauthorized' | 'pipeline-error-cerebras-403-model-access-denied' | 'pipeline-error-cerebras-429-exceeded-quota' | 'pipeline-error-cerebras-500-server-error' | 'pipeline-error-cerebras-503-server-overloaded-error' | 'pipeline-error-cerebras-llm-failed' | 'call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-cerebras-401-unauthorized' | 'call.in-progress.error-vapifault-cerebras-403-model-access-denied' | 'call.in-progress.error-vapifault-cerebras-429-exceeded-quota' | 'call.in-progress.error-providerfault-cerebras-500-server-error' | 'call.in-progress.error-providerfault-cerebras-503-server-overloaded-error' | 'pipeline-error-anthropic-400-bad-request-validation-failed' | 'pipeline-error-anthropic-401-unauthorized' | 'pipeline-error-anthropic-403-model-access-denied' | 'pipeline-error-anthropic-429-exceeded-quota' | 'pipeline-error-anthropic-500-server-error' | 'pipeline-error-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-llm-failed' | 'call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-500-server-error' | 'call.in-progress.error-providerfault-anthropic-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-400-bad-request-validation-failed' | 'pipeline-error-anthropic-bedrock-401-unauthorized' | 'pipeline-error-anthropic-bedrock-403-model-access-denied' | 'pipeline-error-anthropic-bedrock-429-exceeded-quota' | 'pipeline-error-anthropic-bedrock-500-server-error' | 'pipeline-error-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-llm-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-bedrock-500-server-error' | 'call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-400-bad-request-validation-failed' | 'pipeline-error-anthropic-vertex-401-unauthorized' | 'pipeline-error-anthropic-vertex-403-model-access-denied' | 'pipeline-error-anthropic-vertex-429-exceeded-quota' | 'pipeline-error-anthropic-vertex-500-server-error' | 'pipeline-error-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-llm-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized' | 'call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied' | 'call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota' | 'call.in-progress.error-providerfault-anthropic-vertex-500-server-error' | 'call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error' | 'pipeline-error-together-ai-400-bad-request-validation-failed' | 'pipeline-error-together-ai-401-unauthorized' | 'pipeline-error-together-ai-403-model-access-denied' | 'pipeline-error-together-ai-429-exceeded-quota' | 'pipeline-error-together-ai-500-server-error' | 'pipeline-error-together-ai-503-server-overloaded-error' | 'pipeline-error-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-llm-failed' | 'call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-together-ai-401-unauthorized' | 'call.in-progress.error-vapifault-together-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-together-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-together-ai-500-server-error' | 'call.in-progress.error-providerfault-together-ai-503-server-overloaded-error' | 'pipeline-error-anyscale-400-bad-request-validation-failed' | 'pipeline-error-anyscale-401-unauthorized' | 'pipeline-error-anyscale-403-model-access-denied' | 'pipeline-error-anyscale-429-exceeded-quota' | 'pipeline-error-anyscale-500-server-error' | 'pipeline-error-anyscale-503-server-overloaded-error' | 'pipeline-error-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-llm-failed' | 'call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-anyscale-401-unauthorized' | 'call.in-progress.error-vapifault-anyscale-403-model-access-denied' | 'call.in-progress.error-vapifault-anyscale-429-exceeded-quota' | 'call.in-progress.error-providerfault-anyscale-500-server-error' | 'call.in-progress.error-providerfault-anyscale-503-server-overloaded-error' | 'pipeline-error-openrouter-400-bad-request-validation-failed' | 'pipeline-error-openrouter-401-unauthorized' | 'pipeline-error-openrouter-403-model-access-denied' | 'pipeline-error-openrouter-429-exceeded-quota' | 'pipeline-error-openrouter-500-server-error' | 'pipeline-error-openrouter-503-server-overloaded-error' | 'pipeline-error-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-llm-failed' | 'call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-openrouter-401-unauthorized' | 'call.in-progress.error-vapifault-openrouter-403-model-access-denied' | 'call.in-progress.error-vapifault-openrouter-429-exceeded-quota' | 'call.in-progress.error-providerfault-openrouter-500-server-error' | 'call.in-progress.error-providerfault-openrouter-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-400-bad-request-validation-failed' | 'pipeline-error-perplexity-ai-401-unauthorized' | 'pipeline-error-perplexity-ai-403-model-access-denied' | 'pipeline-error-perplexity-ai-429-exceeded-quota' | 'pipeline-error-perplexity-ai-500-server-error' | 'pipeline-error-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-llm-failed' | 'call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-perplexity-ai-401-unauthorized' | 'call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied' | 'call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota' | 'call.in-progress.error-providerfault-perplexity-ai-500-server-error' | 'call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error' | 'pipeline-error-deepinfra-400-bad-request-validation-failed' | 'pipeline-error-deepinfra-401-unauthorized' | 'pipeline-error-deepinfra-403-model-access-denied' | 'pipeline-error-deepinfra-429-exceeded-quota' | 'pipeline-error-deepinfra-500-server-error' | 'pipeline-error-deepinfra-503-server-overloaded-error' | 'pipeline-error-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-llm-failed' | 'call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-deepinfra-401-unauthorized' | 'call.in-progress.error-vapifault-deepinfra-403-model-access-denied' | 'call.in-progress.error-vapifault-deepinfra-429-exceeded-quota' | 'call.in-progress.error-providerfault-deepinfra-500-server-error' | 'call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error' | 'pipeline-error-runpod-400-bad-request-validation-failed' | 'pipeline-error-runpod-401-unauthorized' | 'pipeline-error-runpod-403-model-access-denied' | 'pipeline-error-runpod-429-exceeded-quota' | 'pipeline-error-runpod-500-server-error' | 'pipeline-error-runpod-503-server-overloaded-error' | 'pipeline-error-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-llm-failed' | 'call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-runpod-401-unauthorized' | 'call.in-progress.error-vapifault-runpod-403-model-access-denied' | 'call.in-progress.error-vapifault-runpod-429-exceeded-quota' | 'call.in-progress.error-providerfault-runpod-500-server-error' | 'call.in-progress.error-providerfault-runpod-503-server-overloaded-error' | 'pipeline-error-custom-llm-400-bad-request-validation-failed' | 'pipeline-error-custom-llm-401-unauthorized' | 'pipeline-error-custom-llm-403-model-access-denied' | 'pipeline-error-custom-llm-429-exceeded-quota' | 'pipeline-error-custom-llm-500-server-error' | 'pipeline-error-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-llm-failed' | 'call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed' | 'call.in-progress.error-vapifault-custom-llm-401-unauthorized' | 'call.in-progress.error-vapifault-custom-llm-403-model-access-denied' | 'call.in-progress.error-vapifault-custom-llm-429-exceeded-quota' | 'call.in-progress.error-providerfault-custom-llm-500-server-error' | 'call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error' | 'pipeline-error-custom-voice-failed' | 'pipeline-error-cartesia-socket-hang-up' | 'pipeline-error-cartesia-requested-payment' | 'pipeline-error-cartesia-500-server-error' | 'pipeline-error-cartesia-503-server-error' | 'pipeline-error-cartesia-522-server-error' | 'call.in-progress.error-vapifault-cartesia-socket-hang-up' | 'call.in-progress.error-vapifault-cartesia-requested-payment' | 'call.in-progress.error-providerfault-cartesia-500-server-error' | 'call.in-progress.error-providerfault-cartesia-503-server-error' | 'call.in-progress.error-providerfault-cartesia-522-server-error' | 'pipeline-error-eleven-labs-voice-not-found' | 'pipeline-error-eleven-labs-quota-exceeded' | 'pipeline-error-eleven-labs-unauthorized-access' | 'pipeline-error-eleven-labs-unauthorized-to-access-model' | 'pipeline-error-eleven-labs-professional-voices-only-for-creator-plus' | 'pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'pipeline-error-eleven-labs-system-busy-and-requested-upgrade' | 'pipeline-error-eleven-labs-voice-not-fine-tuned' | 'pipeline-error-eleven-labs-invalid-api-key' | 'pipeline-error-eleven-labs-invalid-voice-samples' | 'pipeline-error-eleven-labs-voice-disabled-by-owner' | 'pipeline-error-eleven-labs-blocked-account-in-probation' | 'pipeline-error-eleven-labs-blocked-content-against-their-policy' | 'pipeline-error-eleven-labs-missing-samples-for-voice-clone' | 'pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'pipeline-error-eleven-labs-voice-not-allowed-for-free-users' | 'pipeline-error-eleven-labs-max-character-limit-exceeded' | 'pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'pipeline-error-eleven-labs-500-server-error' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-found' | 'call.in-progress.error-vapifault-eleven-labs-quota-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-access' | 'call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model' | 'call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus' | 'call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned' | 'call.in-progress.error-vapifault-eleven-labs-invalid-api-key' | 'call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples' | 'call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner' | 'call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation' | 'call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy' | 'call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used' | 'call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users' | 'call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded' | 'call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification' | 'call.in-progress.error-providerfault-eleven-labs-500-server-error' | 'pipeline-error-playht-request-timed-out' | 'pipeline-error-playht-invalid-voice' | 'pipeline-error-playht-unexpected-error' | 'pipeline-error-playht-out-of-credits' | 'pipeline-error-playht-invalid-emotion' | 'pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri' | 'pipeline-error-playht-401-unauthorized' | 'pipeline-error-playht-403-forbidden-out-of-characters' | 'pipeline-error-playht-403-forbidden-api-access-not-available' | 'pipeline-error-playht-429-exceeded-quota' | 'pipeline-error-playht-502-gateway-error' | 'pipeline-error-playht-504-gateway-error' | 'call.in-progress.error-vapifault-playht-request-timed-out' | 'call.in-progress.error-vapifault-playht-invalid-voice' | 'call.in-progress.error-vapifault-playht-unexpected-error' | 'call.in-progress.error-vapifault-playht-out-of-credits' | 'call.in-progress.error-vapifault-playht-invalid-emotion' | 'call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri' | 'call.in-progress.error-vapifault-playht-401-unauthorized' | 'call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters' | 'call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available' | 'call.in-progress.error-vapifault-playht-429-exceeded-quota' | 'call.in-progress.error-providerfault-playht-502-gateway-error' | 'call.in-progress.error-providerfault-playht-504-gateway-error' | 'pipeline-error-custom-transcriber-failed' | 'call.in-progress.error-vapifault-custom-transcriber-failed' | 'pipeline-error-eleven-labs-transcriber-failed' | 'call.in-progress.error-vapifault-eleven-labs-transcriber-failed' | 'pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination' | 'pipeline-error-deepgram-returning-401-invalid-credentials' | 'pipeline-error-deepgram-returning-403-model-access-denied' | 'pipeline-error-deepgram-returning-404-not-found' | 'pipeline-error-deepgram-returning-500-invalid-json' | 'pipeline-error-deepgram-returning-502-network-error' | 'pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach' | 'call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination' | 'call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials' | 'call.in-progress.error-vapifault-deepgram-returning-404-not-found' | 'call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied' | 'call.in-progress.error-providerfault-deepgram-returning-500-invalid-json' | 'call.in-progress.error-providerfault-deepgram-returning-502-network-error' | 'call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach' | 'pipeline-error-google-transcriber-failed' | 'call.in-progress.error-vapifault-google-transcriber-failed' | 'pipeline-error-openai-transcriber-failed' | 'call.in-progress.error-vapifault-openai-transcriber-failed' | 'assistant-ended-call' | 'assistant-said-end-call-phrase' | 'assistant-ended-call-with-hangup-task' | 'assistant-ended-call-after-message-spoken' | 'assistant-forwarded-call' | 'assistant-join-timed-out' | 'call.in-progress.error-assistant-did-not-receive-customer-audio' | 'customer-busy' | 'customer-ended-call' | 'customer-did-not-answer' | 'customer-did-not-give-microphone-permission' | 'exceeded-max-duration' | 'manually-canceled' | 'phone-call-provider-closed-websocket' | 'call.forwarding.operator-busy' | 'silence-timed-out' | 'call.in-progress.error-sip-telephony-provider-failed-to-connect-call' | 'call.ringing.hook-executed-say' | 'call.ringing.hook-executed-transfer' | 'twilio-failed-to-connect-call' | 'twilio-reported-customer-misdialed' | 'vonage-rejected' | 'voicemail';
13729
14125
  /** These are the conversation messages of the call. This is only sent if the status is "forwarding". */
13730
14126
  messages?: (UserMessage | SystemMessage | BotMessage | ToolCallMessage | ToolCallResultMessage)[];
13731
14127
  /** These are the conversation messages of the call. This is only sent if the status is "forwarding". */
@@ -14300,6 +14696,8 @@ export interface ToolCallResult {
14300
14696
  * 3. a response generated by the model, if neither exist
14301
14697
  */
14302
14698
  error?: string;
14699
+ /** This is optional metadata for the tool call result to be sent to the client. */
14700
+ metadata?: object;
14303
14701
  }
14304
14702
  export interface ServerMessageResponseToolCalls {
14305
14703
  /** These are the results of the "tool-calls" message. */
@@ -14467,6 +14865,8 @@ export interface ToolCallResultMessage {
14467
14865
  time: number;
14468
14866
  /** The number of seconds from the start of the conversation. */
14469
14867
  secondsFromStart: number;
14868
+ /** The metadata for the tool call result. */
14869
+ metadata?: object;
14470
14870
  }
14471
14871
  export interface TransportCost {
14472
14872
  /** This is the type of cost, always 'transport' for this class. */
@@ -14569,7 +14969,7 @@ export interface VoicemailDetectionCost {
14569
14969
  /** This is the model that was used to perform the analysis. */
14570
14970
  model: object;
14571
14971
  /** This is the provider that was used to detect the voicemail. */
14572
- provider: 'twilio' | 'google' | 'openai';
14972
+ provider: 'twilio' | 'google' | 'openai' | 'vapi';
14573
14973
  /** This is the number of prompt text tokens used in the voicemail detection. */
14574
14974
  promptTextTokens: number;
14575
14975
  /** This is the number of prompt audio tokens used in the voicemail detection. */
@@ -14581,6 +14981,18 @@ export interface VoicemailDetectionCost {
14581
14981
  /** This is the cost of the component in USD. */
14582
14982
  cost: number;
14583
14983
  }
14984
+ export interface KnowledgeBaseCost {
14985
+ /** This is the type of cost, always 'knowledge-base' for this class. */
14986
+ type: 'knowledge-base';
14987
+ /** This is the model that was used for processing the knowledge base. */
14988
+ model: object;
14989
+ /** This is the number of prompt tokens used in the knowledge base query. */
14990
+ promptTokens: number;
14991
+ /** This is the number of completion tokens generated in the knowledge base query. */
14992
+ completionTokens: number;
14993
+ /** This is the cost of the component in USD. */
14994
+ cost: number;
14995
+ }
14584
14996
  export interface FunctionToolWithToolCall {
14585
14997
  /**
14586
14998
  * This determines if the tool is async.
@@ -15540,6 +15952,20 @@ export declare class Api<SecurityDataType extends unknown> extends HttpClient<Se
15540
15952
  * @secure
15541
15953
  */
15542
15954
  assistantControllerRemove: (id: string, params?: RequestParams) => Promise<HttpResponse<Assistant, any>>;
15955
+ /**
15956
+ * No description
15957
+ *
15958
+ * @tags Assistants
15959
+ * @name AssistantControllerFindVersions
15960
+ * @summary List Assistant Versions
15961
+ * @request GET:/assistant/{id}/version
15962
+ * @secure
15963
+ */
15964
+ assistantControllerFindVersions: (id: string, query?: {
15965
+ page?: number;
15966
+ limit?: number;
15967
+ pageState?: string;
15968
+ }, params?: RequestParams) => Promise<HttpResponse<AssistantVersionPaginatedResponse, any>>;
15543
15969
  };
15544
15970
  phoneNumber: {
15545
15971
  /**
@@ -17097,6 +17523,16 @@ export declare class Api<SecurityDataType extends unknown> extends HttpClient<Se
17097
17523
  * @secure
17098
17524
  */
17099
17525
  orgControllerUserUpdate: (id: string, data: UpdateUserRoleDTO, params?: RequestParams) => Promise<HttpResponse<void, any>>;
17526
+ /**
17527
+ * No description
17528
+ *
17529
+ * @tags Orgs
17530
+ * @name OrgControllerOrgToken
17531
+ * @summary Generate User Org JWT
17532
+ * @request GET:/org/{id}/auth
17533
+ * @secure
17534
+ */
17535
+ orgControllerOrgToken: (id: string, params?: RequestParams) => Promise<HttpResponse<JwtResponse, any>>;
17100
17536
  };
17101
17537
  token: {
17102
17538
  /**