diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index 0ed495eee..83437602f 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -2899,6 +2899,227 @@ ] } }, + "/traffic-allocations": { + "post": { + "operationId": "TrafficAllocationController_create", + "x-fern-availability": "beta", + "summary": "Create traffic allocation", + "description": "Creates a new traffic allocation for an assistant, replacing the one currently in effect. To start or adjust a split, send targets naming published versions (such as \"v7\") with percentages totaling 100; allocationIntent is inferred as 'explicit'. To stop splitting and send every call to the newest published version, send allocationIntent 'follow-latest' with no targets field; stopping always names its intent, so a dropped targets field can never end a split by accident. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTrafficAllocationDTO" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrafficAllocation" + } + } + } + }, + "400": { + "description": "Create 400s when the request carries neither targets nor an allocationIntent, when the target set breaks a shape rule (targets combined with follow-latest, an explicit allocation with no targets, duplicate target versions, percentages not totaling 100, no positive percentage), or when a target names a version that does not exist on this assistant." + }, + "403": { + "description": "Traffic splitting is not enabled for your organization. The feature is in beta, rolling out to select organizations." + }, + "404": { + "description": "The source assistant does not exist." + }, + "409": { + "description": "The provided expectedCurrentAllocationId no longer matches the allocation currently in effect. Omitting the field never conflicts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrafficAllocationStaleConflictResponseDTO" + } + } + } + } + }, + "tags": [ + "Traffic Allocations" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "get": { + "operationId": "TrafficAllocationController_findAllPaginated", + "x-fern-availability": "beta", + "summary": "List traffic allocations", + "description": "The append-only history of an assistant's allocations, newest first. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "parameters": [ + { + "name": "assistantId", + "required": false, + "in": "query", + "description": "Filter to allocations for this assistant.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "The page number to return. Defaults to 1.", + "schema": { + "minimum": 1, + "type": "integer" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "The maximum number of items to return. Defaults to 100.", + "schema": { + "minimum": 0, + "maximum": 1000, + "type": "integer" + } + }, + { + "name": "sortOrder", + "required": false, + "in": "query", + "description": "The sort order for pagination. Defaults to 'DESC'.", + "schema": { + "enum": [ + "ASC", + "DESC" + ], + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrafficAllocationPaginatedResponse" + } + } + } + }, + "403": { + "description": "Traffic splitting is not enabled for your organization. The feature is in beta, rolling out to select organizations." + } + }, + "tags": [ + "Traffic Allocations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/traffic-allocations/latest": { + "get": { + "operationId": "TrafficAllocationController_latestGet", + "x-fern-availability": "beta", + "summary": "Get latest traffic allocation", + "description": "The allocation currently in effect for the assistant, with its targets. The response carries no allocation field when traffic splitting has never been configured. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "parameters": [ + { + "name": "assistantId", + "required": true, + "in": "query", + "description": "The assistant whose latest allocation to return.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrafficAllocationLatestResponseDTO" + } + } + } + }, + "400": { + "description": "assistantId is missing or is not a UUID." + }, + "403": { + "description": "Traffic splitting is not enabled for your organization. The feature is in beta, rolling out to select organizations." + } + }, + "tags": [ + "Traffic Allocations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/traffic-allocations/{id}": { + "get": { + "operationId": "TrafficAllocationController_findOne", + "x-fern-availability": "beta", + "summary": "Get traffic allocation", + "description": "Returns a single allocation by id, including its targets and actor attribution. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrafficAllocation" + } + } + } + }, + "403": { + "description": "Traffic splitting is not enabled for your organization. The feature is in beta, rolling out to select organizations." + }, + "404": { + "description": "No traffic allocation with this id exists in your organization." + } + }, + "tags": [ + "Traffic Allocations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, "/phone-number": { "post": { "operationId": "PhoneNumberController_create", @@ -4815,9 +5036,15 @@ "parameters": [ { "name": "purpose", - "required": true, + "required": false, "in": "query", + "description": "Only return files with this purpose. When omitted, files of every purpose except composer attachments are returned.", "schema": { + "enum": [ + "assistant", + "composer-attachment", + "knowledge-base-v2" + ], "type": "string" } } @@ -10259,6 +10486,81 @@ } }, "schemas": { + "VersionPinReference": { + "type": "object", + "properties": { + "sourceType": { + "type": "string", + "enum": [ + "assistant_version", + "squad", + "squad_version", + "tool_version" + ], + "description": "Kind of source row the pin originates from." + }, + "sourceId": { + "type": "string", + "format": "uuid", + "description": "UUID of the source row (polymorphic, not FK-enforced)." + } + }, + "required": [ + "sourceType", + "sourceId" + ] + }, + "VersionPinConflictResponseDTO": { + "type": "object", + "properties": { + "error": { + "type": "string", + "enum": [ + "version_pinned" + ] + }, + "message": { + "type": "string", + "description": "Human-readable reason the delete was rejected." + }, + "pinnedBy": { + "description": "Pins that block the delete.", + "type": "array", + "items": { + "$ref": "#/components/schemas/VersionPinReference" + } + } + }, + "required": [ + "error", + "message", + "pinnedBy" + ] + }, + "TrafficAllocationVersionConflictResponseDTO": { + "type": "object", + "properties": { + "error": { + "type": "string", + "enum": [ + "version_in_governing_allocation" + ] + }, + "message": { + "type": "string", + "description": "Human-readable reason the delete was rejected." + }, + "governingAllocationId": { + "type": "string", + "description": "The allocation currently using this version. Create a new allocation without it before deleting the version." + } + }, + "required": [ + "error", + "message", + "governingAllocationId" + ] + }, "FallbackTranscriberPlan": { "type": "object", "properties": { @@ -11053,6 +11355,7 @@ "nova-3", "nova-3-general", "nova-3-medical", + "nova-3-pharma", "nova-2", "nova-2-general", "nova-2-meeting", @@ -14190,6 +14493,7 @@ "nova-3", "nova-3-general", "nova-3-medical", + "nova-3-pharma", "nova-2", "nova-2-general", "nova-2-meeting", @@ -36124,7 +36428,7 @@ }, "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.", + "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.", "example": "gpt-5" } }, @@ -39228,57 +39532,6 @@ } } }, - "VersionPinReference": { - "type": "object", - "properties": { - "sourceType": { - "type": "string", - "enum": [ - "assistant_version", - "squad", - "squad_version", - "tool_version" - ], - "description": "Kind of source row the pin originates from." - }, - "sourceId": { - "type": "string", - "format": "uuid", - "description": "UUID of the source row (polymorphic, not FK-enforced)." - } - }, - "required": [ - "sourceType", - "sourceId" - ] - }, - "VersionPinConflictResponseDTO": { - "type": "object", - "properties": { - "error": { - "type": "string", - "enum": [ - "version_pinned" - ] - }, - "message": { - "type": "string", - "description": "Human-readable reason the delete was rejected." - }, - "pinnedBy": { - "description": "Pins that block the delete.", - "type": "array", - "items": { - "$ref": "#/components/schemas/VersionPinReference" - } - } - }, - "required": [ - "error", - "message", - "pinnedBy" - ] - }, "CreateAssistantDraftDTO": { "type": "object", "properties": { @@ -44313,6 +44566,67 @@ } } }, + "TranscriptWordConfidence": { + "type": "object", + "properties": { + "word": { + "type": "string", + "description": "The word as the transcriber recognised it." + }, + "start": { + "type": "number", + "description": "Offset at which the word begins, measured from the start of the\ntranscriber stream (ElevenLabs, which transcribes each utterance as its\nown request, measures from the start of that utterance's audio). The unit\nis transcriber-specific today: seconds for Deepgram, Soniox, Gladia and\nElevenLabs realtime (`scribe_v2_realtime`); milliseconds for AssemblyAI,\nElevenLabs HTTP Scribe and Google. Transcribers without per-word timing\nemit a placeholder, typically `0`." + }, + "end": { + "type": "number", + "description": "Offset at which the word ends, with the same origin and unit as `start`." + }, + "confidence": { + "type": "number", + "description": "The transcriber's confidence for this word, in [0, 1]. Transcribers that\nreport no per-word score, or whose stream does not map one (Cartesia,\nElevenLabs HTTP Scribe, Google, Talkscriber and custom transcribers), emit\n`1` for every word; that placeholder is not a measurement. ElevenLabs\nrealtime passes through its token log-probability, which is not a [0, 1]\nconfidence.", + "minimum": 0, + "maximum": 1 + }, + "punctuated_word": { + "type": "string", + "description": "The word with punctuation and casing applied, when the transcriber\nreports a punctuated form. The snake_case name deliberately mirrors the\ntranscriber wire spelling already stored on every existing message;\nrenaming it would break stored data." + }, + "language": { + "type": "string", + "description": "The language the transcriber detected for this word, when it reports one." + }, + "speaker": { + "type": "number", + "description": "The diarized speaker index this word was attributed to, when the\ntranscriber reports one." + } + }, + "required": [ + "word", + "start", + "end", + "confidence" + ] + }, + "UserMessageMetadata": { + "type": "object", + "properties": { + "wordLevelConfidence": { + "description": "Per-word confidence scores from the transcriber. After consecutive\ntranscript fragments are merged into one message the list covers the whole\nmerged message, or is absent when any fragment lacked word scores.", + "type": "array", + "items": { + "$ref": "#/components/schemas/TranscriptWordConfidence" + } + }, + "type": { + "type": "string", + "description": "Marks a message injected out-of-band rather than produced by the\ntranscriber (e.g. an inbound SMS relayed into the conversation)." + }, + "source": { + "type": "string", + "description": "The channel or address the out-of-band message arrived from (e.g. the\nsender's phone number for an SMS)." + } + } + }, "UserMessage": { "type": "object", "properties": { @@ -44355,9 +44669,27 @@ "type": "string", "description": "The original message before filtering (only included if content was filtered)." }, + "confidence": { + "type": "number", + "description": "The transcriber's confidence score for this message, in [0, 1]. Only\never set alongside `confidenceSource` — see there for why an unmarked\nor out-of-range score is never stored.", + "minimum": 0, + "maximum": 1 + }, + "confidenceSource": { + "type": "string", + "description": "Whether `confidence` came directly from the transcriber ('provider') or\nwas computed by Vapi ('derived').\n\n'derived' means Vapi computed the score from the transcriber's per-word\nscores; the exact aggregation is provider-specific (an average, a median\nor a minimum, depending on the transcriber). It is also 'derived' when\nconsecutive transcript fragments were merged into one message, where the\nscore is the minimum across the fragments.\n\nAbsent means no trustworthy score was available for this message: either\nthe transcriber does not report one, or the value it reported was invalid\nand was dropped. A merged message is unmarked whenever any fragment it\ncontains was unmarked.", + "enum": [ + "provider", + "derived" + ] + }, "metadata": { - "type": "object", - "description": "The metadata associated with the message. Currently used to store the transcriber's word level confidence." + "description": "The metadata associated with the message. Currently used to store the transcriber's word level confidence.", + "allOf": [ + { + "$ref": "#/components/schemas/UserMessageMetadata" + } + ] }, "speakerLabel": { "type": "string", @@ -46948,6 +47280,8 @@ "call.in-progress.error-providerfault-outbound-sip-503-service-unavailable", "call.in-progress.error-providerfault-outbound-sip-480-temporarily-unavailable", "call.in-progress.error-sip-outbound-call-failed-to-connect", + "sip-outbound-unallocated-number", + "sip-outbound-carrier-released-call", "call.ringing.hook-executed-say", "call.ringing.hook-executed-transfer", "call.ending.hook-executed-say", @@ -50861,6 +51195,249 @@ } } }, + "TrafficAllocationTarget": { + "type": "object", + "properties": { + "assistantVersion": { + "type": "string", + "description": "The assistant version this target sends calls to, such as \"v7\"." + }, + "position": { + "type": "number", + "minimum": 0, + "description": "The target's place in the split, starting at 0. Set from the order of the targets array." + }, + "percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Share of calls sent to this version, from 0 to 100 with up to three decimal places. Targets add up to exactly 100. A 0% target keeps the version in the split without sending it calls." + } + }, + "required": [ + "assistantVersion", + "position", + "percentage" + ] + }, + "TrafficAllocation": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier. The most recently created allocation for an assistant is the one in effect." + }, + "orgId": { + "type": "string" + }, + "assistantId": { + "type": "string", + "description": "The assistant this allocation splits calls for." + }, + "allocationIntent": { + "type": "string", + "enum": [ + "follow-latest", + "explicit" + ], + "description": "'explicit' splits calls across this allocation's targets. 'follow-latest' sends every call to the newest published version." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "When this allocation was created, which is also when it took effect." + }, + "actorType": { + "type": "string", + "enum": [ + "user", + "api-key", + "system" + ], + "description": "Who created this allocation. 'system' means Vapi created it automatically, for example when a publish advances a follow-latest allocation." + }, + "actorId": { + "type": "string", + "description": "The user id or API key id that created this allocation. Absent for system rows." + }, + "actorEmail": { + "type": "string", + "description": "Email of the user who created this allocation, as of that time." + }, + "description": { + "type": "string", + "description": "The note given when this allocation was created, if any." + }, + "targets": { + "description": "The versions this allocation splits calls across, in position order. Empty for follow-latest allocations.", + "type": "array", + "items": { + "$ref": "#/components/schemas/TrafficAllocationTarget" + } + } + }, + "required": [ + "id", + "orgId", + "allocationIntent", + "createdAt", + "actorType", + "targets" + ] + }, + "CreateTrafficAllocationTargetDTO": { + "type": "object", + "properties": { + "assistantVersion": { + "type": "string", + "description": "A published version of this assistant, such as \"v7\". To split onto a new version, publish it first, then create the allocation." + }, + "percentage": { + "type": "number", + "minimum": 0, + "maximum": 100, + "description": "Share of calls sent to this version, from 0 to 100 with up to three decimal places. Finer values are rejected, not rounded. All targets together add up to exactly 100. Position is taken from array order." + } + }, + "required": [ + "assistantVersion", + "percentage" + ] + }, + "CreateTrafficAllocationDTO": { + "type": "object", + "properties": { + "assistantId": { + "type": "string", + "description": "The assistant whose calls this allocation splits." + }, + "allocationIntent": { + "type": "string", + "enum": [ + "follow-latest", + "explicit" + ], + "description": "'explicit' splits calls across targets, and is inferred when targets is sent. 'follow-latest' sends every call to the newest published version and is how you stop splitting; it must be sent explicitly." + }, + "targets": { + "maxItems": 5, + "description": "The versions to split calls across. Omit to stop splitting (with allocationIntent 'follow-latest'). Order in this array is the selection order (position).", + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateTrafficAllocationTargetDTO" + } + }, + "expectedCurrentAllocationId": { + "type": "string", + "format": "uuid", + "description": "Optional concurrency guard. Omit it and the write applies unconditionally (last write wins, matching every other Vapi update surface). Provide the id of the allocation you last read and the write applies only while that allocation is still governing; any mismatch is a 409 carrying the actual current id." + }, + "description": { + "type": "string", + "maxLength": 1000, + "description": "An optional note explaining why you made this change." + } + }, + "required": [ + "assistantId" + ] + }, + "GetTrafficAllocationLatestDTO": { + "type": "object", + "properties": { + "assistantId": { + "type": "string", + "description": "The assistant whose latest allocation to return." + } + }, + "required": [ + "assistantId" + ] + }, + "GetTrafficAllocationPaginatedDTO": { + "type": "object", + "properties": { + "assistantId": { + "type": "string", + "description": "Filter to allocations for this assistant." + }, + "page": { + "type": "integer", + "minimum": 1, + "description": "The page number to return. Defaults to 1." + }, + "limit": { + "type": "integer", + "minimum": 0, + "maximum": 1000, + "description": "The maximum number of items to return. Defaults to 100." + }, + "sortOrder": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "description": "The sort order for pagination. Defaults to 'DESC'." + } + } + }, + "TrafficAllocationPaginatedResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TrafficAllocation" + } + }, + "metadata": { + "$ref": "#/components/schemas/PaginationMeta" + } + }, + "required": [ + "results", + "metadata" + ] + }, + "TrafficAllocationLatestResponseDTO": { + "type": "object", + "properties": { + "allocation": { + "description": "The source's current configuration: the newest allocation row with its targets. Absent when the source has never been configured.", + "allOf": [ + { + "$ref": "#/components/schemas/TrafficAllocation" + } + ] + } + } + }, + "TrafficAllocationStaleConflictResponseDTO": { + "type": "object", + "properties": { + "error": { + "type": "string", + "enum": [ + "stale_allocation" + ] + }, + "message": { + "type": "string", + "description": "Human-readable reason the create was rejected." + }, + "currentAllocationId": { + "type": "string", + "nullable": true, + "format": "uuid", + "description": "The allocation currently in effect. Null if none exists yet." + } + }, + "required": [ + "error", + "message" + ] + }, "ByoPhoneNumber": { "type": "object", "properties": { @@ -58801,31 +59378,6 @@ "minLength": 1, "maxLength": 1000 }, - "model": { - "description": "This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.", - "oneOf": [ - { - "$ref": "#/components/schemas/WorkflowOpenAIModel", - "title": "WorkflowOpenAIModel" - }, - { - "$ref": "#/components/schemas/WorkflowAnthropicModel", - "title": "WorkflowAnthropicModel" - }, - { - "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel", - "title": "WorkflowAnthropicBedrockModel" - }, - { - "$ref": "#/components/schemas/WorkflowGoogleModel", - "title": "WorkflowGoogleModel" - }, - { - "$ref": "#/components/schemas/WorkflowCustomModel", - "title": "WorkflowCustomModel" - } - ] - }, "compliancePlan": { "description": "Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.", "example": { @@ -58868,6 +59420,31 @@ ] } }, + "model": { + "description": "This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.", + "oneOf": [ + { + "$ref": "#/components/schemas/WorkflowOpenAIModel", + "title": "WorkflowOpenAIModel" + }, + { + "$ref": "#/components/schemas/WorkflowAnthropicModel", + "title": "WorkflowAnthropicModel" + }, + { + "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel", + "title": "WorkflowAnthropicBedrockModel" + }, + { + "$ref": "#/components/schemas/WorkflowGoogleModel", + "title": "WorkflowGoogleModel" + }, + { + "$ref": "#/components/schemas/WorkflowCustomModel", + "title": "WorkflowCustomModel" + } + ] + }, "name": { "type": "string", "description": "This is the name of the structured output.", @@ -63237,6 +63814,7 @@ "assistant.model.tokenReceived", "assistant.model.responseSucceeded", "assistant.model.responseFailed", + "assistant.model.responseEmpty", "assistant.model.toolCallsReceived", "assistant.model.reconnecting", "assistant.model.cleanup", @@ -66344,6 +66922,15 @@ "platformFee": { "type": "number", "description": "This is the platform fee for the subscription." + }, + "billingCollectionMethod": { + "type": "string", + "nullable": true, + "description": "This is how payment is collected for the subscription: charged to the card\non file, or invoiced.", + "enum": [ + "charge_automatically", + "send_invoice" + ] } }, "required": [ @@ -74757,6 +75344,20 @@ "originalTranscript": { "type": "string", "description": "The original transcript before filtering (only included if content was filtered)." + }, + "confidence": { + "type": "number", + "description": "The transcriber's confidence score for this transcript, in [0, 1]. Only\never set alongside `confidenceSource` — see there for why an unmarked\nscore is never included. Set only on final user-role transcripts: each\nlive message carries the score of the one fragment it was built from, and\n`artifact.messages` agrees with it per fragment. A stored message built\nfrom several consecutive fragments reports the minimum across them as\n'derived', so it can differ from the individual live messages that fed\nit. Partials never carry a score, because nothing stored exists for a\npartial's score to agree with.", + "minimum": 0, + "maximum": 1 + }, + "confidenceSource": { + "type": "string", + "description": "Whether `confidence` came directly from the transcriber ('provider') or\nwas computed by Vapi ('derived').\n\n'derived' means Vapi computed the score from the transcriber's per-word\nscores; the exact aggregation is provider-specific (an average, a median\nor a minimum, depending on the transcriber).\n\nAbsent means no trustworthy score was available for this transcript:\neither the transcriber does not report one, or the value it reported was\ninvalid and was dropped.", + "enum": [ + "provider", + "derived" + ] } }, "required": [ @@ -76949,6 +77550,8 @@ "call.in-progress.error-providerfault-outbound-sip-503-service-unavailable", "call.in-progress.error-providerfault-outbound-sip-480-temporarily-unavailable", "call.in-progress.error-sip-outbound-call-failed-to-connect", + "sip-outbound-unallocated-number", + "sip-outbound-carrier-released-call", "call.ringing.hook-executed-say", "call.ringing.hook-executed-transfer", "call.ending.hook-executed-say", @@ -78402,6 +79005,8 @@ "call.in-progress.error-providerfault-outbound-sip-503-service-unavailable", "call.in-progress.error-providerfault-outbound-sip-480-temporarily-unavailable", "call.in-progress.error-sip-outbound-call-failed-to-connect", + "sip-outbound-unallocated-number", + "sip-outbound-carrier-released-call", "call.ringing.hook-executed-say", "call.ringing.hook-executed-transfer", "call.ending.hook-executed-say", @@ -79004,6 +79609,20 @@ "originalTranscript": { "type": "string", "description": "The original transcript before filtering (only included if content was filtered)." + }, + "confidence": { + "type": "number", + "description": "The transcriber's confidence score for this transcript, in [0, 1]. Only\never set alongside `confidenceSource` — see there for why an unmarked\nscore is never included. Set only on final user-role transcripts: each\nlive message carries the score of the one fragment it was built from, and\n`artifact.messages` agrees with it per fragment. A stored message built\nfrom several consecutive fragments reports the minimum across them as\n'derived', so it can differ from the individual live messages that fed\nit. Partials never carry a score, because nothing stored exists for a\npartial's score to agree with.", + "minimum": 0, + "maximum": 1 + }, + "confidenceSource": { + "type": "string", + "description": "Whether `confidence` came directly from the transcriber ('provider') or\nwas computed by Vapi ('derived').\n\n'derived' means Vapi computed the score from the transcriber's per-word\nscores; the exact aggregation is provider-specific (an average, a median\nor a minimum, depending on the transcriber).\n\nAbsent means no trustworthy score was available for this transcript:\neither the transcriber does not report one, or the value it reported was\ninvalid and was dropped.", + "enum": [ + "provider", + "derived" + ] } }, "required": [