diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index 83437602f..5a658c25b 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -7959,6 +7959,33 @@ ] } }, + "/eval/simulation/concurrency": { + "get": { + "operationId": "SimulationController_getConcurrency", + "summary": "Get Simulation Concurrency", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationConcurrencyResponse" + } + } + } + } + }, + "tags": [ + "Simulations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, "/eval/simulation/{id}": { "get": { "operationId": "SimulationController_findOne", @@ -8079,33 +8106,6 @@ ] } }, - "/eval/simulation/concurrency": { - "get": { - "operationId": "SimulationController_getConcurrency", - "summary": "Get Simulation Concurrency", - "parameters": [], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SimulationConcurrencyResponse" - } - } - } - } - }, - "tags": [ - "Simulations" - ], - "security": [ - { - "bearer": [] - } - ] - } - }, "/reporting/insight": { "post": { "operationId": "InsightController_create", @@ -12680,6 +12680,13 @@ "$ref": "#/components/schemas/SonioxContextGeneralItem" } }, + "confidenceThreshold": { + "type": "number", + "minimum": 0, + "maximum": 1, + "example": 0.4, + "description": "Transcripts below this confidence are discarded. For a discarded final, an `assistant.transcriber.endpointedSpeechLowConfidence` hook whose range covers the confidence runs (by default `[threshold - 0.2, threshold)`); if none does, the assistant does not respond to that utterance. Confidence is the mean of the per-token scores, and a transcript with an unscored token counts as 1. When unset, nothing is discarded by this setting." + }, "fallbackPlan": { "description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.", "allOf": [ @@ -15772,6 +15779,13 @@ "items": { "$ref": "#/components/schemas/SonioxContextGeneralItem" } + }, + "confidenceThreshold": { + "type": "number", + "minimum": 0, + "maximum": 1, + "example": 0.4, + "description": "Transcripts below this confidence are discarded. For a discarded final, an `assistant.transcriber.endpointedSpeechLowConfidence` hook whose range covers the confidence runs (by default `[threshold - 0.2, threshold)`); if none does, the assistant does not respond to that utterance. Confidence is the mean of the per-token scores, and a transcript with an unscored token counts as 1. When unset, nothing is discarded by this setting." } }, "required": [ @@ -19895,7 +19909,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -20112,7 +20126,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -20353,7 +20367,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -20527,7 +20541,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -20731,7 +20745,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -20902,7 +20916,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -21059,7 +21073,9 @@ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", "enum": [ "deepseek-chat", - "deepseek-reasoner" + "deepseek-reasoner", + "deepseek-flash", + "deepseek-flash-thinking" ] }, "provider": { @@ -21076,7 +21092,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -21342,7 +21358,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -21528,7 +21544,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -21701,7 +21717,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -21874,7 +21890,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -21915,6 +21931,70 @@ } } }, + "OpenAIReasonerSkill": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique name within this assistant.", + "maxLength": 64, + "pattern": "/^[a-z][a-z0-9_-]*$/" + }, + "description": { + "type": "string", + "description": "Explain when the reasoner should load this skill. Always visible in its catalog.", + "maxLength": 1024, + "pattern": "/\\S/" + }, + "content": { + "type": "string", + "description": "Full skill instructions, loaded only while this skill is active.", + "maxLength": 32000, + "pattern": "/\\S/" + }, + "tools": { + "type": "array", + "description": "Tools available only after loading this skill. Can be combined with toolIds.", + "maxItems": 20, + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateFunctionToolDTO" + }, + { + "$ref": "#/components/schemas/CreateApiRequestToolDTO" + }, + { + "$ref": "#/components/schemas/CreateMcpToolDTO" + }, + { + "$ref": "#/components/schemas/CreateEndCallToolDTO" + }, + { + "$ref": "#/components/schemas/CreateDtmfToolDTO" + }, + { + "$ref": "#/components/schemas/CreateTransferCallToolDTO" + } + ] + } + }, + "toolIds": { + "type": "array", + "description": "Existing organization-owned tools available only after loading this skill.", + "items": { + "type": "string", + "format": "uuid" + }, + "maxItems": 20 + } + }, + "required": [ + "name", + "description", + "content" + ] + }, "OpenAIReasoner": { "type": "object", "properties": { @@ -21951,7 +22031,15 @@ }, "instructions": { "type": "string", - "description": "Complete reasoner instructions. An explicit empty string is preserved.\nOmit to use Vapi's default reasoner instructions. No behavioral instructions\nare appended to a custom prompt." + "description": "Complete reasoner instructions. An explicit empty string is preserved.\nOmit to use Vapi's default reasoner instructions. No behavioral instructions\nare appended unless skills are configured; skill loading guidance and active\nskill content are then composed with these instructions." + }, + "skills": { + "description": "Inline skills whose instructions and tools the GPT-Live reasoner loads on demand.", + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIReasonerSkill" + } } } }, @@ -22115,6 +22203,7 @@ "type": "string", "description": "This is the OpenAI model that will be used.\nFor GPT-Live configuration and supported settings, see https://docs.vapi.ai/gpt-live/overview.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.\n\n@default undefined", "enum": [ + "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", @@ -22284,6 +22373,7 @@ "items": { "type": "string", "enum": [ + "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", @@ -22494,7 +22584,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -22664,7 +22754,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -22834,7 +22924,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -23004,7 +23094,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -23072,6 +23162,7 @@ "description": "This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.", "maxLength": 100, "enum": [ + "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", @@ -26999,7 +27090,7 @@ }, "maxTokens": { "type": "number", - "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna no cap is applied unless you set one, because reasoning uses output tokens and a small cap can leave the reply empty.", "minimum": 50, "maximum": 10000 }, @@ -27927,45 +28018,45 @@ }, "similarityBoost": { "type": "number", - "description": "Defines the similarity boost for voice settings.", + "description": "Defines the similarity boost for voice settings. Ignored by `eleven_v4_turbo`.", "minimum": 0, "maximum": 1, "example": 0.75 }, "style": { "type": "number", - "description": "Defines the style for voice settings.", + "description": "Defines the style for voice settings. Ignored by `eleven_v4_turbo`.", "minimum": 0, "maximum": 1, "example": 0 }, "useSpeakerBoost": { "type": "boolean", - "description": "Defines the use speaker boost for voice settings.", + "description": "Defines the use speaker boost for voice settings. Ignored by `eleven_v4_turbo`.", "example": false }, "speed": { "type": "number", - "description": "Defines the speed for voice settings.", + "description": "Defines the speed for voice settings. Ignored by `eleven_v4_turbo`.", "minimum": 0.7, "maximum": 1.2, "example": 0.9 }, "optimizeStreamingLatency": { "type": "number", - "description": "Defines the optimize streaming latency for voice settings. Defaults to 3.", + "description": "Defines the optimize streaming latency for voice settings. Defaults to 3. Ignored by `eleven_v4_turbo`.", "minimum": 0, "maximum": 4, "example": 3 }, "enableSsmlParsing": { "type": "boolean", - "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false", + "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency. Ignored by `eleven_v4_turbo`.\n\n@default false", "example": false }, "autoMode": { "type": "boolean", - "description": "Defines the auto mode for voice settings. Defaults to false.", + "description": "Defines the auto mode for voice settings. Defaults to false. Ignored by `eleven_v4_turbo`.", "example": false }, "model": { @@ -27978,13 +28069,14 @@ "eleven_flash_v2", "eleven_flash_v2_5", "eleven_monolingual_v1", - "eleven_v3" + "eleven_v3", + "eleven_v4_turbo" ], "example": "eleven_turbo_v2_5" }, "language": { "type": "string", - "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5 supports language enforcement. For other models, an error will be returned if language code is provided." + "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5, Flash v2.5 and v4 Turbo support language enforcement; other models ignore it." }, "chunkPlan": { "description": "This is the plan for chunking the model output before it is sent to the voice provider.", @@ -30772,45 +30864,45 @@ }, "similarityBoost": { "type": "number", - "description": "Defines the similarity boost for voice settings.", + "description": "Defines the similarity boost for voice settings. Ignored by `eleven_v4_turbo`.", "minimum": 0, "maximum": 1, "example": 0.75 }, "style": { "type": "number", - "description": "Defines the style for voice settings.", + "description": "Defines the style for voice settings. Ignored by `eleven_v4_turbo`.", "minimum": 0, "maximum": 1, "example": 0 }, "useSpeakerBoost": { "type": "boolean", - "description": "Defines the use speaker boost for voice settings.", + "description": "Defines the use speaker boost for voice settings. Ignored by `eleven_v4_turbo`.", "example": false }, "speed": { "type": "number", - "description": "Defines the speed for voice settings.", + "description": "Defines the speed for voice settings. Ignored by `eleven_v4_turbo`.", "minimum": 0.7, "maximum": 1.2, "example": 0.9 }, "optimizeStreamingLatency": { "type": "number", - "description": "Defines the optimize streaming latency for voice settings. Defaults to 3.", + "description": "Defines the optimize streaming latency for voice settings. Defaults to 3. Ignored by `eleven_v4_turbo`.", "minimum": 0, "maximum": 4, "example": 3 }, "enableSsmlParsing": { "type": "boolean", - "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false", + "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency. Ignored by `eleven_v4_turbo`.\n\n@default false", "example": false }, "autoMode": { "type": "boolean", - "description": "Defines the auto mode for voice settings. Defaults to false.", + "description": "Defines the auto mode for voice settings. Defaults to false. Ignored by `eleven_v4_turbo`.", "example": false }, "model": { @@ -30823,13 +30915,14 @@ "eleven_flash_v2", "eleven_flash_v2_5", "eleven_monolingual_v1", - "eleven_v3" + "eleven_v3", + "eleven_v4_turbo" ], "example": "eleven_turbo_v2_5" }, "language": { "type": "string", - "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5 supports language enforcement. For other models, an error will be returned if language code is provided." + "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5, Flash v2.5 and v4 Turbo support language enforcement; other models ignore it." }, "pronunciationDictionaryLocators": { "description": "This is the pronunciation dictionary locators to use.", @@ -36426,9 +36519,18 @@ "description": "Day the model is or was retired, `YYYY-MM-DD` in UTC. On and after this\nday Vapi no longer runs the model as configured.", "example": "2026-03-26" }, + "replacementStatus": { + "type": "string", + "description": "Whether a replacement can be recommended for this configuration.", + "enum": [ + "available", + "manual-action-required" + ], + "example": "manual-action-required" + }, "replacementModel": { "type": "string", - "description": "The recommended migration target for the slot's model: the registry's\nreplacement, followed through any further retirements as of the response\ndate, so it names a model that is alive on that day. A `:`\npin on the slot's model is kept on the target when the pinned name is\nitself a settable model; otherwise the bare replacement is named.", + "description": "Recommended model when replacementStatus is available. Omitted when\neligibility cannot be established or no eligible replacement exists.\nA recommendation reflects the response-time decision; it neither\nconfirms a completed swap nor authorizes a future execution.", "example": "gpt-5" } }, @@ -36438,7 +36540,7 @@ "model", "deprecationDate", "retirementDate", - "replacementModel" + "replacementStatus" ] }, "Assistant": { @@ -37241,7 +37343,7 @@ "description": "This is the latest version label (e.g. `v3`) of the assistant in the\nversion history. `null` while the org is not yet\nonboarded to versioning, or for assistants that have not yet been\npublished under it." }, "modelDeprecations": { - "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot that carries the model (for example `model` or `model.fallbackModels[1]`), the deprecation and retirement dates as `YYYY-MM-DD` in UTC, and the recommended replacement model: the registry's replacement, followed through any further retirements as of the response date, so it names a model that is alive on that day. Ignored if sent back in a create or update request.", + "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot (for example `model` or `model.fallbackModels[1]`), provider, stored model, and deprecation and retirement dates as `YYYY-MM-DD` in UTC. `replacementStatus` is `available` with a `replacementModel` when a replacement can be recommended, or `manual-action-required` with no replacement model when eligibility is unknown or no eligible replacement exists. `manual-action-required` can be transient when compliance context is unavailable; re-fetch before acting. HIPAA-required configurations, sparse drafts, and squads with unresolved assistant references currently require manual action. HIPAA requirements include the organization and assistant settings, including HIPAA with data retention. Recommendations reflect the response-time decision; they do not confirm a swap or authorize future execution. Examples: an available recommendation includes `{\"replacementStatus\":\"available\",\"replacementModel\":\"gpt-5\"}`; a blocked recommendation includes `{\"replacementStatus\":\"manual-action-required\"}`. Ignored if sent back in a create or update request.", "type": "array", "items": { "$ref": "#/components/schemas/ModelDeprecationNotice" @@ -38278,7 +38380,7 @@ } }, "modelDeprecations": { - "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot that carries the model (for example `model` or `model.fallbackModels[1]`), the deprecation and retirement dates as `YYYY-MM-DD` in UTC, and the recommended replacement model: the registry's replacement, followed through any further retirements as of the response date, so it names a model that is alive on that day. Ignored if sent back in a create or update request.", + "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot (for example `model` or `model.fallbackModels[1]`), provider, stored model, and deprecation and retirement dates as `YYYY-MM-DD` in UTC. `replacementStatus` is `available` with a `replacementModel` when a replacement can be recommended, or `manual-action-required` with no replacement model when eligibility is unknown or no eligible replacement exists. `manual-action-required` can be transient when compliance context is unavailable; re-fetch before acting. HIPAA-required configurations, sparse drafts, and squads with unresolved assistant references currently require manual action. HIPAA requirements include the organization and assistant settings, including HIPAA with data retention. Recommendations reflect the response-time decision; they do not confirm a swap or authorize future execution. Examples: an available recommendation includes `{\"replacementStatus\":\"available\",\"replacementModel\":\"gpt-5\"}`; a blocked recommendation includes `{\"replacementStatus\":\"manual-action-required\"}`. Ignored if sent back in a create or update request.", "type": "array", "items": { "$ref": "#/components/schemas/ModelDeprecationNotice" @@ -39364,7 +39466,7 @@ "format": "date-time" }, "modelDeprecations": { - "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot that carries the model (for example `model` or `model.fallbackModels[1]`), the deprecation and retirement dates as `YYYY-MM-DD` in UTC, and the recommended replacement model: the registry's replacement, followed through any further retirements as of the response date, so it names a model that is alive on that day. Ignored if sent back in a create or update request.", + "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot (for example `model` or `model.fallbackModels[1]`), provider, stored model, and deprecation and retirement dates as `YYYY-MM-DD` in UTC. `replacementStatus` is `available` with a `replacementModel` when a replacement can be recommended, or `manual-action-required` with no replacement model when eligibility is unknown or no eligible replacement exists. `manual-action-required` can be transient when compliance context is unavailable; re-fetch before acting. HIPAA-required configurations, sparse drafts, and squads with unresolved assistant references currently require manual action. HIPAA requirements include the organization and assistant settings, including HIPAA with data retention. Recommendations reflect the response-time decision; they do not confirm a swap or authorize future execution. Examples: an available recommendation includes `{\"replacementStatus\":\"available\",\"replacementModel\":\"gpt-5\"}`; a blocked recommendation includes `{\"replacementStatus\":\"manual-action-required\"}`. Ignored if sent back in a create or update request.", "type": "array", "items": { "$ref": "#/components/schemas/ModelDeprecationNotice" @@ -42266,7 +42368,7 @@ "description": "This is the latest version label (e.g. `v3`) of the squad in the version\nhistory. `null` while the org is not yet onboarded to versioning, or for\nsquads that have not yet been published under it." }, "modelDeprecations": { - "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot that carries the model (for example `model` or `model.fallbackModels[1]`), the deprecation and retirement dates as `YYYY-MM-DD` in UTC, and the recommended replacement model: the registry's replacement, followed through any further retirements as of the response date, so it names a model that is alive on that day. Ignored if sent back in a create or update request.", + "description": "Read-only. Present only when a model this configuration uses is deprecated or retired in Vapi's model deprecation registry, judged on the day of the response. Each entry names the slot (for example `model` or `model.fallbackModels[1]`), provider, stored model, and deprecation and retirement dates as `YYYY-MM-DD` in UTC. `replacementStatus` is `available` with a `replacementModel` when a replacement can be recommended, or `manual-action-required` with no replacement model when eligibility is unknown or no eligible replacement exists. `manual-action-required` can be transient when compliance context is unavailable; re-fetch before acting. HIPAA-required configurations, sparse drafts, and squads with unresolved assistant references currently require manual action. HIPAA requirements include the organization and assistant settings, including HIPAA with data retention. Recommendations reflect the response-time decision; they do not confirm a swap or authorize future execution. Examples: an available recommendation includes `{\"replacementStatus\":\"available\",\"replacementModel\":\"gpt-5\"}`; a blocked recommendation includes `{\"replacementStatus\":\"manual-action-required\"}`. Ignored if sent back in a create or update request.", "type": "array", "items": { "$ref": "#/components/schemas/ModelDeprecationNotice" @@ -45482,6 +45584,83 @@ "provider" ] }, + "TransientTwilioPhoneNumber": { + "type": "object", + "properties": { + "fallbackDestination": { + "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "NumberTransferDestination" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "SipTransferDestination" + } + ] + }, + "hooks": { + "type": "array", + "description": "This is the hooks that will be used for incoming calls to this phone number.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/PhoneNumberHookCallRinging", + "title": "PhoneNumberHookCallRinging" + }, + { + "$ref": "#/components/schemas/PhoneNumberHookCallEnding", + "title": "PhoneNumberHookCallEnding" + } + ] + } + }, + "smsEnabled": { + "type": "boolean", + "description": "Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.\n\nIf set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.\nIf `true` or omitted (default), Vapi will configure both the voice and messaging URLs.\n\n@default true", + "default": true + }, + "name": { + "type": "string", + "description": "This is the name of the phone number. This is just for your own reference.", + "maxLength": 40 + }, + "assistantId": { + "type": "string", + "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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." + }, + "workflowId": { + "type": "string", + "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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." + }, + "squadId": { + "type": "string", + "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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." + }, + "server": { + "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "twilioPhoneNumber": { + "type": "string", + "description": "These are the digits of the phone number you own on your Twilio.", + "deprecated": true + }, + "twilioAccountSid": { + "type": "string", + "description": "This is your Twilio Account SID that will be used to handle this phone number." + } + }, + "required": [ + "twilioPhoneNumber", + "twilioAccountSid" + ] + }, "AnalysisCostBreakdown": { "type": "object", "properties": { @@ -46166,309 +46345,6 @@ } } }, - "TransferPhoneNumberHookAction": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of action - must be \"transfer\"", - "enum": [ - "transfer" - ] - }, - "destination": { - "description": "This is the destination details for the transfer - can be a phone number or SIP URI", - "oneOf": [ - { - "$ref": "#/components/schemas/TransferDestinationNumber", - "title": "NumberTransferDestination" - }, - { - "$ref": "#/components/schemas/TransferDestinationSip", - "title": "SipTransferDestination" - } - ] - } - }, - "required": [ - "type" - ] - }, - "SayPhoneNumberHookAction": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of action - must be \"say\"", - "enum": [ - "say" - ] - }, - "exact": { - "type": "string", - "description": "This is the message to say", - "maxLength": 4000 - } - }, - "required": [ - "type", - "exact" - ] - }, - "PhoneNumberCallRingingHookFilter": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of filter - matches when the specified field starts with any of the given prefixes", - "enum": [ - "startsWith" - ], - "maxLength": 1000 - }, - "key": { - "type": "string", - "description": "The field to check. Currently only \"number\" (the caller's phone number) is supported.", - "enum": [ - "number" - ], - "maxLength": 1000 - }, - "startsWith": { - "type": "array", - "description": "Array of prefixes to match. Do not include the + prefix. Inbound calls from numbers starting with any of these prefixes will trigger the hook actions.", - "maxLength": 20, - "items": { - "type": "string", - "maxLength": 20 - }, - "example": [ - "91", - "86", - "7" - ] - } - }, - "required": [ - "type", - "key", - "startsWith" - ] - }, - "PhoneNumberHookCallRinging": { - "type": "object", - "properties": { - "on": { - "type": "string", - "description": "This is the event to trigger the hook on", - "enum": [ - "call.ringing" - ], - "maxLength": 1000 - }, - "filters": { - "type": "array", - "description": "Optional filters to decide when to trigger the hook. Currently supports filtering by caller country code.", - "items": { - "$ref": "#/components/schemas/PhoneNumberCallRingingHookFilter" - } - }, - "do": { - "type": "array", - "description": "Only the first action will be executed. Additional actions will be ignored.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/TransferPhoneNumberHookAction", - "title": "TransferPhoneNumberHookAction" - }, - { - "$ref": "#/components/schemas/SayPhoneNumberHookAction", - "title": "SayPhoneNumberHookAction" - } - ] - } - } - }, - "required": [ - "on", - "do" - ] - }, - "PhoneNumberCallEndingHookFilter": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of filter - currently only \"oneOf\" is supported", - "enum": [ - "oneOf" - ], - "maxLength": 1000 - }, - "key": { - "type": "string", - "description": "This is the key to filter on - only \"call.endedReason\" is allowed for phone number call ending hooks", - "enum": [ - "call.endedReason" - ], - "maxLength": 1000 - }, - "oneOf": { - "type": "array", - "description": "This is the array of assistant-request related ended reasons to match against", - "enum": [ - "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" - ], - "items": { - "type": "string", - "enum": [ - "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" - ] - } - } - }, - "required": [ - "type", - "key", - "oneOf" - ] - }, - "PhoneNumberHookCallEnding": { - "type": "object", - "properties": { - "on": { - "type": "string", - "description": "This is the event to trigger the hook on", - "enum": [ - "call.ending" - ], - "maxLength": 1000 - }, - "filters": { - "type": "array", - "description": "Optional filters to decide when to trigger - restricted to assistant-request related ended reasons", - "items": { - "$ref": "#/components/schemas/PhoneNumberCallEndingHookFilter" - } - }, - "do": { - "description": "This is the action to perform when the hook triggers", - "oneOf": [ - { - "$ref": "#/components/schemas/TransferPhoneNumberHookAction", - "title": "TransferPhoneNumberHookAction" - }, - { - "$ref": "#/components/schemas/SayPhoneNumberHookAction", - "title": "SayPhoneNumberHookAction" - } - ] - } - }, - "required": [ - "on" - ] - }, - "ImportTwilioPhoneNumberDTO": { - "type": "object", - "properties": { - "fallbackDestination": { - "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.", - "oneOf": [ - { - "$ref": "#/components/schemas/TransferDestinationNumber", - "title": "NumberTransferDestination" - }, - { - "$ref": "#/components/schemas/TransferDestinationSip", - "title": "SipTransferDestination" - } - ] - }, - "hooks": { - "type": "array", - "description": "This is the hooks that will be used for incoming calls to this phone number.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/PhoneNumberHookCallRinging", - "title": "PhoneNumberHookCallRinging" - }, - { - "$ref": "#/components/schemas/PhoneNumberHookCallEnding", - "title": "PhoneNumberHookCallEnding" - } - ] - } - }, - "smsEnabled": { - "type": "boolean", - "description": "Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.\n\nIf set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.\nIf `true` or omitted (default), Vapi will configure both the voice and messaging URLs.\n\n@default true", - "default": true - }, - "twilioPhoneNumber": { - "type": "string", - "description": "These are the digits of the phone number you own on your Twilio.", - "deprecated": true - }, - "twilioAccountSid": { - "type": "string", - "description": "This is your Twilio Account SID that will be used to handle this phone number." - }, - "twilioAuthToken": { - "type": "string", - "description": "This is the Twilio Auth Token that will be used to handle this phone number." - }, - "twilioApiKey": { - "type": "string", - "description": "This is the Twilio API Key that will be used to handle this phone number. If AuthToken is provided, this will be ignored." - }, - "twilioApiSecret": { - "type": "string", - "description": "This is the Twilio API Secret that will be used to handle this phone number. If AuthToken is provided, this will be ignored." - }, - "name": { - "type": "string", - "description": "This is the name of the phone number. This is just for your own reference.", - "maxLength": 40 - }, - "assistantId": { - "type": "string", - "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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." - }, - "workflowId": { - "type": "string", - "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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." - }, - "squadId": { - "type": "string", - "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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." - }, - "server": { - "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server", - "allOf": [ - { - "$ref": "#/components/schemas/Server" - } - ] - } - }, - "required": [ - "twilioPhoneNumber", - "twilioAccountSid" - ] - }, "CreateCustomerDTO": { "type": "object", "properties": { @@ -46806,6 +46682,7 @@ "vonage-completed", "phone-call-provider-bypass-enabled-but-no-call-received", "call.in-progress.error-providerfault-transport-never-connected", + "call.start.error-vapifault-worker-not-available", "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", @@ -47177,6 +47054,9 @@ "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-system-busy-and-requested-upgrade", + "call.in-progress.error-providerfault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade", + "call.in-progress.error-providerfault-eleven-labs-voice-disabled-by-owner", + "call.in-progress.error-providerfault-eleven-labs-vapi-voice-disabled-by-owner", "call.in-progress.error-providerfault-eleven-labs-500-server-error", "call.in-progress.error-providerfault-eleven-labs-503-server-error", "pipeline-error-playht-request-timed-out", @@ -47351,6 +47231,14 @@ } ] }, + "phoneNumber": { + "description": "This is the phone number that will be used for the call. To use an existing number, use `phoneNumberId` instead.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.", + "allOf": [ + { + "$ref": "#/components/schemas/TransientTwilioPhoneNumber" + } + ] + }, "id": { "type": "string", "description": "This is the unique identifier for the call." @@ -47504,14 +47392,6 @@ "type": "string", "description": "This is the phone number that will be used for the call. To use a transient number, use `phoneNumber` instead.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type." }, - "phoneNumber": { - "description": "This is the phone number that will be used for the call. To use an existing number, use `phoneNumberId` instead.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.", - "allOf": [ - { - "$ref": "#/components/schemas/ImportTwilioPhoneNumberDTO" - } - ] - }, "customerId": { "type": "string", "description": "This is the customer that will be called. To call a transient customer , use `customer` instead.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type." @@ -47692,6 +47572,309 @@ "totalWords" ] }, + "TransferPhoneNumberHookAction": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of action - must be \"transfer\"", + "enum": [ + "transfer" + ] + }, + "destination": { + "description": "This is the destination details for the transfer - can be a phone number or SIP URI", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "NumberTransferDestination" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "SipTransferDestination" + } + ] + } + }, + "required": [ + "type" + ] + }, + "SayPhoneNumberHookAction": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of action - must be \"say\"", + "enum": [ + "say" + ] + }, + "exact": { + "type": "string", + "description": "This is the message to say", + "maxLength": 4000 + } + }, + "required": [ + "type", + "exact" + ] + }, + "PhoneNumberCallRingingHookFilter": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of filter - matches when the specified field starts with any of the given prefixes", + "enum": [ + "startsWith" + ], + "maxLength": 1000 + }, + "key": { + "type": "string", + "description": "The field to check. Currently only \"number\" (the caller's phone number) is supported.", + "enum": [ + "number" + ], + "maxLength": 1000 + }, + "startsWith": { + "type": "array", + "description": "Array of prefixes to match. Do not include the + prefix. Inbound calls from numbers starting with any of these prefixes will trigger the hook actions.", + "maxLength": 20, + "items": { + "type": "string", + "maxLength": 20 + }, + "example": [ + "91", + "86", + "7" + ] + } + }, + "required": [ + "type", + "key", + "startsWith" + ] + }, + "PhoneNumberHookCallRinging": { + "type": "object", + "properties": { + "on": { + "type": "string", + "description": "This is the event to trigger the hook on", + "enum": [ + "call.ringing" + ], + "maxLength": 1000 + }, + "filters": { + "type": "array", + "description": "Optional filters to decide when to trigger the hook. Currently supports filtering by caller country code.", + "items": { + "$ref": "#/components/schemas/PhoneNumberCallRingingHookFilter" + } + }, + "do": { + "type": "array", + "description": "Only the first action will be executed. Additional actions will be ignored.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TransferPhoneNumberHookAction", + "title": "TransferPhoneNumberHookAction" + }, + { + "$ref": "#/components/schemas/SayPhoneNumberHookAction", + "title": "SayPhoneNumberHookAction" + } + ] + } + } + }, + "required": [ + "on", + "do" + ] + }, + "PhoneNumberCallEndingHookFilter": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of filter - currently only \"oneOf\" is supported", + "enum": [ + "oneOf" + ], + "maxLength": 1000 + }, + "key": { + "type": "string", + "description": "This is the key to filter on - only \"call.endedReason\" is allowed for phone number call ending hooks", + "enum": [ + "call.endedReason" + ], + "maxLength": 1000 + }, + "oneOf": { + "type": "array", + "description": "This is the array of assistant-request related ended reasons to match against", + "enum": [ + "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" + ], + "items": { + "type": "string", + "enum": [ + "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" + ] + } + } + }, + "required": [ + "type", + "key", + "oneOf" + ] + }, + "PhoneNumberHookCallEnding": { + "type": "object", + "properties": { + "on": { + "type": "string", + "description": "This is the event to trigger the hook on", + "enum": [ + "call.ending" + ], + "maxLength": 1000 + }, + "filters": { + "type": "array", + "description": "Optional filters to decide when to trigger - restricted to assistant-request related ended reasons", + "items": { + "$ref": "#/components/schemas/PhoneNumberCallEndingHookFilter" + } + }, + "do": { + "description": "This is the action to perform when the hook triggers", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferPhoneNumberHookAction", + "title": "TransferPhoneNumberHookAction" + }, + { + "$ref": "#/components/schemas/SayPhoneNumberHookAction", + "title": "SayPhoneNumberHookAction" + } + ] + } + }, + "required": [ + "on" + ] + }, + "ImportTwilioPhoneNumberDTO": { + "type": "object", + "properties": { + "fallbackDestination": { + "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "NumberTransferDestination" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "SipTransferDestination" + } + ] + }, + "hooks": { + "type": "array", + "description": "This is the hooks that will be used for incoming calls to this phone number.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/PhoneNumberHookCallRinging", + "title": "PhoneNumberHookCallRinging" + }, + { + "$ref": "#/components/schemas/PhoneNumberHookCallEnding", + "title": "PhoneNumberHookCallEnding" + } + ] + } + }, + "smsEnabled": { + "type": "boolean", + "description": "Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.\n\nIf set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.\nIf `true` or omitted (default), Vapi will configure both the voice and messaging URLs.\n\n@default true", + "default": true + }, + "twilioPhoneNumber": { + "type": "string", + "description": "These are the digits of the phone number you own on your Twilio.", + "deprecated": true + }, + "twilioAccountSid": { + "type": "string", + "description": "This is your Twilio Account SID that will be used to handle this phone number." + }, + "twilioAuthToken": { + "type": "string", + "description": "This is the Twilio Auth Token that will be used to handle this phone number." + }, + "twilioApiKey": { + "type": "string", + "description": "This is the Twilio API Key that will be used to handle this phone number. If AuthToken is provided, this will be ignored." + }, + "twilioApiSecret": { + "type": "string", + "description": "This is the Twilio API Secret that will be used to handle this phone number. If AuthToken is provided, this will be ignored." + }, + "name": { + "type": "string", + "description": "This is the name of the phone number. This is just for your own reference.", + "maxLength": 40 + }, + "assistantId": { + "type": "string", + "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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." + }, + "workflowId": { + "type": "string", + "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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." + }, + "squadId": { + "type": "string", + "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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." + }, + "server": { + "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + } + }, + "required": [ + "twilioPhoneNumber", + "twilioAccountSid" + ] + }, "CreateCallDTO": { "type": "object", "properties": { @@ -60632,6 +60815,49 @@ "toolName" ] }, + "LatencyExpectation": { + "type": "object", + "properties": { + "metric": { + "type": "string", + "description": "This is the latency component to measure.\n- turn: total time from the end of user speech to the start of assistant speech\n- model: LLM time to first token\n- voice: TTS time to first audio", + "enum": [ + "turn", + "model", + "voice" + ], + "example": "turn" + }, + "aggregation": { + "type": "string", + "description": "This is how the call's per-turn latencies are aggregated before comparing.\np95 uses the nearest-rank method, so on calls with fewer than 20 turns it\nequals the max.", + "enum": [ + "mean", + "median", + "p95", + "max" + ], + "example": "median" + }, + "thresholdMs": { + "type": "number", + "description": "This is the ceiling in milliseconds. The expectation passes when the\naggregated latency is less than or equal to this value.", + "minimum": 1, + "maximum": 60000, + "example": 1200 + }, + "required": { + "type": "boolean", + "description": "This is whether this expectation must pass for the simulation to pass.\nDefaults to true. If false, the result is informational only.\nOn a voice simulation, a metric that no turn measured fails the expectation.\nGPT Live targets are skipped, because their latency is not measured yet.", + "default": true + } + }, + "required": [ + "metric", + "aggregation", + "thresholdMs" + ] + }, "CreateScenarioDTO": { "type": "object", "properties": { @@ -60691,6 +60917,14 @@ "$ref": "#/components/schemas/ScenarioToolMock" } }, + "latencyExpectations": { + "description": "Latency ceilings for voice simulations. Each expectation aggregates the\ntarget call's per-turn latencies and fails the simulation (when required)\nif the aggregated value exceeds its threshold. Skipped for chat simulations\nand GPT Live targets; on any other voice simulation, a metric that no turn\nmeasured fails.", + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/LatencyExpectation" + } + }, "path": { "type": "string", "nullable": true, @@ -60784,6 +61018,14 @@ "$ref": "#/components/schemas/ScenarioToolMock" } }, + "latencyExpectations": { + "description": "Latency ceilings for voice simulations. Each expectation aggregates the\ntarget call's per-turn latencies and fails the simulation (when required)\nif the aggregated value exceeds its threshold. Skipped for chat simulations\nand GPT Live targets; on any other voice simulation, a metric that no turn\nmeasured fails.", + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/LatencyExpectation" + } + }, "path": { "type": "string", "nullable": true, @@ -60858,6 +61100,14 @@ "$ref": "#/components/schemas/ScenarioToolMock" } }, + "latencyExpectations": { + "description": "Latency ceilings for voice simulations. Omit to leave unchanged; send an\nempty array to remove all latency expectations.", + "maxItems": 20, + "type": "array", + "items": { + "$ref": "#/components/schemas/LatencyExpectation" + } + }, "path": { "type": "string", "nullable": true, @@ -61816,6 +62066,66 @@ "turnCount" ] }, + "LatencyEvaluationResult": { + "type": "object", + "properties": { + "metric": { + "type": "string", + "description": "This is the latency component that was measured.", + "enum": [ + "turn", + "model", + "voice" + ] + }, + "aggregation": { + "type": "string", + "description": "This is how the per-turn latencies were aggregated.", + "enum": [ + "mean", + "median", + "p95", + "max" + ] + }, + "thresholdMs": { + "type": "number", + "description": "This is the ceiling in milliseconds the aggregated latency was compared against." + }, + "actualMs": { + "type": "number", + "description": "This is the aggregated latency in milliseconds, rounded to the nearest\nmillisecond. The pass/fail verdict is decided on this rounded value.\nAbsent when the expectation was skipped or no turn measured this metric." + }, + "sampleCount": { + "type": "number", + "description": "This is the number of turns that contributed a value for this metric." + }, + "passed": { + "type": "boolean", + "description": "This indicates whether the aggregated latency was at or below the threshold." + }, + "required": { + "type": "boolean", + "description": "This indicates whether this expectation was required for the simulation to pass." + }, + "isSkipped": { + "type": "boolean", + "description": "This indicates whether this expectation was skipped. Expectations are only\nskipped on chat simulations and GPT Live targets, which record no latency." + }, + "skipReason": { + "type": "string", + "description": "This contains the reason for skipping the expectation." + } + }, + "required": [ + "metric", + "aggregation", + "thresholdMs", + "sampleCount", + "passed", + "required" + ] + }, "SimulationRunItemResults": { "type": "object", "properties": { @@ -61828,7 +62138,7 @@ }, "passed": { "type": "boolean", - "description": "This indicates whether all required evaluations passed." + "description": "This indicates whether all required, non-skipped structured output evaluations and latency expectations passed." }, "latencyMetrics": { "description": "This contains the latency metrics collected from the call.", @@ -61837,6 +62147,13 @@ "$ref": "#/components/schemas/LatencyMetrics" } ] + }, + "latencyEvaluations": { + "description": "This is the list of results from the scenario's latency expectations.\nAbsent when the scenario has no latency expectations.", + "type": "array", + "items": { + "$ref": "#/components/schemas/LatencyEvaluationResult" + } } }, "required": [ @@ -62388,33 +62705,6 @@ "personalityId" ] }, - "UpdateSimulationDTO": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "This is an optional friendly name for the simulation.", - "maxLength": 80 - }, - "scenarioId": { - "type": "string", - "description": "This is the ID of the scenario to use for this simulation.", - "format": "uuid" - }, - "personalityId": { - "type": "string", - "description": "This is the ID of the personality to use for this simulation.", - "format": "uuid" - }, - "path": { - "type": "string", - "nullable": true, - "description": "Optional folder path for organizing simulations.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nSet to null to remove from folder.", - "maxLength": 255, - "pattern": "/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/" - } - } - }, "SimulationConcurrencyResponse": { "type": "object", "properties": { @@ -62458,6 +62748,33 @@ "isDefault" ] }, + "UpdateSimulationDTO": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "This is an optional friendly name for the simulation.", + "maxLength": 80 + }, + "scenarioId": { + "type": "string", + "description": "This is the ID of the scenario to use for this simulation.", + "format": "uuid" + }, + "personalityId": { + "type": "string", + "description": "This is the ID of the personality to use for this simulation.", + "format": "uuid" + }, + "path": { + "type": "string", + "nullable": true, + "description": "Optional folder path for organizing simulations.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nSet to null to remove from folder.", + "maxLength": 255, + "pattern": "/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/" + } + } + }, "BarInsightMetadata": { "type": "object", "properties": { @@ -65375,6 +65692,7 @@ "description": "This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.", "maxLength": 100, "enum": [ + "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", @@ -77076,6 +77394,7 @@ "vonage-completed", "phone-call-provider-bypass-enabled-but-no-call-received", "call.in-progress.error-providerfault-transport-never-connected", + "call.start.error-vapifault-worker-not-available", "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", @@ -77447,6 +77766,9 @@ "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-system-busy-and-requested-upgrade", + "call.in-progress.error-providerfault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade", + "call.in-progress.error-providerfault-eleven-labs-voice-disabled-by-owner", + "call.in-progress.error-providerfault-eleven-labs-vapi-voice-disabled-by-owner", "call.in-progress.error-providerfault-eleven-labs-500-server-error", "call.in-progress.error-providerfault-eleven-labs-503-server-error", "pipeline-error-playht-request-timed-out", @@ -78531,6 +78853,7 @@ "vonage-completed", "phone-call-provider-bypass-enabled-but-no-call-received", "call.in-progress.error-providerfault-transport-never-connected", + "call.start.error-vapifault-worker-not-available", "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", @@ -78902,6 +79225,9 @@ "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-system-busy-and-requested-upgrade", + "call.in-progress.error-providerfault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade", + "call.in-progress.error-providerfault-eleven-labs-voice-disabled-by-owner", + "call.in-progress.error-providerfault-eleven-labs-vapi-voice-disabled-by-owner", "call.in-progress.error-providerfault-eleven-labs-500-server-error", "call.in-progress.error-providerfault-eleven-labs-503-server-error", "pipeline-error-playht-request-timed-out",