From 5ed3b154e1090c37fd2bec7ab89e6af81e81232b Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 2 Jul 2026 22:26:45 +0000 Subject: [PATCH 1/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 8287 ++++++++++++++++++++++++++---------- 1 file changed, 5983 insertions(+), 2304 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index d4453b1cf..eca702d51 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -167,7 +167,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -201,7 +203,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -245,7 +249,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -438,7 +444,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -472,7 +480,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -516,7 +526,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -743,7 +755,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -777,7 +791,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -849,6 +865,286 @@ ] } }, + "/call/{id}/mono-recording": { + "get": { + "operationId": "CallArtifactController_monoRecordingDownload", + "summary": "Download Call Mono Recording", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the recording." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/call/{id}/stereo-recording": { + "get": { + "operationId": "CallArtifactController_stereoRecordingDownload", + "summary": "Download Call Stereo Recording", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the recording." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/call/{id}/video-recording": { + "get": { + "operationId": "CallArtifactController_videoRecordingDownload", + "summary": "Download Call Video Recording", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the video." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/call/{id}/customer-recording": { + "get": { + "operationId": "CallArtifactController_customerRecordingDownload", + "summary": "Download Call Customer Recording", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the recording." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/call/{id}/assistant-recording": { + "get": { + "operationId": "CallArtifactController_assistantRecordingDownload", + "summary": "Download Call Assistant Recording", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the recording." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/call/{id}/pcap": { + "get": { + "operationId": "CallArtifactController_pcapDownload", + "summary": "Download Call Packet Capture (pcap)", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the pcap file." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/call/{id}/call-logs": { + "get": { + "operationId": "CallArtifactController_callLogsDownload", + "summary": "Download Call Logs", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Call ID", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "302": { + "description": "Redirect to a short-lived presigned URL for the log file." + }, + "401": { + "description": "Unauthorized — missing or invalid API token." + }, + "404": { + "description": "Artifact not found." + } + }, + "tags": [ + "Calls" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, "/chat": { "get": { "operationId": "ChatController_listChats", @@ -932,6 +1228,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -1288,7 +1598,9 @@ "enum": [ "scheduled", "in-progress", - "ended" + "ended", + "cancelled", + "archived" ], "type": "string" } @@ -1316,6 +1628,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -1430,22 +1756,23 @@ ] } }, - "/campaign/{id}": { - "get": { - "operationId": "CampaignController_findOne", - "summary": "Get Campaign", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "type": "string" + "/v2/campaign": { + "post": { + "operationId": "CampaignController_createV2", + "summary": "Create Campaign V2", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateCampaignDTO" + } } } - ], + }, "responses": { - "200": { + "201": { "description": "", "content": { "application/json": { @@ -1465,36 +1792,169 @@ } ] }, - "patch": { - "operationId": "CampaignController_update", - "summary": "Update Campaign", + "get": { + "operationId": "CampaignController_findAllV2", + "summary": "List Campaigns V2", "parameters": [ { "name": "id", - "required": true, - "in": "path", + "required": false, + "in": "query", "schema": { "type": "string" } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateCampaignDTO" - } + }, + { + "name": "status", + "required": false, + "in": "query", + "schema": { + "enum": [ + "scheduled", + "in-progress", + "ended", + "cancelled", + "archived" + ], + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "This is the page number to return. Defaults to 1.", + "schema": { + "minimum": 1, + "type": "number" + } + }, + { + "name": "sortOrder", + "required": false, + "in": "query", + "description": "This is the sort order for pagination. Defaults to 'DESC'.", + "schema": { + "enum": [ + "ASC", + "DESC" + ], + "type": "string" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "This is the maximum number of items to return. Defaults to 100.", + "schema": { + "minimum": 0, + "maximum": 1000, + "type": "number" + } + }, + { + "name": "createdAtGt", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is greater than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "createdAtLt", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is less than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "createdAtGe", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is greater than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "createdAtLe", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is less than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtGt", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is greater than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtLt", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is less than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtGe", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is greater than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtLe", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is less than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" } } - }, + ], "responses": { "200": { "description": "", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Campaign" + "$ref": "#/components/schemas/CampaignPaginatedResponse" } } } @@ -1508,16 +1968,222 @@ "bearer": [] } ] - }, - "delete": { - "operationId": "CampaignController_remove", - "summary": "Delete Campaign", + } + }, + "/v2/campaign/{id}": { + "get": { + "operationId": "CampaignController_findOneV2", + "summary": "Get Campaign V2", "parameters": [ { "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Campaign" + } + } + } + } + }, + "tags": [ + "Campaigns" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "patch": { + "operationId": "CampaignController_updateV2", + "summary": "Update Campaign", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "The unique identifier for the resource.", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCampaignDTO" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Campaign" + } + } + } + } + }, + "tags": [ + "Campaigns" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "delete": { + "operationId": "CampaignController_removeV2", + "summary": "Delete Campaign", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "The unique identifier for the resource.", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Campaign" + } + } + } + } + }, + "tags": [ + "Campaigns" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/campaign/{id}": { + "get": { + "operationId": "CampaignController_findOne", + "summary": "Get Campaign", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "The unique identifier for the resource.", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Campaign" + } + } + } + } + }, + "tags": [ + "Campaigns" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "patch": { + "operationId": "CampaignController_update", + "summary": "Update Campaign", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "The unique identifier for the resource.", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCampaignDTO" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Campaign" + } + } + } + } + }, + "tags": [ + "Campaigns" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "delete": { + "operationId": "CampaignController_remove", + "summary": "Delete Campaign", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "The unique identifier for the resource.", + "schema": { + "format": "uuid", "type": "string" } } @@ -1672,6 +2338,18 @@ "in": "query", "schema": {} }, + { + "name": "squadOverrides", + "required": false, + "description": "These are the overrides applied when the call targets a `squadId`. Mirrors\nthe call-level `squadOverrides` — use this instead of `assistantOverrides`\nwhen the campaign or call is squad-based.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ], + "in": "query", + "schema": {} + }, { "required": false, "description": "This is the number of the customer.", @@ -1776,6 +2454,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -1899,7 +2591,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -1933,7 +2627,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -1977,7 +2673,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -2294,6 +2992,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -2417,7 +3129,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -2483,7 +3197,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -2590,7 +3306,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -3185,7 +3903,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -3344,7 +4064,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -3633,7 +4355,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -3827,7 +4551,16 @@ "get": { "operationId": "FileController_findAll", "summary": "List Files", - "parameters": [], + "parameters": [ + { + "name": "purpose", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "description": "", @@ -3862,7 +4595,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -3896,7 +4631,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -3940,7 +4677,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4013,6 +4752,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -4171,7 +4924,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4205,7 +4960,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } }, @@ -4257,7 +5014,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4450,6 +5209,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -4573,7 +5346,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4665,7 +5440,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4721,7 +5498,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4779,7 +5558,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -4970,6 +5751,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -5093,7 +5888,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -5137,7 +5934,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -5171,7 +5970,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -5207,7 +6008,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -5241,7 +6044,9 @@ "name": "id", "required": true, "in": "path", + "description": "The unique identifier for the resource.", "schema": { + "format": "uuid", "type": "string" } } @@ -5343,265 +6148,293 @@ } }, { - "name": "limit", - "required": false, - "in": "query", - "description": "This is the maximum number of items to return. Defaults to 100.", - "schema": { - "minimum": 0, - "maximum": 1000, - "type": "number" - } - }, - { - "name": "createdAtGt", - "required": false, - "in": "query", - "description": "This will return items where the createdAt is greater than the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "createdAtLt", - "required": false, - "in": "query", - "description": "This will return items where the createdAt is less than the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "createdAtGe", - "required": false, - "in": "query", - "description": "This will return items where the createdAt is greater than or equal to the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "createdAtLe", - "required": false, - "in": "query", - "description": "This will return items where the createdAt is less than or equal to the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "updatedAtGt", - "required": false, - "in": "query", - "description": "This will return items where the updatedAt is greater than the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "updatedAtLt", - "required": false, - "in": "query", - "description": "This will return items where the updatedAt is less than the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "updatedAtGe", - "required": false, - "in": "query", - "description": "This will return items where the updatedAt is greater than or equal to the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - }, - { - "name": "updatedAtLe", - "required": false, - "in": "query", - "description": "This will return items where the updatedAt is less than or equal to the specified value.", - "schema": { - "format": "date-time", - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EvalRunPaginatedResponse" - } - } - } - } - }, - "tags": [ - "Eval" - ], - "security": [ - { - "bearer": [] - } - ] - } - }, - "/observability/scorecard/{id}": { - "get": { - "operationId": "ScorecardController_get", - "summary": "Get Scorecard", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Scorecard" - } - } - } - } - }, - "tags": [ - "Observability/Scorecard" - ], - "security": [ - { - "bearer": [] - } - ] - }, - "patch": { - "operationId": "ScorecardController_update", - "summary": "Update Scorecard", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateScorecardDTO" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Scorecard" - } - } - } - } - }, - "tags": [ - "Observability/Scorecard" - ], - "security": [ - { - "bearer": [] - } - ] - }, - "delete": { - "operationId": "ScorecardController_remove", - "summary": "Delete Scorecard", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Scorecard" - } - } - } - } - }, - "tags": [ - "Observability/Scorecard" - ], - "security": [ - { - "bearer": [] - } - ] - } - }, - "/observability/scorecard": { - "get": { - "operationId": "ScorecardController_getPaginated", - "summary": "List Scorecards", - "parameters": [ - { - "name": "id", - "required": false, - "in": "query", - "schema": { - "type": "string" - } - }, - { - "name": "page", + "name": "sortBy", "required": false, "in": "query", - "description": "This is the page number to return. Defaults to 1.", - "schema": { - "minimum": 1, - "type": "number" - } - }, - { - "name": "sortOrder", - "required": false, - "in": "query", - "description": "This is the sort order for pagination. Defaults to 'DESC'.", + "description": "This is the column to sort by. Defaults to 'createdAt'.", "schema": { "enum": [ - "ASC", - "DESC" + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "This is the maximum number of items to return. Defaults to 100.", + "schema": { + "minimum": 0, + "maximum": 1000, + "type": "number" + } + }, + { + "name": "createdAtGt", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is greater than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "createdAtLt", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is less than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "createdAtGe", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is greater than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "createdAtLe", + "required": false, + "in": "query", + "description": "This will return items where the createdAt is less than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtGt", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is greater than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtLt", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is less than the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtGe", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is greater than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + }, + { + "name": "updatedAtLe", + "required": false, + "in": "query", + "description": "This will return items where the updatedAt is less than or equal to the specified value.", + "schema": { + "format": "date-time", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvalRunPaginatedResponse" + } + } + } + } + }, + "tags": [ + "Eval" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/observability/scorecard/{id}": { + "get": { + "operationId": "ScorecardController_get", + "summary": "Get Scorecard", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Scorecard" + } + } + } + } + }, + "tags": [ + "Observability/Scorecard" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "patch": { + "operationId": "ScorecardController_update", + "summary": "Update Scorecard", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateScorecardDTO" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Scorecard" + } + } + } + } + }, + "tags": [ + "Observability/Scorecard" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "delete": { + "operationId": "ScorecardController_remove", + "summary": "Delete Scorecard", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Scorecard" + } + } + } + } + }, + "tags": [ + "Observability/Scorecard" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/observability/scorecard": { + "get": { + "operationId": "ScorecardController_getPaginated", + "summary": "List Scorecards", + "parameters": [ + { + "name": "id", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "This is the page number to return. Defaults to 1.", + "schema": { + "minimum": 1, + "type": "number" + } + }, + { + "name": "sortOrder", + "required": false, + "in": "query", + "description": "This is the sort order for pagination. Defaults to 'DESC'.", + "schema": { + "enum": [ + "ASC", + "DESC" + ], + "type": "string" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" ], "type": "string" } @@ -5883,6 +6716,20 @@ "type": "string" } }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "schema": { + "enum": [ + "createdAt", + "duration", + "cost" + ], + "type": "string" + } + }, { "name": "limit", "required": false, @@ -6308,14 +7155,15 @@ { "$ref": "#/components/schemas/FallbackSonioxTranscriber", "title": "Soniox" + }, + { + "$ref": "#/components/schemas/FallbackXaiTranscriber", + "title": "xAI" } ] } } - }, - "required": [ - "transcribers" - ] + } }, "AssemblyAITranscriber": { "type": "object", @@ -6631,7 +7479,8 @@ "model": { "type": "string", "enum": [ - "ink-whisper" + "ink-whisper", + "ink-2" ] }, "language": { @@ -7008,7 +7857,8 @@ "base-voicemail", "base-video", "whisper", - "flux-general-en" + "flux-general-en", + "flux-general-multi" ] }, { @@ -7023,8 +7873,11 @@ "ar", "az", "ba", + "be", "bg", + "bn", "br", + "bs", "ca", "cs", "da", @@ -7054,6 +7907,7 @@ "he", "hi", "hi-Latn", + "hr", "hu", "id", "is", @@ -7067,6 +7921,7 @@ "lt", "lv", "mk", + "mr", "ms", "multi", "nl", @@ -7088,8 +7943,10 @@ "sv-SE", "ta", "taq", + "te", "th", "th-TH", + "tl", "tr", "tt", "uk", @@ -7125,6 +7982,29 @@ "description": "If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false", "example": false }, + "redaction": { + "type": "array", + "description": "Enables redaction of sensitive information from transcripts.\n\nOptions include:\n- \"pci\": Redacts credit card numbers, expiration dates, and CVV.\n- \"pii\": Redacts personally identifiable information (names, locations, identifying numbers, etc.).\n- \"phi\": Redacts protected health information (medical conditions, drugs, injuries, etc.).\n- \"numbers\": Redacts numerical and identifying entities (dates, account numbers, SSNs, etc.).\n\nMultiple values can be provided to redact different categories simultaneously.\nRedacted content is replaced with entity labels like [CREDIT_CARD_1], [SSN_1], etc.\n\nSee https://developers.deepgram.com/docs/redaction for details.", + "enum": [ + "pci", + "pii", + "phi", + "numbers" + ], + "example": [ + "pci", + "phi" + ], + "items": { + "type": "string", + "enum": [ + "pci", + "pii", + "phi", + "numbers" + ] + } + }, "confidenceThreshold": { "type": "number", "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4", @@ -7132,13 +8012,6 @@ "maximum": 1, "example": 0.4 }, - "eagerEotThreshold": { - "type": "number", - "description": "Eager end-of-turn confidence required to fire a eager end-of-turn event. Setting a value here will enable EagerEndOfTurn and SpeechResumed events. It is disabled by default. Only used with Flux models.", - "minimum": 0, - "maximum": 1, - "example": 0.3 - }, "eotThreshold": { "type": "number", "description": "End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7", @@ -7153,6 +8026,17 @@ "maximum": 10000, "example": 5000 }, + "languages": { + "description": "Language hints to bias Flux Multilingual (`flux-general-multi`) toward specific languages.\nProvide BCP-47 language codes (e.g. \"en\", \"es\", \"fr\"). Multiple hints can be given for\nmultilingual or code-switching scenarios. Omit for auto-detection. Only used with `flux-general-multi`.", + "example": [ + "en", + "es" + ], + "type": "array", + "items": { + "type": "string" + } + }, "keywords": { "description": "These keywords are passed to the transcription model to help it pick up use-case specific words. Anything that may not be a common word, like your company name, should be added here.", "type": "array", @@ -7201,6 +8085,7 @@ "description": "This is the model that will be used for the transcription.", "oneOf": [ { + "type": "string", "enum": [ "scribe_v1", "scribe_v2", @@ -7484,6 +8369,7 @@ "description": "This is the Gladia model that will be used. Default is 'fast'", "oneOf": [ { + "type": "string", "enum": [ "fast", "accurate", @@ -7611,109 +8497,112 @@ ] }, "languages": { - "type": "string", + "type": "array", "description": "Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.", - "enum": [ - "af", - "sq", - "am", - "ar", - "hy", - "as", - "az", - "ba", - "eu", - "be", - "bn", - "bs", - "br", - "bg", - "ca", - "zh", - "hr", - "cs", - "da", - "nl", - "en", - "et", - "fo", - "fi", - "fr", - "gl", - "ka", - "de", - "el", - "gu", - "ht", - "ha", - "haw", - "he", - "hi", - "hu", - "is", - "id", - "it", - "ja", - "jv", - "kn", - "kk", - "km", - "ko", - "lo", - "la", - "lv", - "ln", - "lt", - "lb", - "mk", - "mg", - "ms", - "ml", - "mt", - "mi", - "mr", - "mn", - "my", - "ne", - "no", - "nn", - "oc", - "ps", - "fa", - "pl", - "pt", - "pa", - "ro", - "ru", - "sa", - "sr", - "sn", - "sd", - "si", - "sk", - "sl", - "so", - "es", - "su", - "sw", - "sv", - "tl", - "tg", - "ta", - "tt", - "te", - "th", - "bo", - "tr", - "tk", - "uk", - "ur", - "uz", - "vi", - "cy", - "yi", - "yo" - ] + "items": { + "type": "string", + "enum": [ + "af", + "sq", + "am", + "ar", + "hy", + "as", + "az", + "ba", + "eu", + "be", + "bn", + "bs", + "br", + "bg", + "ca", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "et", + "fo", + "fi", + "fr", + "gl", + "ka", + "de", + "el", + "gu", + "ht", + "ha", + "haw", + "he", + "hi", + "hu", + "is", + "id", + "it", + "ja", + "jv", + "kn", + "kk", + "km", + "ko", + "lo", + "la", + "lv", + "ln", + "lt", + "lb", + "mk", + "mg", + "ms", + "ml", + "mt", + "mi", + "mr", + "mn", + "my", + "ne", + "no", + "nn", + "oc", + "ps", + "fa", + "pl", + "pt", + "pa", + "ro", + "ru", + "sa", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "es", + "su", + "sw", + "sv", + "tl", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "tr", + "tk", + "uk", + "ur", + "uz", + "vi", + "cy", + "yi", + "yo" + ] + } }, "transcriptionHint": { "type": "string", @@ -7792,6 +8681,27 @@ "provider" ] }, + "SonioxContextGeneralItem": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The key describing the type of context (e.g., \"domain\", \"topic\", \"doctor\", \"organization\").", + "minLength": 1, + "example": "domain" + }, + "value": { + "type": "string", + "description": "The value for the context key (e.g., \"Healthcare\", \"Diabetes management consultation\").", + "minLength": 1, + "example": "Healthcare" + } + }, + "required": [ + "key", + "value" + ] + }, "SonioxTranscriber": { "type": "object", "properties": { @@ -7804,7 +8714,8 @@ "model": { "type": "string", "enum": [ - "stt-rt-v4" + "stt-rt-v4", + "stt-rt-v5" ], "description": "The Soniox model to use for transcription." }, @@ -7997,11 +8908,205 @@ "zh", "zu" ], - "description": "The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal model." + "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). For multi-language hints or to enable Soniox auto-detect, use `languages` instead — when `languages` is set (including to an empty array), this field is ignored when building the Soniox request. Defaults to `en` if neither this nor `languages` is set." + }, + "languages": { + "type": "array", + "description": "Language hints sent to Soniox as `language_hints`. Provide `[lang1, lang2, ...]` (ISO 639-1 codes) to bias recognition toward specific languages, or provide an explicit empty array `[]` to enable Soniox auto-detect across all 60+ supported languages. When set (including the empty array), this field takes precedence over the singular `language` field. When omitted, falls back to the singular `language` (which defaults to `en` if also unset). Best accuracy is achieved with a single language.", + "items": { + "type": "string", + "enum": [ + "aa", + "ab", + "ae", + "af", + "ak", + "am", + "an", + "ar", + "as", + "av", + "ay", + "az", + "ba", + "be", + "bg", + "bh", + "bi", + "bm", + "bn", + "bo", + "br", + "bs", + "ca", + "ce", + "ch", + "co", + "cr", + "cs", + "cu", + "cv", + "cy", + "da", + "de", + "dv", + "dz", + "ee", + "el", + "en", + "eo", + "es", + "et", + "eu", + "fa", + "ff", + "fi", + "fj", + "fo", + "fr", + "fy", + "ga", + "gd", + "gl", + "gn", + "gu", + "gv", + "ha", + "he", + "hi", + "ho", + "hr", + "ht", + "hu", + "hy", + "hz", + "ia", + "id", + "ie", + "ig", + "ii", + "ik", + "io", + "is", + "it", + "iu", + "ja", + "jv", + "ka", + "kg", + "ki", + "kj", + "kk", + "kl", + "km", + "kn", + "ko", + "kr", + "ks", + "ku", + "kv", + "kw", + "ky", + "la", + "lb", + "lg", + "li", + "ln", + "lo", + "lt", + "lu", + "lv", + "mg", + "mh", + "mi", + "mk", + "ml", + "mn", + "mr", + "ms", + "mt", + "my", + "na", + "nb", + "nd", + "ne", + "ng", + "nl", + "nn", + "no", + "nr", + "nv", + "ny", + "oc", + "oj", + "om", + "or", + "os", + "pa", + "pi", + "pl", + "ps", + "pt", + "qu", + "rm", + "rn", + "ro", + "ru", + "rw", + "sa", + "sc", + "sd", + "se", + "sg", + "si", + "sk", + "sl", + "sm", + "sn", + "so", + "sq", + "sr", + "ss", + "st", + "su", + "sv", + "sw", + "ta", + "te", + "tg", + "th", + "ti", + "tk", + "tl", + "tn", + "to", + "tr", + "ts", + "tt", + "tw", + "ty", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "wo", + "xh", + "yi", + "yue", + "yo", + "za", + "zh", + "zu" + ] + } }, "languageHintsStrict": { "type": "boolean", - "description": "When enabled, restricts transcription to the language specified in the language field. When disabled, the model can detect and transcribe any of 60+ supported languages. Defaults to true." + "description": "When `true`, Soniox strictly restricts transcription to the languages in `languages` (or the singular `language` if `languages` is unset). When `false`, Soniox biases toward those languages but still allows transcription in other languages. Has no effect when no language hints are sent (e.g., `languages: []` for auto-detect). Defaults to `true` (strict mode)." }, "maxEndpointDelayMs": { "type": "number", @@ -8016,6 +9121,23 @@ "type": "string" } }, + "contextGeneral": { + "description": "General context key-value pairs that guide the AI model during transcription. Helps adapt vocabulary to the correct domain, improving accuracy. Recommended: 10 or fewer pairs. Maps to Soniox context.general.", + "example": [ + { + "key": "domain", + "value": "Healthcare" + }, + { + "key": "topic", + "value": "Diabetes management consultation" + } + ], + "type": "array", + "items": { + "$ref": "#/components/schemas/SonioxContextGeneralItem" + } + }, "fallbackPlan": { "description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.", "allOf": [ @@ -8381,6 +9503,8 @@ "type": "string", "description": "This is the model that will be used for the transcription.", "enum": [ + "gemini-3.5-flash", + "gemini-3.1-flash-lite", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", @@ -8551,6 +9675,66 @@ "model" ] }, + "XaiTranscriber": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "xai" + ] + }, + "model": { + "type": "string", + "description": "The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection.", + "enum": [ + "default" + ] + }, + "language": { + "type": "string", + "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). Defaults to `en` if not set. xAI auto-detects when omitted via the API but Vapi defaults to English for deterministic behavior.", + "enum": [ + "ar", + "cs", + "da", + "nl", + "en", + "fil", + "fr", + "de", + "hi", + "id", + "it", + "ja", + "ko", + "mk", + "ms", + "fa", + "pl", + "pt", + "ro", + "ru", + "es", + "sv", + "th", + "tr", + "vi" + ] + }, + "fallbackPlan": { + "description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.", + "allOf": [ + { + "$ref": "#/components/schemas/FallbackTranscriberPlan" + } + ] + } + }, + "required": [ + "provider" + ] + }, "FallbackAssemblyAITranscriber": { "type": "object", "properties": { @@ -8849,7 +10033,8 @@ "model": { "type": "string", "enum": [ - "ink-whisper" + "ink-whisper", + "ink-2" ] }, "language": { @@ -9119,7 +10304,8 @@ "base-voicemail", "base-video", "whisper", - "flux-general-en" + "flux-general-en", + "flux-general-multi" ] }, { @@ -9134,8 +10320,11 @@ "ar", "az", "ba", + "be", "bg", + "bn", "br", + "bs", "ca", "cs", "da", @@ -9165,6 +10354,7 @@ "he", "hi", "hi-Latn", + "hr", "hu", "id", "is", @@ -9178,6 +10368,7 @@ "lt", "lv", "mk", + "mr", "ms", "multi", "nl", @@ -9199,8 +10390,10 @@ "sv-SE", "ta", "taq", + "te", "th", "th-TH", + "tl", "tr", "tt", "uk", @@ -9236,6 +10429,29 @@ "description": "If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false", "example": false }, + "redaction": { + "type": "array", + "description": "Enables redaction of sensitive information from transcripts.\n\nOptions include:\n- \"pci\": Redacts credit card numbers, expiration dates, and CVV.\n- \"pii\": Redacts personally identifiable information (names, locations, identifying numbers, etc.).\n- \"phi\": Redacts protected health information (medical conditions, drugs, injuries, etc.).\n- \"numbers\": Redacts numerical and identifying entities (dates, account numbers, SSNs, etc.).\n\nMultiple values can be provided to redact different categories simultaneously.\nRedacted content is replaced with entity labels like [CREDIT_CARD_1], [SSN_1], etc.\n\nSee https://developers.deepgram.com/docs/redaction for details.", + "enum": [ + "pci", + "pii", + "phi", + "numbers" + ], + "example": [ + "pci", + "phi" + ], + "items": { + "type": "string", + "enum": [ + "pci", + "pii", + "phi", + "numbers" + ] + } + }, "confidenceThreshold": { "type": "number", "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4", @@ -9243,13 +10459,6 @@ "maximum": 1, "example": 0.4 }, - "eagerEotThreshold": { - "type": "number", - "description": "Eager end-of-turn confidence required to fire a eager end-of-turn event. Setting a value here will enable EagerEndOfTurn and SpeechResumed events. It is disabled by default. Only used with Flux models.", - "minimum": 0, - "maximum": 1, - "example": 0.3 - }, "eotThreshold": { "type": "number", "description": "End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7", @@ -9264,6 +10473,17 @@ "maximum": 10000, "example": 5000 }, + "languages": { + "description": "Language hints to bias Flux Multilingual (`flux-general-multi`) toward specific languages.\nProvide BCP-47 language codes (e.g. \"en\", \"es\", \"fr\"). Multiple hints can be given for\nmultilingual or code-switching scenarios. Omit for auto-detection. Only used with `flux-general-multi`.", + "example": [ + "en", + "es" + ], + "type": "array", + "items": { + "type": "string" + } + }, "keywords": { "description": "These keywords are passed to the transcription model to help it pick up use-case specific words. Anything that may not be a common word, like your company name, should be added here.", "type": "array", @@ -9304,6 +10524,7 @@ "description": "This is the model that will be used for the transcription.", "oneOf": [ { + "type": "string", "enum": [ "scribe_v1", "scribe_v2", @@ -9579,6 +10800,7 @@ "description": "This is the Gladia model that will be used. Default is 'fast'", "oneOf": [ { + "type": "string", "enum": [ "fast", "accurate", @@ -9706,109 +10928,112 @@ ] }, "languages": { - "type": "string", + "type": "array", "description": "Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.", - "enum": [ - "af", - "sq", - "am", - "ar", - "hy", - "as", - "az", - "ba", - "eu", - "be", - "bn", - "bs", - "br", - "bg", - "ca", - "zh", - "hr", - "cs", - "da", - "nl", - "en", - "et", - "fo", - "fi", - "fr", - "gl", - "ka", - "de", - "el", - "gu", - "ht", - "ha", - "haw", - "he", - "hi", - "hu", - "is", - "id", - "it", - "ja", - "jv", - "kn", - "kk", - "km", - "ko", - "lo", - "la", - "lv", - "ln", - "lt", - "lb", - "mk", - "mg", - "ms", - "ml", - "mt", - "mi", - "mr", - "mn", - "my", - "ne", - "no", - "nn", - "oc", - "ps", - "fa", - "pl", - "pt", - "pa", - "ro", - "ru", - "sa", - "sr", - "sn", - "sd", - "si", - "sk", - "sl", - "so", - "es", - "su", - "sw", - "sv", - "tl", - "tg", - "ta", - "tt", - "te", - "th", - "bo", - "tr", - "tk", - "uk", - "ur", - "uz", - "vi", - "cy", - "yi", - "yo" - ] + "items": { + "type": "string", + "enum": [ + "af", + "sq", + "am", + "ar", + "hy", + "as", + "az", + "ba", + "eu", + "be", + "bn", + "bs", + "br", + "bg", + "ca", + "zh", + "hr", + "cs", + "da", + "nl", + "en", + "et", + "fo", + "fi", + "fr", + "gl", + "ka", + "de", + "el", + "gu", + "ht", + "ha", + "haw", + "he", + "hi", + "hu", + "is", + "id", + "it", + "ja", + "jv", + "kn", + "kk", + "km", + "ko", + "lo", + "la", + "lv", + "ln", + "lt", + "lb", + "mk", + "mg", + "ms", + "ml", + "mt", + "mi", + "mr", + "mn", + "my", + "ne", + "no", + "nn", + "oc", + "ps", + "fa", + "pl", + "pt", + "pa", + "ro", + "ru", + "sa", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "es", + "su", + "sw", + "sv", + "tl", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "tr", + "tk", + "uk", + "ur", + "uz", + "vi", + "cy", + "yi", + "yo" + ] + } }, "transcriptionHint": { "type": "string", @@ -9891,7 +11116,8 @@ "model": { "type": "string", "enum": [ - "stt-rt-v4" + "stt-rt-v4", + "stt-rt-v5" ], "description": "The Soniox model to use for transcription." }, @@ -10084,11 +11310,205 @@ "zh", "zu" ], - "description": "The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal model." + "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). For multi-language hints or to enable Soniox auto-detect, use `languages` instead — when `languages` is set (including to an empty array), this field is ignored when building the Soniox request. Defaults to `en` if neither this nor `languages` is set." + }, + "languages": { + "type": "array", + "description": "Language hints sent to Soniox as `language_hints`. Provide `[lang1, lang2, ...]` (ISO 639-1 codes) to bias recognition toward specific languages, or provide an explicit empty array `[]` to enable Soniox auto-detect across all 60+ supported languages. When set (including the empty array), this field takes precedence over the singular `language` field. When omitted, falls back to the singular `language` (which defaults to `en` if also unset). Best accuracy is achieved with a single language.", + "items": { + "type": "string", + "enum": [ + "aa", + "ab", + "ae", + "af", + "ak", + "am", + "an", + "ar", + "as", + "av", + "ay", + "az", + "ba", + "be", + "bg", + "bh", + "bi", + "bm", + "bn", + "bo", + "br", + "bs", + "ca", + "ce", + "ch", + "co", + "cr", + "cs", + "cu", + "cv", + "cy", + "da", + "de", + "dv", + "dz", + "ee", + "el", + "en", + "eo", + "es", + "et", + "eu", + "fa", + "ff", + "fi", + "fj", + "fo", + "fr", + "fy", + "ga", + "gd", + "gl", + "gn", + "gu", + "gv", + "ha", + "he", + "hi", + "ho", + "hr", + "ht", + "hu", + "hy", + "hz", + "ia", + "id", + "ie", + "ig", + "ii", + "ik", + "io", + "is", + "it", + "iu", + "ja", + "jv", + "ka", + "kg", + "ki", + "kj", + "kk", + "kl", + "km", + "kn", + "ko", + "kr", + "ks", + "ku", + "kv", + "kw", + "ky", + "la", + "lb", + "lg", + "li", + "ln", + "lo", + "lt", + "lu", + "lv", + "mg", + "mh", + "mi", + "mk", + "ml", + "mn", + "mr", + "ms", + "mt", + "my", + "na", + "nb", + "nd", + "ne", + "ng", + "nl", + "nn", + "no", + "nr", + "nv", + "ny", + "oc", + "oj", + "om", + "or", + "os", + "pa", + "pi", + "pl", + "ps", + "pt", + "qu", + "rm", + "rn", + "ro", + "ru", + "rw", + "sa", + "sc", + "sd", + "se", + "sg", + "si", + "sk", + "sl", + "sm", + "sn", + "so", + "sq", + "sr", + "ss", + "st", + "su", + "sv", + "sw", + "ta", + "te", + "tg", + "th", + "ti", + "tk", + "tl", + "tn", + "to", + "tr", + "ts", + "tt", + "tw", + "ty", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "wo", + "xh", + "yi", + "yue", + "yo", + "za", + "zh", + "zu" + ] + } }, "languageHintsStrict": { "type": "boolean", - "description": "When enabled, restricts transcription to the language specified in the language field. When disabled, the model can detect and transcribe any of 60+ supported languages. Defaults to true." + "description": "When `true`, Soniox strictly restricts transcription to the languages in `languages` (or the singular `language` if `languages` is unset). When `false`, Soniox biases toward those languages but still allows transcription in other languages. Has no effect when no language hints are sent (e.g., `languages: []` for auto-detect). Defaults to `true` (strict mode)." }, "maxEndpointDelayMs": { "type": "number", @@ -10102,6 +11522,23 @@ "items": { "type": "string" } + }, + "contextGeneral": { + "description": "General context key-value pairs that guide the AI model during transcription. Helps adapt vocabulary to the correct domain, improving accuracy. Recommended: 10 or fewer pairs. Maps to Soniox context.general.", + "example": [ + { + "key": "domain", + "value": "Healthcare" + }, + { + "key": "topic", + "value": "Diabetes management consultation" + } + ], + "type": "array", + "items": { + "$ref": "#/components/schemas/SonioxContextGeneralItem" + } } }, "required": [ @@ -10420,6 +11857,8 @@ "type": "string", "description": "This is the model that will be used for the transcription.", "enum": [ + "gemini-3.5-flash", + "gemini-3.1-flash-lite", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", @@ -10574,6 +12013,58 @@ "model" ] }, + "FallbackXaiTranscriber": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "xai" + ] + }, + "model": { + "type": "string", + "description": "The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection.", + "enum": [ + "default" + ] + }, + "language": { + "type": "string", + "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). Defaults to `en` if not set. xAI auto-detects when omitted via the API but Vapi defaults to English for deterministic behavior.", + "enum": [ + "ar", + "cs", + "da", + "nl", + "en", + "fil", + "fr", + "de", + "hi", + "id", + "it", + "ja", + "ko", + "mk", + "ms", + "fa", + "pl", + "pt", + "ro", + "ru", + "es", + "sv", + "th", + "tr", + "vi" + ] + } + }, + "required": [ + "provider" + ] + }, "LangfuseObservabilityPlan": { "type": "object", "properties": { @@ -10874,7 +12365,7 @@ "enum": [ "request-start" ], - "description": "This message is triggered when the tool call starts.\n\nThis message is never triggered for async tools.\n\nIf this message is not provided, one of the default filler messages \"Hold on a sec\", \"One moment\", \"Just a sec\", \"Give me a moment\" or \"This'll just take a sec\" will be used." + "description": "This message is triggered when the tool call starts.\n\nThis message is never triggered for async tools.\n\nMultiple request-start messages are variants. One eligible variant is selected each time the tool starts.\n\nIf this message is not provided, one of the default filler messages \"Hold on a sec\", \"One moment\", \"Just a sec\", \"Give me a moment\" or \"This'll just take a sec\" will be used." }, "blocking": { "type": "boolean", @@ -10973,9 +12464,17 @@ "request-failed" ] }, + "role": { + "type": "string", + "description": "This is optional and defaults to \"assistant\".\n\nWhen role=assistant, `content` is said out loud when the tool call fails.\n\nWhen role=system, `content` is passed to the model as a system message\nalong with the failure result, and the model's generated response is\nspoken. Example:\n assistant: tool called\n tool: error from your server\n <--- system prompt as hint\n ---> model generates response which is spoken\nThis is useful when you want the model to generate an error-aware\nresponse instead of speaking a fixed failure message.", + "enum": [ + "assistant", + "system" + ] + }, "endCallAfterSpokenEnabled": { "type": "boolean", - "description": "This is an optional boolean that if true, the call will end after the message is spoken. Default is false.\n\n@default false", + "description": "This is an optional boolean that if true, the call will end after the message is spoken. Default is false.\n\nThis is ignored if `role` is set to `system`.\n\n@default false", "example": false }, "content": { @@ -11012,7 +12511,7 @@ }, "type": { "type": "string", - "description": "This message is triggered when the tool call is delayed.\n\nThere are the two things that can trigger this message:\n1. The user talks with the assistant while your server is processing the request. Default is \"Sorry, a few more seconds.\"\n2. The server doesn't respond within `timingMilliseconds`.\n\nThis message is never triggered for async tool calls.", + "description": "This message is triggered when the tool call is delayed. Same timing means variants; different timings mean staged updates.", "enum": [ "request-response-delayed" ] @@ -11022,7 +12521,7 @@ "minimum": 100, "maximum": 120000, "example": 1000, - "description": "The number of milliseconds to wait for the server response before saying this message." + "description": "The number of milliseconds to wait for the server response before saying this delayed message." }, "content": { "type": "string", @@ -11214,7 +12713,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -11266,7 +12765,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -11313,7 +12812,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -11544,17 +13043,17 @@ "OpenAIFunction": { "type": "object", "properties": { - "strict": { - "type": "boolean", - "description": "This is a boolean that controls whether to enable strict schema adherence when generating the function call. If set to true, the model will follow the exact schema defined in the parameters field. Only a subset of JSON Schema is supported when strict is true. Learn more about Structured Outputs in the [OpenAI guide](https://openai.com/index/introducing-structured-outputs-in-the-api/).\n\n@default false", - "default": false - }, "name": { "type": "string", "description": "This is the the name of the function to be called.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64.", "maxLength": 64, "pattern": "/^[a-zA-Z0-9_-]{1,64}$/" }, + "strict": { + "type": "boolean", + "description": "This is a boolean that controls whether to enable strict schema adherence when generating the function call. If set to true, the model will follow the exact schema defined in the parameters field. Only a subset of JSON Schema is supported when strict is true. Learn more about Structured Outputs in the [OpenAI guide](https://openai.com/index/introducing-structured-outputs-in-the-api/).\n\n@default false", + "default": false + }, "description": { "type": "string", "description": "This is the description of what the function does, used by the AI to choose when and how to call the function." @@ -11577,7 +13076,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -11671,7 +13170,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -11733,7 +13232,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -12386,6 +13885,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -12439,6 +13946,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -12501,7 +14012,7 @@ "silenceTimeoutSeconds": { "type": "number", "description": "This is the number of seconds of silence to wait before ending the call. Defaults to 30.\n\n@default 30", - "minimum": 10, + "minimum": 5, "maximum": 3600 } }, @@ -12514,7 +14025,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -12561,7 +14072,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -12848,7 +14359,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -12971,6 +14482,20 @@ "type" ] }, + "ContextEngineeringPlanPreviousAssistantMessages": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "previousAssistantMessages" + ] + } + }, + "required": [ + "type" + ] + }, "HandoffDestinationAssistant": { "type": "object", "properties": { @@ -12998,6 +14523,10 @@ { "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages", "title": "User And Assistant Messages" + }, + { + "$ref": "#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages", + "title": "Previous Assistant Messages" } ] }, @@ -13163,6 +14692,10 @@ { "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages", "title": "User And Assistant Messages" + }, + { + "$ref": "#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages", + "title": "Previous Assistant Messages" } ] }, @@ -13212,7 +14745,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13330,6 +14863,8 @@ "type": "string", "description": "The model to use for the knowledge base", "enum": [ + "gemini-3.5-flash", + "gemini-3.1-flash-lite", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", @@ -13371,7 +14906,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13425,7 +14960,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13472,7 +15007,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13519,7 +15054,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13566,7 +15101,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13617,7 +15152,7 @@ }, "messages": { "type": "array", - "description": "Custom messages for this specific tool. Set to an empty array to suppress all messages for this tool. If not provided, the tool will use the default messages from the parent MCP tool configuration.", + "description": "Custom messages for this specific tool. Set to an empty array to suppress all messages for this tool. If not provided, the tool will use the default messages from the parent MCP tool configuration. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13662,7 +15197,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13727,7 +15262,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13774,7 +15309,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13821,7 +15356,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -13868,7 +15403,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -14072,7 +15607,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -14281,7 +15816,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -14456,7 +15991,8 @@ "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6", - "claude-haiku-4-5-20251001" + "claude-haiku-4-5-20251001", + "global.anthropic.claude-haiku-4-5-20251001-v1:0" ] }, "thinking": { @@ -14469,7 +16005,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -14636,7 +16172,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -14833,7 +16369,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -14997,7 +16533,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -15164,7 +16700,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -15388,6 +16924,8 @@ "type": "string", "description": "This is the Google model that will be used.", "enum": [ + "gemini-3.5-flash", + "gemini-3.1-flash-lite", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", @@ -15421,7 +16959,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -15601,7 +17139,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -15767,7 +17305,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -15933,7 +17471,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -16123,6 +17661,7 @@ "gpt-4o-mini-realtime-preview-2024-12-17", "gpt-realtime-2025-08-28", "gpt-realtime-mini-2025-12-15", + "gpt-realtime-2", "gpt-4o-mini-2024-07-18", "gpt-4o-mini", "gpt-4o", @@ -16212,7 +17751,10 @@ "gpt-3.5-turbo-0125:northcentralus", "gpt-3.5-turbo-0125:southcentralus", "gpt-3.5-turbo-1106:canadaeast", - "gpt-3.5-turbo-1106:westus" + "gpt-3.5-turbo-1106:westus", + "gpt-4.1:australiaeast", + "gpt-4o:australiaeast", + "gpt-5.4-mini:australiaeast" ] }, "fallbackModels": { @@ -16253,6 +17795,7 @@ "gpt-4o-mini-realtime-preview-2024-12-17", "gpt-realtime-2025-08-28", "gpt-realtime-mini-2025-12-15", + "gpt-realtime-2", "gpt-4o-mini-2024-07-18", "gpt-4o-mini", "gpt-4o", @@ -16342,7 +17885,10 @@ "gpt-3.5-turbo-0125:northcentralus", "gpt-3.5-turbo-0125:southcentralus", "gpt-3.5-turbo-1106:canadaeast", - "gpt-3.5-turbo-1106:westus" + "gpt-3.5-turbo-1106:westus", + "gpt-4.1:australiaeast", + "gpt-4o:australiaeast", + "gpt-5.4-mini:australiaeast" ] } }, @@ -16367,9 +17913,19 @@ "description": "This is the prompt cache key for models that support extended caching (GPT-4.1, GPT-5 series).\n\nProviding a cache key allows you to share cached prefixes across requests.\n\n@default undefined", "maxLength": 64 }, + "reasoningEffort": { + "type": "string", + "description": "Reasoning effort for reasoning-capable OpenAI models.\nFor `gpt-realtime-2`: forwarded to V2 stream's session.update as `reasoning.effort`.\nFor non-realtime OpenAI models: routed through `modelSpecificOverridesGet` (openAIUtil.ts:622-726).\nNarrower than CompletionRequestParams.reasoningEffort intentionally: 'none' is an internal-only override value set by modelSpecificOverridesGet for GPT-5 family, not user-settable via DTO.", + "enum": [ + "minimal", + "low", + "medium", + "high" + ] + }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -16532,7 +18088,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -16695,7 +18251,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -16858,7 +18414,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -17037,7 +18593,10 @@ "gpt-3.5-turbo-0125:northcentralus", "gpt-3.5-turbo-0125:southcentralus", "gpt-3.5-turbo-1106:canadaeast", - "gpt-3.5-turbo-1106:westus" + "gpt-3.5-turbo-1106:westus", + "gpt-4.1:australiaeast", + "gpt-4o:australiaeast", + "gpt-5.4-mini:australiaeast" ] }, "temperature": { @@ -17143,7 +18702,8 @@ "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929", "claude-sonnet-4-6", - "claude-haiku-4-5-20251001" + "claude-haiku-4-5-20251001", + "global.anthropic.claude-haiku-4-5-20251001-v1:0" ] }, "thinking": { @@ -17187,6 +18747,8 @@ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", "maxLength": 100, "enum": [ + "gemini-3.5-flash", + "gemini-3.1-flash-lite", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", @@ -17380,6 +18942,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -17457,6 +19023,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -17977,7 +19551,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -18065,6 +19639,28 @@ "say" ] }, + "exact": { + "description": "This is the exact message to say. When a string array is provided, one is randomly selected.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "examples": [ + "Are you still there?", + [ + "I didn't catch that.", + "Could you repeat that?", + "Are you still there?" + ] + ] + }, "prompt": { "description": "This is the prompt for the assistant to generate a response based on existing conversation.\nCan be a string or an array of chat messages.", "oneOf": [ @@ -18110,10 +19706,6 @@ } ] ] - }, - "exact": { - "type": "object", - "description": "This is the message to say" } }, "required": [ @@ -18417,9 +20009,17 @@ "CustomerSpeechTimeoutOptions": { "type": "object", "properties": { + "triggerResetMode": { + "type": "string", + "description": "This is whether the counter for hook trigger resets the user speaks.\n\n@default never", + "enum": [ + "onUserSpeech", + "never" + ] + }, "timeoutSeconds": { "type": "number", - "description": "This is the timeout in seconds before action is triggered.\nThe clock starts when the assistant finishes speaking and remains active until the user speaks.\n\n@default 7.5", + "description": "This is the timeout in seconds before action is triggered.\nThe clock starts when the assistant finishes speaking and remains active until the user speaks.\n\n@default 7.5\n@minimum 2\n@maximum 1000", "minimum": 1, "maximum": 1000 }, @@ -18428,10 +20028,6 @@ "description": "This is the maximum number of times the hook will trigger in a call.\n\n@default 3", "minimum": 1, "maximum": 10 - }, - "triggerResetMode": { - "type": "object", - "description": "This is whether the counter for hook trigger resets the user speaks.\n\n@default never" } }, "required": [ @@ -18657,9 +20253,27 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, + "firstMessageMode": { + "type": "string", + "description": "This controls whether the consent assistant speaks first or waits for the caller to speak first.\n\nUse:\n- `assistant-speaks-first` (default) to have the consent assistant play the consent message as soon as the call is answered.\n- `assistant-waits-for-user` to have the consent assistant wait for the caller to speak before playing the consent message.\n\nWe strongly recommend `assistant-waits-for-user` for outbound calls. Some telephony providers signal \"answered\" while the line is still ringing, which can cause the consent message to play into a ringing line and be missed by the caller. Waiting for the caller to speak first guarantees they hear the full consent message.\n\nNote: when combined with `type: 'stay-on-line'`, silence only counts toward consent after the caller has spoken at least once.\n\n@default 'assistant-speaks-first'", + "enum": [ + "assistant-speaks-first", + "assistant-waits-for-user" + ], + "default": "assistant-speaks-first", + "example": "assistant-speaks-first" + }, "type": { "type": "string", "description": "This is the type of recording consent plan. This type assumes consent is granted if the user stays on the line.", @@ -18768,9 +20382,27 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, + "firstMessageMode": { + "type": "string", + "description": "This controls whether the consent assistant speaks first or waits for the caller to speak first.\n\nUse:\n- `assistant-speaks-first` (default) to have the consent assistant play the consent message as soon as the call is answered.\n- `assistant-waits-for-user` to have the consent assistant wait for the caller to speak before playing the consent message.\n\nWe strongly recommend `assistant-waits-for-user` for outbound calls. Some telephony providers signal \"answered\" while the line is still ringing, which can cause the consent message to play into a ringing line and be missed by the caller. Waiting for the caller to speak first guarantees they hear the full consent message.\n\nNote: when combined with `type: 'stay-on-line'`, silence only counts toward consent after the caller has spoken at least once.\n\n@default 'assistant-speaks-first'", + "enum": [ + "assistant-speaks-first", + "assistant-waits-for-user" + ], + "default": "assistant-speaks-first", + "example": "assistant-speaks-first" + }, "type": { "type": "string", "description": "This is the type of recording consent plan. This type assumes consent is granted if the user verbally consents or declines.", @@ -19134,24 +20766,108 @@ "schema" ] }, - "ScorecardMetric": { + "NumberComparatorScorecardMetricCondition": { "type": "object", "properties": { - "structuredOutputId": { + "type": { "type": "string", - "description": "This is the unique identifier for the structured output that will be used to evaluate the scorecard.\nThe structured output must be of type number or boolean only for now." + "description": "This is the type of the condition. Currently only 'comparator' is supported.", + "enum": [ + "comparator" + ] + }, + "comparator": { + "type": "string", + "description": "This is the comparator that will be used to compare the result of the structured output with the value specified.\nOnly '=', '!=', '>', '<', '>=', and '<=' are supported for number conditions\nOnly '=' is supported for boolean conditions.", + "enum": [ + "=", + "!=", + ">", + "<", + ">=", + "<=" + ] + }, + "value": { + "type": "number", + "description": "This is the value that will be used to compare the result of the structured output with the comparator.\nIf the result of the comparison is true, the points will be added to the overall score." + }, + "points": { + "type": "number", + "description": "These are the points that will be added to the overall score if the condition is met.\nThe points must be between 0 and 100.", + "minimum": 0, + "maximum": 100 + } + }, + "required": [ + "type", + "comparator", + "value", + "points" + ] + }, + "BooleanComparatorScorecardMetricCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of the condition. Currently only 'comparator' is supported.", + "enum": [ + "comparator" + ] + }, + "comparator": { + "type": "string", + "description": "The comparator can only be '=' for boolean conditions.", + "enum": [ + "=" + ] }, + "value": { + "type": "boolean", + "description": "This is the value that will be used to compare the result of the structured output with the comparator.\nIf the result of the comparison is true, the points will be added to the overall score." + }, + "points": { + "type": "number", + "description": "These are the points that will be added to the overall score if the condition is met.\nThe points must be between 0 and 100.", + "minimum": 0, + "maximum": 100 + } + }, + "required": [ + "type", + "comparator", + "value", + "points" + ] + }, + "ScorecardMetric": { + "type": "object", + "properties": { "conditions": { - "description": "These are the conditions that will be used to evaluate the scorecard.\nEach condition will have a comparator, value, and points that will be used to calculate the final score.\nThe points will be added to the overall score if the condition is met.\nThe overall score will be normalized to a 100 point scale to ensure uniformity across different scorecards.", "type": "array", + "description": "These are the conditions that will be used to evaluate the scorecard.\nEach condition will have a comparator, value, and points that will be used to calculate the final score.\nThe points will be added to the overall score if the condition is met.\nThe overall score will be normalized to a 100 point scale to ensure uniformity across different scorecards.", "items": { - "type": "object" + "oneOf": [ + { + "$ref": "#/components/schemas/NumberComparatorScorecardMetricCondition", + "title": "NumberComparatorScorecardMetricCondition" + }, + { + "$ref": "#/components/schemas/BooleanComparatorScorecardMetricCondition", + "title": "BooleanComparatorScorecardMetricCondition" + } + ] } + }, + "structuredOutputId": { + "type": "string", + "description": "This is the unique identifier for the structured output that will be used to evaluate the scorecard.\nThe structured output must be of type number or boolean only for now." } }, "required": [ - "structuredOutputId", - "conditions" + "conditions", + "structuredOutputId" ] }, "CreateScorecardDTO": { @@ -19574,6 +21290,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -19651,6 +21371,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -19672,7 +21400,7 @@ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ { - "type": "enum", + "type": "string", "enum": [ "off", "office" @@ -19879,10 +21607,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -19903,6 +21627,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -19987,12 +21715,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -20296,7 +22024,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -20455,7 +22183,10 @@ "grok-2", "grok-3", "grok-4-fast-reasoning", - "grok-4-fast-non-reasoning" + "grok-4-fast-non-reasoning", + "grok-4.20-0309-reasoning", + "grok-4.20-0309-non-reasoning", + "grok-4.3" ] }, "provider": { @@ -20466,7 +22197,7 @@ }, "temperature": { "type": "number", - "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, "maximum": 2 }, @@ -20789,6 +22520,14 @@ { "$ref": "#/components/schemas/FallbackInworldVoice", "title": "Inworld" + }, + { + "$ref": "#/components/schemas/FallbackXaiVoice", + "title": "xAI" + }, + { + "$ref": "#/components/schemas/FallbackMicrosoftVoice", + "title": "Microsoft" } ] } @@ -20980,6 +22719,8 @@ "type": "string", "description": "This is the model that will be used. This is optional and will default to the correct model for the voiceId.", "enum": [ + "sonic-3.5", + "sonic-3.5-2026-05-04", "sonic-3", "sonic-3-2026-01-12", "sonic-3-2025-10-27", @@ -22827,25 +24568,25 @@ "enum": [ "Clara", "Godfrey", + "Elliot", + "Savannah", + "Nico", + "Kai", + "Emma", + "Sagar", + "Neil", "Layla", "Sid", "Gustavo", - "Elliot", "Kylie", "Rohan", "Lily", - "Savannah", "Hana", "Neha", "Cole", "Harry", "Paige", "Spencer", - "Nico", - "Kai", - "Emma", - "Sagar", - "Neil", "Naina", "Leah", "Tara", @@ -22857,6 +24598,14 @@ "Zoe" ] }, + "version": { + "type": "number", + "description": "The Vapi voice routing generation. Version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used.", + "enum": [ + 1, + 2 + ] + }, "speed": { "type": "number", "description": "This is the speed multiplier that will be used.\n\n@default 1", @@ -22864,6 +24613,69 @@ "maximum": 2, "default": 1 }, + "language": { + "type": "string", + "description": "Language for Vapi voice synthesis. For Version 2, omit this field or set `auto` for automatic language detection. Version 1 supports legacy Vapi language values.", + "enum": [ + "en-US", + "en-GB", + "en-AU", + "en-CA", + "ja", + "zh", + "de", + "hi", + "fr-FR", + "fr-CA", + "ko", + "pt-BR", + "pt-PT", + "it", + "es-ES", + "es-MX", + "id", + "nl", + "tr", + "fil", + "pl", + "sv", + "bg", + "ro", + "ar-SA", + "ar-AE", + "cs", + "el", + "fi", + "hr", + "ms", + "sk", + "da", + "ta", + "uk", + "ru", + "hu", + "no", + "vi", + "auto", + "en", + "ar", + "ar-EG", + "bn", + "es", + "fr", + "gu", + "he", + "ka", + "kn", + "ml", + "mr", + "pa", + "pt", + "te", + "th", + "tl" + ] + }, "pronunciationDictionary": { "description": "List of pronunciation dictionary locators for custom word pronunciations.", "type": "array", @@ -23402,6 +25214,248 @@ "voiceId" ] }, + "XaiVoice": { + "type": "object", + "properties": { + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true + }, + "provider": { + "type": "string", + "description": "This is the voice provider that will be used.", + "enum": [ + "xai" + ] + }, + "voiceId": { + "type": "string", + "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.", + "maxLength": 120, + "title": "xAI Voice ID", + "enum": [ + "eve", + "ara", + "rex", + "sal", + "leo" + ], + "example": "eve" + }, + "language": { + "type": "string", + "description": "BCP-47 language code for xAI TTS synthesis.", + "enum": [ + "auto", + "en", + "ar-EG", + "ar-SA", + "ar-AE", + "bn", + "zh", + "fr", + "de", + "hi", + "id", + "it", + "ja", + "ko", + "pt-BR", + "pt-PT", + "ru", + "es-MX", + "es-ES", + "tr", + "vi" + ], + "default": "en" + }, + "speed": { + "type": "number", + "description": "Speed multiplier for xAI TTS synthesis.", + "minimum": 0.7, + "maximum": 1.5, + "default": 1.1 + }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ + { + "$ref": "#/components/schemas/ChunkPlan" + } + ] + }, + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", + "allOf": [ + { + "$ref": "#/components/schemas/FallbackPlan" + } + ] + } + }, + "required": [ + "provider", + "voiceId" + ] + }, + "MicrosoftVoice": { + "type": "object", + "properties": { + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true + }, + "provider": { + "type": "string", + "description": "This is the voice provider that will be used.", + "enum": [ + "microsoft" + ] + }, + "voiceId": { + "type": "string", + "description": "MAI-Voice-2 voice ID. Built-in voices listed in enum.", + "enum": [ + "de-DE-Klaus:MAI-Voice-2", + "de-DE-Mia:MAI-Voice-2", + "en-AU-Lisa:MAI-Voice-2", + "en-US-Ethan:MAI-Voice-2", + "en-US-Grant:MAI-Voice-2", + "en-US-Harper:MAI-Voice-2", + "en-US-Iris:MAI-Voice-2", + "en-US-Jasper:MAI-Voice-2", + "en-US-Olivia:MAI-Voice-2", + "es-ES-Marta:MAI-Voice-2", + "es-MX-Alejo:MAI-Voice-2", + "es-MX-Valeria:MAI-Voice-2", + "fr-FR-Marc:MAI-Voice-2", + "fr-FR-Soleil:MAI-Voice-2", + "hi-IN-Arjun:MAI-Voice-2", + "hi-IN-Dhruv:MAI-Voice-2", + "hi-IN-Kavya:MAI-Voice-2", + "hi-IN-Priya:MAI-Voice-2", + "hu-HU-Bence:MAI-Voice-2", + "hu-HU-Levente:MAI-Voice-2", + "hu-HU-Lilla:MAI-Voice-2", + "hu-HU-Réka:MAI-Voice-2", + "it-IT-Luca:MAI-Voice-2", + "it-IT-Rosa:MAI-Voice-2", + "ko-KR-Hana:MAI-Voice-2", + "ko-KR-Junho:MAI-Voice-2", + "nl-NL-Fleur:MAI-Voice-2", + "nl-NL-Sander:MAI-Voice-2", + "pt-BR-Caio:MAI-Voice-2", + "pt-BR-Luana:MAI-Voice-2", + "pt-BR-Pedro:MAI-Voice-2", + "pt-BR-Rafael:MAI-Voice-2", + "pt-PT-Rui:MAI-Voice-2", + "ro-RO-Andrei:MAI-Voice-2", + "ro-RO-Elena:MAI-Voice-2", + "ro-RO-Ioana:MAI-Voice-2", + "ro-RO-Radu:MAI-Voice-2", + "ru-RU-Lev:MAI-Voice-2", + "ru-RU-Masha:MAI-Voice-2", + "th-TH-Krit:MAI-Voice-2", + "th-TH-Nattapong:MAI-Voice-2", + "tr-TR-Aydin:MAI-Voice-2", + "tr-TR-Elif:MAI-Voice-2", + "zh-CN-Bo:MAI-Voice-2", + "zh-CN-Lan:MAI-Voice-2", + "zh-CN-Mei:MAI-Voice-2" + ], + "example": "en-US-Ethan:MAI-Voice-2" + }, + "style": { + "type": "string", + "description": "Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.", + "enum": [ + "adventurous", + "angry", + "caring", + "cheerful", + "confused", + "curious", + "determined", + "disappointed", + "disgusted", + "embarrassed", + "empathy", + "encouraging", + "excited", + "fearful", + "friendly", + "happy", + "hopeful", + "jealous", + "joyful", + "nostalgic", + "reflective", + "regretful", + "relieved", + "sad", + "serious", + "shouting", + "softvoice", + "surprised", + "whispering" + ], + "example": "happy" + }, + "styleDegree": { + "type": "number", + "description": "Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set.", + "minimum": 0.01, + "maximum": 2, + "default": 1 + }, + "role": { + "type": "string", + "description": "Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.", + "enum": [ + "Girl", + "Boy", + "YoungAdultFemale", + "YoungAdultMale", + "OlderAdultFemale", + "OlderAdultMale", + "SeniorFemale", + "SeniorMale" + ], + "example": "YoungAdultFemale" + }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ + { + "$ref": "#/components/schemas/ChunkPlan" + } + ] + }, + "speed": { + "type": "number", + "description": "This is the speed multiplier that will be used.", + "minimum": 0.5, + "maximum": 2 + }, + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", + "allOf": [ + { + "$ref": "#/components/schemas/FallbackPlan" + } + ] + } + }, + "required": [ + "provider", + "voiceId" + ] + }, "FallbackAzureVoice": { "type": "object", "properties": { @@ -23480,6 +25534,8 @@ "type": "string", "description": "This is the model that will be used. This is optional and will default to the correct model for the voiceId.", "enum": [ + "sonic-3.5", + "sonic-3.5-2026-05-04", "sonic-3", "sonic-3-2026-01-12", "sonic-3-2025-10-27", @@ -25080,25 +27136,25 @@ "enum": [ "Clara", "Godfrey", + "Elliot", + "Savannah", + "Nico", + "Kai", + "Emma", + "Sagar", + "Neil", "Layla", "Sid", "Gustavo", - "Elliot", "Kylie", "Rohan", "Lily", - "Savannah", "Hana", "Neha", "Cole", "Harry", "Paige", "Spencer", - "Nico", - "Kai", - "Emma", - "Sagar", - "Neil", "Naina", "Leah", "Tara", @@ -25110,6 +27166,14 @@ "Zoe" ] }, + "version": { + "type": "number", + "description": "The Vapi voice routing generation. Version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used.", + "enum": [ + 1, + 2 + ] + }, "speed": { "type": "number", "description": "This is the speed multiplier that will be used.\n\n@default 1", @@ -25117,6 +27181,69 @@ "maximum": 2, "default": 1 }, + "language": { + "type": "string", + "description": "Language for Vapi voice synthesis. For Version 2, omit this field or set `auto` for automatic language detection. Version 1 supports legacy Vapi language values.", + "enum": [ + "en-US", + "en-GB", + "en-AU", + "en-CA", + "ja", + "zh", + "de", + "hi", + "fr-FR", + "fr-CA", + "ko", + "pt-BR", + "pt-PT", + "it", + "es-ES", + "es-MX", + "id", + "nl", + "tr", + "fil", + "pl", + "sv", + "bg", + "ro", + "ar-SA", + "ar-AE", + "cs", + "el", + "fi", + "hr", + "ms", + "sk", + "da", + "ta", + "uk", + "ru", + "hu", + "no", + "vi", + "auto", + "en", + "ar", + "ar-EG", + "bn", + "es", + "fr", + "gu", + "he", + "ka", + "kn", + "ml", + "mr", + "pa", + "pt", + "te", + "th", + "tl" + ] + }, "pronunciationDictionary": { "description": "List of pronunciation dictionary locators for custom word pronunciations.", "type": "array", @@ -25288,6 +27415,232 @@ "voiceId" ] }, + "FallbackXaiVoice": { + "type": "object", + "properties": { + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true + }, + "provider": { + "type": "string", + "description": "This is the voice provider that will be used.", + "enum": [ + "xai" + ] + }, + "voiceId": { + "type": "string", + "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.", + "maxLength": 120, + "title": "xAI Voice ID", + "enum": [ + "eve", + "ara", + "rex", + "sal", + "leo" + ], + "example": "eve" + }, + "language": { + "type": "string", + "description": "BCP-47 language code for xAI TTS synthesis.", + "enum": [ + "auto", + "en", + "ar-EG", + "ar-SA", + "ar-AE", + "bn", + "zh", + "fr", + "de", + "hi", + "id", + "it", + "ja", + "ko", + "pt-BR", + "pt-PT", + "ru", + "es-MX", + "es-ES", + "tr", + "vi" + ], + "default": "en" + }, + "speed": { + "type": "number", + "description": "Speed multiplier for xAI TTS synthesis.", + "minimum": 0.7, + "maximum": 1.5, + "default": 1.1 + }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ + { + "$ref": "#/components/schemas/ChunkPlan" + } + ] + } + }, + "required": [ + "provider", + "voiceId" + ] + }, + "FallbackMicrosoftVoice": { + "type": "object", + "properties": { + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true + }, + "provider": { + "type": "string", + "description": "This is the voice provider that will be used.", + "enum": [ + "microsoft" + ] + }, + "voiceId": { + "type": "string", + "description": "MAI-Voice-2 voice ID. Built-in voices listed in enum.", + "enum": [ + "de-DE-Klaus:MAI-Voice-2", + "de-DE-Mia:MAI-Voice-2", + "en-AU-Lisa:MAI-Voice-2", + "en-US-Ethan:MAI-Voice-2", + "en-US-Grant:MAI-Voice-2", + "en-US-Harper:MAI-Voice-2", + "en-US-Iris:MAI-Voice-2", + "en-US-Jasper:MAI-Voice-2", + "en-US-Olivia:MAI-Voice-2", + "es-ES-Marta:MAI-Voice-2", + "es-MX-Alejo:MAI-Voice-2", + "es-MX-Valeria:MAI-Voice-2", + "fr-FR-Marc:MAI-Voice-2", + "fr-FR-Soleil:MAI-Voice-2", + "hi-IN-Arjun:MAI-Voice-2", + "hi-IN-Dhruv:MAI-Voice-2", + "hi-IN-Kavya:MAI-Voice-2", + "hi-IN-Priya:MAI-Voice-2", + "hu-HU-Bence:MAI-Voice-2", + "hu-HU-Levente:MAI-Voice-2", + "hu-HU-Lilla:MAI-Voice-2", + "hu-HU-Réka:MAI-Voice-2", + "it-IT-Luca:MAI-Voice-2", + "it-IT-Rosa:MAI-Voice-2", + "ko-KR-Hana:MAI-Voice-2", + "ko-KR-Junho:MAI-Voice-2", + "nl-NL-Fleur:MAI-Voice-2", + "nl-NL-Sander:MAI-Voice-2", + "pt-BR-Caio:MAI-Voice-2", + "pt-BR-Luana:MAI-Voice-2", + "pt-BR-Pedro:MAI-Voice-2", + "pt-BR-Rafael:MAI-Voice-2", + "pt-PT-Rui:MAI-Voice-2", + "ro-RO-Andrei:MAI-Voice-2", + "ro-RO-Elena:MAI-Voice-2", + "ro-RO-Ioana:MAI-Voice-2", + "ro-RO-Radu:MAI-Voice-2", + "ru-RU-Lev:MAI-Voice-2", + "ru-RU-Masha:MAI-Voice-2", + "th-TH-Krit:MAI-Voice-2", + "th-TH-Nattapong:MAI-Voice-2", + "tr-TR-Aydin:MAI-Voice-2", + "tr-TR-Elif:MAI-Voice-2", + "zh-CN-Bo:MAI-Voice-2", + "zh-CN-Lan:MAI-Voice-2", + "zh-CN-Mei:MAI-Voice-2" + ], + "example": "en-US-Ethan:MAI-Voice-2" + }, + "style": { + "type": "string", + "description": "Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.", + "enum": [ + "adventurous", + "angry", + "caring", + "cheerful", + "confused", + "curious", + "determined", + "disappointed", + "disgusted", + "embarrassed", + "empathy", + "encouraging", + "excited", + "fearful", + "friendly", + "happy", + "hopeful", + "jealous", + "joyful", + "nostalgic", + "reflective", + "regretful", + "relieved", + "sad", + "serious", + "shouting", + "softvoice", + "surprised", + "whispering" + ], + "example": "happy" + }, + "styleDegree": { + "type": "number", + "description": "Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set.", + "minimum": 0.01, + "maximum": 2, + "default": 1 + }, + "role": { + "type": "string", + "description": "Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.", + "enum": [ + "Girl", + "Boy", + "YoungAdultFemale", + "YoungAdultMale", + "OlderAdultFemale", + "OlderAdultMale", + "SeniorFemale", + "SeniorMale" + ], + "example": "YoungAdultFemale" + }, + "speed": { + "type": "number", + "description": "This is the speed multiplier that will be used.", + "minimum": 0.5, + "maximum": 2 + }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ + { + "$ref": "#/components/schemas/ChunkPlan" + } + ] + } + }, + "required": [ + "provider", + "voiceId" + ] + }, "TransportConfigurationTwilio": { "type": "object", "properties": { @@ -25364,6 +27717,7 @@ "enum": [ "us-east-1", "us-west-2", + "eu-central-1", "eu-west-1", "eu-west-3", "ap-northeast-1", @@ -25605,7 +27959,10 @@ "gpt-4-1106-preview", "gpt-4-0613", "gpt-35-turbo-0125", - "gpt-35-turbo-1106" + "gpt-35-turbo-1106", + "gpt-4o", + "gpt-4.1", + "gpt-5.4-mini-2026-03-17" ], "example": [ "gpt-4-0125-preview", @@ -25636,7 +27993,10 @@ "gpt-4-1106-preview", "gpt-4-0613", "gpt-35-turbo-0125", - "gpt-35-turbo-1106" + "gpt-35-turbo-1106", + "gpt-4o", + "gpt-4.1", + "gpt-5.4-mini-2026-03-17" ] } }, @@ -25823,6 +28183,10 @@ "type": "string", "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -26070,6 +28434,15 @@ "maxLength": 10000, "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "enum": [ + "https://api.elevenlabs.io", + "https://api.eu.residency.elevenlabs.io" + ], + "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.", + "nullable": true + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -27249,6 +29622,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -27395,6 +29772,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -27807,10 +30192,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -27831,6 +30212,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -27915,12 +30300,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -28219,6 +30604,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -28365,6 +30754,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -28777,10 +31174,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -28801,6 +31194,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -28885,12 +31282,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -29086,6 +31483,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -29232,6 +31633,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -29644,10 +32053,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -29668,6 +32073,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -29752,12 +32161,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -29936,6 +32345,23 @@ "currentPage": { "type": "number" }, + "totalPages": { + "type": "number" + }, + "hasNextPage": { + "type": "boolean" + }, + "nextCursor": { + "type": "string", + "description": "Opaque cursor for the next page under keyset pagination (PRO-3163). Pass it\nback as the `cursor` query param to fetch the next page without an OFFSET\nscan. Present only when a further page likely exists." + }, + "sortOrder": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + }, "itemsBeyondRetention": { "type": "boolean" }, @@ -30043,6 +32469,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -30189,6 +32619,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -30601,10 +33039,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -30625,6 +33059,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -30709,12 +33147,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -31026,6 +33464,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -31103,6 +33545,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -31124,7 +33574,7 @@ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ { - "type": "enum", + "type": "string", "enum": [ "off", "office" @@ -31331,10 +33781,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -31355,6 +33801,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -31439,12 +33889,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -31709,6 +34159,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -31786,6 +34240,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -31807,7 +34269,7 @@ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ { - "type": "enum", + "type": "string", "enum": [ "off", "office" @@ -32014,10 +34476,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -32038,6 +34496,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -32122,12 +34584,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -32374,6 +34836,10 @@ { "$ref": "#/components/schemas/SonioxTranscriber", "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" } ] }, @@ -32451,6 +34917,14 @@ { "$ref": "#/components/schemas/MinimaxVoice", "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" } ] }, @@ -32472,7 +34946,7 @@ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ { - "type": "enum", + "type": "string", "enum": [ "off", "office" @@ -32679,10 +35153,6 @@ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", "title": "TogetherAICredential" }, - { - "$ref": "#/components/schemas/CreateTrieveCredentialDTO", - "title": "TrieveCredential" - }, { "$ref": "#/components/schemas/CreateTwilioCredentialDTO", "title": "TwilioCredential" @@ -32703,6 +35173,10 @@ "$ref": "#/components/schemas/CreateXAiCredentialDTO", "title": "XAiCredential" }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, { "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "title": "GoogleCalendarOAuth2ClientCredential" @@ -32787,12 +35261,12 @@ "webhook": "#/components/schemas/CreateWebhookCredentialDTO", "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", "hume": "#/components/schemas/CreateHumeCredentialDTO", "mistral": "#/components/schemas/CreateMistralCredentialDTO", "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", "soniox": "#/components/schemas/CreateSonioxCredentialDTO", - "trieve": "#/components/schemas/CreateTrieveCredentialDTO", "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", @@ -32959,6 +35433,784 @@ } } }, + "UserMessage": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "The role of the user in the conversation." + }, + "message": { + "type": "string", + "description": "The message content from the user." + }, + "time": { + "type": "number", + "description": "The timestamp when the message was sent." + }, + "endTime": { + "type": "number", + "description": "The timestamp when the message ended." + }, + "secondsFromStart": { + "type": "number", + "description": "The number of seconds from the start of the conversation." + }, + "duration": { + "type": "number", + "description": "The duration of the message in seconds." + }, + "isFiltered": { + "type": "boolean", + "description": "Indicates if the message was filtered for security reasons." + }, + "detectedThreats": { + "description": "List of detected security threats if the message was filtered.", + "type": "array", + "items": { + "type": "string" + } + }, + "originalMessage": { + "type": "string", + "description": "The original message before filtering (only included if content was filtered)." + }, + "metadata": { + "type": "object", + "description": "The metadata associated with the message. Currently used to store the transcriber's word level confidence." + }, + "speakerLabel": { + "type": "string", + "description": "Stable speaker label for diarized user speakers (e.g., \"Speaker 1\")." + } + }, + "required": [ + "role", + "message", + "time", + "endTime", + "secondsFromStart" + ] + }, + "SystemMessage": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "The role of the system in the conversation." + }, + "message": { + "type": "string", + "description": "The message content from the system." + }, + "time": { + "type": "number", + "description": "The timestamp when the message was sent." + }, + "secondsFromStart": { + "type": "number", + "description": "The number of seconds from the start of the conversation." + } + }, + "required": [ + "role", + "message", + "time", + "secondsFromStart" + ] + }, + "BotMessage": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "The role of the bot in the conversation." + }, + "message": { + "type": "string", + "description": "The message content from the bot." + }, + "time": { + "type": "number", + "description": "The timestamp when the message was sent." + }, + "endTime": { + "type": "number", + "description": "The timestamp when the message ended." + }, + "secondsFromStart": { + "type": "number", + "description": "The number of seconds from the start of the conversation." + }, + "source": { + "type": "string", + "description": "The source of the message." + }, + "duration": { + "type": "number", + "description": "The duration of the message in seconds." + }, + "assistantName": { + "type": "string", + "description": "The name of the assistant that produced this message. In a squad or\nhandoff call this is the specific sub-agent active when the message was\nspoken, letting the transcript label each message by speaker." + }, + "assistantId": { + "type": "string", + "description": "The ID of the assistant that produced this message. Stable reference for\nthe assistant named in `assistantName`." + } + }, + "required": [ + "role", + "message", + "time", + "endTime", + "secondsFromStart" + ] + }, + "ToolCallMessage": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "The role of the tool call in the conversation." + }, + "toolCalls": { + "description": "The list of tool calls made during the conversation.", + "type": "array", + "items": { + "type": "object" + } + }, + "message": { + "type": "string", + "description": "The message content for the tool call." + }, + "time": { + "type": "number", + "description": "The timestamp when the message was sent." + }, + "secondsFromStart": { + "type": "number", + "description": "The number of seconds from the start of the conversation." + } + }, + "required": [ + "role", + "toolCalls", + "message", + "time", + "secondsFromStart" + ] + }, + "ToolCallResultMessageWarning": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The kind of warning. Currently:\n- `oversized-tool-response`: the tool's serialized response exceeded the\n recommended size and is likely to bloat the model context, increasing\n latency and risking truncation of earlier instructions.", + "enum": [ + "oversized-tool-response" + ] + }, + "tokenCount": { + "type": "number", + "description": "The estimated number of tokens in the serialized tool response." + }, + "threshold": { + "type": "number", + "description": "The threshold (in tokens) above which the warning is raised." + } + }, + "required": [ + "type", + "tokenCount", + "threshold" + ] + }, + "ToolCallResultMessage": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "The role of the tool call result in the conversation." + }, + "toolCallId": { + "type": "string", + "description": "The ID of the tool call." + }, + "name": { + "type": "string", + "description": "The name of the tool that returned the result." + }, + "result": { + "type": "string", + "description": "The result of the tool call in JSON format." + }, + "time": { + "type": "number", + "description": "The timestamp when the message was sent." + }, + "secondsFromStart": { + "type": "number", + "description": "The number of seconds from the start of the conversation." + }, + "metadata": { + "type": "object", + "description": "The metadata for the tool call result." + }, + "warnings": { + "description": "Warnings raised for this tool call result, e.g. when the response is\nlarger than recommended for voice AI context windows.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolCallResultMessageWarning" + } + } + }, + "required": [ + "role", + "toolCallId", + "name", + "result", + "time", + "secondsFromStart" + ] + }, + "TransportCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'transport' for this class.", + "enum": [ + "transport" + ] + }, + "provider": { + "type": "string", + "enum": [ + "daily", + "vapi.websocket", + "twilio", + "vonage", + "telnyx", + "vapi.sip" + ] + }, + "minutes": { + "type": "number", + "description": "This is the minutes of `transport` usage. This should match `call.endedAt` - `call.startedAt`." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "minutes", + "cost" + ] + }, + "TranscriberCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'transcriber' for this class.", + "enum": [ + "transcriber" + ] + }, + "transcriber": { + "type": "object", + "description": "This is the transcriber that was used during the call.\n\nThis matches one of the below:\n- `call.assistant.transcriber`,\n- `call.assistantId->transcriber`,\n- `call.squad[n].assistant.transcriber`,\n- `call.squad[n].assistantId->transcriber`,\n- `call.squadId->[n].assistant.transcriber`,\n- `call.squadId->[n].assistantId->transcriber`." + }, + "minutes": { + "type": "number", + "description": "This is the minutes of `transcriber` usage. This should match `call.endedAt` - `call.startedAt` for single assistant calls, while squad calls will have multiple transcriber costs one for each assistant that was used." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "transcriber", + "minutes", + "cost" + ] + }, + "ModelCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'model' for this class.", + "enum": [ + "model" + ] + }, + "model": { + "type": "object", + "description": "This is the model that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.model`,\n- `call.assistantId->model`,\n- `call.squad[n].assistant.model`,\n- `call.squad[n].assistantId->model`,\n- `call.squadId->[n].assistant.model`,\n- `call.squadId->[n].assistantId->model`." + }, + "promptTokens": { + "type": "number", + "description": "This is the number of prompt tokens used in the call. These should be total prompt tokens used in the call for single assistant calls, while squad calls will have multiple model costs one for each assistant that was used." + }, + "completionTokens": { + "type": "number", + "description": "This is the number of completion tokens generated in the call. These should be total completion tokens used in the call for single assistant calls, while squad calls will have multiple model costs one for each assistant that was used." + }, + "cachedPromptTokens": { + "type": "number", + "description": "This is the number of cached prompt tokens used in the call. This is only applicable to certain providers (e.g., OpenAI, Azure OpenAI) that support prompt caching. Cached tokens are billed at a discounted rate." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "model", + "promptTokens", + "completionTokens", + "cost" + ] + }, + "VoiceCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'voice' for this class.", + "enum": [ + "voice" + ] + }, + "voice": { + "type": "object", + "description": "This is the voice that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.voice`,\n- `call.assistantId->voice`,\n- `call.squad[n].assistant.voice`,\n- `call.squad[n].assistantId->voice`,\n- `call.squadId->[n].assistant.voice`,\n- `call.squadId->[n].assistantId->voice`." + }, + "characters": { + "type": "number", + "description": "This is the number of characters that were generated during the call. These should be total characters used in the call for single assistant calls, while squad calls will have multiple voice costs one for each assistant that was used." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "voice", + "characters", + "cost" + ] + }, + "ChatCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'chat' for this class.", + "enum": [ + "chat" + ] + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "cost" + ] + }, + "VapiCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'vapi' for this class.", + "enum": [ + "vapi" + ] + }, + "subType": { + "type": "string", + "description": "This is the sub type of the cost.", + "enum": [ + "normal", + "overage" + ] + }, + "minutes": { + "type": "number", + "description": "This is the minutes of Vapi usage. This should match `call.endedAt` - `call.startedAt`." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "subType", + "minutes", + "cost" + ] + }, + "VoicemailDetectionCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'voicemail-detection' for this class.", + "enum": [ + "voicemail-detection" + ] + }, + "model": { + "type": "object", + "description": "This is the model that was used to perform the analysis." + }, + "provider": { + "type": "string", + "description": "This is the provider that was used to detect the voicemail.", + "enum": [ + "twilio", + "google", + "openai", + "vapi" + ] + }, + "promptTextTokens": { + "type": "number", + "description": "This is the number of prompt text tokens used in the voicemail detection." + }, + "promptAudioTokens": { + "type": "number", + "description": "This is the number of prompt audio tokens used in the voicemail detection." + }, + "completionTextTokens": { + "type": "number", + "description": "This is the number of completion text tokens used in the voicemail detection." + }, + "completionAudioTokens": { + "type": "number", + "description": "This is the number of completion audio tokens used in the voicemail detection." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "model", + "provider", + "promptTextTokens", + "promptAudioTokens", + "completionTextTokens", + "completionAudioTokens", + "cost" + ] + }, + "AnalysisCost": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type of cost, always 'analysis' for this class.", + "enum": [ + "analysis" + ] + }, + "analysisType": { + "type": "string", + "description": "This is the type of analysis performed.", + "enum": [ + "summary", + "structuredData", + "successEvaluation", + "structuredOutput" + ] + }, + "model": { + "type": "object", + "description": "This is the model that was used to perform the analysis." + }, + "promptTokens": { + "type": "number", + "description": "This is the number of prompt tokens used in the analysis." + }, + "completionTokens": { + "type": "number", + "description": "This is the number of completion tokens generated in the analysis." + }, + "cachedPromptTokens": { + "type": "number", + "description": "This is the number of cached prompt tokens used in the analysis. This is only applicable to certain providers (e.g., OpenAI, Azure OpenAI) that support prompt caching. Cached tokens are billed at a discounted rate." + }, + "cost": { + "type": "number", + "description": "This is the cost of the component in USD." + } + }, + "required": [ + "type", + "analysisType", + "model", + "promptTokens", + "completionTokens", + "cost" + ] + }, + "AudioFormat": { + "type": "object", + "properties": { + "sampleRate": { + "type": "number", + "description": "This is the sample rate of the call.\n\n@default 16000", + "minimum": 0, + "maximum": 192000 + }, + "format": { + "type": "object", + "description": "This is the audio format of the call.\n\n@default 'pcm_s16le'", + "enum": [ + "pcm_s16le", + "mulaw" + ] + }, + "container": { + "type": "string", + "description": "This is the container format of the call.\n\n@default 'raw'", + "enum": [ + "raw" + ] + } + }, + "required": [ + "sampleRate", + "format" + ] + }, + "VapiWebsocketTransport": { + "type": "object", + "properties": { + "conversationType": { + "type": "string", + "description": "This is the conversation type of the call (ie, voice or chat).", + "default": "voice", + "enum": [ + "voice" + ] + }, + "provider": { + "type": "string", + "description": "Vapi websocket transport provider", + "enum": [ + "vapi.websocket" + ] + }, + "audioFormat": { + "description": "This is the audio format of the call. Defaults to 16KHz raw pcm_s16le", + "allOf": [ + { + "$ref": "#/components/schemas/AudioFormat" + } + ] + } + }, + "required": [ + "provider" + ] + }, + "VapiWebCallTransport": { + "type": "object", + "properties": { + "conversationType": { + "type": "string", + "description": "This is the conversation type of the call (ie, voice or chat).", + "default": "voice", + "enum": [ + "voice" + ] + }, + "provider": { + "type": "string", + "description": "Vapi web call transport provider", + "enum": [ + "daily" + ] + }, + "roomDeleteOnUserLeaveEnabled": { + "type": "boolean", + "description": "This determines whether the daily room will be deleted and all participants will be kicked once the user leaves the room.\nIf set to `false`, the room will be kept alive even after the user leaves, allowing clients to reconnect to the same room.\nIf set to `true`, the room will be deleted and reconnection will not be allowed.\n\nDefaults to `true`.", + "example": true, + "default": true + }, + "callUrl": { + "type": "string", + "description": "This is the URL of the web call." + }, + "callSipUri": { + "type": "string", + "description": "This is the SIP URI of the web call." + } + }, + "required": [ + "provider" + ] + }, + "TwilioTransport": { + "type": "object", + "properties": { + "conversationType": { + "type": "string", + "description": "This is the conversation type of the call (ie, voice or chat).", + "default": "voice", + "enum": [ + "voice" + ] + }, + "provider": { + "type": "string", + "description": "Twilio transport provider", + "enum": [ + "twilio" + ] + }, + "accountSid": { + "type": "string", + "description": "This is the account SID of the Twilio account." + }, + "callSid": { + "type": "string", + "description": "This is the call SID of the Twilio call." + }, + "callToken": { + "type": "string", + "description": "This is the call token of the Twilio call." + }, + "forwardedFrom": { + "type": "string", + "description": "This is the phone number from which the call was forwarded.\nUndefined if the call was not forwarded." + } + }, + "required": [ + "provider" + ] + }, + "TelnyxTransport": { + "type": "object", + "properties": { + "conversationType": { + "type": "string", + "description": "This is the conversation type of the call (ie, voice or chat).", + "default": "voice", + "enum": [ + "voice" + ] + }, + "provider": { + "type": "string", + "description": "Telnyx transport provider", + "enum": [ + "telnyx" + ] + }, + "callControlId": { + "type": "string", + "description": "This is the call control ID of the Telnyx call." + }, + "callLegId": { + "type": "string", + "description": "This is the call leg ID of the Telnyx call." + }, + "callSessionId": { + "type": "string", + "description": "This is the call session ID of the Telnyx call." + } + }, + "required": [ + "provider" + ] + }, + "VapiSipTransport": { + "type": "object", + "properties": { + "conversationType": { + "type": "string", + "description": "This is the conversation type of the call (ie, voice or chat).", + "default": "voice", + "enum": [ + "voice" + ] + }, + "provider": { + "type": "string", + "description": "Vapi SIP transport provider", + "enum": [ + "vapi.sip" + ] + }, + "dialTimeout": { + "type": "number", + "description": "This sets the timeout for outbound dial operations in seconds. This is the duration the call will ring before timing out.\n\n@default 60", + "minimum": 1, + "maximum": 600, + "default": 60 + }, + "sbcCallSid": { + "type": "string", + "description": "This is the call SID of the Vapi SIP call." + }, + "callSid": { + "type": "string", + "description": "This is the call ID of the Vapi SIP call." + } + }, + "required": [ + "provider" + ] + }, + "VonageTransport": { + "type": "object", + "properties": { + "conversationType": { + "type": "string", + "description": "This is the conversation type of the call (ie, voice or chat).", + "default": "voice", + "enum": [ + "voice" + ] + }, + "provider": { + "type": "string", + "description": "Vonage transport provider", + "enum": [ + "vonage" + ] + }, + "conversationUUID": { + "type": "string", + "description": "This is the conversation UUID of the Vonage call." + }, + "callUUID": { + "type": "string", + "description": "This is the call ID of the Vonage call." + } + }, + "required": [ + "provider" + ] + }, "AnalysisCostBreakdown": { "type": "object", "properties": { @@ -33445,8 +36697,12 @@ "type": "object", "properties": { "type": { - "type": "object", - "description": "This is the type of recording consent." + "type": "string", + "description": "This is the type of recording consent.", + "enum": [ + "stay-on-line", + "verbal" + ] }, "grantedAt": { "format": "date-time", @@ -33805,6 +37061,14 @@ } ] }, + "squadOverrides": { + "description": "These are the overrides applied when the call targets a `squadId`. Mirrors\nthe call-level `squadOverrides` — use this instead of `assistantOverrides`\nwhen the campaign or call is squad-based.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, "number": { "type": "string", "description": "This is the number of the customer.", @@ -34010,6 +37274,9 @@ "pipeline-error-inworld-voice-failed", "pipeline-error-minimax-voice-failed", "pipeline-error-wellsaid-voice-failed", + "pipeline-error-xai-voice-failed", + "pipeline-error-microsoft-voice-failed", + "pipeline-error-microsoft-voice-request-canceled", "pipeline-error-tavus-video-failed", "call.in-progress.error-vapifault-openai-voice-failed", "call.in-progress.error-vapifault-cartesia-voice-failed", @@ -34027,6 +37294,8 @@ "call.in-progress.error-vapifault-inworld-voice-failed", "call.in-progress.error-vapifault-minimax-voice-failed", "call.in-progress.error-vapifault-wellsaid-voice-failed", + "call.in-progress.error-vapifault-xai-voice-failed", + "call.in-progress.error-vapifault-microsoft-voice-failed", "call.in-progress.error-vapifault-tavus-video-failed", "pipeline-error-vapi-llm-failed", "pipeline-error-vapi-400-bad-request-validation-failed", @@ -34081,6 +37350,18 @@ "call.in-progress.error-vapifault-soniox-transcriber-invalid-config", "call.in-progress.error-vapifault-soniox-transcriber-server-error", "call.in-progress.error-vapifault-soniox-transcriber-failed", + "pipeline-error-xai-transcriber-auth-failed", + "pipeline-error-xai-transcriber-rate-limited", + "pipeline-error-xai-transcriber-invalid-config", + "pipeline-error-xai-transcriber-server-error", + "pipeline-error-xai-transcriber-failed", + "call.in-progress.error-vapifault-xai-transcriber-auth-failed", + "call.in-progress.error-vapifault-xai-transcriber-rate-limited", + "call.in-progress.error-vapifault-xai-transcriber-invalid-config", + "call.in-progress.error-vapifault-xai-transcriber-server-error", + "call.in-progress.error-vapifault-xai-transcriber-failed", + "pipeline-error-cartesia-transcriber-failed", + "call.in-progress.error-vapifault-cartesia-transcriber-failed", "call.in-progress.error-pipeline-no-available-llm-model", "worker-shutdown", "vonage-disconnected", @@ -34516,6 +37797,18 @@ "call.in-progress.error-vapifault-soniox-transcriber-invalid-config", "call.in-progress.error-vapifault-soniox-transcriber-server-error", "call.in-progress.error-vapifault-soniox-transcriber-failed", + "pipeline-error-xai-transcriber-auth-failed", + "pipeline-error-xai-transcriber-rate-limited", + "pipeline-error-xai-transcriber-invalid-config", + "pipeline-error-xai-transcriber-server-error", + "pipeline-error-xai-transcriber-failed", + "call.in-progress.error-vapifault-xai-transcriber-auth-failed", + "call.in-progress.error-vapifault-xai-transcriber-rate-limited", + "call.in-progress.error-vapifault-xai-transcriber-invalid-config", + "call.in-progress.error-vapifault-xai-transcriber-server-error", + "call.in-progress.error-vapifault-xai-transcriber-failed", + "pipeline-error-cartesia-transcriber-failed", + "call.in-progress.error-vapifault-cartesia-transcriber-failed", "call.in-progress.error-warm-transfer-max-duration", "call.in-progress.error-warm-transfer-assistant-cancelled", "call.in-progress.error-warm-transfer-silence-timeout", @@ -34577,6 +37870,35 @@ } ] }, + "transport": { + "description": "This is the transport of the call.", + "oneOf": [ + { + "$ref": "#/components/schemas/VapiWebsocketTransport", + "title": "VapiWebsocketTransport" + }, + { + "$ref": "#/components/schemas/VonageTransport", + "title": "VonageTransport" + }, + { + "$ref": "#/components/schemas/TwilioTransport", + "title": "TwilioTransport" + }, + { + "$ref": "#/components/schemas/VapiSipTransport", + "title": "VapiSipTransport" + }, + { + "$ref": "#/components/schemas/TelnyxTransport", + "title": "TelnyxTransport" + }, + { + "$ref": "#/components/schemas/VapiWebCallTransport", + "title": "VapiWebCallTransport" + } + ] + }, "id": { "type": "string", "description": "This is the unique identifier for the call." @@ -34762,18 +38084,6 @@ "$ref": "#/components/schemas/SchedulePlan" } ] - }, - "transport": { - "type": "object", - "description": "This is the transport of the call." - }, - "subscriptionLimits": { - "description": "These are the subscription limits for the org at the time of the call. Includes concurrency limit information.", - "allOf": [ - { - "$ref": "#/components/schemas/SubscriptionLimits" - } - ] } }, "required": [ @@ -34933,6 +38243,35 @@ "CreateCallDTO": { "type": "object", "properties": { + "transport": { + "description": "This is the transport of the call.", + "oneOf": [ + { + "$ref": "#/components/schemas/VapiWebsocketTransport", + "title": "VapiWebsocketTransport" + }, + { + "$ref": "#/components/schemas/VonageTransport", + "title": "VonageTransport" + }, + { + "$ref": "#/components/schemas/TwilioTransport", + "title": "TwilioTransport" + }, + { + "$ref": "#/components/schemas/VapiSipTransport", + "title": "VapiSipTransport" + }, + { + "$ref": "#/components/schemas/TelnyxTransport", + "title": "TelnyxTransport" + }, + { + "$ref": "#/components/schemas/VapiWebCallTransport", + "title": "VapiWebCallTransport" + } + ] + }, "customers": { "description": "This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.", "type": "array", @@ -34953,10 +38292,6 @@ } ] }, - "transport": { - "type": "object", - "description": "This is the transport of the call." - }, "assistantId": { "type": "string", "description": "This is the assistant ID that will be used for the call. To use a transient assistant, use `assistant` instead.\n\nTo start a call with:\n- Assistant, use `assistantId` or `assistant`\n- Squad, use `squadId` or `squad`\n- Workflow, use `workflowId` or `workflow`" @@ -35101,6 +38436,35 @@ "CreateOutboundCallDTO": { "type": "object", "properties": { + "transport": { + "description": "This is the transport of the call.", + "oneOf": [ + { + "$ref": "#/components/schemas/VapiWebsocketTransport", + "title": "VapiWebsocketTransport" + }, + { + "$ref": "#/components/schemas/VonageTransport", + "title": "VonageTransport" + }, + { + "$ref": "#/components/schemas/TwilioTransport", + "title": "TwilioTransport" + }, + { + "$ref": "#/components/schemas/VapiSipTransport", + "title": "VapiSipTransport" + }, + { + "$ref": "#/components/schemas/TelnyxTransport", + "title": "TelnyxTransport" + }, + { + "$ref": "#/components/schemas/VapiWebCallTransport", + "title": "VapiWebCallTransport" + } + ] + }, "customers": { "description": "This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.", "type": "array", @@ -35121,10 +38485,6 @@ } ] }, - "transport": { - "type": "object", - "description": "This is the transport of the call." - }, "assistantId": { "type": "string", "description": "This is the assistant ID that will be used for the call. To use a transient assistant, use `assistant` instead.\n\nTo start a call with:\n- Assistant, use `assistantId` or `assistant`\n- Squad, use `squadId` or `squad`\n- Workflow, use `workflowId` or `workflow`" @@ -35333,92 +38693,6 @@ "content" ] }, - "SystemMessage": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "The role of the system in the conversation." - }, - "message": { - "type": "string", - "description": "The message content from the system." - }, - "time": { - "type": "number", - "description": "The timestamp when the message was sent." - }, - "secondsFromStart": { - "type": "number", - "description": "The number of seconds from the start of the conversation." - } - }, - "required": [ - "role", - "message", - "time", - "secondsFromStart" - ] - }, - "UserMessage": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "The role of the user in the conversation." - }, - "message": { - "type": "string", - "description": "The message content from the user." - }, - "time": { - "type": "number", - "description": "The timestamp when the message was sent." - }, - "endTime": { - "type": "number", - "description": "The timestamp when the message ended." - }, - "secondsFromStart": { - "type": "number", - "description": "The number of seconds from the start of the conversation." - }, - "duration": { - "type": "number", - "description": "The duration of the message in seconds." - }, - "isFiltered": { - "type": "boolean", - "description": "Indicates if the message was filtered for security reasons." - }, - "detectedThreats": { - "description": "List of detected security threats if the message was filtered.", - "type": "array", - "items": { - "type": "string" - } - }, - "originalMessage": { - "type": "string", - "description": "The original message before filtering (only included if content was filtered)." - }, - "metadata": { - "type": "object", - "description": "The metadata associated with the message. Currently used to store the transcriber's word level confidence." - }, - "speakerLabel": { - "type": "string", - "description": "Stable speaker label for diarized user speakers (e.g., \"Speaker 1\")." - } - }, - "required": [ - "role", - "message", - "time", - "endTime", - "secondsFromStart" - ] - }, "ToolCallFunction": { "type": "object", "properties": { @@ -35957,6 +39231,15 @@ "DESC" ] }, + "sortBy": { + "type": "string", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "enum": [ + "createdAt", + "duration", + "cost" + ] + }, "limit": { "type": "number", "description": "This is the maximum number of items to return. Defaults to 100.", @@ -36555,6 +39838,15 @@ "DESC" ] }, + "sortBy": { + "type": "string", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "enum": [ + "createdAt", + "duration", + "cost" + ] + }, "limit": { "type": "number", "description": "This is the maximum number of items to return. Defaults to 100.", @@ -36933,6 +40225,39 @@ "items": { "$ref": "#/components/schemas/CreateCustomerDTO" } + }, + "maxConcurrency": { + "type": "number", + "minimum": 1, + "description": "This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10." + }, + "assistantOverrides": { + "description": "These are the overrides for the assistant's settings and template variables for the campaign. Use this when the campaign targets an `assistantId`.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "squadOverrides": { + "description": "These are the overrides for the squad and template variables for the campaign. Use this when the campaign targets a `squadId`. Per-contact `squadOverrides` are deep-merged on top of this at dispatch time.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "server": { + "description": "This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks.", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "duplicateFromCampaignId": { + "type": "string", + "description": "Optional campaign ID to duplicate config from. Provided fields in the request override the source. If `customers` is omitted, contacts are copied from the source." } }, "required": [ @@ -36948,7 +40273,9 @@ "enum": [ "scheduled", "in-progress", - "ended" + "ended", + "cancelled", + "archived" ] }, "endedReason": { @@ -37003,6 +40330,35 @@ "$ref": "#/components/schemas/CreateCustomerDTO" } }, + "maxConcurrency": { + "type": "number", + "minimum": 1, + "description": "This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10." + }, + "assistantOverrides": { + "description": "These are the overrides for the assistant's settings and template variables for the campaign. Use this when the campaign targets an `assistantId`.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "squadOverrides": { + "description": "These are the overrides for the squad and template variables for the campaign. Use this when the campaign targets a `squadId`. Per-contact `squadOverrides` are deep-merged on top of this at dispatch time.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "server": { + "description": "This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks.", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, "id": { "type": "string", "description": "This is the unique identifier for the campaign." @@ -37119,9 +40475,10 @@ }, "status": { "type": "string", - "description": "This is the status of the campaign.\nCan only be updated to 'ended' if you want to end the campaign.\nWhen set to 'ended', it will delete all scheduled calls. Calls in progress will be allowed to complete.", + "description": "Set to 'cancelled' to stop the campaign ('ended' is a V1 alias). Scheduled\ncalls are deleted; in-progress calls are allowed to finish.", "enum": [ - "ended" + "ended", + "cancelled" ] } } @@ -37706,6 +41063,15 @@ "DESC" ] }, + "sortBy": { + "type": "string", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "enum": [ + "createdAt", + "duration", + "cost" + ] + }, "limit": { "type": "number", "description": "This is the maximum number of items to return. Defaults to 100.", @@ -37882,6 +41248,15 @@ "DESC" ] }, + "sortBy": { + "type": "string", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "enum": [ + "createdAt", + "duration", + "cost" + ] + }, "limit": { "type": "number", "description": "This is the maximum number of items to return. Defaults to 100.", @@ -38288,7 +41663,7 @@ "properties": { "realm": { "type": "string", - "description": "This will be expected in the `realm` field of the `authorization` header of the SIP INVITE. Defaults to sip.vapi.ai." + "description": "This will be expected in the `realm` field of the `authorization` header of the SIP INVITE. Defaults to the SIP realm of the Vapi region serving the request (e.g. `sip.vapi.ai` for US, `sip.eu.vapi.ai` for EU)." }, "username": { "type": "string", @@ -38998,80 +42373,94 @@ ] } }, - "numberE164CheckEnabled": { - "type": "boolean", - "description": "This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should be used if you know your use case requires it.\n\nUse cases:\n- `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing out to non-E164 numbers on your SIP trunks.\n- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.\n\nIf `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\\+?[a-zA-Z0-9]+$/`).\n\n@default true (E164 check is enabled)", - "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" - } - ] - }, - "number": { - "type": "string", - "description": "This is the number of the customer.", - "minLength": 3, - "maxLength": 40 - }, - "credentialId": { + "provider": { + "type": "string", + "description": "This is to bring your own phone numbers from your own SIP trunks or Carriers.", + "enum": [ + "byo-phone-number" + ] + }, + "numberE164CheckEnabled": { + "type": "boolean", + "description": "This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should be used if you know your use case requires it.\n\nUse cases:\n- `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing out to non-E164 numbers on your SIP trunks.\n- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.\n\nIf `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\\+?[a-zA-Z0-9]+$/`).\n\n@default true (E164 check is enabled)", + "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" + } + ] + }, + "number": { + "type": "string", + "description": "This is the number of the customer.", + "minLength": 3, + "maxLength": 40 + }, + "credentialId": { + "type": "string", + "description": "This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make calls to this phone number.\n\nYou can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get the credentialId." + } + } + }, + "UpdateTwilioPhoneNumberDTO": { + "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" + } + ] + } + }, + "provider": { "type": "string", - "description": "This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make calls to this phone number.\n\nYou can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get the credentialId." - } - } - }, - "UpdateTwilioPhoneNumberDTO": { - "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" - } + "description": "This is to use numbers bought on Twilio.", + "enum": [ + "twilio" ] }, - "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", @@ -39156,6 +42545,13 @@ ] } }, + "provider": { + "type": "string", + "description": "This is to use numbers bought on Vonage.", + "enum": [ + "vonage" + ] + }, "name": { "type": "string", "description": "This is the name of the phone number. This is just for your own reference.", @@ -39223,6 +42619,12 @@ ] } }, + "provider": { + "type": "string", + "enum": [ + "vapi" + ] + }, "name": { "type": "string", "description": "This is the name of the phone number. This is just for your own reference.", @@ -39294,6 +42696,13 @@ ] } }, + "provider": { + "type": "string", + "description": "This is to use numbers bought on Telnyx.", + "enum": [ + "telnyx" + ] + }, "name": { "type": "string", "description": "This is the name of the phone number. This is just for your own reference.", @@ -39446,7 +42855,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -39475,6 +42884,12 @@ ], "description": "The type of tool. \"apiRequest\" for API request tool." }, + "name": { + "type": "string", + "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.", + "maxLength": 40, + "pattern": "/^[a-zA-Z0-9_-]{1,40}$/" + }, "method": { "type": "string", "enum": [ @@ -39537,12 +42952,6 @@ } ] }, - "name": { - "type": "string", - "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.", - "maxLength": 40, - "pattern": "/^[a-zA-Z0-9_-]{1,40}$/" - }, "description": { "type": "string", "description": "This is the description of the tool. This will be passed to the model." @@ -39621,7 +43030,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -39744,7 +43153,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -39818,7 +43227,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -39887,7 +43296,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -39992,7 +43401,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40065,7 +43474,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40138,7 +43547,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40226,7 +43635,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40327,7 +43736,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40396,7 +43805,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40490,7 +43899,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40598,7 +44007,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40692,7 +44101,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40768,7 +44177,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40837,7 +44246,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40906,7 +44315,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -40975,7 +44384,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41044,7 +44453,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41113,7 +44522,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41200,7 +44609,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41269,7 +44678,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41338,7 +44747,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41407,7 +44816,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41476,7 +44885,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41574,7 +44983,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41649,7 +45058,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41678,6 +45087,12 @@ ], "description": "The type of tool. \"apiRequest\" for API request tool." }, + "name": { + "type": "string", + "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.", + "maxLength": 40, + "pattern": "/^[a-zA-Z0-9_-]{1,40}$/" + }, "method": { "type": "string", "enum": [ @@ -41714,12 +45129,6 @@ "$ref": "#/components/schemas/ToolParameter" } }, - "name": { - "type": "string", - "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.", - "maxLength": 40, - "pattern": "/^[a-zA-Z0-9_-]{1,40}$/" - }, "description": { "type": "string", "description": "This is the description of the tool. This will be passed to the model." @@ -41780,7 +45189,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41881,7 +45290,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -41928,7 +45337,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42000,7 +45409,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42086,7 +45495,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42158,7 +45567,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42205,7 +45614,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42281,7 +45690,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42303,6 +45712,19 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "apiRequest" + ], + "description": "The type of tool. \"apiRequest\" for API request tool." + }, + "name": { + "type": "string", + "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.", + "maxLength": 40, + "pattern": "/^[a-zA-Z0-9_-]{1,40}$/" + }, "method": { "type": "string", "enum": [ @@ -42347,12 +45769,6 @@ } ] }, - "name": { - "type": "string", - "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.", - "maxLength": 40, - "pattern": "/^[a-zA-Z0-9_-]{1,40}$/" - }, "description": { "type": "string", "description": "This is the description of the tool. This will be passed to the model." @@ -42400,7 +45816,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42422,6 +45838,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "code" + ], + "description": "The type of tool. \"code\" for Code tool." + }, "async": { "type": "boolean", "example": false, @@ -42490,7 +45913,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42512,6 +45935,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "dtmf" + ], + "description": "The type of tool. \"dtmf\" for DTMF tool." + }, "sipInfoDtmfEnabled": { "type": "boolean", "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled, DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network configurations. Only relevant when using the `vapi.sip` transport.", @@ -42532,7 +45962,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42554,6 +45984,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "endCall" + ], + "description": "The type of tool. \"endCall\" for End Call tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -42569,7 +46006,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42591,6 +46028,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "function" + ], + "description": "The type of tool. \"function\" for Function tool." + }, "async": { "type": "boolean", "example": false, @@ -42642,7 +46086,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42664,6 +46108,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "ghl" + ], + "description": "The type of tool. \"ghl\" for GHL tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -42682,7 +46133,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42704,6 +46155,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "make" + ], + "description": "The type of tool. \"make\" for Make tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -42722,7 +46180,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42744,6 +46202,13 @@ ] } }, + "type": { + "type": "string", + "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---", + "enum": [ + "handoff" + ] + }, "defaultResult": { "type": "string", "description": "This is the default local tool result message used when no runtime handoff result override is returned." @@ -42791,7 +46256,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42813,6 +46278,12 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "transferCall" + ] + }, "destinations": { "type": "array", "description": "These are the destinations that the call can be transferred to. If no destinations are provided, server.url will be used to get the transfer destination once the tool is called.", @@ -42848,7 +46319,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42870,6 +46341,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "output" + ], + "description": "The type of tool. \"output\" for Output tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -42885,7 +46363,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42907,6 +46385,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "bash" + ], + "description": "The type of tool. \"bash\" for Bash tool." + }, "subType": { "type": "string", "enum": [ @@ -42945,7 +46430,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -42967,6 +46452,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "computer" + ], + "description": "The type of tool. \"computer\" for Computer tool." + }, "subType": { "type": "string", "enum": [ @@ -43017,7 +46509,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43039,6 +46531,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "textEditor" + ], + "description": "The type of tool. \"textEditor\" for Text Editor tool." + }, "subType": { "type": "string", "enum": [ @@ -43077,7 +46576,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43099,6 +46598,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "query" + ], + "description": "The type of tool. \"query\" for Query tool." + }, "knowledgeBases": { "description": "The knowledge bases to query", "type": "array", @@ -43121,7 +46627,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43143,6 +46649,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "google.calendar.event.create" + ], + "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43158,7 +46671,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43180,6 +46693,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "google.sheets.row.append" + ], + "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43195,7 +46715,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43217,6 +46737,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "google.calendar.availability.check" + ], + "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43232,7 +46759,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43254,6 +46781,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "slack.message.send" + ], + "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43269,7 +46803,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43291,6 +46825,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "sms" + ], + "description": "The type of tool. \"sms\" for Twilio SMS sending tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43306,7 +46847,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43328,6 +46869,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "mcp" + ], + "description": "The type of tool. \"mcp\" for MCP tool." + }, "server": { "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", "allOf": [ @@ -43361,7 +46909,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43383,6 +46931,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "gohighlevel.calendar.availability.check" + ], + "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43398,7 +46953,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43420,6 +46975,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "gohighlevel.calendar.event.create" + ], + "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43435,7 +46997,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43457,6 +47019,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "gohighlevel.contact.create" + ], + "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43472,7 +47041,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43494,6 +47063,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "gohighlevel.contact.get" + ], + "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -43509,7 +47085,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43531,6 +47107,13 @@ ] } }, + "type": { + "type": "string", + "enum": [ + "sipRequest" + ], + "description": "The type of tool. \"sipRequest\" for SIP request tool." + }, "verb": { "type": "string", "enum": [ @@ -43574,7 +47157,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -43596,6 +47179,13 @@ ] } }, + "type": { + "type": "string", + "description": "The type of tool. \"voicemail\" for Voicemail tool.", + "enum": [ + "voicemail" + ] + }, "beepDetectionEnabled": { "type": "boolean", "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false", @@ -43717,82 +47307,6 @@ } } }, - "TrieveKnowledgeBaseSearchPlan": { - "type": "object", - "properties": { - "topK": { - "type": "number", - "description": "Specifies the number of top chunks to return. This corresponds to the `page_size` parameter in Trieve." - }, - "removeStopWords": { - "type": "boolean", - "description": "If true, stop words (specified in server/src/stop-words.txt in the git repo) will be removed. This will preserve queries that are entirely stop words." - }, - "scoreThreshold": { - "type": "number", - "description": "This is the score threshold to filter out chunks with a score below the threshold for cosine distance metric. For Manhattan Distance, Euclidean Distance, and Dot Product, it will filter out scores above the threshold distance. This threshold applies before weight and bias modifications. If not specified, this defaults to no threshold. A threshold of 0 will default to no threshold." - }, - "searchType": { - "type": "string", - "description": "This is the search method used when searching for relevant chunks from the vector store.", - "enum": [ - "fulltext", - "semantic", - "hybrid", - "bm25" - ] - } - }, - "required": [ - "searchType" - ] - }, - "TrieveKnowledgeBase": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "description": "This knowledge base is provided by Trieve.\n\nTo learn more about Trieve, visit https://trieve.ai.", - "enum": [ - "trieve" - ] - }, - "name": { - "type": "string", - "description": "This is the name of the knowledge base." - }, - "searchPlan": { - "description": "This is the searching plan used when searching for relevant chunks from the vector store.\n\nYou should configure this if you're running into these issues:\n- Too much unnecessary context is being fed as knowledge base context.\n- Not enough relevant context is being fed as knowledge base context.", - "allOf": [ - { - "$ref": "#/components/schemas/TrieveKnowledgeBaseSearchPlan" - } - ] - }, - "createPlan": { - "description": "This is the plan if you want us to create/import a new vector store using Trieve.", - "oneOf": [ - { - "$ref": "#/components/schemas/TrieveKnowledgeBaseImport", - "title": "Import" - } - ] - }, - "id": { - "type": "string", - "description": "This is the id of the knowledge base." - }, - "orgId": { - "type": "string", - "description": "This is the org id of the knowledge base." - } - }, - "required": [ - "provider", - "id", - "orgId" - ] - }, "CustomKnowledgeBase": { "type": "object", "properties": { @@ -43827,71 +47341,16 @@ "orgId" ] }, - "CreateTrieveKnowledgeBaseDTO": { + "UpdateCustomKnowledgeBaseDTO": { "type": "object", "properties": { "provider": { "type": "string", - "description": "This knowledge base is provided by Trieve.\n\nTo learn more about Trieve, visit https://trieve.ai.", + "description": "This knowledge base is bring your own knowledge base implementation.", "enum": [ - "trieve" - ] - }, - "name": { - "type": "string", - "description": "This is the name of the knowledge base." - }, - "searchPlan": { - "description": "This is the searching plan used when searching for relevant chunks from the vector store.\n\nYou should configure this if you're running into these issues:\n- Too much unnecessary context is being fed as knowledge base context.\n- Not enough relevant context is being fed as knowledge base context.", - "allOf": [ - { - "$ref": "#/components/schemas/TrieveKnowledgeBaseSearchPlan" - } - ] - }, - "createPlan": { - "description": "This is the plan if you want us to create/import a new vector store using Trieve.", - "oneOf": [ - { - "$ref": "#/components/schemas/TrieveKnowledgeBaseImport", - "title": "Import" - } - ] - } - }, - "required": [ - "provider" - ] - }, - "UpdateTrieveKnowledgeBaseDTO": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "This is the name of the knowledge base." - }, - "searchPlan": { - "description": "This is the searching plan used when searching for relevant chunks from the vector store.\n\nYou should configure this if you're running into these issues:\n- Too much unnecessary context is being fed as knowledge base context.\n- Not enough relevant context is being fed as knowledge base context.", - "allOf": [ - { - "$ref": "#/components/schemas/TrieveKnowledgeBaseSearchPlan" - } + "custom-knowledge-base" ] }, - "createPlan": { - "description": "This is the plan if you want us to create/import a new vector store using Trieve.", - "oneOf": [ - { - "$ref": "#/components/schemas/TrieveKnowledgeBaseImport", - "title": "Import" - } - ] - } - } - }, - "UpdateCustomKnowledgeBaseDTO": { - "type": "object", - "properties": { "server": { "description": "This is where the knowledge base request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"knowledge-base-request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Why is ocean blue?\"\n }\n ],\n ...other metadata about the call...\n }\n}\n\nResponse Expected:\n```\n{\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The ocean is blue because water absorbs everything but blue.\",\n }, // YOU CAN RETURN THE EXACT RESPONSE TO SPEAK\n \"documents\": [\n {\n \"content\": \"The ocean is blue primarily because water absorbs colors in the red part of the light spectrum and scatters the blue light, making it more visible to our eyes.\",\n \"similarity\": 1\n },\n {\n \"content\": \"Blue light is scattered more by the water molecules than other colors, enhancing the blue appearance of the ocean.\",\n \"similarity\": .5\n }\n ] // OR, YOU CAN RETURN AN ARRAY OF DOCUMENTS THAT WILL BE SENT TO THE MODEL\n}\n```", "allOf": [ @@ -43902,83 +47361,6 @@ } } }, - "TrieveKnowledgeBaseChunkPlan": { - "type": "object", - "properties": { - "fileIds": { - "description": "These are the file ids that will be used to create the vector store. To upload files, use the `POST /files` endpoint.", - "type": "array", - "items": { - "type": "string" - } - }, - "websites": { - "description": "These are the websites that will be used to create the vector store.", - "type": "array", - "items": { - "type": "string" - } - }, - "targetSplitsPerChunk": { - "type": "number", - "description": "This is an optional field which allows you to specify the number of splits you want per chunk. If not specified, the default 20 is used. However, you may want to use a different number." - }, - "splitDelimiters": { - "description": "This is an optional field which allows you to specify the delimiters to use when splitting the file before chunking the text. If not specified, the default [.!?\\n] are used to split into sentences. However, you may want to use spaces or other delimiters.", - "type": "array", - "items": { - "type": "string" - } - }, - "rebalanceChunks": { - "type": "boolean", - "description": "This is an optional field which allows you to specify whether or not to rebalance the chunks created from the file. If not specified, the default true is used. If true, Trieve will evenly distribute remainder splits across chunks such that 66 splits with a target_splits_per_chunk of 20 will result in 3 chunks with 22 splits each." - } - } - }, - "TrieveKnowledgeBaseCreate": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is to create a new dataset on Trieve.", - "enum": [ - "create" - ] - }, - "chunkPlans": { - "description": "These are the chunk plans used to create the dataset.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TrieveKnowledgeBaseChunkPlan" - } - } - }, - "required": [ - "type", - "chunkPlans" - ] - }, - "TrieveKnowledgeBaseImport": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is to import an existing dataset from Trieve.", - "enum": [ - "import" - ] - }, - "providerId": { - "type": "string", - "description": "This is the `datasetId` of the dataset on your Trieve account." - } - }, - "required": [ - "type", - "providerId" - ] - }, "StructuredOutput": { "type": "object", "properties": { @@ -45267,6 +48649,11 @@ } ] }, + "path": { + "type": "string", + "description": "Optional dot-notation path to a primitive leaf when evaluating an object structured output.", + "example": "contact.auth_started" + }, "comparator": { "type": "string", "description": "This is the comparison operator to use when evaluating the extracted value against the expected value.\nAvailable operators depend on the structured output's schema type:\n- boolean: '=', '!='\n- string: '=', '!='\n- number/integer: '=', '!=', '>', '<', '>=', '<='", @@ -46002,6 +49389,22 @@ "type": "string", "description": "This is the name of the structured output." }, + "path": { + "type": "string", + "description": "This is the optional dot-notation path evaluated within an object structured output." + }, + "description": { + "type": "string", + "description": "This is the structured output description captured when the evaluation ran." + }, + "schema": { + "description": "This is the structured output schema captured when the evaluation ran.", + "allOf": [ + { + "$ref": "#/components/schemas/JsonSchema" + } + ] + }, "extractedValue": { "description": "This is the value extracted from the call by the structured output.", "oneOf": [ @@ -46857,6 +50260,10 @@ "format": "date-time", "type": "string", "description": "This is the ISO 8601 date-time string of when the Insight was last updated." + }, + "systemKey": { + "type": "string", + "description": "Stable server-owned identifier for system-created insights." } }, "required": [ @@ -46968,6 +50375,10 @@ "format": "date-time", "type": "string", "description": "This is the ISO 8601 date-time string of when the Insight was last updated." + }, + "systemKey": { + "type": "string", + "description": "Stable server-owned identifier for system-created insights." } }, "required": [ @@ -47094,6 +50505,10 @@ "format": "date-time", "type": "string", "description": "This is the ISO 8601 date-time string of when the Insight was last updated." + }, + "systemKey": { + "type": "string", + "description": "Stable server-owned identifier for system-created insights." } }, "required": [ @@ -47168,6 +50583,10 @@ "format": "date-time", "type": "string", "description": "This is the ISO 8601 date-time string of when the Insight was last updated." + }, + "systemKey": { + "type": "string", + "description": "Stable server-owned identifier for system-created insights." } }, "required": [ @@ -48790,6 +52209,10 @@ "$ref": "#/components/schemas/InsightTimeRangeWithStep" } ] + }, + "assistantId": { + "type": "string", + "description": "Optional runtime assistant scope for dashboards.\nThis is applied to call-table queries without mutating the saved insight." } } }, @@ -48858,6 +52281,10 @@ "format": "date-time", "type": "string", "description": "This is the ISO 8601 date-time string of when the Insight was last updated." + }, + "systemKey": { + "type": "string", + "description": "Stable server-owned identifier for system-created insights." } }, "required": [ @@ -49423,7 +52850,10 @@ "gpt-3.5-turbo-0125:northcentralus", "gpt-3.5-turbo-0125:southcentralus", "gpt-3.5-turbo-1106:canadaeast", - "gpt-3.5-turbo-1106:westus" + "gpt-3.5-turbo-1106:westus", + "gpt-4.1:australiaeast", + "gpt-4o:australiaeast", + "gpt-5.4-mini:australiaeast" ] }, "temperature": { @@ -49534,6 +52964,8 @@ "description": "This is the name of the model. Ex. gpt-4o", "maxLength": 100, "enum": [ + "gemini-3.5-flash", + "gemini-3.1-flash-lite", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", @@ -49846,6 +53278,15 @@ "DESC" ] }, + "sortBy": { + "type": "string", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "enum": [ + "createdAt", + "duration", + "cost" + ] + }, "limit": { "type": "number", "description": "This is the maximum number of items to return. Defaults to 100.", @@ -50237,6 +53678,15 @@ "DESC" ] }, + "sortBy": { + "type": "string", + "description": "This is the column to sort by. Defaults to 'createdAt'.", + "enum": [ + "createdAt", + "duration", + "cost" + ] + }, "limit": { "type": "number", "description": "This is the maximum number of items to return. Defaults to 100.", @@ -51023,12 +54473,21 @@ } }, "role": { - "enum": [ - "admin", - "editor", - "viewer" - ], - "type": "string" + "pattern": "ORG_ROLE_OR_CUSTOM_ROLE_PATTERN", + "oneOf": [ + { + "type": "string", + "enum": [ + "admin", + "editor", + "viewer" + ] + }, + { + "type": "string", + "pattern": "^org-[a-z0-9-]+$" + } + ] }, "redirectTo": { "type": "string" @@ -51046,12 +54505,21 @@ "type": "string" }, "role": { - "enum": [ - "admin", - "editor", - "viewer" - ], - "type": "string" + "pattern": "ORG_ROLE_OR_CUSTOM_ROLE_PATTERN", + "oneOf": [ + { + "type": "string", + "enum": [ + "admin", + "editor", + "viewer" + ] + }, + { + "type": "string", + "pattern": "^org-[a-z0-9-]+$" + } + ] } }, "required": [ @@ -51346,6 +54814,7 @@ "enum": [ "us-east-1", "us-west-2", + "eu-central-1", "eu-west-1", "eu-west-3", "ap-northeast-1", @@ -51670,7 +55139,10 @@ "gpt-4-1106-preview", "gpt-4-0613", "gpt-35-turbo-0125", - "gpt-35-turbo-1106" + "gpt-35-turbo-1106", + "gpt-4o", + "gpt-4.1", + "gpt-5.4-mini-2026-03-17" ], "example": [ "gpt-4-0125-preview", @@ -51701,7 +55173,10 @@ "gpt-4-1106-preview", "gpt-4-0613", "gpt-35-turbo-0125", - "gpt-35-turbo-1106" + "gpt-35-turbo-1106", + "gpt-4o", + "gpt-4.1", + "gpt-5.4-mini-2026-03-17" ] } }, @@ -51871,6 +55346,10 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 + }, + "apiUrl": { + "type": "string", + "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." } }, "required": [ @@ -52239,6 +55718,15 @@ "maxLength": 10000, "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "enum": [ + "https://api.elevenlabs.io", + "https://api.eu.residency.elevenlabs.io" + ], + "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.", + "nullable": true + }, "id": { "type": "string", "description": "This is the unique identifier for the credential." @@ -52310,284 +55798,44 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 - }, - "gcpKey": { - "description": "This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at https://console.cloud.google.com/iam-admin/serviceaccounts/details//keys.\n\nThe schema is identical to the JSON that GCP outputs.", - "allOf": [ - { - "$ref": "#/components/schemas/GcpKey" - } - ] - }, - "region": { - "type": "string", - "description": "This is the region of the GCP resource.", - "maxLength": 40 - }, - "bucketPlan": { - "$ref": "#/components/schemas/BucketPlan" - } - }, - "required": [ - "provider", - "id", - "orgId", - "createdAt", - "updatedAt", - "gcpKey" - ] - }, - "GladiaCredential": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "gladia" - ] - }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "GoHighLevelCredential": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "gohighlevel" - ] - }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "GoogleCredential": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey", - "enum": [ - "google" - ] - }, - "apiKey": { - "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "GroqCredential": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "groq" - ] - }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "HumeCredential": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "hume" - ] - }, - "apiKey": { - "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + }, + "gcpKey": { + "description": "This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at https://console.cloud.google.com/iam-admin/serviceaccounts/details//keys.\n\nThe schema is identical to the JSON that GCP outputs.", + "allOf": [ + { + "$ref": "#/components/schemas/GcpKey" + } + ] + }, + "region": { + "type": "string", + "description": "This is the region of the GCP resource.", + "maxLength": 40 + }, + "bucketPlan": { + "$ref": "#/components/schemas/BucketPlan" } }, "required": [ "provider", - "apiKey", "id", "orgId", "createdAt", - "updatedAt" + "updatedAt", + "gcpKey" ] }, - "InflectionAICredential": { + "GladiaCredential": { "type": "object", "properties": { "provider": { "type": "string", - "description": "This is the api key for Pi in InflectionAI's console. Get it from here: https://developers.inflection.ai/keys, billing will need to be setup", "enum": [ - "inflection-ai" + "gladia" ] }, "apiKey": { "type": "string", - "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -52624,26 +55872,18 @@ "updatedAt" ] }, - "LangfuseCredential": { + "GoHighLevelCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "langfuse" + "gohighlevel" ] }, - "publicKey": { - "type": "string", - "description": "The public key for Langfuse project. Eg: pk-lf-..." - }, "apiKey": { "type": "string", - "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API." - }, - "apiUrl": { - "type": "string", - "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com" + "description": "This is not returned in the API." }, "id": { "type": "string", @@ -52672,26 +55912,26 @@ }, "required": [ "provider", - "publicKey", "apiKey", - "apiUrl", "id", "orgId", "createdAt", "updatedAt" ] }, - "LmntCredential": { + "GoogleCredential": { "type": "object", "properties": { "provider": { "type": "string", + "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey", "enum": [ - "lmnt" + "google" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -52728,25 +55968,65 @@ "updatedAt" ] }, - "MakeCredential": { + "GroqCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "make" + "groq" ] }, - "teamId": { + "apiKey": { "type": "string", - "description": "Team ID" + "description": "This is not returned in the API." }, - "region": { + "id": { "type": "string", - "description": "Region of your application. For example: eu1, eu2, us1, us2" + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + }, + "required": [ + "provider", + "apiKey", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "HumeCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "hume" + ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -52776,8 +56056,6 @@ }, "required": [ "provider", - "teamId", - "region", "apiKey", "id", "orgId", @@ -52785,18 +56063,19 @@ "updatedAt" ] }, - "MistralCredential": { + "InflectionAICredential": { "type": "object", "properties": { "provider": { "type": "string", + "description": "This is the api key for Pi in InflectionAI's console. Get it from here: https://developers.inflection.ai/keys, billing will need to be setup", "enum": [ - "mistral" + "inflection-ai" ] }, "apiKey": { "type": "string", - "maxLength": 100, + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -52833,18 +56112,26 @@ "updatedAt" ] }, - "NeuphonicCredential": { + "LangfuseCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "neuphonic" + "langfuse" ] }, + "publicKey": { + "type": "string", + "description": "The public key for Langfuse project. Eg: pk-lf-..." + }, "apiKey": { "type": "string", - "description": "This is not returned in the API." + "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API." + }, + "apiUrl": { + "type": "string", + "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com" }, "id": { "type": "string", @@ -52873,20 +56160,22 @@ }, "required": [ "provider", + "publicKey", "apiKey", + "apiUrl", "id", "orgId", "createdAt", "updatedAt" ] }, - "OpenAICredential": { + "LmntCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "openai" + "lmnt" ] }, "apiKey": { @@ -52927,15 +56216,23 @@ "updatedAt" ] }, - "OpenRouterCredential": { + "MakeCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "openrouter" + "make" ] }, + "teamId": { + "type": "string", + "description": "Team ID" + }, + "region": { + "type": "string", + "description": "Region of your application. For example: eu1, eu2, us1, us2" + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -52967,6 +56264,8 @@ }, "required": [ "provider", + "teamId", + "region", "apiKey", "id", "orgId", @@ -52974,18 +56273,25 @@ "updatedAt" ] }, - "PerplexityAICredential": { + "MicrosoftCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "perplexity-ai" + "microsoft" ] }, "apiKey": { "type": "string", - "description": "This is not returned in the API." + "description": "This is not returned in the API.", + "maxLength": 10000 + }, + "region": { + "type": "string", + "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.", + "maxLength": 64, + "example": "eastus" }, "id": { "type": "string", @@ -53021,17 +56327,18 @@ "updatedAt" ] }, - "PlayHTCredential": { + "MistralCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "playht" + "mistral" ] }, "apiKey": { "type": "string", + "maxLength": 100, "description": "This is not returned in the API." }, "id": { @@ -53057,9 +56364,6 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 - }, - "userId": { - "type": "string" } }, "required": [ @@ -53068,17 +56372,16 @@ "id", "orgId", "createdAt", - "updatedAt", - "userId" + "updatedAt" ] }, - "RimeAICredential": { + "NeuphonicCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "rime-ai" + "neuphonic" ] }, "apiKey": { @@ -53119,13 +56422,13 @@ "updatedAt" ] }, - "RunpodCredential": { + "OpenAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "runpod" + "openai" ] }, "apiKey": { @@ -53166,18 +56469,17 @@ "updatedAt" ] }, - "WellSaidCredential": { + "OpenRouterCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "wellsaid" + "openrouter" ] }, "apiKey": { "type": "string", - "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -53214,40 +56516,65 @@ "updatedAt" ] }, - "S3Credential": { + "PerplexityAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "s3" - ], - "description": "Credential provider. Only allowed value is s3" + "perplexity-ai" + ] }, - "awsAccessKeyId": { + "apiKey": { "type": "string", - "description": "AWS access key ID." + "description": "This is not returned in the API." }, - "awsSecretAccessKey": { + "id": { "type": "string", - "description": "AWS access key secret. This is not returned in the API." + "description": "This is the unique identifier for the credential." }, - "region": { + "orgId": { "type": "string", - "description": "AWS region in which the S3 bucket is located." + "description": "This is the unique identifier for the org that this credential belongs to." }, - "s3BucketName": { + "createdAt": { + "format": "date-time", "type": "string", - "description": "AWS S3 bucket name." + "description": "This is the ISO 8601 date-time string of when the credential was created." }, - "s3PathPrefix": { + "updatedAt": { + "format": "date-time", "type": "string", - "description": "The path prefix for the uploaded recording. Ex. \"recordings/\"" + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." }, - "fallbackIndex": { - "type": "number", - "minimum": 1, - "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order." + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + }, + "required": [ + "provider", + "apiKey", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "PlayHTCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "playht" + ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API." }, "id": { "type": "string", @@ -53272,28 +56599,28 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 + }, + "userId": { + "type": "string" } }, "required": [ "provider", - "awsAccessKeyId", - "awsSecretAccessKey", - "region", - "s3BucketName", - "s3PathPrefix", + "apiKey", "id", "orgId", "createdAt", - "updatedAt" + "updatedAt", + "userId" ] }, - "SmallestAICredential": { + "RimeAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "smallest-ai" + "rime-ai" ] }, "apiKey": { @@ -53334,13 +56661,13 @@ "updatedAt" ] }, - "SonioxCredential": { + "RunpodCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "soniox" + "runpod" ] }, "apiKey": { @@ -53381,17 +56708,18 @@ "updatedAt" ] }, - "SpeechmaticsCredential": { + "WellSaidCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "speechmatics" + "wellsaid" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -53428,15 +56756,35 @@ "updatedAt" ] }, - "SupabaseCredential": { + "S3Credential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "supabase" + "s3" ], - "description": "This is for supabase storage." + "description": "Credential provider. Only allowed value is s3" + }, + "awsAccessKeyId": { + "type": "string", + "description": "AWS access key ID." + }, + "awsSecretAccessKey": { + "type": "string", + "description": "AWS access key secret. This is not returned in the API." + }, + "region": { + "type": "string", + "description": "AWS region in which the S3 bucket is located." + }, + "s3BucketName": { + "type": "string", + "description": "AWS S3 bucket name." + }, + "s3PathPrefix": { + "type": "string", + "description": "The path prefix for the uploaded recording. Ex. \"recordings/\"" }, "fallbackIndex": { "type": "number", @@ -53466,32 +56814,85 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 + } + }, + "required": [ + "provider", + "awsAccessKeyId", + "awsSecretAccessKey", + "region", + "s3BucketName", + "s3PathPrefix", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "SmallestAICredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "smallest-ai" + ] }, - "bucketPlan": { - "$ref": "#/components/schemas/SupabaseBucketPlan" + "apiKey": { + "type": "string", + "description": "This is not returned in the API." + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 } }, "required": [ "provider", + "apiKey", "id", "orgId", "createdAt", "updatedAt" ] }, - "TavusCredential": { + "SonioxCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "tavus" + "soniox" ] }, "apiKey": { "type": "string", "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "description": "Custom Soniox WebSocket endpoint (e.g. EU server wss://stt-rt.eu.soniox.com/transcribe-websocket). Defaults to the region-appropriate endpoint when omitted." + }, "id": { "type": "string", "description": "This is the unique identifier for the credential." @@ -53526,13 +56927,111 @@ "updatedAt" ] }, - "TogetherAICredential": { + "SpeechmaticsCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "together-ai" + "speechmatics" + ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API." + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + }, + "required": [ + "provider", + "apiKey", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "SupabaseCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "supabase" + ], + "description": "This is for supabase storage." + }, + "fallbackIndex": { + "type": "number", + "minimum": 1, + "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order." + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + }, + "bucketPlan": { + "$ref": "#/components/schemas/SupabaseBucketPlan" + } + }, + "required": [ + "provider", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "TavusCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "tavus" ] }, "apiKey": { @@ -53573,13 +57072,13 @@ "updatedAt" ] }, - "TrieveCredential": { + "TogetherAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "trieve" + "together-ai" ] }, "apiKey": { @@ -54507,19 +58006,25 @@ "apiKey" ] }, - "CreateMistralCredentialDTO": { + "CreateMicrosoftCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "mistral" + "microsoft" ] }, "apiKey": { "type": "string", - "maxLength": 100, - "description": "This is not returned in the API." + "description": "This is not returned in the API.", + "maxLength": 10000 + }, + "region": { + "type": "string", + "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.", + "maxLength": 64, + "example": "eastus" }, "name": { "type": "string", @@ -54533,17 +58038,18 @@ "apiKey" ] }, - "CreateNeuphonicCredentialDTO": { + "CreateMistralCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "neuphonic" + "mistral" ] }, "apiKey": { "type": "string", + "maxLength": 100, "description": "This is not returned in the API." }, "name": { @@ -54558,18 +58064,17 @@ "apiKey" ] }, - "CreateWellSaidCredentialDTO": { + "CreateNeuphonicCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "wellsaid" + "neuphonic" ] }, "apiKey": { "type": "string", - "maxLength": 10000, "description": "This is not returned in the API." }, "name": { @@ -54584,17 +58089,18 @@ "apiKey" ] }, - "CreateSonioxCredentialDTO": { + "CreateWellSaidCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "soniox" + "wellsaid" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "name": { @@ -54609,19 +58115,23 @@ "apiKey" ] }, - "CreateSpeechmaticsCredentialDTO": { + "CreateSonioxCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "speechmatics" + "soniox" ] }, "apiKey": { "type": "string", "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "description": "Custom Soniox WebSocket endpoint (e.g. EU server wss://stt-rt.eu.soniox.com/transcribe-websocket). Defaults to the region-appropriate endpoint when omitted." + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -54634,13 +58144,13 @@ "apiKey" ] }, - "CreateTrieveCredentialDTO": { + "CreateSpeechmaticsCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "trieve" + "speechmatics" ] }, "apiKey": { @@ -54829,6 +58339,12 @@ "UpdateAnthropicCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "anthropic" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -54845,12 +58361,19 @@ "UpdateAnthropicBedrockCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "anthropic-bedrock" + ] + }, "region": { "type": "string", "description": "AWS region where Bedrock is configured.", "enum": [ "us-east-1", "us-west-2", + "eu-central-1", "eu-west-1", "eu-west-3", "ap-northeast-1", @@ -54879,6 +58402,12 @@ "UpdateAnyscaleCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "anyscale" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -54895,6 +58424,12 @@ "UpdateAssemblyAICredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "assembly-ai" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -54910,6 +58445,12 @@ "UpdateAzureCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "azure" + ] + }, "service": { "type": "string", "description": "This is the service being used in Azure.", @@ -54977,6 +58518,12 @@ "UpdateAzureOpenAICredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "azure-openai" + ] + }, "region": { "type": "string", "enum": [ @@ -55030,7 +58577,10 @@ "gpt-4-1106-preview", "gpt-4-0613", "gpt-35-turbo-0125", - "gpt-35-turbo-1106" + "gpt-35-turbo-1106", + "gpt-4o", + "gpt-4.1", + "gpt-5.4-mini-2026-03-17" ], "example": [ "gpt-4-0125-preview", @@ -55061,7 +58611,10 @@ "gpt-4-1106-preview", "gpt-4-0613", "gpt-35-turbo-0125", - "gpt-35-turbo-1106" + "gpt-35-turbo-1106", + "gpt-4o", + "gpt-4.1", + "gpt-5.4-mini-2026-03-17" ] } }, @@ -55089,6 +58642,13 @@ "UpdateByoSipTrunkCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.", + "enum": [ + "byo-sip-trunk" + ] + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -55137,6 +58697,12 @@ "UpdateCartesiaCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "cartesia" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55146,12 +58712,22 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 + }, + "apiUrl": { + "type": "string", + "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." } } }, "UpdateCerebrasCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "cerebras" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55168,6 +58744,13 @@ "UpdateCloudflareCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "cloudflare" + ], + "description": "Credential provider. Only allowed value is cloudflare" + }, "accountId": { "type": "string", "description": "Cloudflare Account Id." @@ -55204,6 +58787,12 @@ "UpdateCustomLLMCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "custom-llm" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55228,6 +58817,12 @@ "UpdateDeepgramCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "deepgram" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55247,6 +58842,12 @@ "UpdateDeepInfraCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "deepinfra" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55262,6 +58863,12 @@ "UpdateDeepSeekCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "deep-seek" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55277,11 +58884,26 @@ "UpdateElevenLabsCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "11labs" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "enum": [ + "https://api.elevenlabs.io", + "https://api.eu.residency.elevenlabs.io" + ], + "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.", + "nullable": true + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -55293,6 +58915,12 @@ "UpdateGcpCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "gcp" + ] + }, "fallbackIndex": { "type": "number", "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.", @@ -55325,6 +58953,12 @@ "UpdateGladiaCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "gladia" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55340,6 +58974,12 @@ "UpdateGoHighLevelCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "gohighlevel" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55355,6 +58995,13 @@ "UpdateGoogleCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey", + "enum": [ + "google" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55371,6 +59018,12 @@ "UpdateGroqCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "groq" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55386,6 +59039,12 @@ "UpdateHumeCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "hume" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55402,6 +59061,13 @@ "UpdateInflectionAICredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "description": "This is the api key for Pi in InflectionAI's console. Get it from here: https://developers.inflection.ai/keys, billing will need to be setup", + "enum": [ + "inflection-ai" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55418,6 +59084,12 @@ "UpdateLangfuseCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "langfuse" + ] + }, "publicKey": { "type": "string", "description": "The public key for Langfuse project. Eg: pk-lf-..." @@ -55441,6 +59113,12 @@ "UpdateLmntCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "lmnt" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55456,6 +59134,12 @@ "UpdateMakeCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "make" + ] + }, "teamId": { "type": "string", "description": "Team ID" @@ -55476,9 +59160,43 @@ } } }, + "UpdateMicrosoftCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "microsoft" + ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API.", + "maxLength": 10000 + }, + "region": { + "type": "string", + "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.", + "maxLength": 64, + "example": "eastus" + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + } + }, "UpdateMistralCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "mistral" + ] + }, "apiKey": { "type": "string", "maxLength": 100, @@ -55495,6 +59213,12 @@ "UpdateNeuphonicCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "neuphonic" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55510,6 +59234,12 @@ "UpdateOpenAICredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "openai" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55525,6 +59255,12 @@ "UpdateOpenRouterCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "openrouter" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55540,6 +59276,12 @@ "UpdatePerplexityAICredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "perplexity-ai" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55555,6 +59297,12 @@ "UpdatePlayHTCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "playht" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55573,6 +59321,12 @@ "UpdateRimeAICredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "rime-ai" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55588,6 +59342,12 @@ "UpdateRunpodCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "runpod" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55603,6 +59363,12 @@ "UpdateWellSaidCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "wellsaid" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55619,6 +59385,13 @@ "UpdateS3CredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "s3" + ], + "description": "Credential provider. Only allowed value is s3" + }, "awsAccessKeyId": { "type": "string", "description": "AWS access key ID." @@ -55655,21 +59428,12 @@ "UpdateTogetherAICredentialDTO": { "type": "object", "properties": { - "apiKey": { + "provider": { "type": "string", - "description": "This is not returned in the API." + "enum": [ + "together-ai" + ] }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - } - }, - "UpdateTrieveCredentialDTO": { - "type": "object", - "properties": { "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -55685,6 +59449,12 @@ "UpdateTwilioCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "twilio" + ] + }, "authToken": { "type": "string", "description": "This is not returned in the API." @@ -55711,6 +59481,12 @@ "UpdateVonageCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "vonage" + ] + }, "apiSecret": { "type": "string", "description": "This is not returned in the API." @@ -55729,6 +59505,12 @@ "UpdateWebhookCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "webhook" + ] + }, "authenticationPlan": { "description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.", "oneOf": [ @@ -55762,6 +59544,12 @@ "UpdateCustomCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "custom-credential" + ] + }, "authenticationPlan": { "description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.", "oneOf": [ @@ -55814,6 +59602,13 @@ "UpdateXAiCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "description": "This is the api key for Grok in XAi's console. Get it from here: https://console.x.ai", + "enum": [ + "xai" + ] + }, "apiKey": { "type": "string", "maxLength": 10000, @@ -55830,6 +59625,12 @@ "UpdateGoogleCalendarOAuth2ClientCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "google.calendar.oauth2-client" + ] + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -55841,6 +59642,12 @@ "UpdateGoogleCalendarOAuth2AuthorizationCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "google.calendar.oauth2-authorization" + ] + }, "authorizationId": { "type": "string", "description": "The authorization ID for the OAuth2 authorization" @@ -55856,6 +59663,12 @@ "UpdateGoogleSheetsOAuth2AuthorizationCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "google.sheets.oauth2-authorization" + ] + }, "authorizationId": { "type": "string", "description": "The authorization ID for the OAuth2 authorization" @@ -55871,6 +59684,12 @@ "UpdateSlackOAuth2AuthorizationCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "slack.oauth2-authorization" + ] + }, "authorizationId": { "type": "string", "description": "The authorization ID for the OAuth2 authorization" @@ -55886,6 +59705,12 @@ "UpdateGoHighLevelMCPCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "ghl.oauth2-authorization" + ] + }, "authenticationSession": { "description": "This is the authentication session for the credential.", "allOf": [ @@ -55905,6 +59730,12 @@ "UpdateInworldCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "inworld" + ] + }, "apiKey": { "type": "string", "description": "This is the Inworld Basic (Base64) authentication token. This is not returned in the API.", @@ -55921,6 +59752,12 @@ "UpdateEmailCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "email" + ] + }, "email": { "type": "string", "description": "The recipient email address for alerts" @@ -55936,6 +59773,12 @@ "UpdateSlackWebhookCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "slack-webhook" + ] + }, "webhookUrl": { "type": "string", "description": "Slack incoming webhook URL. See https://api.slack.com/messaging/webhooks for setup instructions. This is not returned in the API." @@ -55951,10 +59794,20 @@ "UpdateSonioxCredentialDTO": { "type": "object", "properties": { + "provider": { + "type": "string", + "enum": [ + "soniox" + ] + }, "apiKey": { "type": "string", "description": "This is not returned in the API." }, + "apiUrl": { + "type": "string", + "description": "Custom Soniox WebSocket endpoint (e.g. EU server wss://stt-rt.eu.soniox.com/transcribe-websocket). Defaults to the region-appropriate endpoint when omitted." + }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -57095,7 +60948,9 @@ "inworld", "minimax", "wellsaid", - "orpheus" + "orpheus", + "xai", + "microsoft" ] }, "providerId": { @@ -57215,7 +61070,9 @@ "inworld", "minimax", "wellsaid", - "orpheus" + "orpheus", + "xai", + "microsoft" ], "items": { "type": "string", @@ -57238,7 +61095,9 @@ "inworld", "minimax", "wellsaid", - "orpheus" + "orpheus", + "xai", + "microsoft" ] } } @@ -57455,6 +61314,16 @@ "VoiceLibraryVoiceResponse": { "type": "object", "properties": { + "age": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, "voiceId": { "type": "string" }, @@ -57470,9 +61339,6 @@ "gender": { "type": "string" }, - "age": { - "type": "object" - }, "accent": { "type": "string" } @@ -59931,6 +63797,9 @@ "pipeline-error-inworld-voice-failed", "pipeline-error-minimax-voice-failed", "pipeline-error-wellsaid-voice-failed", + "pipeline-error-xai-voice-failed", + "pipeline-error-microsoft-voice-failed", + "pipeline-error-microsoft-voice-request-canceled", "pipeline-error-tavus-video-failed", "call.in-progress.error-vapifault-openai-voice-failed", "call.in-progress.error-vapifault-cartesia-voice-failed", @@ -59948,6 +63817,8 @@ "call.in-progress.error-vapifault-inworld-voice-failed", "call.in-progress.error-vapifault-minimax-voice-failed", "call.in-progress.error-vapifault-wellsaid-voice-failed", + "call.in-progress.error-vapifault-xai-voice-failed", + "call.in-progress.error-vapifault-microsoft-voice-failed", "call.in-progress.error-vapifault-tavus-video-failed", "pipeline-error-vapi-llm-failed", "pipeline-error-vapi-400-bad-request-validation-failed", @@ -60002,6 +63873,18 @@ "call.in-progress.error-vapifault-soniox-transcriber-invalid-config", "call.in-progress.error-vapifault-soniox-transcriber-server-error", "call.in-progress.error-vapifault-soniox-transcriber-failed", + "pipeline-error-xai-transcriber-auth-failed", + "pipeline-error-xai-transcriber-rate-limited", + "pipeline-error-xai-transcriber-invalid-config", + "pipeline-error-xai-transcriber-server-error", + "pipeline-error-xai-transcriber-failed", + "call.in-progress.error-vapifault-xai-transcriber-auth-failed", + "call.in-progress.error-vapifault-xai-transcriber-rate-limited", + "call.in-progress.error-vapifault-xai-transcriber-invalid-config", + "call.in-progress.error-vapifault-xai-transcriber-server-error", + "call.in-progress.error-vapifault-xai-transcriber-failed", + "pipeline-error-cartesia-transcriber-failed", + "call.in-progress.error-vapifault-cartesia-transcriber-failed", "call.in-progress.error-pipeline-no-available-llm-model", "worker-shutdown", "vonage-disconnected", @@ -60437,6 +64320,18 @@ "call.in-progress.error-vapifault-soniox-transcriber-invalid-config", "call.in-progress.error-vapifault-soniox-transcriber-server-error", "call.in-progress.error-vapifault-soniox-transcriber-failed", + "pipeline-error-xai-transcriber-auth-failed", + "pipeline-error-xai-transcriber-rate-limited", + "pipeline-error-xai-transcriber-invalid-config", + "pipeline-error-xai-transcriber-server-error", + "pipeline-error-xai-transcriber-failed", + "call.in-progress.error-vapifault-xai-transcriber-auth-failed", + "call.in-progress.error-vapifault-xai-transcriber-rate-limited", + "call.in-progress.error-vapifault-xai-transcriber-invalid-config", + "call.in-progress.error-vapifault-xai-transcriber-server-error", + "call.in-progress.error-vapifault-xai-transcriber-failed", + "pipeline-error-cartesia-transcriber-failed", + "call.in-progress.error-vapifault-cartesia-transcriber-failed", "call.in-progress.error-warm-transfer-max-duration", "call.in-progress.error-warm-transfer-assistant-cancelled", "call.in-progress.error-warm-transfer-silence-timeout", @@ -61310,6 +65205,9 @@ "pipeline-error-inworld-voice-failed", "pipeline-error-minimax-voice-failed", "pipeline-error-wellsaid-voice-failed", + "pipeline-error-xai-voice-failed", + "pipeline-error-microsoft-voice-failed", + "pipeline-error-microsoft-voice-request-canceled", "pipeline-error-tavus-video-failed", "call.in-progress.error-vapifault-openai-voice-failed", "call.in-progress.error-vapifault-cartesia-voice-failed", @@ -61327,6 +65225,8 @@ "call.in-progress.error-vapifault-inworld-voice-failed", "call.in-progress.error-vapifault-minimax-voice-failed", "call.in-progress.error-vapifault-wellsaid-voice-failed", + "call.in-progress.error-vapifault-xai-voice-failed", + "call.in-progress.error-vapifault-microsoft-voice-failed", "call.in-progress.error-vapifault-tavus-video-failed", "pipeline-error-vapi-llm-failed", "pipeline-error-vapi-400-bad-request-validation-failed", @@ -61381,6 +65281,18 @@ "call.in-progress.error-vapifault-soniox-transcriber-invalid-config", "call.in-progress.error-vapifault-soniox-transcriber-server-error", "call.in-progress.error-vapifault-soniox-transcriber-failed", + "pipeline-error-xai-transcriber-auth-failed", + "pipeline-error-xai-transcriber-rate-limited", + "pipeline-error-xai-transcriber-invalid-config", + "pipeline-error-xai-transcriber-server-error", + "pipeline-error-xai-transcriber-failed", + "call.in-progress.error-vapifault-xai-transcriber-auth-failed", + "call.in-progress.error-vapifault-xai-transcriber-rate-limited", + "call.in-progress.error-vapifault-xai-transcriber-invalid-config", + "call.in-progress.error-vapifault-xai-transcriber-server-error", + "call.in-progress.error-vapifault-xai-transcriber-failed", + "pipeline-error-cartesia-transcriber-failed", + "call.in-progress.error-vapifault-cartesia-transcriber-failed", "call.in-progress.error-pipeline-no-available-llm-model", "worker-shutdown", "vonage-disconnected", @@ -61816,6 +65728,18 @@ "call.in-progress.error-vapifault-soniox-transcriber-invalid-config", "call.in-progress.error-vapifault-soniox-transcriber-server-error", "call.in-progress.error-vapifault-soniox-transcriber-failed", + "pipeline-error-xai-transcriber-auth-failed", + "pipeline-error-xai-transcriber-rate-limited", + "pipeline-error-xai-transcriber-invalid-config", + "pipeline-error-xai-transcriber-server-error", + "pipeline-error-xai-transcriber-failed", + "call.in-progress.error-vapifault-xai-transcriber-auth-failed", + "call.in-progress.error-vapifault-xai-transcriber-rate-limited", + "call.in-progress.error-vapifault-xai-transcriber-invalid-config", + "call.in-progress.error-vapifault-xai-transcriber-server-error", + "call.in-progress.error-vapifault-xai-transcriber-failed", + "pipeline-error-cartesia-transcriber-failed", + "call.in-progress.error-vapifault-cartesia-transcriber-failed", "call.in-progress.error-warm-transfer-max-duration", "call.in-progress.error-warm-transfer-assistant-cancelled", "call.in-progress.error-warm-transfer-silence-timeout", @@ -62000,46 +65924,239 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"tool-calls\" is sent to call a tool.", + "description": "This is the type of the message. \"tool-calls\" is sent to call a tool.", + "enum": [ + "tool-calls" + ] + }, + "toolWithToolCallList": { + "type": "array", + "description": "This is the list of tools calls that the model is requesting along with the original tool configuration.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/FunctionToolWithToolCall", + "title": "FunctionToolWithToolCall" + }, + { + "$ref": "#/components/schemas/GhlToolWithToolCall", + "title": "GhlToolWithToolCall" + }, + { + "$ref": "#/components/schemas/MakeToolWithToolCall", + "title": "MakeToolWithToolCall" + }, + { + "$ref": "#/components/schemas/BashToolWithToolCall", + "title": "BashToolWithToolCall" + }, + { + "$ref": "#/components/schemas/ComputerToolWithToolCall", + "title": "ComputerToolWithToolCall" + }, + { + "$ref": "#/components/schemas/TextEditorToolWithToolCall", + "title": "TextEditorToolWithToolCall" + }, + { + "$ref": "#/components/schemas/GoogleCalendarCreateEventToolWithToolCall", + "title": "GoogleCalendarCreateEventToolWithToolCall" + } + ] + } + }, + "timestamp": { + "type": "number", + "description": "This is the timestamp of the message." + }, + "artifact": { + "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.", + "allOf": [ + { + "$ref": "#/components/schemas/Artifact" + } + ] + }, + "assistant": { + "description": "This is the assistant that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "customer": { + "description": "This is the customer that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + ] + }, + "call": { + "description": "This is the call that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/Call" + } + ] + }, + "chat": { + "description": "This is the chat object.", + "allOf": [ + { + "$ref": "#/components/schemas/Chat" + } + ] + }, + "toolCallList": { + "description": "This is the list of tool calls that the model is requesting.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolCall" + } + } + }, + "required": [ + "toolWithToolCallList", + "toolCallList" + ] + }, + "ServerMessageTransferDestinationRequest": { + "type": "object", + "properties": { + "phoneNumber": { + "description": "This is the phone number that the message is associated with.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", + "title": "ByoPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", + "title": "TwilioPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", + "title": "VonagePhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", + "title": "VapiPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", + "title": "TelnyxPhoneNumber" + } + ] + }, + "type": { + "type": "string", + "description": "This is the type of the message. \"transfer-destination-request\" is sent when the model is requesting transfer but destination is unknown.", + "enum": [ + "transfer-destination-request" + ] + }, + "timestamp": { + "type": "number", + "description": "This is the timestamp of the message." + }, + "artifact": { + "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.", + "allOf": [ + { + "$ref": "#/components/schemas/Artifact" + } + ] + }, + "assistant": { + "description": "This is the assistant that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "customer": { + "description": "This is the customer that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + ] + }, + "call": { + "description": "This is the call that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/Call" + } + ] + }, + "chat": { + "description": "This is the chat object.", + "allOf": [ + { + "$ref": "#/components/schemas/Chat" + } + ] + } + }, + "required": [ + "type" + ] + }, + "ServerMessageTransferUpdate": { + "type": "object", + "properties": { + "phoneNumber": { + "description": "This is the phone number that the message is associated with.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", + "title": "ByoPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", + "title": "TwilioPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", + "title": "VonagePhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", + "title": "VapiPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", + "title": "TelnyxPhoneNumber" + } + ] + }, + "type": { + "type": "string", + "description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.", "enum": [ - "tool-calls" + "transfer-update" ] }, - "toolWithToolCallList": { - "type": "array", - "description": "This is the list of tools calls that the model is requesting along with the original tool configuration.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/FunctionToolWithToolCall", - "title": "FunctionToolWithToolCall" - }, - { - "$ref": "#/components/schemas/GhlToolWithToolCall", - "title": "GhlToolWithToolCall" - }, - { - "$ref": "#/components/schemas/MakeToolWithToolCall", - "title": "MakeToolWithToolCall" - }, - { - "$ref": "#/components/schemas/BashToolWithToolCall", - "title": "BashToolWithToolCall" - }, - { - "$ref": "#/components/schemas/ComputerToolWithToolCall", - "title": "ComputerToolWithToolCall" - }, - { - "$ref": "#/components/schemas/TextEditorToolWithToolCall", - "title": "TextEditorToolWithToolCall" - }, - { - "$ref": "#/components/schemas/GoogleCalendarCreateEventToolWithToolCall", - "title": "GoogleCalendarCreateEventToolWithToolCall" - } - ] - } + "destination": { + "description": "This is the destination of the transfer.", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationAssistant", + "title": "Assistant" + }, + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "Number" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "Sip" + } + ] }, "timestamp": { "type": "number", @@ -62085,20 +66202,36 @@ } ] }, - "toolCallList": { - "description": "This is the list of tool calls that the model is requesting.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ToolCall" - } + "toAssistant": { + "description": "This is the assistant that the call is being transferred to. This is only sent if `destination.type` is \"assistant\".", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "fromAssistant": { + "description": "This is the assistant that the call is being transferred from. This is only sent if `destination.type` is \"assistant\".", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "toStepRecord": { + "type": "object", + "description": "This is the step that the conversation moved to." + }, + "fromStepRecord": { + "type": "object", + "description": "This is the step that the conversation moved from. =" } }, "required": [ - "toolWithToolCallList", - "toolCallList" + "type" ] }, - "ServerMessageTransferDestinationRequest": { + "ServerMessageTranscript": { "type": "object", "properties": { "phoneNumber": { @@ -62128,9 +66261,10 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"transfer-destination-request\" is sent when the model is requesting transfer but destination is unknown.", + "description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.", "enum": [ - "transfer-destination-request" + "transcript", + "transcript[transcriptType=\"final\"]" ] }, "timestamp": { @@ -62176,13 +66310,51 @@ "$ref": "#/components/schemas/Chat" } ] + }, + "role": { + "type": "string", + "description": "This is the role for which the transcript is for.", + "enum": [ + "assistant", + "user" + ] + }, + "transcriptType": { + "type": "string", + "description": "This is the type of the transcript.", + "enum": [ + "partial", + "final" + ] + }, + "transcript": { + "type": "string", + "description": "This is the transcript content." + }, + "isFiltered": { + "type": "boolean", + "description": "Indicates if the transcript was filtered for security reasons." + }, + "detectedThreats": { + "description": "List of detected security threats if the transcript was filtered.", + "type": "array", + "items": { + "type": "string" + } + }, + "originalTranscript": { + "type": "string", + "description": "The original transcript before filtering (only included if content was filtered)." } }, "required": [ - "type" + "type", + "role", + "transcriptType", + "transcript" ] }, - "ServerMessageTransferUpdate": { + "ServerMessageUserInterrupted": { "type": "object", "properties": { "phoneNumber": { @@ -62212,27 +66384,14 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.", + "description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.", "enum": [ - "transfer-update" + "user-interrupted" ] }, - "destination": { - "description": "This is the destination of the transfer.", - "oneOf": [ - { - "$ref": "#/components/schemas/TransferDestinationAssistant", - "title": "Assistant" - }, - { - "$ref": "#/components/schemas/TransferDestinationNumber", - "title": "Number" - }, - { - "$ref": "#/components/schemas/TransferDestinationSip", - "title": "Sip" - } - ] + "turnId": { + "type": "string", + "description": "This is the turnId of the LLM response that was interrupted. Matches the turnId\non model-output messages so clients can discard the interrupted turn's tokens." }, "timestamp": { "type": "number", @@ -62277,37 +66436,13 @@ "$ref": "#/components/schemas/Chat" } ] - }, - "toAssistant": { - "description": "This is the assistant that the call is being transferred to. This is only sent if `destination.type` is \"assistant\".", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "fromAssistant": { - "description": "This is the assistant that the call is being transferred from. This is only sent if `destination.type` is \"assistant\".", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "toStepRecord": { - "type": "object", - "description": "This is the step that the conversation moved to." - }, - "fromStepRecord": { - "type": "object", - "description": "This is the step that the conversation moved from. =" } }, "required": [ "type" ] }, - "ServerMessageTranscript": { + "ServerMessageLanguageChangeDetected": { "type": "object", "properties": { "phoneNumber": { @@ -62337,10 +66472,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.", + "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", "enum": [ - "transcript", - "transcript[transcriptType=\"final\"]" + "language-change-detected" ] }, "timestamp": { @@ -62387,50 +66521,17 @@ } ] }, - "role": { - "type": "string", - "description": "This is the role for which the transcript is for.", - "enum": [ - "assistant", - "user" - ] - }, - "transcriptType": { - "type": "string", - "description": "This is the type of the transcript.", - "enum": [ - "partial", - "final" - ] - }, - "transcript": { - "type": "string", - "description": "This is the transcript content." - }, - "isFiltered": { - "type": "boolean", - "description": "Indicates if the transcript was filtered for security reasons." - }, - "detectedThreats": { - "description": "List of detected security threats if the transcript was filtered.", - "type": "array", - "items": { - "type": "string" - } - }, - "originalTranscript": { + "language": { "type": "string", - "description": "The original transcript before filtering (only included if content was filtered)." + "description": "This is the language the transcriber is switched to." } }, "required": [ "type", - "role", - "transcriptType", - "transcript" + "language" ] }, - "ServerMessageUserInterrupted": { + "ServerMessageVoiceInput": { "type": "object", "properties": { "phoneNumber": { @@ -62460,15 +66561,11 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.", + "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", "enum": [ - "user-interrupted" + "voice-input" ] }, - "turnId": { - "type": "string", - "description": "This is the turnId of the LLM response that was interrupted. Matches the turnId\non model-output messages so clients can discard the interrupted turn's tokens." - }, "timestamp": { "type": "number", "description": "This is the timestamp of the message." @@ -62512,13 +66609,18 @@ "$ref": "#/components/schemas/Chat" } ] + }, + "input": { + "type": "string", + "description": "This is the voice input content" } }, "required": [ - "type" + "type", + "input" ] }, - "ServerMessageLanguageChangeDetected": { + "ServerMessageAssistantSpeech": { "type": "object", "properties": { "phoneNumber": { @@ -62548,11 +66650,44 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", + "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.", "enum": [ - "language-change-detected" + "assistant.speechStarted" ] }, + "text": { + "type": "string", + "description": "The full assistant text for the current turn. This is the complete text,\nnot an incremental delta — consumers should use `timing` metadata (e.g.\n`wordsSpoken`) to determine which portion has been spoken so far." + }, + "turn": { + "type": "number", + "description": "This is the turn number of the assistant speech event (0-indexed)." + }, + "source": { + "type": "string", + "description": "Indicates how the text was sourced.", + "enum": [ + "model", + "force-say", + "custom-voice" + ] + }, + "timing": { + "description": "Optional timing metadata. Shape depends on `timing.type`:\n\n- `word-alignment` (ElevenLabs): per-character timing at playback\n cadence. words[] includes space entries. Best consumed by tracking\n a running character count: join timing.words, add to a char cursor,\n and highlight text up to that position. No interpolation needed.\n\n- `word-progress` (Minimax with voice.subtitleType: 'word'): cursor-\n based word count per TTS segment. Use wordsSpoken as the anchor,\n interpolate forward using segmentDurationMs or timing.words until\n the next event arrives.\n\nWhen absent, the event is a text-only fallback for providers without\nword-level timing (e.g. Cartesia, Deepgram, Azure). Text emits once\nper TTS chunk when audio is playing. Optionally interpolate a word\ncursor at ~3.5 words/sec between events for approximate tracking.", + "oneOf": [ + { + "$ref": "#/components/schemas/AssistantSpeechWordAlignmentTiming", + "title": "WordAlignmentTiming" + }, + { + "$ref": "#/components/schemas/AssistantSpeechWordProgressTiming", + "title": "WordProgressTiming" + } + ], + "discriminator": { + "propertyName": "type" + } + }, "timestamp": { "type": "number", "description": "This is the timestamp of the message." @@ -62596,18 +66731,14 @@ "$ref": "#/components/schemas/Chat" } ] - }, - "language": { - "type": "string", - "description": "This is the language the transcriber is switched to." } }, "required": [ "type", - "language" + "text" ] }, - "ServerMessageVoiceInput": { + "ServerMessageVoiceRequest": { "type": "object", "properties": { "phoneNumber": { @@ -62637,9 +66768,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", + "description": "This is the type of the message. \"voice-request\" is sent when using `assistant.voice={ \"type\": \"custom-voice\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.voice.server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nThe expected response is 1-channel 16-bit raw PCM audio at the sample rate specified in the request. Here is how the response will be piped to the transport:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```", "enum": [ - "voice-input" + "voice-request" ] }, "timestamp": { @@ -62686,17 +66817,22 @@ } ] }, - "input": { + "text": { "type": "string", - "description": "This is the voice input content" + "description": "This is the text to be synthesized." + }, + "sampleRate": { + "type": "number", + "description": "This is the sample rate to be synthesized." } }, "required": [ "type", - "input" + "text", + "sampleRate" ] }, - "ServerMessageAssistantSpeech": { + "ServerMessageCallEndpointingRequest": { "type": "object", "properties": { "phoneNumber": { @@ -62726,42 +66862,44 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.", + "description": "This is the type of the message. \"call.endpointing.request\" is sent when using `assistant.startSpeakingPlan.smartEndpointingPlan={ \"provider\": \"custom-endpointing-model\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.startSpeakingPlan.smartEndpointingPlan.server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nThe expected response:\n{\n \"timeoutSeconds\": 0.5\n}", "enum": [ - "assistant.speechStarted" + "call.endpointing.request" ] }, - "text": { - "type": "string", - "description": "The full assistant text for the current turn. This is the complete text,\nnot an incremental delta — consumers should use `timing` metadata (e.g.\n`wordsSpoken`) to determine which portion has been spoken so far." - }, - "turn": { - "type": "number", - "description": "This is the turn number of the assistant speech event (0-indexed)." - }, - "source": { - "type": "string", - "description": "Indicates how the text was sourced.", - "enum": [ - "model", - "force-say", - "custom-voice" - ] + "messages": { + "type": "array", + "description": "This is the conversation history at the time of the endpointing request.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserMessage", + "title": "UserMessage" + }, + { + "$ref": "#/components/schemas/SystemMessage", + "title": "SystemMessage" + }, + { + "$ref": "#/components/schemas/BotMessage", + "title": "BotMessage" + }, + { + "$ref": "#/components/schemas/ToolCallMessage", + "title": "ToolCallMessage" + }, + { + "$ref": "#/components/schemas/ToolCallResultMessage", + "title": "ToolCallResultMessage" + } + ] + } }, - "timing": { - "description": "Optional timing metadata. Shape depends on `timing.type`:\n\n- `word-alignment` (ElevenLabs): per-character timing at playback\n cadence. words[] includes space entries. Best consumed by tracking\n a running character count: join timing.words, add to a char cursor,\n and highlight text up to that position. No interpolation needed.\n\n- `word-progress` (Minimax with voice.subtitleType: 'word'): cursor-\n based word count per TTS segment. Use wordsSpoken as the anchor,\n interpolate forward using segmentDurationMs or timing.words until\n the next event arrives.\n\nWhen absent, the event is a text-only fallback for providers without\nword-level timing (e.g. Cartesia, Deepgram, Azure). Text emits once\nper TTS chunk when audio is playing. Optionally interpolate a word\ncursor at ~3.5 words/sec between events for approximate tracking.", - "oneOf": [ - { - "$ref": "#/components/schemas/AssistantSpeechWordAlignmentTiming", - "title": "WordAlignmentTiming" - }, - { - "$ref": "#/components/schemas/AssistantSpeechWordProgressTiming", - "title": "WordProgressTiming" - } - ], - "discriminator": { - "propertyName": "type" + "messagesOpenAIFormatted": { + "description": "This is just `messages` formatted for OpenAI.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" } }, "timestamp": { @@ -62811,10 +66949,10 @@ }, "required": [ "type", - "text" + "messagesOpenAIFormatted" ] }, - "ServerMessageVoiceRequest": { + "ServerMessageChatCreated": { "type": "object", "properties": { "phoneNumber": { @@ -62844,9 +66982,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"voice-request\" is sent when using `assistant.voice={ \"type\": \"custom-voice\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.voice.server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nThe expected response is 1-channel 16-bit raw PCM audio at the sample rate specified in the request. Here is how the response will be piped to the transport:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```", + "description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.", "enum": [ - "voice-request" + "chat.created" ] }, "timestamp": { @@ -62886,29 +67024,20 @@ ] }, "chat": { - "description": "This is the chat object.", + "description": "This is the chat that was created.", "allOf": [ { "$ref": "#/components/schemas/Chat" } ] - }, - "text": { - "type": "string", - "description": "This is the text to be synthesized." - }, - "sampleRate": { - "type": "number", - "description": "This is the sample rate to be synthesized." } }, "required": [ "type", - "text", - "sampleRate" + "chat" ] }, - "ServerMessageCallEndpointingRequest": { + "ServerMessageChatDeleted": { "type": "object", "properties": { "phoneNumber": { @@ -62938,46 +67067,11 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"call.endpointing.request\" is sent when using `assistant.startSpeakingPlan.smartEndpointingPlan={ \"provider\": \"custom-endpointing-model\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.startSpeakingPlan.smartEndpointingPlan.server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nThe expected response:\n{\n \"timeoutSeconds\": 0.5\n}", + "description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.", "enum": [ - "call.endpointing.request" + "chat.deleted" ] }, - "messages": { - "type": "array", - "description": "This is the conversation history at the time of the endpointing request.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/UserMessage", - "title": "UserMessage" - }, - { - "$ref": "#/components/schemas/SystemMessage", - "title": "SystemMessage" - }, - { - "$ref": "#/components/schemas/BotMessage", - "title": "BotMessage" - }, - { - "$ref": "#/components/schemas/ToolCallMessage", - "title": "ToolCallMessage" - }, - { - "$ref": "#/components/schemas/ToolCallResultMessage", - "title": "ToolCallResultMessage" - } - ] - } - }, - "messagesOpenAIFormatted": { - "description": "This is just `messages` formatted for OpenAI.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" - } - }, "timestamp": { "type": "number", "description": "This is the timestamp of the message." @@ -63015,7 +67109,7 @@ ] }, "chat": { - "description": "This is the chat object.", + "description": "This is the chat that was deleted.", "allOf": [ { "$ref": "#/components/schemas/Chat" @@ -63025,10 +67119,10 @@ }, "required": [ "type", - "messagesOpenAIFormatted" + "chat" ] }, - "ServerMessageChatCreated": { + "ServerMessageSessionCreated": { "type": "object", "properties": { "phoneNumber": { @@ -63058,9 +67152,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.", + "description": "This is the type of the message. \"session.created\" is sent when a new session is created.", "enum": [ - "chat.created" + "session.created" ] }, "timestamp": { @@ -63100,105 +67194,28 @@ ] }, "chat": { - "description": "This is the chat that was created.", + "description": "This is the chat object.", "allOf": [ { "$ref": "#/components/schemas/Chat" } ] - } - }, - "required": [ - "type", - "chat" - ] - }, - "ServerMessageChatDeleted": { - "type": "object", - "properties": { - "phoneNumber": { - "description": "This is the phone number that the message is associated with.", - "oneOf": [ - { - "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", - "title": "ByoPhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", - "title": "TwilioPhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", - "title": "VonagePhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", - "title": "VapiPhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", - "title": "TelnyxPhoneNumber" - } - ] - }, - "type": { - "type": "string", - "description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.", - "enum": [ - "chat.deleted" - ] - }, - "timestamp": { - "type": "number", - "description": "This is the timestamp of the message." - }, - "artifact": { - "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.", - "allOf": [ - { - "$ref": "#/components/schemas/Artifact" - } - ] - }, - "assistant": { - "description": "This is the assistant that the message is associated with.", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "customer": { - "description": "This is the customer that the message is associated with.", - "allOf": [ - { - "$ref": "#/components/schemas/CreateCustomerDTO" - } - ] }, - "call": { - "description": "This is the call that the message is associated with.", - "allOf": [ - { - "$ref": "#/components/schemas/Call" - } - ] - }, - "chat": { - "description": "This is the chat that was deleted.", + "session": { + "description": "This is the session that was created.", "allOf": [ { - "$ref": "#/components/schemas/Chat" + "$ref": "#/components/schemas/Session" } ] } }, "required": [ "type", - "chat" + "session" ] }, - "ServerMessageSessionCreated": { + "ServerMessageSessionUpdated": { "type": "object", "properties": { "phoneNumber": { @@ -63228,9 +67245,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"session.created\" is sent when a new session is created.", + "description": "This is the type of the message. \"session.updated\" is sent when a session is updated.", "enum": [ - "session.created" + "session.updated" ] }, "timestamp": { @@ -63278,7 +67295,7 @@ ] }, "session": { - "description": "This is the session that was created.", + "description": "This is the session that was updated.", "allOf": [ { "$ref": "#/components/schemas/Session" @@ -63291,7 +67308,7 @@ "session" ] }, - "ServerMessageSessionUpdated": { + "ServerMessageSessionDeleted": { "type": "object", "properties": { "phoneNumber": { @@ -63321,9 +67338,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"session.updated\" is sent when a session is updated.", + "description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.", "enum": [ - "session.updated" + "session.deleted" ] }, "timestamp": { @@ -63371,7 +67388,7 @@ ] }, "session": { - "description": "This is the session that was updated.", + "description": "This is the session that was deleted.", "allOf": [ { "$ref": "#/components/schemas/Session" @@ -63384,7 +67401,7 @@ "session" ] }, - "ServerMessageSessionDeleted": { + "ServerMessageCallDeleted": { "type": "object", "properties": { "phoneNumber": { @@ -63414,9 +67431,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.", + "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", "enum": [ - "session.deleted" + "call.deleted" ] }, "timestamp": { @@ -63462,22 +67479,13 @@ "$ref": "#/components/schemas/Chat" } ] - }, - "session": { - "description": "This is the session that was deleted.", - "allOf": [ - { - "$ref": "#/components/schemas/Session" - } - ] } }, "required": [ - "type", - "session" + "type" ] }, - "ServerMessageCallDeleted": { + "ServerMessageCallDeleteFailed": { "type": "object", "properties": { "phoneNumber": { @@ -63509,7 +67517,7 @@ "type": "string", "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", "enum": [ - "call.deleted" + "call.delete.failed" ] }, "timestamp": { @@ -63561,7 +67569,55 @@ "type" ] }, - "ServerMessageCallDeleteFailed": { + "CampaignContact": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "campaignId": { + "type": "string" + }, + "orgId": { + "type": "string" + }, + "customerId": { + "type": "string" + }, + "number": { + "type": "string", + "minLength": 3, + "maxLength": 40 + }, + "name": { + "type": "string", + "maxLength": 40 + }, + "assistantOverrides": { + "$ref": "#/components/schemas/AssistantOverrides" + }, + "squadOverrides": { + "description": "Use this when the campaign targets a `squadId`. Mirrors the call-level `squadOverrides` field. Merged with the campaign-level squadOverrides at dispatch time.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "createdAt": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "id", + "campaignId", + "orgId", + "number", + "createdAt" + ] + }, + "ServerMessageCampaignPredial": { "type": "object", "properties": { "phoneNumber": { @@ -63591,9 +67647,21 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", + "description": "This is the type of the message. \"campaign.predial\" is sent to the campaign's server before each contact is dialed, so the server can decide whether the contact is eligible to be called.", "enum": [ - "call.delete.failed" + "campaign.predial" + ] + }, + "campaignId": { + "type": "string", + "description": "This is the ID of the campaign the contact belongs to." + }, + "contact": { + "description": "This is the contact that is about to be dialed.", + "allOf": [ + { + "$ref": "#/components/schemas/CampaignContact" + } ] }, "timestamp": { @@ -63642,7 +67710,9 @@ } }, "required": [ - "type" + "type", + "campaignId", + "contact" ] }, "ServerMessage": { @@ -63758,6 +67828,10 @@ { "$ref": "#/components/schemas/ServerMessageCallDeleteFailed", "title": "CallDeleteFailed" + }, + { + "$ref": "#/components/schemas/ServerMessageCampaignPredial", + "title": "CampaignPredial" } ] } @@ -64040,6 +68114,18 @@ "timeoutSeconds" ] }, + "ServerMessageResponseCampaignPredial": { + "type": "object", + "properties": { + "eligible": { + "type": "boolean", + "description": "This is whether the contact is eligible to be dialed. When `false` — or when the server is unreachable, errors, or times out — the contact is skipped and not called." + } + }, + "required": [ + "eligible" + ] + }, "ServerMessageResponse": { "type": "object", "properties": { @@ -64073,6 +68159,10 @@ { "$ref": "#/components/schemas/ServerMessageResponseCallEndpointingRequest", "title": "CallEndpointingRequest" + }, + { + "$ref": "#/components/schemas/ServerMessageResponseCampaignPredial", + "title": "CampaignPredial" } ] } @@ -64279,397 +68369,6 @@ "message" ] }, - "BotMessage": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "The role of the bot in the conversation." - }, - "message": { - "type": "string", - "description": "The message content from the bot." - }, - "time": { - "type": "number", - "description": "The timestamp when the message was sent." - }, - "endTime": { - "type": "number", - "description": "The timestamp when the message ended." - }, - "secondsFromStart": { - "type": "number", - "description": "The number of seconds from the start of the conversation." - }, - "source": { - "type": "string", - "description": "The source of the message." - }, - "duration": { - "type": "number", - "description": "The duration of the message in seconds." - } - }, - "required": [ - "role", - "message", - "time", - "endTime", - "secondsFromStart" - ] - }, - "ToolCallMessage": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "The role of the tool call in the conversation." - }, - "toolCalls": { - "description": "The list of tool calls made during the conversation.", - "type": "array", - "items": { - "type": "object" - } - }, - "message": { - "type": "string", - "description": "The message content for the tool call." - }, - "time": { - "type": "number", - "description": "The timestamp when the message was sent." - }, - "secondsFromStart": { - "type": "number", - "description": "The number of seconds from the start of the conversation." - } - }, - "required": [ - "role", - "toolCalls", - "message", - "time", - "secondsFromStart" - ] - }, - "ToolCallResultMessage": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "The role of the tool call result in the conversation." - }, - "toolCallId": { - "type": "string", - "description": "The ID of the tool call." - }, - "name": { - "type": "string", - "description": "The name of the tool that returned the result." - }, - "result": { - "type": "string", - "description": "The result of the tool call in JSON format." - }, - "time": { - "type": "number", - "description": "The timestamp when the message was sent." - }, - "secondsFromStart": { - "type": "number", - "description": "The number of seconds from the start of the conversation." - }, - "metadata": { - "type": "object", - "description": "The metadata for the tool call result." - } - }, - "required": [ - "role", - "toolCallId", - "name", - "result", - "time", - "secondsFromStart" - ] - }, - "TransportCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'transport' for this class.", - "enum": [ - "transport" - ] - }, - "provider": { - "type": "string", - "enum": [ - "daily", - "vapi.websocket", - "twilio", - "vonage", - "telnyx", - "vapi.sip" - ] - }, - "minutes": { - "type": "number", - "description": "This is the minutes of `transport` usage. This should match `call.endedAt` - `call.startedAt`." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "minutes", - "cost" - ] - }, - "TranscriberCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'transcriber' for this class.", - "enum": [ - "transcriber" - ] - }, - "transcriber": { - "type": "object", - "description": "This is the transcriber that was used during the call.\n\nThis matches one of the below:\n- `call.assistant.transcriber`,\n- `call.assistantId->transcriber`,\n- `call.squad[n].assistant.transcriber`,\n- `call.squad[n].assistantId->transcriber`,\n- `call.squadId->[n].assistant.transcriber`,\n- `call.squadId->[n].assistantId->transcriber`." - }, - "minutes": { - "type": "number", - "description": "This is the minutes of `transcriber` usage. This should match `call.endedAt` - `call.startedAt` for single assistant calls, while squad calls will have multiple transcriber costs one for each assistant that was used." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "transcriber", - "minutes", - "cost" - ] - }, - "ModelCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'model' for this class.", - "enum": [ - "model" - ] - }, - "model": { - "type": "object", - "description": "This is the model that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.model`,\n- `call.assistantId->model`,\n- `call.squad[n].assistant.model`,\n- `call.squad[n].assistantId->model`,\n- `call.squadId->[n].assistant.model`,\n- `call.squadId->[n].assistantId->model`." - }, - "promptTokens": { - "type": "number", - "description": "This is the number of prompt tokens used in the call. These should be total prompt tokens used in the call for single assistant calls, while squad calls will have multiple model costs one for each assistant that was used." - }, - "completionTokens": { - "type": "number", - "description": "This is the number of completion tokens generated in the call. These should be total completion tokens used in the call for single assistant calls, while squad calls will have multiple model costs one for each assistant that was used." - }, - "cachedPromptTokens": { - "type": "number", - "description": "This is the number of cached prompt tokens used in the call. This is only applicable to certain providers (e.g., OpenAI, Azure OpenAI) that support prompt caching. Cached tokens are billed at a discounted rate." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "model", - "promptTokens", - "completionTokens", - "cost" - ] - }, - "VoiceCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'voice' for this class.", - "enum": [ - "voice" - ] - }, - "voice": { - "type": "object", - "description": "This is the voice that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.voice`,\n- `call.assistantId->voice`,\n- `call.squad[n].assistant.voice`,\n- `call.squad[n].assistantId->voice`,\n- `call.squadId->[n].assistant.voice`,\n- `call.squadId->[n].assistantId->voice`." - }, - "characters": { - "type": "number", - "description": "This is the number of characters that were generated during the call. These should be total characters used in the call for single assistant calls, while squad calls will have multiple voice costs one for each assistant that was used." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "voice", - "characters", - "cost" - ] - }, - "VapiCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'vapi' for this class.", - "enum": [ - "vapi" - ] - }, - "subType": { - "type": "string", - "description": "This is the sub type of the cost.", - "enum": [ - "normal", - "overage" - ] - }, - "minutes": { - "type": "number", - "description": "This is the minutes of Vapi usage. This should match `call.endedAt` - `call.startedAt`." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "subType", - "minutes", - "cost" - ] - }, - "AnalysisCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'analysis' for this class.", - "enum": [ - "analysis" - ] - }, - "analysisType": { - "type": "string", - "description": "This is the type of analysis performed.", - "enum": [ - "summary", - "structuredData", - "successEvaluation", - "structuredOutput" - ] - }, - "model": { - "type": "object", - "description": "This is the model that was used to perform the analysis." - }, - "promptTokens": { - "type": "number", - "description": "This is the number of prompt tokens used in the analysis." - }, - "completionTokens": { - "type": "number", - "description": "This is the number of completion tokens generated in the analysis." - }, - "cachedPromptTokens": { - "type": "number", - "description": "This is the number of cached prompt tokens used in the analysis. This is only applicable to certain providers (e.g., OpenAI, Azure OpenAI) that support prompt caching. Cached tokens are billed at a discounted rate." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "analysisType", - "model", - "promptTokens", - "completionTokens", - "cost" - ] - }, - "VoicemailDetectionCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'voicemail-detection' for this class.", - "enum": [ - "voicemail-detection" - ] - }, - "model": { - "type": "object", - "description": "This is the model that was used to perform the analysis." - }, - "provider": { - "type": "string", - "description": "This is the provider that was used to detect the voicemail.", - "enum": [ - "twilio", - "google", - "openai", - "vapi" - ] - }, - "promptTextTokens": { - "type": "number", - "description": "This is the number of prompt text tokens used in the voicemail detection." - }, - "promptAudioTokens": { - "type": "number", - "description": "This is the number of prompt audio tokens used in the voicemail detection." - }, - "completionTextTokens": { - "type": "number", - "description": "This is the number of completion text tokens used in the voicemail detection." - }, - "completionAudioTokens": { - "type": "number", - "description": "This is the number of completion audio tokens used in the voicemail detection." - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "model", - "provider", - "promptTextTokens", - "promptAudioTokens", - "completionTextTokens", - "completionAudioTokens", - "cost" - ] - }, "KnowledgeBaseCost": { "type": "object", "properties": { @@ -64705,26 +68404,6 @@ "cost" ] }, - "ChatCost": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of cost, always 'chat' for this class.", - "enum": [ - "chat" - ] - }, - "cost": { - "type": "number", - "description": "This is the cost of the component in USD." - } - }, - "required": [ - "type", - "cost" - ] - }, "SessionCost": { "type": "object", "properties": { @@ -64750,7 +68429,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -64837,7 +68516,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -64892,7 +68571,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -64947,7 +68626,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65023,7 +68702,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65113,7 +68792,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65189,7 +68868,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65240,7 +68919,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65291,7 +68970,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65342,7 +69021,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65393,7 +69072,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { @@ -65444,7 +69123,7 @@ "properties": { "messages": { "type": "array", - "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { From 01d8b36c60208fd6c845bacb1fe4929645a530da Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 7 Jul 2026 00:50:19 +0000 Subject: [PATCH 2/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 94 +++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index eca702d51..4063a2747 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -36395,6 +36395,86 @@ } } }, + "TransferArtifact": { + "type": "object", + "properties": { + "destination": { + "description": "The transfer destination (phone number or SIP URI).", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "Number" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "Sip" + } + ] + }, + "mode": { + "type": "string", + "description": "The transfer mode (e.g. warm-transfer-experimental, blind-transfer).", + "enum": [ + "blind-transfer", + "blind-transfer-add-summary-to-sip-header", + "warm-transfer-say-message", + "warm-transfer-say-summary", + "warm-transfer-twiml", + "warm-transfer-wait-for-operator-to-speak-first-and-then-say-message", + "warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary", + "warm-transfer-experimental" + ] + }, + "transcript": { + "type": "string", + "description": "Flat-text transcript / announcement preview of the transfer." + }, + "status": { + "type": "string", + "description": "The terminal status of the transfer, rendered as the status line.", + "enum": [ + "connected", + "no-answer", + "busy", + "voicemail", + "failed", + "completed", + "cancelled" + ] + }, + "messages": { + "type": "array", + "description": "The agent↔operator conversation captured during a\nwarm-transfer-experimental, rendered as bubbles.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/UserMessage", + "title": "UserMessage" + }, + { + "$ref": "#/components/schemas/SystemMessage", + "title": "SystemMessage" + }, + { + "$ref": "#/components/schemas/BotMessage", + "title": "BotMessage" + }, + { + "$ref": "#/components/schemas/ToolCallMessage", + "title": "ToolCallMessage" + }, + { + "$ref": "#/components/schemas/ToolCallResultMessage", + "title": "ToolCallResultMessage" + } + ] + } + } + }, + "required": [ + "destination" + ] + }, "Mono": { "type": "object", "properties": { @@ -36605,6 +36685,13 @@ "$ref": "#/components/schemas/OpenAIMessage" } }, + "transfers": { + "description": "These are the transfer records from warm transfers, including destinations, transcripts, and status.", + "type": "array", + "items": { + "$ref": "#/components/schemas/TransferArtifact" + } + }, "recordingUrl": { "type": "string", "description": "This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.", @@ -36679,13 +36766,6 @@ "type": "object", "description": "These are the scorecards that have been evaluated based on the structured outputs extracted during the call.\nTo enable, set `assistant.artifactPlan.scorecardIds` or `assistant.artifactPlan.scorecards` with the IDs or objects of the scorecards you want to evaluate." }, - "transfers": { - "description": "These are the transfer records from warm transfers, including destinations, transcripts, and status.", - "type": "array", - "items": { - "type": "string" - } - }, "structuredOutputsLastUpdatedAt": { "format": "date-time", "type": "string", From a2c864545f9d0ebdd1c4f72ed03d4aa27625fb43 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 8 Jul 2026 00:42:07 +0000 Subject: [PATCH 3/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 742 ++++++++++++++++++++++++++++++++++++- 1 file changed, 728 insertions(+), 14 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index 4063a2747..81708586f 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -9735,6 +9735,623 @@ "provider" ] }, + "VapiTranscriber": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "vapi" + ] + }, + "version": { + "type": "string", + "description": "This is the version of the Vapi transcriber. Vapi manages the underlying\nmodel and routing. When omitted, the latest version is used.\n\nManaged version params are additive-only and `'latest'` is an auto-update\nchannel — see the param-evolution INVARIANT in `vapiManaged/types.ts`.", + "enum": [ + "latest", + "1" + ] + }, + "language": { + "type": "string", + "description": "This is the language for transcription as an ISO 639-1 code (e.g. `en`).\nSelecting a language locks transcription to it. For multiple languages,\nuse `languages` instead. When neither `language` nor `languages` is set,\nthe transcriber auto-detects the spoken language.", + "enum": [ + "aa", + "ab", + "ae", + "af", + "ak", + "am", + "an", + "ar", + "as", + "av", + "ay", + "az", + "ba", + "be", + "bg", + "bh", + "bi", + "bm", + "bn", + "bo", + "br", + "bs", + "ca", + "ce", + "ch", + "co", + "cr", + "cs", + "cu", + "cv", + "cy", + "da", + "de", + "dv", + "dz", + "ee", + "el", + "en", + "eo", + "es", + "et", + "eu", + "fa", + "ff", + "fi", + "fj", + "fo", + "fr", + "fy", + "ga", + "gd", + "gl", + "gn", + "gu", + "gv", + "ha", + "he", + "hi", + "ho", + "hr", + "ht", + "hu", + "hy", + "hz", + "ia", + "id", + "ie", + "ig", + "ii", + "ik", + "io", + "is", + "it", + "iu", + "ja", + "jv", + "ka", + "kg", + "ki", + "kj", + "kk", + "kl", + "km", + "kn", + "ko", + "kr", + "ks", + "ku", + "kv", + "kw", + "ky", + "la", + "lb", + "lg", + "li", + "ln", + "lo", + "lt", + "lu", + "lv", + "mg", + "mh", + "mi", + "mk", + "ml", + "mn", + "mr", + "ms", + "mt", + "my", + "na", + "nb", + "nd", + "ne", + "ng", + "nl", + "nn", + "no", + "nr", + "nv", + "ny", + "oc", + "oj", + "om", + "or", + "os", + "pa", + "pi", + "pl", + "ps", + "pt", + "qu", + "rm", + "rn", + "ro", + "ru", + "rw", + "sa", + "sc", + "sd", + "se", + "sg", + "si", + "sk", + "sl", + "sm", + "sn", + "so", + "sq", + "sr", + "ss", + "st", + "su", + "sv", + "sw", + "ta", + "te", + "tg", + "th", + "ti", + "tk", + "tl", + "tn", + "to", + "tr", + "ts", + "tt", + "tw", + "ty", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "wo", + "xh", + "yi", + "yue", + "yo", + "za", + "zh", + "zu" + ] + }, + "languages": { + "type": "array", + "description": "These are the languages for transcription as ISO 639-1 codes. Set one or\nmore codes to restrict and bias recognition to those languages. An empty\narray `[]` (or omitting both this and `language`) enables auto-detection\nof the spoken language.", + "enum": [ + "aa", + "ab", + "ae", + "af", + "ak", + "am", + "an", + "ar", + "as", + "av", + "ay", + "az", + "ba", + "be", + "bg", + "bh", + "bi", + "bm", + "bn", + "bo", + "br", + "bs", + "ca", + "ce", + "ch", + "co", + "cr", + "cs", + "cu", + "cv", + "cy", + "da", + "de", + "dv", + "dz", + "ee", + "el", + "en", + "eo", + "es", + "et", + "eu", + "fa", + "ff", + "fi", + "fj", + "fo", + "fr", + "fy", + "ga", + "gd", + "gl", + "gn", + "gu", + "gv", + "ha", + "he", + "hi", + "ho", + "hr", + "ht", + "hu", + "hy", + "hz", + "ia", + "id", + "ie", + "ig", + "ii", + "ik", + "io", + "is", + "it", + "iu", + "ja", + "jv", + "ka", + "kg", + "ki", + "kj", + "kk", + "kl", + "km", + "kn", + "ko", + "kr", + "ks", + "ku", + "kv", + "kw", + "ky", + "la", + "lb", + "lg", + "li", + "ln", + "lo", + "lt", + "lu", + "lv", + "mg", + "mh", + "mi", + "mk", + "ml", + "mn", + "mr", + "ms", + "mt", + "my", + "na", + "nb", + "nd", + "ne", + "ng", + "nl", + "nn", + "no", + "nr", + "nv", + "ny", + "oc", + "oj", + "om", + "or", + "os", + "pa", + "pi", + "pl", + "ps", + "pt", + "qu", + "rm", + "rn", + "ro", + "ru", + "rw", + "sa", + "sc", + "sd", + "se", + "sg", + "si", + "sk", + "sl", + "sm", + "sn", + "so", + "sq", + "sr", + "ss", + "st", + "su", + "sv", + "sw", + "ta", + "te", + "tg", + "th", + "ti", + "tk", + "tl", + "tn", + "to", + "tr", + "ts", + "tt", + "tw", + "ty", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "wo", + "xh", + "yi", + "yue", + "yo", + "za", + "zh", + "zu" + ], + "items": { + "type": "string", + "enum": [ + "aa", + "ab", + "ae", + "af", + "ak", + "am", + "an", + "ar", + "as", + "av", + "ay", + "az", + "ba", + "be", + "bg", + "bh", + "bi", + "bm", + "bn", + "bo", + "br", + "bs", + "ca", + "ce", + "ch", + "co", + "cr", + "cs", + "cu", + "cv", + "cy", + "da", + "de", + "dv", + "dz", + "ee", + "el", + "en", + "eo", + "es", + "et", + "eu", + "fa", + "ff", + "fi", + "fj", + "fo", + "fr", + "fy", + "ga", + "gd", + "gl", + "gn", + "gu", + "gv", + "ha", + "he", + "hi", + "ho", + "hr", + "ht", + "hu", + "hy", + "hz", + "ia", + "id", + "ie", + "ig", + "ii", + "ik", + "io", + "is", + "it", + "iu", + "ja", + "jv", + "ka", + "kg", + "ki", + "kj", + "kk", + "kl", + "km", + "kn", + "ko", + "kr", + "ks", + "ku", + "kv", + "kw", + "ky", + "la", + "lb", + "lg", + "li", + "ln", + "lo", + "lt", + "lu", + "lv", + "mg", + "mh", + "mi", + "mk", + "ml", + "mn", + "mr", + "ms", + "mt", + "my", + "na", + "nb", + "nd", + "ne", + "ng", + "nl", + "nn", + "no", + "nr", + "nv", + "ny", + "oc", + "oj", + "om", + "or", + "os", + "pa", + "pi", + "pl", + "ps", + "pt", + "qu", + "rm", + "rn", + "ro", + "ru", + "rw", + "sa", + "sc", + "sd", + "se", + "sg", + "si", + "sk", + "sl", + "sm", + "sn", + "so", + "sq", + "sr", + "ss", + "st", + "su", + "sv", + "sw", + "ta", + "te", + "tg", + "th", + "ti", + "tk", + "tl", + "tn", + "to", + "tr", + "ts", + "tt", + "tw", + "ty", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "wo", + "xh", + "yi", + "yue", + "yo", + "za", + "zh", + "zu" + ] + } + }, + "keywords": { + "description": "These are custom keywords/vocabulary to boost recognition of use-case\nspecific words (company names, product names, jargon).", + "type": "array", + "items": { + "type": "string" + } + }, + "turnTaking": { + "type": "string", + "description": "This is the turn-taking mode. `intelligent` uses the underlying model's\nnative end-of-turn detection; `manual` ignores it and waits a fixed\nend-of-turn delay. Defaults to `intelligent`.", + "enum": [ + "intelligent", + "manual" + ] + }, + "fallbackPlan": { + "description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.", + "allOf": [ + { + "$ref": "#/components/schemas/FallbackTranscriberPlan" + } + ] + } + }, + "required": [ + "provider" + ] + }, "FallbackAssemblyAITranscriber": { "type": "object", "properties": { @@ -13950,6 +14567,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -18946,6 +19567,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -21294,6 +21919,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -22000,6 +22629,18 @@ } ] }, + "model": { + "type": "string", + "description": "White-label Vapi models are selected by `version`, not a model name, so\n`model` is optional here (the runtime already accepts a version-only Vapi\npayload). Overriding the required `ModelBase.model`: the declared type stays\n`string` to match the base (avoids TS2416) and the `= undefined!` initializer\nsatisfies TS2612 for the field override, while `@IsOptional` +\n`@ApiPropertyOptional` make validation and the generated OpenAPI schema treat\nit as optional (so `VapiModel.required` is `['provider']`)." + }, + "version": { + "type": "string", + "description": "Vapi-managed model version (update channel). When set, this is a Vapi-managed\nLLM routed by the registry; when absent, this is the legacy workflow form\nbelow (`steps` / `workflow`).", + "enum": [ + "latest", + "1" + ] + }, "provider": { "type": "string", "enum": [ @@ -22018,10 +22659,6 @@ } ] }, - "model": { - "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b" - }, "temperature": { "type": "number", "description": "This is the temperature that will be used for calls. Default is 0.5.", @@ -22045,8 +22682,7 @@ } }, "required": [ - "provider", - "model" + "provider" ] }, "XaiModel": { @@ -24599,11 +25235,28 @@ ] }, "version": { - "type": "number", - "description": "The Vapi voice routing generation. Version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used.", + "description": "The Vapi voice routing generation. `latest` auto-updates to the newest generation; version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used. Accepts the string channel ('latest', '1', '2'); legacy numeric values (1, 2) are also accepted and coerced to their string form.", "enum": [ - 1, - 2 + "1", + "2", + "latest" + ], + "oneOf": [ + { + "type": "string", + "enum": [ + "1", + "2", + "latest" + ] + }, + { + "type": "number", + "enum": [ + 1, + 2 + ] + } ] }, "speed": { @@ -27167,11 +27820,28 @@ ] }, "version": { - "type": "number", - "description": "The Vapi voice routing generation. Version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used.", + "description": "The Vapi voice routing generation. `latest` auto-updates to the newest generation; version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used. Accepts the string channel ('latest', '1', '2'); legacy numeric values (1, 2) are also accepted and coerced to their string form.", "enum": [ - 1, - 2 + "1", + "2", + "latest" + ], + "oneOf": [ + { + "type": "string", + "enum": [ + "1", + "2", + "latest" + ] + }, + { + "type": "number", + "enum": [ + 1, + 2 + ] + } ] }, "speed": { @@ -29626,6 +30296,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -29695,6 +30369,10 @@ { "$ref": "#/components/schemas/XaiModel", "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" } ] }, @@ -30608,6 +31286,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -30677,6 +31359,10 @@ { "$ref": "#/components/schemas/XaiModel", "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" } ] }, @@ -31487,6 +32173,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -31556,6 +32246,10 @@ { "$ref": "#/components/schemas/XaiModel", "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" } ] }, @@ -32473,6 +33167,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -32542,6 +33240,10 @@ { "$ref": "#/components/schemas/XaiModel", "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" } ] }, @@ -33468,6 +34170,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -34163,6 +34869,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, @@ -34840,6 +35550,10 @@ { "$ref": "#/components/schemas/XaiTranscriber", "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" } ] }, From 43b4ecf89d307b41f197fa823553e5800b4bdb78 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 9 Jul 2026 00:46:55 +0000 Subject: [PATCH 4/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index 81708586f..f2dfc7c10 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -10338,14 +10338,6 @@ "intelligent", "manual" ] - }, - "fallbackPlan": { - "description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.", - "allOf": [ - { - "$ref": "#/components/schemas/FallbackTranscriberPlan" - } - ] } }, "required": [ @@ -25343,14 +25335,6 @@ "$ref": "#/components/schemas/ChunkPlan" } ] - }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", - "allOf": [ - { - "$ref": "#/components/schemas/FallbackPlan" - } - ] } }, "required": [ @@ -41014,7 +40998,7 @@ ] }, "customers": { - "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided.", + "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided. Maximum of 10000 customers per campaign.", "type": "array", "items": { "$ref": "#/components/schemas/CreateCustomerDTO" @@ -41118,7 +41102,7 @@ ] }, "customers": { - "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided.", + "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided. Maximum of 10000 customers per campaign.", "type": "array", "items": { "$ref": "#/components/schemas/CreateCustomerDTO" From d0979cec73db21557c6ca442b28a1672a8f83af9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 14 Jul 2026 00:38:44 +0000 Subject: [PATCH 5/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index f2dfc7c10..fdee6aaa8 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -22657,12 +22657,6 @@ "minimum": 0, "maximum": 2 }, - "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.", - "minimum": 50, - "maximum": 10000 - }, "emotionRecognitionEnabled": { "type": "boolean", "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false" From 5b79eb03d643e856f37a5ce9324b40817bad8c47 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 15 Jul 2026 00:36:13 +0000 Subject: [PATCH 6/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 45 ++++++++++++++------------------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index fdee6aaa8..c943c7f36 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -28681,7 +28681,7 @@ "properties": { "ip": { "type": "string", - "description": "This is the address of the gateway. It can be an IPv4 address like 1.1.1.1 or a fully qualified domain name like my-sip-trunk.pstn.twilio.com." + "description": "This is the address of the gateway. Inbound gateways require an IPv4 address like 1.1.1.1. Outbound-only gateways can also use a fully qualified domain name like my-sip-trunk.pstn.twilio.com." }, "port": { "type": "number", @@ -28756,10 +28756,6 @@ } } }, - "SbcConfiguration": { - "type": "object", - "properties": {} - }, "CreateByoSipTrunkCredentialDTO": { "type": "object", "properties": { @@ -28799,14 +28795,6 @@ "description": "This can be used to enable the SIP diversion header for authenticating the calling number if the SIP trunk supports it. This is an advanced property.", "maxLength": 10000 }, - "sbcConfiguration": { - "description": "This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.", - "allOf": [ - { - "$ref": "#/components/schemas/SbcConfiguration" - } - ] - }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -38077,12 +38065,17 @@ "pipeline-error-vapi-500-server-error", "pipeline-error-vapi-503-server-overloaded-error", "call.in-progress.error-providerfault-vapi-llm-failed", + "call.in-progress.error-vapifault-vapi-llm-failed", "call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed", "call.in-progress.error-vapifault-vapi-401-unauthorized", "call.in-progress.error-vapifault-vapi-403-model-access-denied", "call.in-progress.error-vapifault-vapi-429-exceeded-quota", "call.in-progress.error-providerfault-vapi-500-server-error", "call.in-progress.error-providerfault-vapi-503-server-overloaded-error", + "pipeline-error-vapi-transcriber-failed", + "call.in-progress.error-vapifault-vapi-transcriber-failed", + "call.in-progress.error-providerfault-vapi-transcriber-failed", + "call.in-progress.error-providerfault-vapi-voice-failed", "pipeline-error-deepgram-transcriber-failed", "pipeline-error-deepgram-transcriber-api-key-missing", "call.in-progress.error-vapifault-deepgram-transcriber-failed", @@ -56064,14 +56057,6 @@ "type": "string", "description": "This can be used to enable the SIP diversion header for authenticating the calling number if the SIP trunk supports it. This is an advanced property.", "maxLength": 10000 - }, - "sbcConfiguration": { - "description": "This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.", - "allOf": [ - { - "$ref": "#/components/schemas/SbcConfiguration" - } - ] } }, "required": [ @@ -59455,14 +59440,6 @@ "type": "string", "description": "This can be used to enable the SIP diversion header for authenticating the calling number if the SIP trunk supports it. This is an advanced property.", "maxLength": 10000 - }, - "sbcConfiguration": { - "description": "This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.", - "allOf": [ - { - "$ref": "#/components/schemas/SbcConfiguration" - } - ] } } }, @@ -64600,12 +64577,17 @@ "pipeline-error-vapi-500-server-error", "pipeline-error-vapi-503-server-overloaded-error", "call.in-progress.error-providerfault-vapi-llm-failed", + "call.in-progress.error-vapifault-vapi-llm-failed", "call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed", "call.in-progress.error-vapifault-vapi-401-unauthorized", "call.in-progress.error-vapifault-vapi-403-model-access-denied", "call.in-progress.error-vapifault-vapi-429-exceeded-quota", "call.in-progress.error-providerfault-vapi-500-server-error", "call.in-progress.error-providerfault-vapi-503-server-overloaded-error", + "pipeline-error-vapi-transcriber-failed", + "call.in-progress.error-vapifault-vapi-transcriber-failed", + "call.in-progress.error-providerfault-vapi-transcriber-failed", + "call.in-progress.error-providerfault-vapi-voice-failed", "pipeline-error-deepgram-transcriber-failed", "pipeline-error-deepgram-transcriber-api-key-missing", "call.in-progress.error-vapifault-deepgram-transcriber-failed", @@ -66008,12 +65990,17 @@ "pipeline-error-vapi-500-server-error", "pipeline-error-vapi-503-server-overloaded-error", "call.in-progress.error-providerfault-vapi-llm-failed", + "call.in-progress.error-vapifault-vapi-llm-failed", "call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed", "call.in-progress.error-vapifault-vapi-401-unauthorized", "call.in-progress.error-vapifault-vapi-403-model-access-denied", "call.in-progress.error-vapifault-vapi-429-exceeded-quota", "call.in-progress.error-providerfault-vapi-500-server-error", "call.in-progress.error-providerfault-vapi-503-server-overloaded-error", + "pipeline-error-vapi-transcriber-failed", + "call.in-progress.error-vapifault-vapi-transcriber-failed", + "call.in-progress.error-providerfault-vapi-transcriber-failed", + "call.in-progress.error-providerfault-vapi-voice-failed", "pipeline-error-deepgram-transcriber-failed", "pipeline-error-deepgram-transcriber-api-key-missing", "call.in-progress.error-vapifault-deepgram-transcriber-failed", From f860d70f35334e968e9f99e13bf2b531d919ce71 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 18 Jul 2026 00:38:40 +0000 Subject: [PATCH 7/7] Update API specifications with fern api update --- fern/apis/api/openapi.json | 8734 ++++++++++++++++++++++++++++++------ 1 file changed, 7275 insertions(+), 1459 deletions(-) diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index c943c7f36..0ac5e50e7 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -266,6 +266,16 @@ } } } + }, + "409": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssistantPinnedConflictResponseDTO" + } + } + } } }, "tags": [ @@ -4497,6 +4507,16 @@ } } } + }, + "409": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ToolPinnedConflictResponseDTO" + } + } + } } }, "tags": [ @@ -15213,6 +15233,11 @@ "SquadMemberDTO": { "type": "object", "properties": { + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the assistant version (e.g. `v3`) to pin for this squad member. When set, the call uses\nthe snapshot from `assistant_version` (by `(assistantId, version)`) instead of the latest. Valid\nonly with `assistantId`; rejected with inline `assistant`. Omit to follow the latest version." + }, "assistantDestinations": { "type": "array", "items": { @@ -16082,6 +16107,24 @@ "role" ] }, + "ToolRef": { + "type": "object", + "properties": { + "toolId": { + "type": "string", + "description": "This is the unique identifier of the tool whose version is being pinned.", + "format": "uuid" + }, + "version": { + "type": "string", + "description": "Public version label of the tool, e.g. \"v3\"" + } + }, + "required": [ + "toolId", + "version" + ] + }, "AnyscaleModel": { "type": "object", "properties": { @@ -16199,6 +16242,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -16383,6 +16433,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -16571,6 +16628,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -16760,6 +16824,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -16927,6 +16998,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -17125,6 +17203,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -17288,6 +17373,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -17524,6 +17616,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -17714,6 +17813,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -17894,6 +18000,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -18060,6 +18173,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -18226,6 +18346,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -18680,6 +18807,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -18843,6 +18977,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -19006,6 +19147,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -22204,6 +22352,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -22327,6 +22479,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -22612,6 +22765,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -22788,6 +22948,13 @@ "type": "string" } }, + "toolRefs": { + "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolRef" + } + }, "knowledgeBase": { "description": "These are the options for the knowledge base.", "oneOf": [ @@ -30812,6 +30979,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -30935,6 +31106,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -31802,6 +31974,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -31925,6 +32101,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -32689,6 +32866,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -32812,6 +32993,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -32869,6 +33051,11 @@ ] } }, + "latestVersion": { + "type": "string", + "nullable": true, + "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." + }, "name": { "type": "string", "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", @@ -33058,25 +33245,7 @@ "metadata" ] }, - "AssistantVersionPaginatedResponse": { - "type": "object", - "properties": { - "results": { - "type": "array" - }, - "metadata": { - "$ref": "#/components/schemas/PaginationMeta" - }, - "nextPageState": { - "type": "string" - } - }, - "required": [ - "results", - "metadata" - ] - }, - "UpdateAssistantDTO": { + "AssistantDraft": { "type": "object", "properties": { "transcriber": { @@ -33683,6 +33852,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -33806,6 +33979,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -33960,130 +34134,137 @@ }, "keypadInputPlan": { "$ref": "#/components/schemas/KeypadInputPlan" - } - } - }, - "Squad": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "This is the name of the squad." }, - "members": { - "description": "This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list.", - "type": "array", - "items": { - "$ref": "#/components/schemas/SquadMemberDTO" - } - }, - "membersOverrides": { - "description": "This can be used to override all the assistants' settings and provide values for their template variables.\n\nBoth `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.", - "allOf": [ - { - "$ref": "#/components/schemas/AssistantOverrides" - } - ] + "baseVersion": { + "type": "string", + "description": "Server-resolved baseVersion (always set after POST)." }, "id": { "type": "string", - "description": "This is the unique identifier for the squad." + "description": "Surrogate key used as `draftId` in URLs." }, "orgId": { "type": "string", - "description": "This is the unique identifier for the org that this squad belongs to." + "description": "Org this draft belongs to." + }, + "assistantId": { + "type": "string", + "description": "Parent assistant the draft was forked from. FK to assistant.id ON DELETE CASCADE." + }, + "createdBy": { + "type": "string", + "nullable": true, + "description": "Email when JWT, null when API or external JWT. Set on POST, never rewritten on PATCH." }, "createdAt": { "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the squad was created." + "type": "string" }, "updatedAt": { "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the squad was last updated." + "type": "string" } }, "required": [ - "members", + "baseVersion", "id", "orgId", + "assistantId", "createdAt", "updatedAt" ] }, - "UpdateSquadDTO": { + "AssistantDraftPaginatedMetadata": { "type": "object", "properties": { - "name": { + "nextCursor": { "type": "string", - "description": "This is the name of the squad." + "nullable": true }, - "members": { - "description": "This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list.", + "hasNextPage": { + "type": "boolean" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "nextCursor", + "hasNextPage", + "limit" + ] + }, + "AssistantDraftPaginatedResponse": { + "type": "object", + "properties": { + "results": { "type": "array", "items": { - "$ref": "#/components/schemas/SquadMemberDTO" + "$ref": "#/components/schemas/AssistantDraft" } }, - "membersOverrides": { - "description": "This can be used to override all the assistants' settings and provide values for their template variables.\n\nBoth `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.", - "allOf": [ - { - "$ref": "#/components/schemas/AssistantOverrides" - } - ] + "metadata": { + "$ref": "#/components/schemas/AssistantDraftPaginatedMetadata" } }, "required": [ - "members" + "results", + "metadata" ] }, - "Workflow": { + "LegacyAssistantVersion": { "type": "object", "properties": { - "nodes": { + "id": { + "type": "string" + }, + "assistantId": { + "type": "string" + }, + "orgId": { + "type": "string" + }, + "data": { + "type": "string" + }, + "createdAt": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "id", + "assistantId", + "orgId", + "createdAt" + ] + }, + "LegacyAssistantVersionPaginatedResponse": { + "type": "object", + "properties": { + "results": { "type": "array", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ConversationNode", - "title": "ConversationNode" - }, - { - "$ref": "#/components/schemas/ToolNode", - "title": "ToolNode" - } - ] + "$ref": "#/components/schemas/LegacyAssistantVersion" } }, - "model": { - "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.", - "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" - } - ] + "metadata": { + "$ref": "#/components/schemas/PaginationMeta" }, + "nextPageState": { + "type": "string" + } + }, + "required": [ + "results", + "metadata" + ] + }, + "AssistantVersion": { + "type": "object", + "properties": { "transcriber": { - "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.", + "description": "These are the options for the assistant's transcriber.", "oneOf": [ { "$ref": "#/components/schemas/AssemblyAITranscriber", @@ -34143,8 +34324,81 @@ } ] }, + "model": { + "description": "These are the options for the assistant's LLM.", + "oneOf": [ + { + "$ref": "#/components/schemas/AnthropicModel", + "title": "Anthropic" + }, + { + "$ref": "#/components/schemas/AnthropicBedrockModel", + "title": "AnthropicBedrock" + }, + { + "$ref": "#/components/schemas/AnyscaleModel", + "title": "Anyscale" + }, + { + "$ref": "#/components/schemas/CerebrasModel", + "title": "Cerebras" + }, + { + "$ref": "#/components/schemas/CustomLLMModel", + "title": "CustomLLM" + }, + { + "$ref": "#/components/schemas/DeepInfraModel", + "title": "DeepInfra" + }, + { + "$ref": "#/components/schemas/DeepSeekModel", + "title": "DeepSeek" + }, + { + "$ref": "#/components/schemas/GoogleModel", + "title": "Google" + }, + { + "$ref": "#/components/schemas/GroqModel", + "title": "Groq" + }, + { + "$ref": "#/components/schemas/InflectionAIModel", + "title": "InflectionAI" + }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, + { + "$ref": "#/components/schemas/OpenAIModel", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/OpenRouterModel", + "title": "OpenRouter" + }, + { + "$ref": "#/components/schemas/PerplexityAIModel", + "title": "PerplexityAI" + }, + { + "$ref": "#/components/schemas/TogetherAIModel", + "title": "Together" + }, + { + "$ref": "#/components/schemas/XaiModel", + "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" + } + ] + }, "voice": { - "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.", + "description": "These are the options for the assistant's voice.", "oneOf": [ { "$ref": "#/components/schemas/AzureVoice", @@ -34228,20 +34482,201 @@ } ] }, - "observabilityPlan": { - "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.", + "firstMessage": { + "type": "string", + "description": "This is the first message that the assistant will say. This can also be a URL to a containerized audio file (mp3, wav, etc.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.", + "example": "Hello! How can I help you today?" + }, + "firstMessageInterruptionsEnabled": { + "type": "boolean", + "default": false + }, + "firstMessageMode": { + "type": "string", + "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message generated by the model based on the conversation state. (`assistant.model.messages` at call start, `call.messages` at squad transfer points).\n\n@default 'assistant-speaks-first'", + "enum": [ + "assistant-speaks-first", + "assistant-speaks-first-with-model-generated-message", + "assistant-waits-for-user" + ], + "example": "assistant-speaks-first" + }, + "voicemailDetection": { + "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.", "oneOf": [ { - "$ref": "#/components/schemas/LangfuseObservabilityPlan", - "title": "Langfuse" - } - ], - "allOf": [ + "type": "string", + "enum": [ + "off" + ] + }, { - "$ref": "#/components/schemas/LangfuseObservabilityPlan" + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" } ] }, + "clientMessages": { + "type": "array", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "example": [ + "conversation-update", + "function-call", + "hang", + "model-output", + "speech-update", + "status-update", + "transfer-update", + "transcript", + "tool-calls", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started. You can check the shape of the messages in ClientMessage schema.", + "items": { + "type": "string", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ] + } + }, + "serverMessages": { + "type": "array", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ], + "example": [ + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "speech-update", + "status-update", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "user-interrupted", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started. You can check the shape of the messages in ServerMessage schema.", + "items": { + "type": "string", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ] + } + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, "backgroundSound": { "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ @@ -34260,37 +34695,40 @@ } ] }, - "hooks": { + "modelOutputInMessagesEnabled": { + "type": "boolean", + "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false", + "example": false + }, + "transportConfigurations": { "type": "array", - "description": "This is a set of actions that will be performed on certain events.", + "description": "These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You can store multiple configurations for different transport providers. For a call, only the configuration matching the call transport provider is used.", "items": { "oneOf": [ { - "$ref": "#/components/schemas/CallHookCallEnding", - "title": "CallHookCallEnding" - }, - { - "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", - "title": "CallHookAssistantSpeechInterrupted" - }, - { - "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", - "title": "CallHookCustomerSpeechInterrupted" - }, - { - "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", - "title": "CallHookCustomerSpeechTimeout" - }, - { - "$ref": "#/components/schemas/CallHookModelResponseTimeout", - "title": "CallHookModelResponseTimeout" + "$ref": "#/components/schemas/TransportConfigurationTwilio", + "title": "Twilio" } ] } }, + "observabilityPlan": { + "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, "credentials": { "type": "array", - "description": "These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "description": "These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", "items": { "oneOf": [ { @@ -34429,6 +34867,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -34552,6 +34994,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -34581,86 +35024,133 @@ } } }, - "voicemailDetection": { - "description": "This is the voicemail detection plan for the workflow.", - "oneOf": [ - { - "type": "string", - "enum": [ - "off" - ] - }, - { - "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", - "title": "Google" - }, - { - "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", - "title": "OpenAI" - }, - { - "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", - "title": "Twilio" - }, - { - "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", - "title": "Vapi" - } - ] + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/SessionCreatedHook", + "title": "SessionCreatedHook" + } + ] + } }, - "maxDurationSeconds": { - "type": "number", - "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.", - "minimum": 10, - "maximum": 43200, - "example": 600 + "versionName": { + "type": "string", + "nullable": true, + "description": "Optional human-readable label for this version. Pass `null` to clear.", + "maxLength": 80 + }, + "versionDescription": { + "type": "string", + "nullable": true, + "description": "Optional description for this version. Pass `null` to clear.", + "maxLength": 500 }, "id": { - "type": "string" + "type": "string", + "description": "This is the unique identifier for the version row.", + "format": "uuid" }, "orgId": { - "type": "string" + "type": "string", + "description": "This is the unique identifier for the org that owns this version.", + "format": "uuid" }, - "createdAt": { - "format": "date-time", - "type": "string" + "assistantId": { + "type": "string", + "description": "This is the unique identifier for the assistant this version was snapshotted from.", + "format": "uuid" }, - "updatedAt": { - "format": "date-time", - "type": "string" + "version": { + "type": "string", + "description": "This is the public monotonic version label, e.g. \"v1\".\nSystem-owned and incremented per assistant; never user-supplied.", + "example": "v1" + }, + "configHash": { + "type": "string", + "description": "This is the SHA-256 hex of the snapshotted content used for no-op detection." + }, + "parentVersion": { + "type": "string", + "nullable": true, + "description": "This is the prior version label (vN-1). Null on v1 or for branch roots." + }, + "createdBy": { + "type": "string", + "nullable": true, + "description": "This is the actor that wrote this version. Email when created via JWT, null when created via API." + }, + "deletedAt": { + "type": "string", + "nullable": true, + "description": "This is the soft-delete timestamp. Null when active.", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "description": "This is the ISO 8601 date-time string of when the version was created.", + "format": "date-time" }, "name": { "type": "string", - "maxLength": 80 + "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "maxLength": 40 }, - "edges": { + "voicemailMessage": { + "type": "string", + "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", + "maxLength": 1000 + }, + "endCallMessage": { + "type": "string", + "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.", + "maxLength": 1000 + }, + "endCallPhrases": { + "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.", "type": "array", "items": { - "$ref": "#/components/schemas/Edge" + "type": "string", + "maxLength": 140, + "minLength": 2 } }, - "globalPrompt": { - "type": "string", - "maxLength": 5000 + "compliancePlan": { + "$ref": "#/components/schemas/CompliancePlan" }, - "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. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server", - "allOf": [ - { - "$ref": "#/components/schemas/Server" - } - ] + "metadata": { + "type": "object", + "description": "This is for metadata you want to store on the assistant." }, - "compliancePlan": { - "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.", + "backgroundSpeechDenoisingPlan": { + "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising", "allOf": [ { - "$ref": "#/components/schemas/CompliancePlan" + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" } ] }, "analysisPlan": { - "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.", + "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/AnalysisPlan" @@ -34668,7 +35158,7 @@ ] }, "artifactPlan": { - "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.", + "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.", "allOf": [ { "$ref": "#/components/schemas/ArtifactPlan" @@ -34676,7 +35166,7 @@ ] }, "startSpeakingPlan": { - "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", + "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", "allOf": [ { "$ref": "#/components/schemas/StartSpeakingPlan" @@ -34684,7 +35174,7 @@ ] }, "stopSpeakingPlan": { - "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", + "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", "allOf": [ { "$ref": "#/components/schemas/StopSpeakingPlan" @@ -34692,97 +35182,150 @@ ] }, "monitorPlan": { - "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.", + "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.", "allOf": [ { "$ref": "#/components/schemas/MonitorPlan" } ] }, - "backgroundSpeechDenoisingPlan": { - "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising", - "allOf": [ - { - "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" - } - ] - }, "credentialIds": { - "description": "These are the credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", + "description": "These are the credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", "type": "array", "items": { "type": "string" } }, - "keypadInputPlan": { - "description": "This is the plan for keypad input handling during workflow calls.", + "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.url\n2. phoneNumber.serverUrl\n3. org.serverUrl", "allOf": [ { - "$ref": "#/components/schemas/KeypadInputPlan" + "$ref": "#/components/schemas/Server" } ] }, - "voicemailMessage": { - "type": "string", - "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", - "maxLength": 1000 + "keypadInputPlan": { + "$ref": "#/components/schemas/KeypadInputPlan" } }, "required": [ - "nodes", "id", "orgId", - "createdAt", - "updatedAt", - "name", - "edges" + "assistantId", + "version", + "configHash", + "createdAt" ] }, - "CreateWorkflowDTO": { + "AssistantVersionPaginatedMetadata": { "type": "object", "properties": { - "nodes": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ConversationNode", - "title": "ConversationNode" - }, - { - "$ref": "#/components/schemas/ToolNode", - "title": "ToolNode" - } - ] - } + "nextCursor": { + "type": "string", + "nullable": true }, - "model": { - "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.", - "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" - } + "hasNextPage": { + "type": "boolean" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "hasNextPage", + "limit" + ] + }, + "AssistantVersionPaginatedResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AssistantVersion" + } + }, + "metadata": { + "$ref": "#/components/schemas/AssistantVersionPaginatedMetadata" + } + }, + "required": [ + "results", + "metadata" + ] + }, + "UpdateAssistantVersionMetadataDTO": { + "type": "object", + "properties": { + "versionName": { + "type": "string", + "nullable": true, + "description": "Optional human-readable label for this version. Pass `null` to clear.", + "maxLength": 80 + }, + "versionDescription": { + "type": "string", + "nullable": true, + "description": "Optional description for this version. Pass `null` to clear.", + "maxLength": 500 + } + } + }, + "VersionPinReference": { + "type": "object", + "properties": { + "sourceType": { + "type": "string", + "enum": [ + "assistant_version", + "squad", + "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": { "transcriber": { - "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.", + "description": "These are the options for the assistant's transcriber.", "oneOf": [ { "$ref": "#/components/schemas/AssemblyAITranscriber", @@ -34842,8 +35385,81 @@ } ] }, + "model": { + "description": "These are the options for the assistant's LLM.", + "oneOf": [ + { + "$ref": "#/components/schemas/AnthropicModel", + "title": "Anthropic" + }, + { + "$ref": "#/components/schemas/AnthropicBedrockModel", + "title": "AnthropicBedrock" + }, + { + "$ref": "#/components/schemas/AnyscaleModel", + "title": "Anyscale" + }, + { + "$ref": "#/components/schemas/CerebrasModel", + "title": "Cerebras" + }, + { + "$ref": "#/components/schemas/CustomLLMModel", + "title": "CustomLLM" + }, + { + "$ref": "#/components/schemas/DeepInfraModel", + "title": "DeepInfra" + }, + { + "$ref": "#/components/schemas/DeepSeekModel", + "title": "DeepSeek" + }, + { + "$ref": "#/components/schemas/GoogleModel", + "title": "Google" + }, + { + "$ref": "#/components/schemas/GroqModel", + "title": "Groq" + }, + { + "$ref": "#/components/schemas/InflectionAIModel", + "title": "InflectionAI" + }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, + { + "$ref": "#/components/schemas/OpenAIModel", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/OpenRouterModel", + "title": "OpenRouter" + }, + { + "$ref": "#/components/schemas/PerplexityAIModel", + "title": "PerplexityAI" + }, + { + "$ref": "#/components/schemas/TogetherAIModel", + "title": "Together" + }, + { + "$ref": "#/components/schemas/XaiModel", + "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" + } + ] + }, "voice": { - "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.", + "description": "These are the options for the assistant's voice.", "oneOf": [ { "$ref": "#/components/schemas/AzureVoice", @@ -34927,20 +35543,201 @@ } ] }, - "observabilityPlan": { - "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.", + "firstMessage": { + "type": "string", + "description": "This is the first message that the assistant will say. This can also be a URL to a containerized audio file (mp3, wav, etc.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.", + "example": "Hello! How can I help you today?" + }, + "firstMessageInterruptionsEnabled": { + "type": "boolean", + "default": false + }, + "firstMessageMode": { + "type": "string", + "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message generated by the model based on the conversation state. (`assistant.model.messages` at call start, `call.messages` at squad transfer points).\n\n@default 'assistant-speaks-first'", + "enum": [ + "assistant-speaks-first", + "assistant-speaks-first-with-model-generated-message", + "assistant-waits-for-user" + ], + "example": "assistant-speaks-first" + }, + "voicemailDetection": { + "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.", "oneOf": [ { - "$ref": "#/components/schemas/LangfuseObservabilityPlan", - "title": "Langfuse" - } - ], - "allOf": [ + "type": "string", + "enum": [ + "off" + ] + }, { - "$ref": "#/components/schemas/LangfuseObservabilityPlan" + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" } ] }, + "clientMessages": { + "type": "array", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "example": [ + "conversation-update", + "function-call", + "hang", + "model-output", + "speech-update", + "status-update", + "transfer-update", + "transcript", + "tool-calls", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started. You can check the shape of the messages in ClientMessage schema.", + "items": { + "type": "string", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ] + } + }, + "serverMessages": { + "type": "array", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ], + "example": [ + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "speech-update", + "status-update", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "user-interrupted", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started. You can check the shape of the messages in ServerMessage schema.", + "items": { + "type": "string", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ] + } + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, "backgroundSound": { "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ @@ -34959,37 +35756,40 @@ } ] }, - "hooks": { + "modelOutputInMessagesEnabled": { + "type": "boolean", + "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false", + "example": false + }, + "transportConfigurations": { "type": "array", - "description": "This is a set of actions that will be performed on certain events.", + "description": "These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You can store multiple configurations for different transport providers. For a call, only the configuration matching the call transport provider is used.", "items": { "oneOf": [ { - "$ref": "#/components/schemas/CallHookCallEnding", - "title": "CallHookCallEnding" - }, - { - "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", - "title": "CallHookAssistantSpeechInterrupted" - }, - { - "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", - "title": "CallHookCustomerSpeechInterrupted" - }, - { - "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", - "title": "CallHookCustomerSpeechTimeout" - }, - { - "$ref": "#/components/schemas/CallHookModelResponseTimeout", - "title": "CallHookModelResponseTimeout" + "$ref": "#/components/schemas/TransportConfigurationTwilio", + "title": "Twilio" } ] } }, + "observabilityPlan": { + "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, "credentials": { "type": "array", - "description": "These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "description": "These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", "items": { "oneOf": [ { @@ -35128,6 +35928,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -35251,6 +36055,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -35280,72 +36085,76 @@ } } }, - "voicemailDetection": { - "description": "This is the voicemail detection plan for the workflow.", - "oneOf": [ - { - "type": "string", - "enum": [ - "off" - ] - }, - { - "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", - "title": "Google" - }, - { - "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", - "title": "OpenAI" - }, - { - "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", - "title": "Twilio" - }, - { - "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", - "title": "Vapi" - } - ] - }, - "maxDurationSeconds": { - "type": "number", - "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.", - "minimum": 10, - "maximum": 43200, - "example": 600 + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/SessionCreatedHook", + "title": "SessionCreatedHook" + } + ] + } }, "name": { "type": "string", - "maxLength": 80 + "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "maxLength": 40 }, - "edges": { + "voicemailMessage": { + "type": "string", + "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", + "maxLength": 1000 + }, + "endCallMessage": { + "type": "string", + "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.", + "maxLength": 1000 + }, + "endCallPhrases": { + "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.", "type": "array", "items": { - "$ref": "#/components/schemas/Edge" + "type": "string", + "maxLength": 140, + "minLength": 2 } }, - "globalPrompt": { - "type": "string", - "maxLength": 5000 + "compliancePlan": { + "$ref": "#/components/schemas/CompliancePlan" }, - "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. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server", + "metadata": { + "type": "object", + "description": "This is for metadata you want to store on the assistant." + }, + "backgroundSpeechDenoisingPlan": { + "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising", "allOf": [ { - "$ref": "#/components/schemas/Server" - } - ] - }, - "compliancePlan": { - "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.", - "allOf": [ - { - "$ref": "#/components/schemas/CompliancePlan" + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" } ] }, "analysisPlan": { - "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.", + "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/AnalysisPlan" @@ -35353,7 +36162,7 @@ ] }, "artifactPlan": { - "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.", + "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.", "allOf": [ { "$ref": "#/components/schemas/ArtifactPlan" @@ -35361,7 +36170,7 @@ ] }, "startSpeakingPlan": { - "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", + "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", "allOf": [ { "$ref": "#/components/schemas/StartSpeakingPlan" @@ -35369,7 +36178,7 @@ ] }, "stopSpeakingPlan": { - "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", + "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", "allOf": [ { "$ref": "#/components/schemas/StopSpeakingPlan" @@ -35377,93 +36186,62 @@ ] }, "monitorPlan": { - "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.", + "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.", "allOf": [ { "$ref": "#/components/schemas/MonitorPlan" } ] }, - "backgroundSpeechDenoisingPlan": { - "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising", - "allOf": [ - { - "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" - } - ] - }, "credentialIds": { - "description": "These are the credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", + "description": "These are the credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", "type": "array", "items": { "type": "string" } }, - "keypadInputPlan": { - "description": "This is the plan for keypad input handling during workflow calls.", + "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.url\n2. phoneNumber.serverUrl\n3. org.serverUrl", "allOf": [ { - "$ref": "#/components/schemas/KeypadInputPlan" + "$ref": "#/components/schemas/Server" } ] }, - "voicemailMessage": { + "keypadInputPlan": { + "$ref": "#/components/schemas/KeypadInputPlan" + }, + "baseVersion": { "type": "string", - "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", - "maxLength": 1000 + "description": "Optional pointer to the published version this draft was forked from.\nWhen omitted on `POST /assistant/:id/draft`, defaults server-side to the\nparent assistant's current `latestVersion` (which is lazy-created via\n`assistantBaselineVersionEnsureInTx` if the parent has never been\nversioned). Immutable for the lifetime of the draft." + } + } + }, + "AssistantDraftConflictResponseDTO": { + "type": "object", + "properties": { + "existingDraftId": { + "type": "string", + "nullable": true + }, + "error": { + "type": "string" + }, + "message": { + "type": "string" } }, "required": [ - "nodes", - "name", - "edges" + "existingDraftId", + "error", + "message" ] }, - "UpdateWorkflowDTO": { + "UpdateAssistantDraftDTO": { "type": "object", "properties": { - "nodes": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ConversationNode", - "title": "ConversationNode" - }, - { - "$ref": "#/components/schemas/ToolNode", - "title": "ToolNode" - } - ] - } - }, - "model": { - "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.", - "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" - } - ] - }, "transcriber": { - "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.", + "description": "These are the options for the assistant's transcriber.", "oneOf": [ { "$ref": "#/components/schemas/AssemblyAITranscriber", @@ -35523,8 +36301,81 @@ } ] }, + "model": { + "description": "These are the options for the assistant's LLM.", + "oneOf": [ + { + "$ref": "#/components/schemas/AnthropicModel", + "title": "Anthropic" + }, + { + "$ref": "#/components/schemas/AnthropicBedrockModel", + "title": "AnthropicBedrock" + }, + { + "$ref": "#/components/schemas/AnyscaleModel", + "title": "Anyscale" + }, + { + "$ref": "#/components/schemas/CerebrasModel", + "title": "Cerebras" + }, + { + "$ref": "#/components/schemas/CustomLLMModel", + "title": "CustomLLM" + }, + { + "$ref": "#/components/schemas/DeepInfraModel", + "title": "DeepInfra" + }, + { + "$ref": "#/components/schemas/DeepSeekModel", + "title": "DeepSeek" + }, + { + "$ref": "#/components/schemas/GoogleModel", + "title": "Google" + }, + { + "$ref": "#/components/schemas/GroqModel", + "title": "Groq" + }, + { + "$ref": "#/components/schemas/InflectionAIModel", + "title": "InflectionAI" + }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, + { + "$ref": "#/components/schemas/OpenAIModel", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/OpenRouterModel", + "title": "OpenRouter" + }, + { + "$ref": "#/components/schemas/PerplexityAIModel", + "title": "PerplexityAI" + }, + { + "$ref": "#/components/schemas/TogetherAIModel", + "title": "Together" + }, + { + "$ref": "#/components/schemas/XaiModel", + "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" + } + ] + }, "voice": { - "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.", + "description": "These are the options for the assistant's voice.", "oneOf": [ { "$ref": "#/components/schemas/AzureVoice", @@ -35608,20 +36459,201 @@ } ] }, - "observabilityPlan": { - "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.", + "firstMessage": { + "type": "string", + "description": "This is the first message that the assistant will say. This can also be a URL to a containerized audio file (mp3, wav, etc.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.", + "example": "Hello! How can I help you today?" + }, + "firstMessageInterruptionsEnabled": { + "type": "boolean", + "default": false + }, + "firstMessageMode": { + "type": "string", + "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message generated by the model based on the conversation state. (`assistant.model.messages` at call start, `call.messages` at squad transfer points).\n\n@default 'assistant-speaks-first'", + "enum": [ + "assistant-speaks-first", + "assistant-speaks-first-with-model-generated-message", + "assistant-waits-for-user" + ], + "example": "assistant-speaks-first" + }, + "voicemailDetection": { + "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.", "oneOf": [ { - "$ref": "#/components/schemas/LangfuseObservabilityPlan", - "title": "Langfuse" - } - ], - "allOf": [ + "type": "string", + "enum": [ + "off" + ] + }, { - "$ref": "#/components/schemas/LangfuseObservabilityPlan" + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" } ] }, + "clientMessages": { + "type": "array", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "example": [ + "conversation-update", + "function-call", + "hang", + "model-output", + "speech-update", + "status-update", + "transfer-update", + "transcript", + "tool-calls", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started. You can check the shape of the messages in ClientMessage schema.", + "items": { + "type": "string", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ] + } + }, + "serverMessages": { + "type": "array", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ], + "example": [ + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "speech-update", + "status-update", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "user-interrupted", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started. You can check the shape of the messages in ServerMessage schema.", + "items": { + "type": "string", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ] + } + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, "backgroundSound": { "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", "oneOf": [ @@ -35640,37 +36672,40 @@ } ] }, - "hooks": { + "modelOutputInMessagesEnabled": { + "type": "boolean", + "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false", + "example": false + }, + "transportConfigurations": { "type": "array", - "description": "This is a set of actions that will be performed on certain events.", + "description": "These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You can store multiple configurations for different transport providers. For a call, only the configuration matching the call transport provider is used.", "items": { "oneOf": [ { - "$ref": "#/components/schemas/CallHookCallEnding", - "title": "CallHookCallEnding" - }, - { - "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", - "title": "CallHookAssistantSpeechInterrupted" - }, - { - "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", - "title": "CallHookCustomerSpeechInterrupted" - }, - { - "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", - "title": "CallHookCustomerSpeechTimeout" - }, - { - "$ref": "#/components/schemas/CallHookModelResponseTimeout", - "title": "CallHookModelResponseTimeout" + "$ref": "#/components/schemas/TransportConfigurationTwilio", + "title": "Twilio" } ] } }, + "observabilityPlan": { + "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, "credentials": { "type": "array", - "description": "These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "description": "These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", "items": { "oneOf": [ { @@ -35809,6 +36844,10 @@ "$ref": "#/components/schemas/CreateS3CredentialDTO", "title": "S3Credential" }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, { "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", "title": "SmallestAICredential" @@ -35932,6 +36971,7 @@ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", "runpod": "#/components/schemas/CreateRunpodCredentialDTO", "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", "tavus": "#/components/schemas/CreateTavusCredentialDTO", @@ -35961,56 +37001,3108 @@ } } }, - "voicemailDetection": { - "description": "This is the voicemail detection plan for the workflow.", - "oneOf": [ - { - "type": "string", - "enum": [ - "off" - ] - }, - { - "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", - "title": "Google" - }, - { - "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", - "title": "OpenAI" - }, - { - "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", - "title": "Twilio" - }, - { - "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", - "title": "Vapi" - } - ] - }, - "maxDurationSeconds": { - "type": "number", - "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.", - "minimum": 10, - "maximum": 43200, - "example": 600 + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/SessionCreatedHook", + "title": "SessionCreatedHook" + } + ] + } }, "name": { "type": "string", - "maxLength": 80 + "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "maxLength": 40 }, - "edges": { + "voicemailMessage": { + "type": "string", + "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", + "maxLength": 1000 + }, + "endCallMessage": { + "type": "string", + "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.", + "maxLength": 1000 + }, + "endCallPhrases": { + "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.", "type": "array", "items": { - "$ref": "#/components/schemas/Edge" + "type": "string", + "maxLength": 140, + "minLength": 2 } }, - "globalPrompt": { - "type": "string", - "maxLength": 5000 + "compliancePlan": { + "$ref": "#/components/schemas/CompliancePlan" }, - "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. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server", + "metadata": { + "type": "object", + "description": "This is for metadata you want to store on the assistant." + }, + "backgroundSpeechDenoisingPlan": { + "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising", + "allOf": [ + { + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" + } + ] + }, + "analysisPlan": { + "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/AnalysisPlan" + } + ] + }, + "artifactPlan": { + "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactPlan" + } + ] + }, + "startSpeakingPlan": { + "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", + "allOf": [ + { + "$ref": "#/components/schemas/StartSpeakingPlan" + } + ] + }, + "stopSpeakingPlan": { + "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", + "allOf": [ + { + "$ref": "#/components/schemas/StopSpeakingPlan" + } + ] + }, + "monitorPlan": { + "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorPlan" + } + ] + }, + "credentialIds": { + "description": "These are the credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", + "type": "array", + "items": { + "type": "string" + } + }, + "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.url\n2. phoneNumber.serverUrl\n3. org.serverUrl", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "keypadInputPlan": { + "$ref": "#/components/schemas/KeypadInputPlan" + } + } + }, + "UpdateAssistantDTO": { + "type": "object", + "properties": { + "transcriber": { + "description": "These are the options for the assistant's transcriber.", + "oneOf": [ + { + "$ref": "#/components/schemas/AssemblyAITranscriber", + "title": "AssemblyAITranscriber" + }, + { + "$ref": "#/components/schemas/AzureSpeechTranscriber", + "title": "AzureSpeechTranscriber" + }, + { + "$ref": "#/components/schemas/CustomTranscriber", + "title": "CustomTranscriber" + }, + { + "$ref": "#/components/schemas/DeepgramTranscriber", + "title": "DeepgramTranscriber" + }, + { + "$ref": "#/components/schemas/ElevenLabsTranscriber", + "title": "ElevenLabsTranscriber" + }, + { + "$ref": "#/components/schemas/GladiaTranscriber", + "title": "GladiaTranscriber" + }, + { + "$ref": "#/components/schemas/GoogleTranscriber", + "title": "GoogleTranscriber" + }, + { + "$ref": "#/components/schemas/SpeechmaticsTranscriber", + "title": "SpeechmaticsTranscriber" + }, + { + "$ref": "#/components/schemas/TalkscriberTranscriber", + "title": "TalkscriberTranscriber" + }, + { + "$ref": "#/components/schemas/OpenAITranscriber", + "title": "OpenAITranscriber" + }, + { + "$ref": "#/components/schemas/CartesiaTranscriber", + "title": "CartesiaTranscriber" + }, + { + "$ref": "#/components/schemas/SonioxTranscriber", + "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" + } + ] + }, + "model": { + "description": "These are the options for the assistant's LLM.", + "oneOf": [ + { + "$ref": "#/components/schemas/AnthropicModel", + "title": "Anthropic" + }, + { + "$ref": "#/components/schemas/AnthropicBedrockModel", + "title": "AnthropicBedrock" + }, + { + "$ref": "#/components/schemas/AnyscaleModel", + "title": "Anyscale" + }, + { + "$ref": "#/components/schemas/CerebrasModel", + "title": "Cerebras" + }, + { + "$ref": "#/components/schemas/CustomLLMModel", + "title": "CustomLLM" + }, + { + "$ref": "#/components/schemas/DeepInfraModel", + "title": "DeepInfra" + }, + { + "$ref": "#/components/schemas/DeepSeekModel", + "title": "DeepSeek" + }, + { + "$ref": "#/components/schemas/GoogleModel", + "title": "Google" + }, + { + "$ref": "#/components/schemas/GroqModel", + "title": "Groq" + }, + { + "$ref": "#/components/schemas/InflectionAIModel", + "title": "InflectionAI" + }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, + { + "$ref": "#/components/schemas/OpenAIModel", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/OpenRouterModel", + "title": "OpenRouter" + }, + { + "$ref": "#/components/schemas/PerplexityAIModel", + "title": "PerplexityAI" + }, + { + "$ref": "#/components/schemas/TogetherAIModel", + "title": "Together" + }, + { + "$ref": "#/components/schemas/XaiModel", + "title": "XAI" + }, + { + "$ref": "#/components/schemas/VapiModel", + "title": "Vapi" + } + ] + }, + "voice": { + "description": "These are the options for the assistant's voice.", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureVoice", + "title": "AzureVoice" + }, + { + "$ref": "#/components/schemas/CartesiaVoice", + "title": "CartesiaVoice" + }, + { + "$ref": "#/components/schemas/CustomVoice", + "title": "CustomVoice" + }, + { + "$ref": "#/components/schemas/DeepgramVoice", + "title": "DeepgramVoice" + }, + { + "$ref": "#/components/schemas/ElevenLabsVoice", + "title": "ElevenLabsVoice" + }, + { + "$ref": "#/components/schemas/HumeVoice", + "title": "HumeVoice" + }, + { + "$ref": "#/components/schemas/LMNTVoice", + "title": "LMNTVoice" + }, + { + "$ref": "#/components/schemas/NeuphonicVoice", + "title": "NeuphonicVoice" + }, + { + "$ref": "#/components/schemas/OpenAIVoice", + "title": "OpenAIVoice" + }, + { + "$ref": "#/components/schemas/PlayHTVoice", + "title": "PlayHTVoice" + }, + { + "$ref": "#/components/schemas/WellSaidVoice", + "title": "WellSaidVoice" + }, + { + "$ref": "#/components/schemas/RimeAIVoice", + "title": "RimeAIVoice" + }, + { + "$ref": "#/components/schemas/SmallestAIVoice", + "title": "SmallestAIVoice" + }, + { + "$ref": "#/components/schemas/TavusVoice", + "title": "TavusVoice" + }, + { + "$ref": "#/components/schemas/VapiVoice", + "title": "VapiVoice" + }, + { + "$ref": "#/components/schemas/SesameVoice", + "title": "SesameVoice" + }, + { + "$ref": "#/components/schemas/InworldVoice", + "title": "InworldVoice" + }, + { + "$ref": "#/components/schemas/MinimaxVoice", + "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" + } + ] + }, + "firstMessage": { + "type": "string", + "description": "This is the first message that the assistant will say. This can also be a URL to a containerized audio file (mp3, wav, etc.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.", + "example": "Hello! How can I help you today?" + }, + "firstMessageInterruptionsEnabled": { + "type": "boolean", + "default": false + }, + "firstMessageMode": { + "type": "string", + "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message generated by the model based on the conversation state. (`assistant.model.messages` at call start, `call.messages` at squad transfer points).\n\n@default 'assistant-speaks-first'", + "enum": [ + "assistant-speaks-first", + "assistant-speaks-first-with-model-generated-message", + "assistant-waits-for-user" + ], + "example": "assistant-speaks-first" + }, + "voicemailDetection": { + "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off" + ] + }, + { + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" + } + ] + }, + "clientMessages": { + "type": "array", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "example": [ + "conversation-update", + "function-call", + "hang", + "model-output", + "speech-update", + "status-update", + "transfer-update", + "transcript", + "tool-calls", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Client SDKs. Default is conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started. You can check the shape of the messages in ClientMessage schema.", + "items": { + "type": "string", + "enum": [ + "conversation-update", + "assistant.speechStarted", + "function-call", + "function-call-result", + "hang", + "language-changed", + "metadata", + "model-output", + "speech-update", + "status-update", + "transcript", + "tool-calls", + "tool-calls-result", + "tool.completed", + "transfer-update", + "user-interrupted", + "voice-input", + "workflow.node.started", + "assistant.started" + ] + } + }, + "serverMessages": { + "type": "array", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ], + "example": [ + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "speech-update", + "status-update", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "user-interrupted", + "assistant.started" + ], + "description": "These are the messages that will be sent to your Server URL. Default is conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started. You can check the shape of the messages in ServerMessage schema.", + "items": { + "type": "string", + "enum": [ + "assistant.started", + "assistant.speechStarted", + "conversation-update", + "end-of-call-report", + "function-call", + "hang", + "language-changed", + "language-change-detected", + "model-output", + "phone-call-control", + "speech-update", + "status-update", + "transcript", + "transcript[transcriptType=\"final\"]", + "tool-calls", + "transfer-destination-request", + "handoff-destination-request", + "transfer-update", + "user-interrupted", + "voice-input", + "chat.created", + "chat.deleted", + "session.created", + "session.updated", + "session.deleted", + "call.deleted", + "call.delete.failed" + ] + } + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, + "backgroundSound": { + "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off", + "office" + ], + "example": "office" + }, + { + "type": "string", + "format": "uri", + "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3" + } + ] + }, + "modelOutputInMessagesEnabled": { + "type": "boolean", + "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false", + "example": false + }, + "transportConfigurations": { + "type": "array", + "description": "These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You can store multiple configurations for different transport providers. For a call, only the configuration matching the call transport provider is used.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TransportConfigurationTwilio", + "title": "Twilio" + } + ] + } + }, + "observabilityPlan": { + "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, + "credentials": { + "type": "array", + "description": "These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateAnthropicCredentialDTO", + "title": "AnthropicCredential" + }, + { + "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "title": "AnthropicBedrockCredential" + }, + { + "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO", + "title": "AnyscaleCredential" + }, + { + "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO", + "title": "AssemblyAICredential" + }, + { + "$ref": "#/components/schemas/CreateAzureCredentialDTO", + "title": "AzureCredential" + }, + { + "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "title": "AzureOpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "title": "ByoSipTrunkCredential" + }, + { + "$ref": "#/components/schemas/CreateCartesiaCredentialDTO", + "title": "CartesiaCredential" + }, + { + "$ref": "#/components/schemas/CreateCerebrasCredentialDTO", + "title": "CerebrasCredential" + }, + { + "$ref": "#/components/schemas/CreateCloudflareCredentialDTO", + "title": "CloudflareCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO", + "title": "CustomLLMCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepgramCredentialDTO", + "title": "DeepgramCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO", + "title": "DeepInfraCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO", + "title": "DeepSeekCredential" + }, + { + "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO", + "title": "ElevenLabsCredential" + }, + { + "$ref": "#/components/schemas/CreateGcpCredentialDTO", + "title": "GcpCredential" + }, + { + "$ref": "#/components/schemas/CreateGladiaCredentialDTO", + "title": "GladiaCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "title": "GhlCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCredentialDTO", + "title": "GoogleCredential" + }, + { + "$ref": "#/components/schemas/CreateGroqCredentialDTO", + "title": "GroqCredential" + }, + { + "$ref": "#/components/schemas/CreateHumeCredentialDTO", + "title": "HumeCredential" + }, + { + "$ref": "#/components/schemas/CreateInflectionAICredentialDTO", + "title": "InflectionAICredential" + }, + { + "$ref": "#/components/schemas/CreateLangfuseCredentialDTO", + "title": "LangfuseCredential" + }, + { + "$ref": "#/components/schemas/CreateLmntCredentialDTO", + "title": "LmntCredential" + }, + { + "$ref": "#/components/schemas/CreateMakeCredentialDTO", + "title": "MakeCredential" + }, + { + "$ref": "#/components/schemas/CreateMistralCredentialDTO", + "title": "MistralCredential" + }, + { + "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO", + "title": "NeuphonicCredential" + }, + { + "$ref": "#/components/schemas/CreateOpenAICredentialDTO", + "title": "OpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO", + "title": "OpenRouterCredential" + }, + { + "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO", + "title": "PerplexityAICredential" + }, + { + "$ref": "#/components/schemas/CreatePlayHTCredentialDTO", + "title": "PlayHTCredential" + }, + { + "$ref": "#/components/schemas/CreateRimeAICredentialDTO", + "title": "RimeAICredential" + }, + { + "$ref": "#/components/schemas/CreateRunpodCredentialDTO", + "title": "RunpodCredential" + }, + { + "$ref": "#/components/schemas/CreateS3CredentialDTO", + "title": "S3Credential" + }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, + { + "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", + "title": "SmallestAICredential" + }, + { + "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "title": "SpeechmaticsCredential" + }, + { + "$ref": "#/components/schemas/CreateSonioxCredentialDTO", + "title": "SonioxCredential" + }, + { + "$ref": "#/components/schemas/CreateSupabaseCredentialDTO", + "title": "SupabaseCredential" + }, + { + "$ref": "#/components/schemas/CreateTavusCredentialDTO", + "title": "TavusCredential" + }, + { + "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", + "title": "TogetherAICredential" + }, + { + "$ref": "#/components/schemas/CreateTwilioCredentialDTO", + "title": "TwilioCredential" + }, + { + "$ref": "#/components/schemas/CreateVonageCredentialDTO", + "title": "VonageCredential" + }, + { + "$ref": "#/components/schemas/CreateWebhookCredentialDTO", + "title": "WebhookCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomCredentialDTO", + "title": "CustomCredential" + }, + { + "$ref": "#/components/schemas/CreateXAiCredentialDTO", + "title": "XAiCredential" + }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "title": "GoogleCalendarOAuth2ClientCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "title": "GoogleCalendarOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "title": "GoogleSheetsOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "title": "SlackOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "title": "GoHighLevelMCPCredential" + }, + { + "$ref": "#/components/schemas/CreateInworldCredentialDTO", + "title": "InworldCredential" + }, + { + "$ref": "#/components/schemas/CreateMinimaxCredentialDTO", + "title": "MinimaxCredential" + }, + { + "$ref": "#/components/schemas/CreateWellSaidCredentialDTO", + "title": "WellSaidCredential" + }, + { + "$ref": "#/components/schemas/CreateEmailCredentialDTO", + "title": "EmailCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO", + "title": "SlackWebhookCredential" + } + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO", + "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO", + "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO", + "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO", + "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "azure": "#/components/schemas/CreateAzureCredentialDTO", + "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO", + "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO", + "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO", + "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO", + "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO", + "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO", + "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO", + "gcp": "#/components/schemas/CreateGcpCredentialDTO", + "gladia": "#/components/schemas/CreateGladiaCredentialDTO", + "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "google": "#/components/schemas/CreateGoogleCredentialDTO", + "groq": "#/components/schemas/CreateGroqCredentialDTO", + "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO", + "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO", + "lmnt": "#/components/schemas/CreateLmntCredentialDTO", + "make": "#/components/schemas/CreateMakeCredentialDTO", + "openai": "#/components/schemas/CreateOpenAICredentialDTO", + "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO", + "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO", + "playht": "#/components/schemas/CreatePlayHTCredentialDTO", + "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", + "runpod": "#/components/schemas/CreateRunpodCredentialDTO", + "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", + "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", + "tavus": "#/components/schemas/CreateTavusCredentialDTO", + "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO", + "twilio": "#/components/schemas/CreateTwilioCredentialDTO", + "vonage": "#/components/schemas/CreateVonageCredentialDTO", + "webhook": "#/components/schemas/CreateWebhookCredentialDTO", + "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", + "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", + "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", + "hume": "#/components/schemas/CreateHumeCredentialDTO", + "mistral": "#/components/schemas/CreateMistralCredentialDTO", + "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "soniox": "#/components/schemas/CreateSonioxCredentialDTO", + "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "inworld": "#/components/schemas/CreateInworldCredentialDTO", + "minimax": "#/components/schemas/CreateMinimaxCredentialDTO", + "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO", + "email": "#/components/schemas/CreateEmailCredentialDTO", + "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO" + } + } + } + }, + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/SessionCreatedHook", + "title": "SessionCreatedHook" + } + ] + } + }, + "name": { + "type": "string", + "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "maxLength": 40 + }, + "voicemailMessage": { + "type": "string", + "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", + "maxLength": 1000 + }, + "endCallMessage": { + "type": "string", + "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.", + "maxLength": 1000 + }, + "endCallPhrases": { + "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.", + "type": "array", + "items": { + "type": "string", + "maxLength": 140, + "minLength": 2 + } + }, + "compliancePlan": { + "$ref": "#/components/schemas/CompliancePlan" + }, + "metadata": { + "type": "object", + "description": "This is for metadata you want to store on the assistant." + }, + "backgroundSpeechDenoisingPlan": { + "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising", + "allOf": [ + { + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" + } + ] + }, + "analysisPlan": { + "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/AnalysisPlan" + } + ] + }, + "artifactPlan": { + "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactPlan" + } + ] + }, + "startSpeakingPlan": { + "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", + "allOf": [ + { + "$ref": "#/components/schemas/StartSpeakingPlan" + } + ] + }, + "stopSpeakingPlan": { + "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", + "allOf": [ + { + "$ref": "#/components/schemas/StopSpeakingPlan" + } + ] + }, + "monitorPlan": { + "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorPlan" + } + ] + }, + "credentialIds": { + "description": "These are the credentials that will be used for the assistant calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", + "type": "array", + "items": { + "type": "string" + } + }, + "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.url\n2. phoneNumber.serverUrl\n3. org.serverUrl", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "keypadInputPlan": { + "$ref": "#/components/schemas/KeypadInputPlan" + } + } + }, + "AssistantPinnedConflictResponseDTO": { + "type": "object", + "properties": { + "error": { + "type": "string", + "enum": [ + "assistant_pinned" + ] + }, + "message": { + "type": "string", + "description": "Human-readable reason the parent-assistant delete was rejected." + } + }, + "required": [ + "error", + "message" + ] + }, + "Squad": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "This is the name of the squad." + }, + "members": { + "description": "This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list.", + "type": "array", + "items": { + "$ref": "#/components/schemas/SquadMemberDTO" + } + }, + "membersOverrides": { + "description": "This can be used to override all the assistants' settings and provide values for their template variables.\n\nBoth `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the squad." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this squad belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the squad was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the squad was last updated." + } + }, + "required": [ + "members", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "UpdateSquadDTO": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "This is the name of the squad." + }, + "members": { + "description": "This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list.", + "type": "array", + "items": { + "$ref": "#/components/schemas/SquadMemberDTO" + } + }, + "membersOverrides": { + "description": "This can be used to override all the assistants' settings and provide values for their template variables.\n\nBoth `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + } + }, + "required": [ + "members" + ] + }, + "Workflow": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ConversationNode", + "title": "ConversationNode" + }, + { + "$ref": "#/components/schemas/ToolNode", + "title": "ToolNode" + } + ] + } + }, + "model": { + "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.", + "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" + } + ] + }, + "transcriber": { + "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.", + "oneOf": [ + { + "$ref": "#/components/schemas/AssemblyAITranscriber", + "title": "AssemblyAITranscriber" + }, + { + "$ref": "#/components/schemas/AzureSpeechTranscriber", + "title": "AzureSpeechTranscriber" + }, + { + "$ref": "#/components/schemas/CustomTranscriber", + "title": "CustomTranscriber" + }, + { + "$ref": "#/components/schemas/DeepgramTranscriber", + "title": "DeepgramTranscriber" + }, + { + "$ref": "#/components/schemas/ElevenLabsTranscriber", + "title": "ElevenLabsTranscriber" + }, + { + "$ref": "#/components/schemas/GladiaTranscriber", + "title": "GladiaTranscriber" + }, + { + "$ref": "#/components/schemas/GoogleTranscriber", + "title": "GoogleTranscriber" + }, + { + "$ref": "#/components/schemas/SpeechmaticsTranscriber", + "title": "SpeechmaticsTranscriber" + }, + { + "$ref": "#/components/schemas/TalkscriberTranscriber", + "title": "TalkscriberTranscriber" + }, + { + "$ref": "#/components/schemas/OpenAITranscriber", + "title": "OpenAITranscriber" + }, + { + "$ref": "#/components/schemas/CartesiaTranscriber", + "title": "CartesiaTranscriber" + }, + { + "$ref": "#/components/schemas/SonioxTranscriber", + "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" + } + ] + }, + "voice": { + "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureVoice", + "title": "AzureVoice" + }, + { + "$ref": "#/components/schemas/CartesiaVoice", + "title": "CartesiaVoice" + }, + { + "$ref": "#/components/schemas/CustomVoice", + "title": "CustomVoice" + }, + { + "$ref": "#/components/schemas/DeepgramVoice", + "title": "DeepgramVoice" + }, + { + "$ref": "#/components/schemas/ElevenLabsVoice", + "title": "ElevenLabsVoice" + }, + { + "$ref": "#/components/schemas/HumeVoice", + "title": "HumeVoice" + }, + { + "$ref": "#/components/schemas/LMNTVoice", + "title": "LMNTVoice" + }, + { + "$ref": "#/components/schemas/NeuphonicVoice", + "title": "NeuphonicVoice" + }, + { + "$ref": "#/components/schemas/OpenAIVoice", + "title": "OpenAIVoice" + }, + { + "$ref": "#/components/schemas/PlayHTVoice", + "title": "PlayHTVoice" + }, + { + "$ref": "#/components/schemas/WellSaidVoice", + "title": "WellSaidVoice" + }, + { + "$ref": "#/components/schemas/RimeAIVoice", + "title": "RimeAIVoice" + }, + { + "$ref": "#/components/schemas/SmallestAIVoice", + "title": "SmallestAIVoice" + }, + { + "$ref": "#/components/schemas/TavusVoice", + "title": "TavusVoice" + }, + { + "$ref": "#/components/schemas/VapiVoice", + "title": "VapiVoice" + }, + { + "$ref": "#/components/schemas/SesameVoice", + "title": "SesameVoice" + }, + { + "$ref": "#/components/schemas/InworldVoice", + "title": "InworldVoice" + }, + { + "$ref": "#/components/schemas/MinimaxVoice", + "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" + } + ] + }, + "observabilityPlan": { + "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, + "backgroundSound": { + "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off", + "office" + ], + "example": "office" + }, + { + "type": "string", + "format": "uri", + "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3" + } + ] + }, + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/CallHookModelResponseTimeout", + "title": "CallHookModelResponseTimeout" + } + ] + } + }, + "credentials": { + "type": "array", + "description": "These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateAnthropicCredentialDTO", + "title": "AnthropicCredential" + }, + { + "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "title": "AnthropicBedrockCredential" + }, + { + "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO", + "title": "AnyscaleCredential" + }, + { + "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO", + "title": "AssemblyAICredential" + }, + { + "$ref": "#/components/schemas/CreateAzureCredentialDTO", + "title": "AzureCredential" + }, + { + "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "title": "AzureOpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "title": "ByoSipTrunkCredential" + }, + { + "$ref": "#/components/schemas/CreateCartesiaCredentialDTO", + "title": "CartesiaCredential" + }, + { + "$ref": "#/components/schemas/CreateCerebrasCredentialDTO", + "title": "CerebrasCredential" + }, + { + "$ref": "#/components/schemas/CreateCloudflareCredentialDTO", + "title": "CloudflareCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO", + "title": "CustomLLMCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepgramCredentialDTO", + "title": "DeepgramCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO", + "title": "DeepInfraCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO", + "title": "DeepSeekCredential" + }, + { + "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO", + "title": "ElevenLabsCredential" + }, + { + "$ref": "#/components/schemas/CreateGcpCredentialDTO", + "title": "GcpCredential" + }, + { + "$ref": "#/components/schemas/CreateGladiaCredentialDTO", + "title": "GladiaCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "title": "GhlCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCredentialDTO", + "title": "GoogleCredential" + }, + { + "$ref": "#/components/schemas/CreateGroqCredentialDTO", + "title": "GroqCredential" + }, + { + "$ref": "#/components/schemas/CreateHumeCredentialDTO", + "title": "HumeCredential" + }, + { + "$ref": "#/components/schemas/CreateInflectionAICredentialDTO", + "title": "InflectionAICredential" + }, + { + "$ref": "#/components/schemas/CreateLangfuseCredentialDTO", + "title": "LangfuseCredential" + }, + { + "$ref": "#/components/schemas/CreateLmntCredentialDTO", + "title": "LmntCredential" + }, + { + "$ref": "#/components/schemas/CreateMakeCredentialDTO", + "title": "MakeCredential" + }, + { + "$ref": "#/components/schemas/CreateMistralCredentialDTO", + "title": "MistralCredential" + }, + { + "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO", + "title": "NeuphonicCredential" + }, + { + "$ref": "#/components/schemas/CreateOpenAICredentialDTO", + "title": "OpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO", + "title": "OpenRouterCredential" + }, + { + "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO", + "title": "PerplexityAICredential" + }, + { + "$ref": "#/components/schemas/CreatePlayHTCredentialDTO", + "title": "PlayHTCredential" + }, + { + "$ref": "#/components/schemas/CreateRimeAICredentialDTO", + "title": "RimeAICredential" + }, + { + "$ref": "#/components/schemas/CreateRunpodCredentialDTO", + "title": "RunpodCredential" + }, + { + "$ref": "#/components/schemas/CreateS3CredentialDTO", + "title": "S3Credential" + }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, + { + "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", + "title": "SmallestAICredential" + }, + { + "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "title": "SpeechmaticsCredential" + }, + { + "$ref": "#/components/schemas/CreateSonioxCredentialDTO", + "title": "SonioxCredential" + }, + { + "$ref": "#/components/schemas/CreateSupabaseCredentialDTO", + "title": "SupabaseCredential" + }, + { + "$ref": "#/components/schemas/CreateTavusCredentialDTO", + "title": "TavusCredential" + }, + { + "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", + "title": "TogetherAICredential" + }, + { + "$ref": "#/components/schemas/CreateTwilioCredentialDTO", + "title": "TwilioCredential" + }, + { + "$ref": "#/components/schemas/CreateVonageCredentialDTO", + "title": "VonageCredential" + }, + { + "$ref": "#/components/schemas/CreateWebhookCredentialDTO", + "title": "WebhookCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomCredentialDTO", + "title": "CustomCredential" + }, + { + "$ref": "#/components/schemas/CreateXAiCredentialDTO", + "title": "XAiCredential" + }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "title": "GoogleCalendarOAuth2ClientCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "title": "GoogleCalendarOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "title": "GoogleSheetsOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "title": "SlackOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "title": "GoHighLevelMCPCredential" + }, + { + "$ref": "#/components/schemas/CreateInworldCredentialDTO", + "title": "InworldCredential" + }, + { + "$ref": "#/components/schemas/CreateMinimaxCredentialDTO", + "title": "MinimaxCredential" + }, + { + "$ref": "#/components/schemas/CreateWellSaidCredentialDTO", + "title": "WellSaidCredential" + }, + { + "$ref": "#/components/schemas/CreateEmailCredentialDTO", + "title": "EmailCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO", + "title": "SlackWebhookCredential" + } + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO", + "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO", + "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO", + "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO", + "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "azure": "#/components/schemas/CreateAzureCredentialDTO", + "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO", + "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO", + "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO", + "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO", + "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO", + "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO", + "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO", + "gcp": "#/components/schemas/CreateGcpCredentialDTO", + "gladia": "#/components/schemas/CreateGladiaCredentialDTO", + "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "google": "#/components/schemas/CreateGoogleCredentialDTO", + "groq": "#/components/schemas/CreateGroqCredentialDTO", + "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO", + "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO", + "lmnt": "#/components/schemas/CreateLmntCredentialDTO", + "make": "#/components/schemas/CreateMakeCredentialDTO", + "openai": "#/components/schemas/CreateOpenAICredentialDTO", + "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO", + "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO", + "playht": "#/components/schemas/CreatePlayHTCredentialDTO", + "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", + "runpod": "#/components/schemas/CreateRunpodCredentialDTO", + "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", + "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", + "tavus": "#/components/schemas/CreateTavusCredentialDTO", + "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO", + "twilio": "#/components/schemas/CreateTwilioCredentialDTO", + "vonage": "#/components/schemas/CreateVonageCredentialDTO", + "webhook": "#/components/schemas/CreateWebhookCredentialDTO", + "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", + "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", + "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", + "hume": "#/components/schemas/CreateHumeCredentialDTO", + "mistral": "#/components/schemas/CreateMistralCredentialDTO", + "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "soniox": "#/components/schemas/CreateSonioxCredentialDTO", + "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "inworld": "#/components/schemas/CreateInworldCredentialDTO", + "minimax": "#/components/schemas/CreateMinimaxCredentialDTO", + "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO", + "email": "#/components/schemas/CreateEmailCredentialDTO", + "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO" + } + } + } + }, + "voicemailDetection": { + "description": "This is the voicemail detection plan for the workflow.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off" + ] + }, + { + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" + } + ] + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, + "id": { + "type": "string" + }, + "orgId": { + "type": "string" + }, + "createdAt": { + "format": "date-time", + "type": "string" + }, + "updatedAt": { + "format": "date-time", + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 80 + }, + "edges": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Edge" + } + }, + "globalPrompt": { + "type": "string", + "maxLength": 5000 + }, + "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. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "compliancePlan": { + "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.", + "allOf": [ + { + "$ref": "#/components/schemas/CompliancePlan" + } + ] + }, + "analysisPlan": { + "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.", + "allOf": [ + { + "$ref": "#/components/schemas/AnalysisPlan" + } + ] + }, + "artifactPlan": { + "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactPlan" + } + ] + }, + "startSpeakingPlan": { + "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", + "allOf": [ + { + "$ref": "#/components/schemas/StartSpeakingPlan" + } + ] + }, + "stopSpeakingPlan": { + "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", + "allOf": [ + { + "$ref": "#/components/schemas/StopSpeakingPlan" + } + ] + }, + "monitorPlan": { + "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorPlan" + } + ] + }, + "backgroundSpeechDenoisingPlan": { + "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising", + "allOf": [ + { + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" + } + ] + }, + "credentialIds": { + "description": "These are the credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", + "type": "array", + "items": { + "type": "string" + } + }, + "keypadInputPlan": { + "description": "This is the plan for keypad input handling during workflow calls.", + "allOf": [ + { + "$ref": "#/components/schemas/KeypadInputPlan" + } + ] + }, + "voicemailMessage": { + "type": "string", + "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", + "maxLength": 1000 + } + }, + "required": [ + "nodes", + "id", + "orgId", + "createdAt", + "updatedAt", + "name", + "edges" + ] + }, + "CreateWorkflowDTO": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ConversationNode", + "title": "ConversationNode" + }, + { + "$ref": "#/components/schemas/ToolNode", + "title": "ToolNode" + } + ] + } + }, + "model": { + "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.", + "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" + } + ] + }, + "transcriber": { + "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.", + "oneOf": [ + { + "$ref": "#/components/schemas/AssemblyAITranscriber", + "title": "AssemblyAITranscriber" + }, + { + "$ref": "#/components/schemas/AzureSpeechTranscriber", + "title": "AzureSpeechTranscriber" + }, + { + "$ref": "#/components/schemas/CustomTranscriber", + "title": "CustomTranscriber" + }, + { + "$ref": "#/components/schemas/DeepgramTranscriber", + "title": "DeepgramTranscriber" + }, + { + "$ref": "#/components/schemas/ElevenLabsTranscriber", + "title": "ElevenLabsTranscriber" + }, + { + "$ref": "#/components/schemas/GladiaTranscriber", + "title": "GladiaTranscriber" + }, + { + "$ref": "#/components/schemas/GoogleTranscriber", + "title": "GoogleTranscriber" + }, + { + "$ref": "#/components/schemas/SpeechmaticsTranscriber", + "title": "SpeechmaticsTranscriber" + }, + { + "$ref": "#/components/schemas/TalkscriberTranscriber", + "title": "TalkscriberTranscriber" + }, + { + "$ref": "#/components/schemas/OpenAITranscriber", + "title": "OpenAITranscriber" + }, + { + "$ref": "#/components/schemas/CartesiaTranscriber", + "title": "CartesiaTranscriber" + }, + { + "$ref": "#/components/schemas/SonioxTranscriber", + "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" + } + ] + }, + "voice": { + "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureVoice", + "title": "AzureVoice" + }, + { + "$ref": "#/components/schemas/CartesiaVoice", + "title": "CartesiaVoice" + }, + { + "$ref": "#/components/schemas/CustomVoice", + "title": "CustomVoice" + }, + { + "$ref": "#/components/schemas/DeepgramVoice", + "title": "DeepgramVoice" + }, + { + "$ref": "#/components/schemas/ElevenLabsVoice", + "title": "ElevenLabsVoice" + }, + { + "$ref": "#/components/schemas/HumeVoice", + "title": "HumeVoice" + }, + { + "$ref": "#/components/schemas/LMNTVoice", + "title": "LMNTVoice" + }, + { + "$ref": "#/components/schemas/NeuphonicVoice", + "title": "NeuphonicVoice" + }, + { + "$ref": "#/components/schemas/OpenAIVoice", + "title": "OpenAIVoice" + }, + { + "$ref": "#/components/schemas/PlayHTVoice", + "title": "PlayHTVoice" + }, + { + "$ref": "#/components/schemas/WellSaidVoice", + "title": "WellSaidVoice" + }, + { + "$ref": "#/components/schemas/RimeAIVoice", + "title": "RimeAIVoice" + }, + { + "$ref": "#/components/schemas/SmallestAIVoice", + "title": "SmallestAIVoice" + }, + { + "$ref": "#/components/schemas/TavusVoice", + "title": "TavusVoice" + }, + { + "$ref": "#/components/schemas/VapiVoice", + "title": "VapiVoice" + }, + { + "$ref": "#/components/schemas/SesameVoice", + "title": "SesameVoice" + }, + { + "$ref": "#/components/schemas/InworldVoice", + "title": "InworldVoice" + }, + { + "$ref": "#/components/schemas/MinimaxVoice", + "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" + } + ] + }, + "observabilityPlan": { + "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, + "backgroundSound": { + "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off", + "office" + ], + "example": "office" + }, + { + "type": "string", + "format": "uri", + "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3" + } + ] + }, + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/CallHookModelResponseTimeout", + "title": "CallHookModelResponseTimeout" + } + ] + } + }, + "credentials": { + "type": "array", + "description": "These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateAnthropicCredentialDTO", + "title": "AnthropicCredential" + }, + { + "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "title": "AnthropicBedrockCredential" + }, + { + "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO", + "title": "AnyscaleCredential" + }, + { + "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO", + "title": "AssemblyAICredential" + }, + { + "$ref": "#/components/schemas/CreateAzureCredentialDTO", + "title": "AzureCredential" + }, + { + "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "title": "AzureOpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "title": "ByoSipTrunkCredential" + }, + { + "$ref": "#/components/schemas/CreateCartesiaCredentialDTO", + "title": "CartesiaCredential" + }, + { + "$ref": "#/components/schemas/CreateCerebrasCredentialDTO", + "title": "CerebrasCredential" + }, + { + "$ref": "#/components/schemas/CreateCloudflareCredentialDTO", + "title": "CloudflareCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO", + "title": "CustomLLMCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepgramCredentialDTO", + "title": "DeepgramCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO", + "title": "DeepInfraCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO", + "title": "DeepSeekCredential" + }, + { + "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO", + "title": "ElevenLabsCredential" + }, + { + "$ref": "#/components/schemas/CreateGcpCredentialDTO", + "title": "GcpCredential" + }, + { + "$ref": "#/components/schemas/CreateGladiaCredentialDTO", + "title": "GladiaCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "title": "GhlCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCredentialDTO", + "title": "GoogleCredential" + }, + { + "$ref": "#/components/schemas/CreateGroqCredentialDTO", + "title": "GroqCredential" + }, + { + "$ref": "#/components/schemas/CreateHumeCredentialDTO", + "title": "HumeCredential" + }, + { + "$ref": "#/components/schemas/CreateInflectionAICredentialDTO", + "title": "InflectionAICredential" + }, + { + "$ref": "#/components/schemas/CreateLangfuseCredentialDTO", + "title": "LangfuseCredential" + }, + { + "$ref": "#/components/schemas/CreateLmntCredentialDTO", + "title": "LmntCredential" + }, + { + "$ref": "#/components/schemas/CreateMakeCredentialDTO", + "title": "MakeCredential" + }, + { + "$ref": "#/components/schemas/CreateMistralCredentialDTO", + "title": "MistralCredential" + }, + { + "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO", + "title": "NeuphonicCredential" + }, + { + "$ref": "#/components/schemas/CreateOpenAICredentialDTO", + "title": "OpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO", + "title": "OpenRouterCredential" + }, + { + "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO", + "title": "PerplexityAICredential" + }, + { + "$ref": "#/components/schemas/CreatePlayHTCredentialDTO", + "title": "PlayHTCredential" + }, + { + "$ref": "#/components/schemas/CreateRimeAICredentialDTO", + "title": "RimeAICredential" + }, + { + "$ref": "#/components/schemas/CreateRunpodCredentialDTO", + "title": "RunpodCredential" + }, + { + "$ref": "#/components/schemas/CreateS3CredentialDTO", + "title": "S3Credential" + }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, + { + "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", + "title": "SmallestAICredential" + }, + { + "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "title": "SpeechmaticsCredential" + }, + { + "$ref": "#/components/schemas/CreateSonioxCredentialDTO", + "title": "SonioxCredential" + }, + { + "$ref": "#/components/schemas/CreateSupabaseCredentialDTO", + "title": "SupabaseCredential" + }, + { + "$ref": "#/components/schemas/CreateTavusCredentialDTO", + "title": "TavusCredential" + }, + { + "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", + "title": "TogetherAICredential" + }, + { + "$ref": "#/components/schemas/CreateTwilioCredentialDTO", + "title": "TwilioCredential" + }, + { + "$ref": "#/components/schemas/CreateVonageCredentialDTO", + "title": "VonageCredential" + }, + { + "$ref": "#/components/schemas/CreateWebhookCredentialDTO", + "title": "WebhookCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomCredentialDTO", + "title": "CustomCredential" + }, + { + "$ref": "#/components/schemas/CreateXAiCredentialDTO", + "title": "XAiCredential" + }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "title": "GoogleCalendarOAuth2ClientCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "title": "GoogleCalendarOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "title": "GoogleSheetsOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "title": "SlackOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "title": "GoHighLevelMCPCredential" + }, + { + "$ref": "#/components/schemas/CreateInworldCredentialDTO", + "title": "InworldCredential" + }, + { + "$ref": "#/components/schemas/CreateMinimaxCredentialDTO", + "title": "MinimaxCredential" + }, + { + "$ref": "#/components/schemas/CreateWellSaidCredentialDTO", + "title": "WellSaidCredential" + }, + { + "$ref": "#/components/schemas/CreateEmailCredentialDTO", + "title": "EmailCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO", + "title": "SlackWebhookCredential" + } + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO", + "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO", + "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO", + "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO", + "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "azure": "#/components/schemas/CreateAzureCredentialDTO", + "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO", + "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO", + "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO", + "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO", + "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO", + "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO", + "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO", + "gcp": "#/components/schemas/CreateGcpCredentialDTO", + "gladia": "#/components/schemas/CreateGladiaCredentialDTO", + "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "google": "#/components/schemas/CreateGoogleCredentialDTO", + "groq": "#/components/schemas/CreateGroqCredentialDTO", + "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO", + "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO", + "lmnt": "#/components/schemas/CreateLmntCredentialDTO", + "make": "#/components/schemas/CreateMakeCredentialDTO", + "openai": "#/components/schemas/CreateOpenAICredentialDTO", + "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO", + "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO", + "playht": "#/components/schemas/CreatePlayHTCredentialDTO", + "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", + "runpod": "#/components/schemas/CreateRunpodCredentialDTO", + "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", + "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", + "tavus": "#/components/schemas/CreateTavusCredentialDTO", + "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO", + "twilio": "#/components/schemas/CreateTwilioCredentialDTO", + "vonage": "#/components/schemas/CreateVonageCredentialDTO", + "webhook": "#/components/schemas/CreateWebhookCredentialDTO", + "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", + "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", + "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", + "hume": "#/components/schemas/CreateHumeCredentialDTO", + "mistral": "#/components/schemas/CreateMistralCredentialDTO", + "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "soniox": "#/components/schemas/CreateSonioxCredentialDTO", + "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "inworld": "#/components/schemas/CreateInworldCredentialDTO", + "minimax": "#/components/schemas/CreateMinimaxCredentialDTO", + "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO", + "email": "#/components/schemas/CreateEmailCredentialDTO", + "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO" + } + } + } + }, + "voicemailDetection": { + "description": "This is the voicemail detection plan for the workflow.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off" + ] + }, + { + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" + } + ] + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, + "name": { + "type": "string", + "maxLength": 80 + }, + "edges": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Edge" + } + }, + "globalPrompt": { + "type": "string", + "maxLength": 5000 + }, + "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. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "compliancePlan": { + "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.", + "allOf": [ + { + "$ref": "#/components/schemas/CompliancePlan" + } + ] + }, + "analysisPlan": { + "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.", + "allOf": [ + { + "$ref": "#/components/schemas/AnalysisPlan" + } + ] + }, + "artifactPlan": { + "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.", + "allOf": [ + { + "$ref": "#/components/schemas/ArtifactPlan" + } + ] + }, + "startSpeakingPlan": { + "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.", + "allOf": [ + { + "$ref": "#/components/schemas/StartSpeakingPlan" + } + ] + }, + "stopSpeakingPlan": { + "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.", + "allOf": [ + { + "$ref": "#/components/schemas/StopSpeakingPlan" + } + ] + }, + "monitorPlan": { + "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorPlan" + } + ] + }, + "backgroundSpeechDenoisingPlan": { + "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising", + "allOf": [ + { + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" + } + ] + }, + "credentialIds": { + "description": "These are the credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can provide a subset using this.", + "type": "array", + "items": { + "type": "string" + } + }, + "keypadInputPlan": { + "description": "This is the plan for keypad input handling during workflow calls.", + "allOf": [ + { + "$ref": "#/components/schemas/KeypadInputPlan" + } + ] + }, + "voicemailMessage": { + "type": "string", + "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.", + "maxLength": 1000 + } + }, + "required": [ + "nodes", + "name", + "edges" + ] + }, + "UpdateWorkflowDTO": { + "type": "object", + "properties": { + "nodes": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ConversationNode", + "title": "ConversationNode" + }, + { + "$ref": "#/components/schemas/ToolNode", + "title": "ToolNode" + } + ] + } + }, + "model": { + "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.", + "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" + } + ] + }, + "transcriber": { + "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.", + "oneOf": [ + { + "$ref": "#/components/schemas/AssemblyAITranscriber", + "title": "AssemblyAITranscriber" + }, + { + "$ref": "#/components/schemas/AzureSpeechTranscriber", + "title": "AzureSpeechTranscriber" + }, + { + "$ref": "#/components/schemas/CustomTranscriber", + "title": "CustomTranscriber" + }, + { + "$ref": "#/components/schemas/DeepgramTranscriber", + "title": "DeepgramTranscriber" + }, + { + "$ref": "#/components/schemas/ElevenLabsTranscriber", + "title": "ElevenLabsTranscriber" + }, + { + "$ref": "#/components/schemas/GladiaTranscriber", + "title": "GladiaTranscriber" + }, + { + "$ref": "#/components/schemas/GoogleTranscriber", + "title": "GoogleTranscriber" + }, + { + "$ref": "#/components/schemas/SpeechmaticsTranscriber", + "title": "SpeechmaticsTranscriber" + }, + { + "$ref": "#/components/schemas/TalkscriberTranscriber", + "title": "TalkscriberTranscriber" + }, + { + "$ref": "#/components/schemas/OpenAITranscriber", + "title": "OpenAITranscriber" + }, + { + "$ref": "#/components/schemas/CartesiaTranscriber", + "title": "CartesiaTranscriber" + }, + { + "$ref": "#/components/schemas/SonioxTranscriber", + "title": "SonioxTranscriber" + }, + { + "$ref": "#/components/schemas/XaiTranscriber", + "title": "XaiTranscriber" + }, + { + "$ref": "#/components/schemas/VapiTranscriber", + "title": "VapiTranscriber" + } + ] + }, + "voice": { + "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.", + "oneOf": [ + { + "$ref": "#/components/schemas/AzureVoice", + "title": "AzureVoice" + }, + { + "$ref": "#/components/schemas/CartesiaVoice", + "title": "CartesiaVoice" + }, + { + "$ref": "#/components/schemas/CustomVoice", + "title": "CustomVoice" + }, + { + "$ref": "#/components/schemas/DeepgramVoice", + "title": "DeepgramVoice" + }, + { + "$ref": "#/components/schemas/ElevenLabsVoice", + "title": "ElevenLabsVoice" + }, + { + "$ref": "#/components/schemas/HumeVoice", + "title": "HumeVoice" + }, + { + "$ref": "#/components/schemas/LMNTVoice", + "title": "LMNTVoice" + }, + { + "$ref": "#/components/schemas/NeuphonicVoice", + "title": "NeuphonicVoice" + }, + { + "$ref": "#/components/schemas/OpenAIVoice", + "title": "OpenAIVoice" + }, + { + "$ref": "#/components/schemas/PlayHTVoice", + "title": "PlayHTVoice" + }, + { + "$ref": "#/components/schemas/WellSaidVoice", + "title": "WellSaidVoice" + }, + { + "$ref": "#/components/schemas/RimeAIVoice", + "title": "RimeAIVoice" + }, + { + "$ref": "#/components/schemas/SmallestAIVoice", + "title": "SmallestAIVoice" + }, + { + "$ref": "#/components/schemas/TavusVoice", + "title": "TavusVoice" + }, + { + "$ref": "#/components/schemas/VapiVoice", + "title": "VapiVoice" + }, + { + "$ref": "#/components/schemas/SesameVoice", + "title": "SesameVoice" + }, + { + "$ref": "#/components/schemas/InworldVoice", + "title": "InworldVoice" + }, + { + "$ref": "#/components/schemas/MinimaxVoice", + "title": "MinimaxVoice" + }, + { + "$ref": "#/components/schemas/XaiVoice", + "title": "XaiVoice" + }, + { + "$ref": "#/components/schemas/MicrosoftVoice", + "title": "MicrosoftVoice" + } + ] + }, + "observabilityPlan": { + "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.", + "oneOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan", + "title": "Langfuse" + } + ], + "allOf": [ + { + "$ref": "#/components/schemas/LangfuseObservabilityPlan" + } + ] + }, + "backgroundSound": { + "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off", + "office" + ], + "example": "office" + }, + { + "type": "string", + "format": "uri", + "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3" + } + ] + }, + "hooks": { + "type": "array", + "description": "This is a set of actions that will be performed on certain events.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CallHookCallEnding", + "title": "CallHookCallEnding" + }, + { + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" + }, + { + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" + }, + { + "$ref": "#/components/schemas/CallHookModelResponseTimeout", + "title": "CallHookModelResponseTimeout" + } + ] + } + }, + "credentials": { + "type": "array", + "description": "These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are available for use in the call but you can supplement an additional credentials using this. Dynamic credentials override existing credentials.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateAnthropicCredentialDTO", + "title": "AnthropicCredential" + }, + { + "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "title": "AnthropicBedrockCredential" + }, + { + "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO", + "title": "AnyscaleCredential" + }, + { + "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO", + "title": "AssemblyAICredential" + }, + { + "$ref": "#/components/schemas/CreateAzureCredentialDTO", + "title": "AzureCredential" + }, + { + "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "title": "AzureOpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "title": "ByoSipTrunkCredential" + }, + { + "$ref": "#/components/schemas/CreateCartesiaCredentialDTO", + "title": "CartesiaCredential" + }, + { + "$ref": "#/components/schemas/CreateCerebrasCredentialDTO", + "title": "CerebrasCredential" + }, + { + "$ref": "#/components/schemas/CreateCloudflareCredentialDTO", + "title": "CloudflareCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO", + "title": "CustomLLMCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepgramCredentialDTO", + "title": "DeepgramCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO", + "title": "DeepInfraCredential" + }, + { + "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO", + "title": "DeepSeekCredential" + }, + { + "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO", + "title": "ElevenLabsCredential" + }, + { + "$ref": "#/components/schemas/CreateGcpCredentialDTO", + "title": "GcpCredential" + }, + { + "$ref": "#/components/schemas/CreateGladiaCredentialDTO", + "title": "GladiaCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "title": "GhlCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCredentialDTO", + "title": "GoogleCredential" + }, + { + "$ref": "#/components/schemas/CreateGroqCredentialDTO", + "title": "GroqCredential" + }, + { + "$ref": "#/components/schemas/CreateHumeCredentialDTO", + "title": "HumeCredential" + }, + { + "$ref": "#/components/schemas/CreateInflectionAICredentialDTO", + "title": "InflectionAICredential" + }, + { + "$ref": "#/components/schemas/CreateLangfuseCredentialDTO", + "title": "LangfuseCredential" + }, + { + "$ref": "#/components/schemas/CreateLmntCredentialDTO", + "title": "LmntCredential" + }, + { + "$ref": "#/components/schemas/CreateMakeCredentialDTO", + "title": "MakeCredential" + }, + { + "$ref": "#/components/schemas/CreateMistralCredentialDTO", + "title": "MistralCredential" + }, + { + "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO", + "title": "NeuphonicCredential" + }, + { + "$ref": "#/components/schemas/CreateOpenAICredentialDTO", + "title": "OpenAICredential" + }, + { + "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO", + "title": "OpenRouterCredential" + }, + { + "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO", + "title": "PerplexityAICredential" + }, + { + "$ref": "#/components/schemas/CreatePlayHTCredentialDTO", + "title": "PlayHTCredential" + }, + { + "$ref": "#/components/schemas/CreateRimeAICredentialDTO", + "title": "RimeAICredential" + }, + { + "$ref": "#/components/schemas/CreateRunpodCredentialDTO", + "title": "RunpodCredential" + }, + { + "$ref": "#/components/schemas/CreateS3CredentialDTO", + "title": "S3Credential" + }, + { + "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" + }, + { + "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", + "title": "SmallestAICredential" + }, + { + "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "title": "SpeechmaticsCredential" + }, + { + "$ref": "#/components/schemas/CreateSonioxCredentialDTO", + "title": "SonioxCredential" + }, + { + "$ref": "#/components/schemas/CreateSupabaseCredentialDTO", + "title": "SupabaseCredential" + }, + { + "$ref": "#/components/schemas/CreateTavusCredentialDTO", + "title": "TavusCredential" + }, + { + "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", + "title": "TogetherAICredential" + }, + { + "$ref": "#/components/schemas/CreateTwilioCredentialDTO", + "title": "TwilioCredential" + }, + { + "$ref": "#/components/schemas/CreateVonageCredentialDTO", + "title": "VonageCredential" + }, + { + "$ref": "#/components/schemas/CreateWebhookCredentialDTO", + "title": "WebhookCredential" + }, + { + "$ref": "#/components/schemas/CreateCustomCredentialDTO", + "title": "CustomCredential" + }, + { + "$ref": "#/components/schemas/CreateXAiCredentialDTO", + "title": "XAiCredential" + }, + { + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "title": "GoogleCalendarOAuth2ClientCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "title": "GoogleCalendarOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "title": "GoogleSheetsOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "title": "SlackOAuth2AuthorizationCredential" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "title": "GoHighLevelMCPCredential" + }, + { + "$ref": "#/components/schemas/CreateInworldCredentialDTO", + "title": "InworldCredential" + }, + { + "$ref": "#/components/schemas/CreateMinimaxCredentialDTO", + "title": "MinimaxCredential" + }, + { + "$ref": "#/components/schemas/CreateWellSaidCredentialDTO", + "title": "WellSaidCredential" + }, + { + "$ref": "#/components/schemas/CreateEmailCredentialDTO", + "title": "EmailCredential" + }, + { + "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO", + "title": "SlackWebhookCredential" + } + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO", + "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO", + "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO", + "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO", + "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "azure": "#/components/schemas/CreateAzureCredentialDTO", + "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO", + "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO", + "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO", + "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO", + "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO", + "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO", + "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO", + "gcp": "#/components/schemas/CreateGcpCredentialDTO", + "gladia": "#/components/schemas/CreateGladiaCredentialDTO", + "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "google": "#/components/schemas/CreateGoogleCredentialDTO", + "groq": "#/components/schemas/CreateGroqCredentialDTO", + "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO", + "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO", + "lmnt": "#/components/schemas/CreateLmntCredentialDTO", + "make": "#/components/schemas/CreateMakeCredentialDTO", + "openai": "#/components/schemas/CreateOpenAICredentialDTO", + "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO", + "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO", + "playht": "#/components/schemas/CreatePlayHTCredentialDTO", + "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO", + "runpod": "#/components/schemas/CreateRunpodCredentialDTO", + "s3": "#/components/schemas/CreateS3CredentialDTO", + "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO", + "supabase": "#/components/schemas/CreateSupabaseCredentialDTO", + "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO", + "tavus": "#/components/schemas/CreateTavusCredentialDTO", + "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO", + "twilio": "#/components/schemas/CreateTwilioCredentialDTO", + "vonage": "#/components/schemas/CreateVonageCredentialDTO", + "webhook": "#/components/schemas/CreateWebhookCredentialDTO", + "custom-credential": "#/components/schemas/CreateCustomCredentialDTO", + "xai": "#/components/schemas/CreateXAiCredentialDTO", + "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO", + "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO", + "hume": "#/components/schemas/CreateHumeCredentialDTO", + "mistral": "#/components/schemas/CreateMistralCredentialDTO", + "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "soniox": "#/components/schemas/CreateSonioxCredentialDTO", + "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "inworld": "#/components/schemas/CreateInworldCredentialDTO", + "minimax": "#/components/schemas/CreateMinimaxCredentialDTO", + "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO", + "email": "#/components/schemas/CreateEmailCredentialDTO", + "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO" + } + } + } + }, + "voicemailDetection": { + "description": "This is the voicemail detection plan for the workflow.", + "oneOf": [ + { + "type": "string", + "enum": [ + "off" + ] + }, + { + "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan", + "title": "Google" + }, + { + "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan", + "title": "OpenAI" + }, + { + "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan", + "title": "Twilio" + }, + { + "$ref": "#/components/schemas/VapiVoicemailDetectionPlan", + "title": "Vapi" + } + ] + }, + "maxDurationSeconds": { + "type": "number", + "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.", + "minimum": 10, + "maximum": 43200, + "example": 600 + }, + "name": { + "type": "string", + "maxLength": 80 + }, + "edges": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Edge" + } + }, + "globalPrompt": { + "type": "string", + "maxLength": 5000 + }, + "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. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server", "allOf": [ { "$ref": "#/components/schemas/Server" @@ -37241,6 +41333,11 @@ "AssistantActivation": { "type": "object", "properties": { + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant active when\nthe activation row was recorded. `null` for inline assistants,\norgs not on assistant versioning, and parent assistants that have\nnot yet been published under it." + }, "assistantName": { "type": "string", "description": "This is the name of the assistant that was active during the call." @@ -37450,6 +41547,38 @@ "format": "date-time", "type": "string", "description": "This is when the structured outputs were last updated" + }, + "presignedMonoUrl": { + "type": "string", + "description": "This is a presigned URL to download the mono recording without\nauthentication. Populated on API responses and server messages; never\nstored. Expires at `presignedUrlsExpiresAt` — after that, use\n`GET /call/{id}/mono-recording`." + }, + "presignedStereoUrl": { + "type": "string", + "description": "This is a presigned URL to download the stereo recording without\nauthentication. Expires at `presignedUrlsExpiresAt` — after that, use\n`GET /call/{id}/stereo-recording`." + }, + "presignedVideoUrl": { + "type": "string", + "description": "This is a presigned URL to download the video recording without\nauthentication. Expires at `presignedUrlsExpiresAt` — after that, use\n`GET /call/{id}/video-recording`." + }, + "presignedAssistantUrl": { + "type": "string", + "description": "This is a presigned URL to download the assistant-channel mono recording\nwithout authentication. Expires at `presignedUrlsExpiresAt`." + }, + "presignedCustomerUrl": { + "type": "string", + "description": "This is a presigned URL to download the customer-channel mono recording\nwithout authentication. Expires at `presignedUrlsExpiresAt`." + }, + "presignedPcapUrl": { + "type": "string", + "description": "This is a presigned URL to download the packet capture without\nauthentication. Expires at `presignedUrlsExpiresAt`." + }, + "presignedLogUrl": { + "type": "string", + "description": "This is a presigned URL to download the call logs without\nauthentication. Expires at `presignedUrlsExpiresAt`." + }, + "presignedUrlsExpiresAt": { + "type": "string", + "description": "This is when the presigned URLs above expire, as an ISO 8601 timestamp.\nThe raw `*Url` fields remain the stable identifiers and do not expire.\nPresigned URLs are regenerated per response and per webhook delivery, so\nvalues differ across retries." } } }, @@ -38015,6 +42144,7 @@ "call.start.error-subscription-upgrade-failed", "call.start.error-subscription-concurrency-limit-reached", "call.start.error-enterprise-feature-not-available-recording-consent", + "call.start.assistant-version-error-validation", "assistant-not-valid", "call.start.error-vapifault-database-error", "assistant-not-found", @@ -38635,6 +42765,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version." + }, "transport": { "description": "This is the transport of the call.", "oneOf": [ @@ -39008,6 +43143,209 @@ "CreateCallDTO": { "type": "object", "properties": { + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version." + }, + "transport": { + "description": "This is the transport of the call.", + "oneOf": [ + { + "$ref": "#/components/schemas/VapiWebsocketTransport", + "title": "VapiWebsocketTransport" + }, + { + "$ref": "#/components/schemas/VonageTransport", + "title": "VonageTransport" + }, + { + "$ref": "#/components/schemas/TwilioTransport", + "title": "TwilioTransport" + }, + { + "$ref": "#/components/schemas/VapiSipTransport", + "title": "VapiSipTransport" + }, + { + "$ref": "#/components/schemas/TelnyxTransport", + "title": "TelnyxTransport" + }, + { + "$ref": "#/components/schemas/VapiWebCallTransport", + "title": "VapiWebCallTransport" + } + ] + }, + "customers": { + "description": "This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + }, + "name": { + "type": "string", + "description": "This is the name of the call. This is just for your own reference.", + "maxLength": 40 + }, + "schedulePlan": { + "description": "This is the schedule plan of the call.", + "allOf": [ + { + "$ref": "#/components/schemas/SchedulePlan" + } + ] + }, + "assistantId": { + "type": "string", + "description": "This is the assistant ID that will be used for the call. To use a transient assistant, use `assistant` instead.\n\nTo start a call with:\n- Assistant, use `assistantId` or `assistant`\n- Squad, use `squadId` or `squad`\n- Workflow, use `workflowId` or `workflow`" + }, + "assistant": { + "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "assistantOverrides": { + "description": "These are the overrides for the `assistant` or `assistantId`'s settings and template variables.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "squadId": { + "type": "string", + "description": "This is the squad that will be used for the call. To use a transient squad, use `squad` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`" + }, + "squad": { + "description": "This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`", + "allOf": [ + { + "$ref": "#/components/schemas/CreateSquadDTO" + } + ] + }, + "squadOverrides": { + "description": "These are the overrides for the `squad` or `squadId`'s member settings and template variables.\nThis will apply to all members of the squad.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, + "workflowId": { + "type": "string", + "description": "This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`" + }, + "workflow": { + "description": "This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`", + "allOf": [ + { + "$ref": "#/components/schemas/CreateWorkflowDTO" + } + ] + }, + "workflowOverrides": { + "description": "These are the overrides for the `workflow` or `workflowId`'s settings and template variables.", + "allOf": [ + { + "$ref": "#/components/schemas/WorkflowOverrides" + } + ] + }, + "phoneNumberId": { + "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." + }, + "customer": { + "description": "This is the customer that will be called. To call an existing customer, use `customerId` instead.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + ] + } + } + }, + "StructuredOutputFilterDTO": { + "type": "object", + "properties": { + "eq": { + "type": "string", + "description": "Equal to" + }, + "neq": { + "type": "string", + "description": "Not equal to" + }, + "gt": { + "type": "string", + "description": "Greater than" + }, + "gte": { + "type": "string", + "description": "Greater than or equal to" + }, + "lt": { + "type": "string", + "description": "Less than" + }, + "lte": { + "type": "string", + "description": "Less than or equal to" + }, + "contains": { + "type": "string", + "description": "Contains" + }, + "notContains": { + "type": "string", + "description": "Not contains" + } + } + }, + "CallPaginatedResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Call" + } + }, + "metadata": { + "$ref": "#/components/schemas/PaginationMeta" + } + }, + "required": [ + "results", + "metadata" + ] + }, + "CreateOutboundCallDTO": { + "type": "object", + "properties": { + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version." + }, "transport": { "description": "This is the transport of the call.", "oneOf": [ @@ -39143,202 +43481,14 @@ } } }, - "StructuredOutputFilterDTO": { - "type": "object", - "properties": { - "eq": { - "type": "string", - "description": "Equal to" - }, - "neq": { - "type": "string", - "description": "Not equal to" - }, - "gt": { - "type": "string", - "description": "Greater than" - }, - "gte": { - "type": "string", - "description": "Greater than or equal to" - }, - "lt": { - "type": "string", - "description": "Less than" - }, - "lte": { - "type": "string", - "description": "Less than or equal to" - }, - "contains": { - "type": "string", - "description": "Contains" - }, - "notContains": { - "type": "string", - "description": "Not contains" - } - } - }, - "CallPaginatedResponse": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Call" - } - }, - "metadata": { - "$ref": "#/components/schemas/PaginationMeta" - } - }, - "required": [ - "results", - "metadata" - ] - }, - "CreateOutboundCallDTO": { + "CreateWebCallDTO": { "type": "object", "properties": { - "transport": { - "description": "This is the transport of the call.", - "oneOf": [ - { - "$ref": "#/components/schemas/VapiWebsocketTransport", - "title": "VapiWebsocketTransport" - }, - { - "$ref": "#/components/schemas/VonageTransport", - "title": "VonageTransport" - }, - { - "$ref": "#/components/schemas/TwilioTransport", - "title": "TwilioTransport" - }, - { - "$ref": "#/components/schemas/VapiSipTransport", - "title": "VapiSipTransport" - }, - { - "$ref": "#/components/schemas/TelnyxTransport", - "title": "TelnyxTransport" - }, - { - "$ref": "#/components/schemas/VapiWebCallTransport", - "title": "VapiWebCallTransport" - } - ] - }, - "customers": { - "description": "This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.", - "type": "array", - "items": { - "$ref": "#/components/schemas/CreateCustomerDTO" - } - }, - "name": { - "type": "string", - "description": "This is the name of the call. This is just for your own reference.", - "maxLength": 40 - }, - "schedulePlan": { - "description": "This is the schedule plan of the call.", - "allOf": [ - { - "$ref": "#/components/schemas/SchedulePlan" - } - ] - }, - "assistantId": { - "type": "string", - "description": "This is the assistant ID that will be used for the call. To use a transient assistant, use `assistant` instead.\n\nTo start a call with:\n- Assistant, use `assistantId` or `assistant`\n- Squad, use `squadId` or `squad`\n- Workflow, use `workflowId` or `workflow`" - }, - "assistant": { - "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "assistantOverrides": { - "description": "These are the overrides for the `assistant` or `assistantId`'s settings and template variables.", - "allOf": [ - { - "$ref": "#/components/schemas/AssistantOverrides" - } - ] - }, - "squadId": { - "type": "string", - "description": "This is the squad that will be used for the call. To use a transient squad, use `squad` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`" - }, - "squad": { - "description": "This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`", - "allOf": [ - { - "$ref": "#/components/schemas/CreateSquadDTO" - } - ] - }, - "squadOverrides": { - "description": "These are the overrides for the `squad` or `squadId`'s member settings and template variables.\nThis will apply to all members of the squad.", - "allOf": [ - { - "$ref": "#/components/schemas/AssistantOverrides" - } - ] - }, - "workflowId": { - "type": "string", - "description": "This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`" - }, - "workflow": { - "description": "This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.\n\nTo start a call with:\n- Assistant, use `assistant` or `assistantId`\n- Squad, use `squad` or `squadId`\n- Workflow, use `workflow` or `workflowId`", - "allOf": [ - { - "$ref": "#/components/schemas/CreateWorkflowDTO" - } - ] - }, - "workflowOverrides": { - "description": "These are the overrides for the `workflow` or `workflowId`'s settings and template variables.", - "allOf": [ - { - "$ref": "#/components/schemas/WorkflowOverrides" - } - ] - }, - "phoneNumberId": { - "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": { + "assistantVersion": { "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." + "nullable": true, + "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version." }, - "customer": { - "description": "This is the customer that will be called. To call an existing customer, use `customerId` instead.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.", - "allOf": [ - { - "$ref": "#/components/schemas/CreateCustomerDTO" - } - ] - } - } - }, - "CreateWebCallDTO": { - "type": "object", - "properties": { "roomDeleteOnUserLeaveEnabled": { "type": "boolean", "default": true @@ -43618,6 +47768,10 @@ "ApiRequestTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -43793,6 +47947,10 @@ "CodeTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -43916,6 +48074,10 @@ "DtmfTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -43990,6 +48152,10 @@ "EndCallTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44059,6 +48225,10 @@ "FunctionTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44164,6 +48334,10 @@ "GhlTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44237,6 +48411,10 @@ "MakeTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44310,6 +48488,10 @@ "TransferCallTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44398,6 +48580,10 @@ "HandoffTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44499,6 +48685,10 @@ "OutputTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44568,6 +48758,10 @@ "BashTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44662,6 +48856,10 @@ "ComputerTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44770,6 +48968,10 @@ "TextEditorTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44864,6 +49066,10 @@ "QueryTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -44940,6 +49146,10 @@ "GoogleCalendarCreateEventTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45009,6 +49219,10 @@ "GoogleSheetsRowAppendTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45078,6 +49292,10 @@ "GoogleCalendarCheckAvailabilityTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45147,6 +49365,10 @@ "SlackSendMessageTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45216,6 +49438,10 @@ "SmsTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45285,6 +49511,10 @@ "McpTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45372,6 +49602,10 @@ "GoHighLevelCalendarAvailabilityTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45441,6 +49675,10 @@ "GoHighLevelCalendarEventCreateTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45510,6 +49748,10 @@ "GoHighLevelContactCreateTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45579,6 +49821,10 @@ "GoHighLevelContactGetTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45648,6 +49894,10 @@ "SipRequestTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -45746,6 +49996,10 @@ "VoicemailTool": { "type": "object", "properties": { + "latestVersion": { + "type": "string", + "nullable": true + }, "messages": { "type": "array", "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", @@ -46846,7 +51100,497 @@ } } }, - "UpdateGhlToolDTO": { + "UpdateGhlToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "ghl" + ], + "description": "The type of tool. \"ghl\" for GHL tool." + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + }, + "metadata": { + "$ref": "#/components/schemas/GhlToolMetadata" + } + } + }, + "UpdateMakeToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "make" + ], + "description": "The type of tool. \"make\" for Make tool." + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + }, + "metadata": { + "$ref": "#/components/schemas/MakeToolMetadata" + } + } + }, + "UpdateHandoffToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---", + "enum": [ + "handoff" + ] + }, + "defaultResult": { + "type": "string", + "description": "This is the default local tool result message used when no runtime handoff result override is returned." + }, + "destinations": { + "type": "array", + "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/HandoffDestinationAssistant", + "title": "Assistant" + }, + { + "$ref": "#/components/schemas/HandoffDestinationDynamic", + "title": "Dynamic" + }, + { + "$ref": "#/components/schemas/HandoffDestinationSquad", + "title": "Squad" + } + ] + } + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + }, + "function": { + "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf you choose to override the function parameters, it must include `destination` as a required parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal `dynamic`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/OpenAIFunction" + } + ] + } + } + }, + "UpdateTransferCallToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "transferCall" + ] + }, + "destinations": { + "type": "array", + "description": "These are the destinations that the call can be transferred to. If no destinations are provided, server.url will be used to get the transfer destination once the tool is called.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationAssistant", + "title": "Assistant" + }, + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "Number" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "Sip" + } + ] + } + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + } + } + }, + "UpdateOutputToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "output" + ], + "description": "The type of tool. \"output\" for Output tool." + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + } + } + }, + "UpdateBashToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "bash" + ], + "description": "The type of tool. \"bash\" for Bash tool." + }, + "subType": { + "type": "string", + "enum": [ + "bash_20241022" + ], + "description": "The sub type of tool." + }, + "server": { + "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + }, + "name": { + "type": "string", + "description": "The name of the tool, fixed to 'bash'", + "default": "bash", + "enum": [ + "bash" + ] + } + } + }, + "UpdateComputerToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "computer" + ], + "description": "The type of tool. \"computer\" for Computer tool." + }, + "subType": { + "type": "string", + "enum": [ + "computer_20241022" + ], + "description": "The sub type of tool." + }, + "server": { + "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + }, + "name": { + "type": "string", + "description": "The name of the tool, fixed to 'computer'", + "default": "computer", + "enum": [ + "computer" + ] + }, + "displayWidthPx": { + "type": "number", + "description": "The display width in pixels" + }, + "displayHeightPx": { + "type": "number", + "description": "The display height in pixels" + }, + "displayNumber": { + "type": "number", + "description": "Optional display number" + } + } + }, + "UpdateTextEditorToolDTO": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" + }, + { + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" + }, + { + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" + } + ] + } + }, + "type": { + "type": "string", + "enum": [ + "textEditor" + ], + "description": "The type of tool. \"textEditor\" for Text Editor tool." + }, + "subType": { + "type": "string", + "enum": [ + "text_editor_20241022" + ], + "description": "The sub type of tool." + }, + "server": { + "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", + "allOf": [ + { + "$ref": "#/components/schemas/Server" + } + ] + }, + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + }, + "name": { + "type": "string", + "description": "The name of the tool, fixed to 'str_replace_editor'", + "default": "str_replace_editor", + "enum": [ + "str_replace_editor" + ] + } + } + }, + "UpdateQueryToolDTO": { "type": "object", "properties": { "messages": { @@ -46876,9 +51620,16 @@ "type": { "type": "string", "enum": [ - "ghl" + "query" ], - "description": "The type of tool. \"ghl\" for GHL tool." + "description": "The type of tool. \"query\" for Query tool." + }, + "knowledgeBases": { + "description": "The knowledge bases to query", + "type": "array", + "items": { + "$ref": "#/components/schemas/KnowledgeBase" + } }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -46887,13 +51638,10 @@ "$ref": "#/components/schemas/ToolRejectionPlan" } ] - }, - "metadata": { - "$ref": "#/components/schemas/GhlToolMetadata" } } }, - "UpdateMakeToolDTO": { + "UpdateGoogleCalendarCreateEventToolDTO": { "type": "object", "properties": { "messages": { @@ -46923,9 +51671,9 @@ "type": { "type": "string", "enum": [ - "make" + "google.calendar.event.create" ], - "description": "The type of tool. \"make\" for Make tool." + "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -46934,13 +51682,10 @@ "$ref": "#/components/schemas/ToolRejectionPlan" } ] - }, - "metadata": { - "$ref": "#/components/schemas/MakeToolMetadata" } } }, - "UpdateHandoffToolDTO": { + "UpdateGoogleSheetsRowAppendToolDTO": { "type": "object", "properties": { "messages": { @@ -46969,34 +51714,10 @@ }, "type": { "type": "string", - "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---", "enum": [ - "handoff" - ] - }, - "defaultResult": { - "type": "string", - "description": "This is the default local tool result message used when no runtime handoff result override is returned." - }, - "destinations": { - "type": "array", - "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/HandoffDestinationAssistant", - "title": "Assistant" - }, - { - "$ref": "#/components/schemas/HandoffDestinationDynamic", - "title": "Dynamic" - }, - { - "$ref": "#/components/schemas/HandoffDestinationSquad", - "title": "Squad" - } - ] - } + "google.sheets.row.append" + ], + "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47005,18 +51726,10 @@ "$ref": "#/components/schemas/ToolRejectionPlan" } ] - }, - "function": { - "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf you choose to override the function parameters, it must include `destination` as a required parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal `dynamic`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```", - "allOf": [ - { - "$ref": "#/components/schemas/OpenAIFunction" - } - ] } } }, - "UpdateTransferCallToolDTO": { + "UpdateGoogleCalendarCheckAvailabilityToolDTO": { "type": "object", "properties": { "messages": { @@ -47046,29 +51759,54 @@ "type": { "type": "string", "enum": [ - "transferCall" - ] + "google.calendar.availability.check" + ], + "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool." }, - "destinations": { + "rejectionPlan": { + "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "allOf": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + } + } + }, + "UpdateSlackSendMessageToolDTO": { + "type": "object", + "properties": { + "messages": { "type": "array", - "description": "These are the destinations that the call can be transferred to. If no destinations are provided, server.url will be used to get the transfer destination once the tool is called.", + "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { "oneOf": [ { - "$ref": "#/components/schemas/TransferDestinationAssistant", - "title": "Assistant" + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" }, { - "$ref": "#/components/schemas/TransferDestinationNumber", - "title": "Number" + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" }, { - "$ref": "#/components/schemas/TransferDestinationSip", - "title": "Sip" + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" + }, + { + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" } ] } }, + "type": { + "type": "string", + "enum": [ + "slack.message.send" + ], + "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool." + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -47079,7 +51817,7 @@ } } }, - "UpdateOutputToolDTO": { + "UpdateSmsToolDTO": { "type": "object", "properties": { "messages": { @@ -47109,9 +51847,9 @@ "type": { "type": "string", "enum": [ - "output" + "sms" ], - "description": "The type of tool. \"output\" for Output tool." + "description": "The type of tool. \"sms\" for Twilio SMS sending tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47123,7 +51861,7 @@ } } }, - "UpdateBashToolDTO": { + "UpdateMcpToolDTO": { "type": "object", "properties": { "messages": { @@ -47153,16 +51891,9 @@ "type": { "type": "string", "enum": [ - "bash" - ], - "description": "The type of tool. \"bash\" for Bash tool." - }, - "subType": { - "type": "string", - "enum": [ - "bash_20241022" + "mcp" ], - "description": "The sub type of tool." + "description": "The type of tool. \"mcp\" for MCP tool." }, "server": { "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", @@ -47172,6 +51903,13 @@ } ] }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty array to suppress messages for a specific tool. Tools not listed here will use the default messages from the parent tool.", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -47180,17 +51918,12 @@ } ] }, - "name": { - "type": "string", - "description": "The name of the tool, fixed to 'bash'", - "default": "bash", - "enum": [ - "bash" - ] + "metadata": { + "$ref": "#/components/schemas/McpToolMetadata" } } }, - "UpdateComputerToolDTO": { + "UpdateGoHighLevelCalendarAvailabilityToolDTO": { "type": "object", "properties": { "messages": { @@ -47220,24 +51953,9 @@ "type": { "type": "string", "enum": [ - "computer" - ], - "description": "The type of tool. \"computer\" for Computer tool." - }, - "subType": { - "type": "string", - "enum": [ - "computer_20241022" + "gohighlevel.calendar.availability.check" ], - "description": "The sub type of tool." - }, - "server": { - "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", - "allOf": [ - { - "$ref": "#/components/schemas/Server" - } - ] + "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47246,30 +51964,10 @@ "$ref": "#/components/schemas/ToolRejectionPlan" } ] - }, - "name": { - "type": "string", - "description": "The name of the tool, fixed to 'computer'", - "default": "computer", - "enum": [ - "computer" - ] - }, - "displayWidthPx": { - "type": "number", - "description": "The display width in pixels" - }, - "displayHeightPx": { - "type": "number", - "description": "The display height in pixels" - }, - "displayNumber": { - "type": "number", - "description": "Optional display number" } } }, - "UpdateTextEditorToolDTO": { + "UpdateGoHighLevelCalendarEventCreateToolDTO": { "type": "object", "properties": { "messages": { @@ -47299,24 +51997,9 @@ "type": { "type": "string", "enum": [ - "textEditor" - ], - "description": "The type of tool. \"textEditor\" for Text Editor tool." - }, - "subType": { - "type": "string", - "enum": [ - "text_editor_20241022" + "gohighlevel.calendar.event.create" ], - "description": "The sub type of tool." - }, - "server": { - "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", - "allOf": [ - { - "$ref": "#/components/schemas/Server" - } - ] + "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47325,18 +52008,10 @@ "$ref": "#/components/schemas/ToolRejectionPlan" } ] - }, - "name": { - "type": "string", - "description": "The name of the tool, fixed to 'str_replace_editor'", - "default": "str_replace_editor", - "enum": [ - "str_replace_editor" - ] } } }, - "UpdateQueryToolDTO": { + "UpdateGoHighLevelContactCreateToolDTO": { "type": "object", "properties": { "messages": { @@ -47366,16 +52041,9 @@ "type": { "type": "string", "enum": [ - "query" + "gohighlevel.contact.create" ], - "description": "The type of tool. \"query\" for Query tool." - }, - "knowledgeBases": { - "description": "The knowledge bases to query", - "type": "array", - "items": { - "$ref": "#/components/schemas/KnowledgeBase" - } + "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47387,7 +52055,7 @@ } } }, - "UpdateGoogleCalendarCreateEventToolDTO": { + "UpdateGoHighLevelContactGetToolDTO": { "type": "object", "properties": { "messages": { @@ -47417,9 +52085,9 @@ "type": { "type": "string", "enum": [ - "google.calendar.event.create" + "gohighlevel.contact.get" ], - "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool." + "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47431,7 +52099,7 @@ } } }, - "UpdateGoogleSheetsRowAppendToolDTO": { + "UpdateSipRequestToolDTO": { "type": "object", "properties": { "messages": { @@ -47461,9 +52129,37 @@ "type": { "type": "string", "enum": [ - "google.sheets.row.append" + "sipRequest" ], - "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool." + "description": "The type of tool. \"sipRequest\" for SIP request tool." + }, + "verb": { + "type": "string", + "enum": [ + "INFO", + "MESSAGE", + "NOTIFY" + ], + "description": "The SIP method to send." + }, + "headers": { + "description": "JSON schema for headers the model should populate when sending the SIP request.", + "allOf": [ + { + "$ref": "#/components/schemas/JsonSchema" + } + ] + }, + "body": { + "description": "Body to include in the SIP request. Either a literal string body, or a JSON schema describing a structured body that the model should populate.", + "oneOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/JsonSchema" + } + ] }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47475,7 +52171,7 @@ } } }, - "UpdateGoogleCalendarCheckAvailabilityToolDTO": { + "UpdateVoicemailToolDTO": { "type": "object", "properties": { "messages": { @@ -47504,10 +52200,16 @@ }, "type": { "type": "string", + "description": "The type of tool. \"voicemail\" for Voicemail tool.", "enum": [ - "google.calendar.availability.check" - ], - "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool." + "voicemail" + ] + }, + "beepDetectionEnabled": { + "type": "boolean", + "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false", + "default": false, + "example": false }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47517,9 +52219,267 @@ } ] } - } + } + }, + "ToolVersion": { + "type": "object", + "properties": { + "versionName": { + "type": "string", + "nullable": true, + "description": "Optional human-readable label for this version. Pass `null` to clear.", + "maxLength": 80 + }, + "versionDescription": { + "type": "string", + "nullable": true, + "description": "Optional description for this version. Pass `null` to clear.", + "maxLength": 500 + }, + "type": { + "type": "object" + }, + "function": { + "type": "object", + "nullable": true + }, + "messages": { + "type": "array", + "nullable": true, + "items": { + "type": "object" + } + }, + "metadata": { + "type": "object", + "nullable": true + }, + "templateId": { + "type": "string", + "nullable": true + }, + "server": { + "type": "object", + "nullable": true + }, + "async": { + "type": "boolean", + "nullable": true + }, + "destinations": { + "type": "array", + "nullable": true, + "items": { + "type": "object" + } + }, + "name": { + "type": "string", + "nullable": true + }, + "subType": { + "type": "string", + "nullable": true + }, + "displayWidthPx": { + "type": "number", + "nullable": true + }, + "displayHeightPx": { + "type": "number", + "nullable": true + }, + "displayNumber": { + "type": "number", + "nullable": true + }, + "knowledgeBases": { + "type": "array", + "nullable": true, + "items": { + "type": "object" + } + }, + "url": { + "type": "string", + "nullable": true + }, + "method": { + "type": "string", + "nullable": true + }, + "headers": { + "type": "object", + "nullable": true + }, + "body": { + "type": "object" + }, + "backoffPlan": { + "type": "object", + "nullable": true + }, + "timeoutSeconds": { + "type": "number", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + }, + "variableExtractionPlan": { + "type": "object", + "nullable": true + }, + "rejectionPlan": { + "type": "object", + "nullable": true + }, + "credentialId": { + "type": "string", + "nullable": true + }, + "extendedDelayWhenPrecededByTextEnabled": { + "type": "boolean", + "nullable": true + }, + "beepDetectionEnabled": { + "type": "boolean", + "nullable": true + }, + "code": { + "type": "string", + "nullable": true + }, + "environmentVariables": { + "type": "array", + "nullable": true, + "items": { + "type": "object" + } + }, + "parameters": { + "type": "array", + "nullable": true, + "items": { + "type": "object" + } + }, + "encryptedPaths": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, + "sipInfoDtmfEnabled": { + "type": "boolean", + "nullable": true + }, + "verb": { + "type": "string", + "nullable": true + }, + "defaultResult": { + "type": "string", + "nullable": true + }, + "toolMessages": { + "type": "array", + "nullable": true, + "items": { + "type": "object" + } + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the version row." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that owns this version." + }, + "toolId": { + "type": "string", + "description": "This is the unique identifier for the tool this version was snapshotted from." + }, + "version": { + "type": "string", + "description": "This is the public monotonic version label, e.g. \"v1\".\nSystem-owned and incremented per tool; never user-supplied." + }, + "configHash": { + "type": "string", + "description": "This is the SHA-256 hex of the snapshotted content used for no-op detection." + }, + "parentVersion": { + "type": "string", + "nullable": true, + "description": "This is the prior version label (vN-1). Null on v1 or for branch roots." + }, + "createdBy": { + "type": "string", + "nullable": true, + "description": "This is the actor that wrote this version. Email when created via JWT, null when created via API." + }, + "deletedAt": { + "format": "date-time", + "type": "string", + "nullable": true, + "description": "This is the soft-delete timestamp. Null when active." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the version was created." + } + }, + "required": [ + "id", + "orgId", + "toolId", + "version", + "configHash", + "createdAt" + ] + }, + "ToolVersionPaginatedMetadata": { + "type": "object", + "properties": { + "nextCursor": { + "type": "string", + "nullable": true + }, + "hasNextPage": { + "type": "boolean" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "hasNextPage", + "limit" + ] + }, + "ToolVersionPaginatedResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolVersion" + } + }, + "metadata": { + "$ref": "#/components/schemas/ToolVersionPaginatedMetadata" + } + }, + "required": [ + "results", + "metadata" + ] }, - "UpdateSlackSendMessageToolDTO": { + "ToolDraft": { "type": "object", "properties": { "messages": { @@ -47548,10 +52508,68 @@ }, "type": { "type": "string", + "description": "This is the type of the tool.", "enum": [ - "slack.message.send" - ], - "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool." + "dtmf", + "endCall", + "transferCall", + "transferCancel", + "transferSuccessful", + "handoff", + "output", + "voicemail", + "query", + "sms", + "sipRequest", + "function", + "mcp", + "apiRequest", + "code", + "bash", + "computer", + "textEditor", + "google.calendar.event.create", + "google.calendar.availability.check", + "google.sheets.row.append", + "slack.message.send", + "gohighlevel.calendar.event.create", + "gohighlevel.calendar.availability.check", + "gohighlevel.contact.create", + "gohighlevel.contact.get", + "make", + "ghl" + ] + }, + "id": { + "type": "string", + "description": "Key used as `draftId` in URLs." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that owns this draft." + }, + "toolId": { + "type": "string", + "description": "This is the unique identifier for the tool this draft was forked from.\nIntentionally NOT a FK — `tool_draft` mirrors `tool_version` / `version_pin`'s\nno-FK / app-cleanup philosophy, so there is no `ON DELETE CASCADE`. Drafts\nmust be cleaned up explicitly (`toolDraftDelete({ orgId, toolId })`) on a\nparent tool hard-delete; nothing reaps them automatically." + }, + "baseVersion": { + "type": "string", + "description": "The published version this draft was forked from. Server defaults to\n`tool.latestVersion` on POST if omitted. Immutable for the draft's lifetime." + }, + "createdBy": { + "type": "string", + "nullable": true, + "description": "Email when JWT, null when API or external JWT. Set on POST, never rewritten on PATCH." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the draft was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the draft was last updated." }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47560,204 +52578,187 @@ "$ref": "#/components/schemas/ToolRejectionPlan" } ] - } - } - }, - "UpdateSmsToolDTO": { - "type": "object", - "properties": { - "messages": { + }, + "function": { + "description": "This is the function definition of the tool.", + "allOf": [ + { + "$ref": "#/components/schemas/OpenAIFunction" + } + ] + }, + "metadata": { + "type": "object", + "description": "Provider-specific metadata. Polymorphic across tool variants with no shared\ndiscriminator, so it is validated as a plain object (mirrors how\n`ToolCallResult.metadata` is typed)." + }, + "templateId": { + "type": "string", + "description": "This is the unique identifier for the template this tool was created from." + }, + "server": { + "$ref": "#/components/schemas/Server" + }, + "async": { + "type": "boolean" + }, + "destinations": { + "description": "These are the destinations that the call can be transferred to.", "type": "array", - "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] + "type": "object" } }, - "type": { + "name": { "type": "string", - "enum": [ - "sms" - ], - "description": "The type of tool. \"sms\" for Twilio SMS sending tool." + "description": "This is the name of the tool. This will be passed to the model." }, - "rejectionPlan": { - "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", - "allOf": [ - { - "$ref": "#/components/schemas/ToolRejectionPlan" - } - ] - } - } - }, - "UpdateMcpToolDTO": { - "type": "object", - "properties": { - "messages": { + "subType": { + "type": "string", + "description": "This is the sub type of the tool (e.g. for computer, bash and text-editor tools)." + }, + "displayWidthPx": { + "type": "number", + "description": "The display width in pixels (computer tool)." + }, + "displayHeightPx": { + "type": "number", + "description": "The display height in pixels (computer tool)." + }, + "displayNumber": { + "type": "number", + "description": "Optional display number (computer tool)." + }, + "knowledgeBases": { + "description": "The knowledge bases to query (query tool).", "type": "array", - "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] + "$ref": "#/components/schemas/KnowledgeBase" } }, - "type": { + "url": { + "type": "string", + "description": "This is where the request will be sent (api-request tool)." + }, + "method": { "type": "string", + "description": "This is the HTTP method for the request (api-request tool).", "enum": [ - "mcp" - ], - "description": "The type of tool. \"mcp\" for MCP tool." + "POST", + "GET", + "PUT", + "PATCH", + "DELETE" + ] }, - "server": { - "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.", + "headers": { + "description": "These are the headers to send with the request (api-request / sip-request tool).", "allOf": [ { - "$ref": "#/components/schemas/Server" + "$ref": "#/components/schemas/JsonSchema" } ] }, - "toolMessages": { - "description": "Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty array to suppress messages for a specific tool. Tools not listed here will use the default messages from the parent tool.", - "type": "array", - "items": { - "$ref": "#/components/schemas/McpToolMessages" - } + "body": { + "type": "object", + "description": "This is the body of the request. Either a JSON schema (api-request) or a\nliteral string / schema (sip-request)." }, - "rejectionPlan": { - "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "backoffPlan": { + "description": "This is the backoff plan if the request fails.", "allOf": [ { - "$ref": "#/components/schemas/ToolRejectionPlan" + "$ref": "#/components/schemas/BackoffPlan" } ] }, - "metadata": { - "$ref": "#/components/schemas/McpToolMetadata" - } - } - }, - "UpdateGoHighLevelCalendarAvailabilityToolDTO": { - "type": "object", - "properties": { - "messages": { - "type": "array", - "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] - } + "timeoutSeconds": { + "type": "number", + "description": "This is the timeout in seconds for the request.", + "minimum": 1, + "maximum": 300 }, - "type": { + "description": { "type": "string", - "enum": [ - "gohighlevel.calendar.availability.check" - ], - "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool." + "description": "This is the description of the tool. This will be passed to the model." }, - "rejectionPlan": { - "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "variableExtractionPlan": { + "description": "This is the plan to extract variables from the tool's response.", "allOf": [ { - "$ref": "#/components/schemas/ToolRejectionPlan" + "$ref": "#/components/schemas/VariableExtractionPlan" } ] - } - } - }, - "UpdateGoHighLevelCalendarEventCreateToolDTO": { - "type": "object", - "properties": { - "messages": { + }, + "credentialId": { + "type": "string", + "description": "This is the credential ID that will be used for authorization." + }, + "extendedDelayWhenPrecededByTextEnabled": { + "type": "boolean" + }, + "beepDetectionEnabled": { + "type": "boolean" + }, + "code": { + "type": "string", + "description": "This is the TypeScript code that will be executed when the tool is called (code tool).", + "maxLength": 50000 + }, + "environmentVariables": { + "description": "These are the environment variables available in the code via the `env` object (code tool).", "type": "array", - "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] + "$ref": "#/components/schemas/CodeToolEnvironmentVariable" } }, - "type": { + "parameters": { + "description": "These are the static parameters to merge into the tool's request body.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolParameter" + } + }, + "encryptedPaths": { + "description": "This is the paths to encrypt in the request body.", + "type": "array", + "items": { + "type": "string" + } + }, + "sipInfoDtmfEnabled": { + "type": "boolean", + "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833." + }, + "verb": { "type": "string", + "description": "This is the SIP method to send (sip-request tool).", "enum": [ - "gohighlevel.calendar.event.create" - ], - "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool." - }, - "rejectionPlan": { - "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", - "allOf": [ - { - "$ref": "#/components/schemas/ToolRejectionPlan" - } + "INFO", + "MESSAGE", + "NOTIFY" ] + }, + "defaultResult": { + "type": "string", + "description": "This is the default local tool result message used when no runtime override is returned (handoff tool)." + }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server (mcp tool).", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } } - } + }, + "required": [ + "id", + "orgId", + "toolId", + "baseVersion", + "createdAt", + "updatedAt" + ] }, - "UpdateGoHighLevelContactCreateToolDTO": { + "CreateToolDraftDTO": { "type": "object", "properties": { "messages": { @@ -47786,110 +52787,115 @@ }, "type": { "type": "string", + "description": "This is the type of the tool.", "enum": [ - "gohighlevel.contact.create" - ], - "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool." + "dtmf", + "endCall", + "transferCall", + "transferCancel", + "transferSuccessful", + "handoff", + "output", + "voicemail", + "query", + "sms", + "sipRequest", + "function", + "mcp", + "apiRequest", + "code", + "bash", + "computer", + "textEditor", + "google.calendar.event.create", + "google.calendar.availability.check", + "google.sheets.row.append", + "slack.message.send", + "gohighlevel.calendar.event.create", + "gohighlevel.calendar.availability.check", + "gohighlevel.contact.create", + "gohighlevel.contact.get", + "make", + "ghl" + ] }, - "rejectionPlan": { - "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", + "baseVersion": { + "type": "string", + "description": "Optional pointer to the published version this draft was forked from.\nWhen omitted, defaults server-side to the parent tool's current\n`latestVersion` (lazy-created via `toolBaselineVersionEnsureInTx` if the\ntool has never been versioned). Immutable for the lifetime of the draft." + }, + "function": { + "description": "This is the function definition of the tool.", "allOf": [ { - "$ref": "#/components/schemas/ToolRejectionPlan" + "$ref": "#/components/schemas/OpenAIFunction" } ] - } - } - }, - "UpdateGoHighLevelContactGetToolDTO": { - "type": "object", - "properties": { - "messages": { + }, + "metadata": { + "type": "object", + "description": "Provider-specific metadata. Polymorphic across tool variants with no shared\ndiscriminator, so it is validated as a plain object (mirrors how\n`ToolCallResult.metadata` is typed)." + }, + "templateId": { + "type": "string", + "description": "This is the unique identifier for the template this tool was created from." + }, + "server": { + "$ref": "#/components/schemas/Server" + }, + "async": { + "type": "boolean" + }, + "destinations": { + "description": "These are the destinations that the call can be transferred to.", "type": "array", - "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] + "type": "object" } }, - "type": { + "name": { "type": "string", - "enum": [ - "gohighlevel.contact.get" - ], - "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool." + "description": "This is the name of the tool. This will be passed to the model." }, - "rejectionPlan": { - "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", - "allOf": [ - { - "$ref": "#/components/schemas/ToolRejectionPlan" - } - ] - } - } - }, - "UpdateSipRequestToolDTO": { - "type": "object", - "properties": { - "messages": { + "subType": { + "type": "string", + "description": "This is the sub type of the tool (e.g. for computer, bash and text-editor tools)." + }, + "displayWidthPx": { + "type": "number", + "description": "The display width in pixels (computer tool)." + }, + "displayHeightPx": { + "type": "number", + "description": "The display height in pixels (computer tool)." + }, + "displayNumber": { + "type": "number", + "description": "Optional display number (computer tool)." + }, + "knowledgeBases": { + "description": "The knowledge bases to query (query tool).", "type": "array", - "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] + "$ref": "#/components/schemas/KnowledgeBase" } }, - "type": { + "url": { "type": "string", - "enum": [ - "sipRequest" - ], - "description": "The type of tool. \"sipRequest\" for SIP request tool." + "description": "This is where the request will be sent (api-request tool)." }, - "verb": { + "method": { "type": "string", + "description": "This is the HTTP method for the request (api-request tool).", "enum": [ - "INFO", - "MESSAGE", - "NOTIFY" - ], - "description": "The SIP method to send." + "POST", + "GET", + "PUT", + "PATCH", + "DELETE" + ] }, "headers": { - "description": "JSON schema for headers the model should populate when sending the SIP request.", + "description": "These are the headers to send with the request (api-request / sip-request tool).", "allOf": [ { "$ref": "#/components/schemas/JsonSchema" @@ -47897,16 +52903,95 @@ ] }, "body": { - "description": "Body to include in the SIP request. Either a literal string body, or a JSON schema describing a structured body that the model should populate.", - "oneOf": [ + "type": "object", + "description": "This is the body of the request. Either a JSON schema (api-request) or a\nliteral string / schema (sip-request)." + }, + "backoffPlan": { + "description": "This is the backoff plan if the request fails.", + "allOf": [ { - "type": "string" - }, + "$ref": "#/components/schemas/BackoffPlan" + } + ] + }, + "timeoutSeconds": { + "type": "number", + "description": "This is the timeout in seconds for the request.", + "minimum": 1, + "maximum": 300 + }, + "description": { + "type": "string", + "description": "This is the description of the tool. This will be passed to the model." + }, + "variableExtractionPlan": { + "description": "This is the plan to extract variables from the tool's response.", + "allOf": [ { - "$ref": "#/components/schemas/JsonSchema" + "$ref": "#/components/schemas/VariableExtractionPlan" } ] }, + "credentialId": { + "type": "string", + "description": "This is the credential ID that will be used for authorization." + }, + "extendedDelayWhenPrecededByTextEnabled": { + "type": "boolean" + }, + "beepDetectionEnabled": { + "type": "boolean" + }, + "code": { + "type": "string", + "description": "This is the TypeScript code that will be executed when the tool is called (code tool).", + "maxLength": 50000 + }, + "environmentVariables": { + "description": "These are the environment variables available in the code via the `env` object (code tool).", + "type": "array", + "items": { + "$ref": "#/components/schemas/CodeToolEnvironmentVariable" + } + }, + "parameters": { + "description": "These are the static parameters to merge into the tool's request body.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolParameter" + } + }, + "encryptedPaths": { + "description": "This is the paths to encrypt in the request body.", + "type": "array", + "items": { + "type": "string" + } + }, + "sipInfoDtmfEnabled": { + "type": "boolean", + "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833." + }, + "verb": { + "type": "string", + "description": "This is the SIP method to send (sip-request tool).", + "enum": [ + "INFO", + "MESSAGE", + "NOTIFY" + ] + }, + "defaultResult": { + "type": "string", + "description": "This is the default local tool result message used when no runtime override is returned (handoff tool)." + }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server (mcp tool).", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -47917,7 +53002,7 @@ } } }, - "UpdateVoicemailToolDTO": { + "UpdateToolDraftDTO": { "type": "object", "properties": { "messages": { @@ -47946,16 +53031,206 @@ }, "type": { "type": "string", - "description": "The type of tool. \"voicemail\" for Voicemail tool.", + "description": "This is the type of the tool.", "enum": [ - "voicemail" + "dtmf", + "endCall", + "transferCall", + "transferCancel", + "transferSuccessful", + "handoff", + "output", + "voicemail", + "query", + "sms", + "sipRequest", + "function", + "mcp", + "apiRequest", + "code", + "bash", + "computer", + "textEditor", + "google.calendar.event.create", + "google.calendar.availability.check", + "google.sheets.row.append", + "slack.message.send", + "gohighlevel.calendar.event.create", + "gohighlevel.calendar.availability.check", + "gohighlevel.contact.create", + "gohighlevel.contact.get", + "make", + "ghl" + ] + }, + "function": { + "description": "This is the function definition of the tool.", + "allOf": [ + { + "$ref": "#/components/schemas/OpenAIFunction" + } ] }, + "metadata": { + "type": "object", + "description": "Provider-specific metadata. Polymorphic across tool variants with no shared\ndiscriminator, so it is validated as a plain object (mirrors how\n`ToolCallResult.metadata` is typed)." + }, + "templateId": { + "type": "string", + "description": "This is the unique identifier for the template this tool was created from." + }, + "server": { + "$ref": "#/components/schemas/Server" + }, + "async": { + "type": "boolean" + }, + "destinations": { + "description": "These are the destinations that the call can be transferred to.", + "type": "array", + "items": { + "type": "object" + } + }, + "name": { + "type": "string", + "description": "This is the name of the tool. This will be passed to the model." + }, + "subType": { + "type": "string", + "description": "This is the sub type of the tool (e.g. for computer, bash and text-editor tools)." + }, + "displayWidthPx": { + "type": "number", + "description": "The display width in pixels (computer tool)." + }, + "displayHeightPx": { + "type": "number", + "description": "The display height in pixels (computer tool)." + }, + "displayNumber": { + "type": "number", + "description": "Optional display number (computer tool)." + }, + "knowledgeBases": { + "description": "The knowledge bases to query (query tool).", + "type": "array", + "items": { + "$ref": "#/components/schemas/KnowledgeBase" + } + }, + "url": { + "type": "string", + "description": "This is where the request will be sent (api-request tool)." + }, + "method": { + "type": "string", + "description": "This is the HTTP method for the request (api-request tool).", + "enum": [ + "POST", + "GET", + "PUT", + "PATCH", + "DELETE" + ] + }, + "headers": { + "description": "These are the headers to send with the request (api-request / sip-request tool).", + "allOf": [ + { + "$ref": "#/components/schemas/JsonSchema" + } + ] + }, + "body": { + "type": "object", + "description": "This is the body of the request. Either a JSON schema (api-request) or a\nliteral string / schema (sip-request)." + }, + "backoffPlan": { + "description": "This is the backoff plan if the request fails.", + "allOf": [ + { + "$ref": "#/components/schemas/BackoffPlan" + } + ] + }, + "timeoutSeconds": { + "type": "number", + "description": "This is the timeout in seconds for the request.", + "minimum": 1, + "maximum": 300 + }, + "description": { + "type": "string", + "description": "This is the description of the tool. This will be passed to the model." + }, + "variableExtractionPlan": { + "description": "This is the plan to extract variables from the tool's response.", + "allOf": [ + { + "$ref": "#/components/schemas/VariableExtractionPlan" + } + ] + }, + "credentialId": { + "type": "string", + "description": "This is the credential ID that will be used for authorization." + }, + "extendedDelayWhenPrecededByTextEnabled": { + "type": "boolean" + }, "beepDetectionEnabled": { + "type": "boolean" + }, + "code": { + "type": "string", + "description": "This is the TypeScript code that will be executed when the tool is called (code tool).", + "maxLength": 50000 + }, + "environmentVariables": { + "description": "These are the environment variables available in the code via the `env` object (code tool).", + "type": "array", + "items": { + "$ref": "#/components/schemas/CodeToolEnvironmentVariable" + } + }, + "parameters": { + "description": "These are the static parameters to merge into the tool's request body.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolParameter" + } + }, + "encryptedPaths": { + "description": "This is the paths to encrypt in the request body.", + "type": "array", + "items": { + "type": "string" + } + }, + "sipInfoDtmfEnabled": { "type": "boolean", - "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false", - "default": false, - "example": false + "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833." + }, + "verb": { + "type": "string", + "description": "This is the SIP method to send (sip-request tool).", + "enum": [ + "INFO", + "MESSAGE", + "NOTIFY" + ] + }, + "defaultResult": { + "type": "string", + "description": "This is the default local tool result message used when no runtime override is returned (handoff tool)." + }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server (mcp tool).", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", @@ -47967,6 +53242,118 @@ } } }, + "ToolDraftPaginatedMetadata": { + "type": "object", + "properties": { + "nextCursor": { + "type": "string", + "nullable": true + }, + "hasNextPage": { + "type": "boolean" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "nextCursor", + "hasNextPage", + "limit" + ] + }, + "ToolDraftPaginatedResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ToolDraft" + } + }, + "metadata": { + "$ref": "#/components/schemas/ToolDraftPaginatedMetadata" + } + }, + "required": [ + "results", + "metadata" + ] + }, + "ToolDraftConflictResponseDTO": { + "type": "object", + "properties": { + "existingDraftId": { + "type": "string", + "nullable": true + }, + "error": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "existingDraftId", + "error", + "message" + ] + }, + "GetToolDraftsDTO": { + "type": "object", + "properties": { + "cursor": { + "type": "string", + "description": "Opaque base64-encoded keyset cursor. Omit on first page." + }, + "limit": { + "type": "number", + "description": "Page size, defaults to 25, capped at 100.", + "minimum": 1, + "maximum": 100 + }, + "createdBy": { + "type": "string" + } + } + }, + "UpdateToolVersionMetadataDTO": { + "type": "object", + "properties": { + "versionName": { + "type": "string", + "nullable": true, + "description": "Optional human-readable label for this version. Pass `null` to clear.", + "maxLength": 80 + }, + "versionDescription": { + "type": "string", + "nullable": true, + "description": "Optional description for this version. Pass `null` to clear.", + "maxLength": 500 + } + } + }, + "ToolPinnedConflictResponseDTO": { + "type": "object", + "properties": { + "error": { + "type": "string", + "enum": [ + "tool_pinned" + ] + }, + "message": { + "type": "string", + "description": "Human-readable reason the parent-tool delete was rejected." + } + }, + "required": [ + "error", + "message" + ] + }, "CreateFileDTO": { "type": "object", "properties": { @@ -55978,31 +61365,300 @@ "minLength": 1, "maxLength": 40 }, - "openAIEndpoint": { - "type": "string", - "maxLength": 10000 + "openAIEndpoint": { + "type": "string", + "maxLength": 10000 + } + }, + "required": [ + "provider", + "region", + "models", + "openAIKey", + "id", + "orgId", + "createdAt", + "updatedAt", + "openAIEndpoint" + ] + }, + "ByoSipTrunkCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.", + "enum": [ + "byo-sip-trunk" + ] + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + }, + "gateways": { + "description": "This is the list of SIP trunk's gateways.", + "type": "array", + "items": { + "$ref": "#/components/schemas/SipTrunkGateway" + } + }, + "outboundAuthenticationPlan": { + "description": "This can be used to configure the outbound authentication if required by the SIP trunk.", + "allOf": [ + { + "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan" + } + ] + }, + "outboundLeadingPlusEnabled": { + "type": "boolean", + "description": "This ensures the outbound origination attempts have a leading plus. Defaults to false to match conventional telecom behavior.\n\nUsage:\n- Vonage/Twilio requires leading plus for all outbound calls. Set this to true.\n\n@default false" + }, + "techPrefix": { + "type": "string", + "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.", + "maxLength": 10000 + }, + "sipDiversionHeader": { + "type": "string", + "description": "This can be used to enable the SIP diversion header for authenticating the calling number if the SIP trunk supports it. This is an advanced property.", + "maxLength": 10000 + } + }, + "required": [ + "id", + "orgId", + "createdAt", + "updatedAt", + "gateways" + ] + }, + "CartesiaCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "cartesia" + ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API." + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + }, + "apiUrl": { + "type": "string", + "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." + } + }, + "required": [ + "provider", + "apiKey", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "CerebrasCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "cerebras" + ] + }, + "apiKey": { + "type": "string", + "maxLength": 10000, + "description": "This is not returned in the API." + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + }, + "required": [ + "provider", + "apiKey", + "id", + "orgId", + "createdAt", + "updatedAt" + ] + }, + "CloudflareCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "cloudflare" + ], + "description": "Credential provider. Only allowed value is cloudflare" + }, + "accountId": { + "type": "string", + "description": "Cloudflare Account Id." + }, + "apiKey": { + "type": "string", + "description": "Cloudflare API Key / Token." + }, + "accountEmail": { + "type": "string", + "description": "Cloudflare Account Email." + }, + "fallbackIndex": { + "type": "number", + "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.", + "minimum": 1 + }, + "id": { + "type": "string", + "description": "This is the unique identifier for the credential." + }, + "orgId": { + "type": "string", + "description": "This is the unique identifier for the org that this credential belongs to." + }, + "createdAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the credential was created." + }, + "updatedAt": { + "format": "date-time", + "type": "string", + "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + }, + "bucketPlan": { + "description": "This is the bucket plan that can be provided to store call artifacts in R2", + "allOf": [ + { + "$ref": "#/components/schemas/CloudflareR2BucketPlan" + } + ] } }, "required": [ "provider", - "region", - "models", - "openAIKey", "id", "orgId", "createdAt", - "updatedAt", - "openAIEndpoint" + "updatedAt" ] }, - "ByoSipTrunkCredential": { + "Oauth2AuthenticationSession": { + "type": "object", + "properties": { + "accessToken": { + "type": "string", + "description": "This is the OAuth2 access token." + }, + "expiresAt": { + "format": "date-time", + "type": "string", + "description": "This is the OAuth2 access token expiration." + }, + "refreshToken": { + "type": "string", + "description": "This is the OAuth2 refresh token." + } + } + }, + "CustomLLMCredential": { "type": "object", "properties": { "provider": { "type": "string", - "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.", "enum": [ - "byo-sip-trunk" + "custom-llm" + ] + }, + "apiKey": { + "type": "string", + "maxLength": 10000, + "description": "This is not returned in the API." + }, + "authenticationPlan": { + "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey", + "allOf": [ + { + "$ref": "#/components/schemas/OAuth2AuthenticationPlan" + } ] }, "id": { @@ -56023,57 +61679,37 @@ "type": "string", "description": "This is the ISO 8601 date-time string of when the assistant was last updated." }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - }, - "gateways": { - "description": "This is the list of SIP trunk's gateways.", - "type": "array", - "items": { - "$ref": "#/components/schemas/SipTrunkGateway" - } - }, - "outboundAuthenticationPlan": { - "description": "This can be used to configure the outbound authentication if required by the SIP trunk.", + "authenticationSession": { + "description": "This is the authentication session for the credential. Available for credentials that have an authentication plan.", "allOf": [ { - "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan" + "$ref": "#/components/schemas/Oauth2AuthenticationSession" } ] }, - "outboundLeadingPlusEnabled": { - "type": "boolean", - "description": "This ensures the outbound origination attempts have a leading plus. Defaults to false to match conventional telecom behavior.\n\nUsage:\n- Vonage/Twilio requires leading plus for all outbound calls. Set this to true.\n\n@default false" - }, - "techPrefix": { - "type": "string", - "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.", - "maxLength": 10000 - }, - "sipDiversionHeader": { + "name": { "type": "string", - "description": "This can be used to enable the SIP diversion header for authenticating the calling number if the SIP trunk supports it. This is an advanced property.", - "maxLength": 10000 + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 } }, "required": [ + "provider", + "apiKey", "id", "orgId", "createdAt", - "updatedAt", - "gateways" + "updatedAt" ] }, - "CartesiaCredential": { + "DeepgramCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "cartesia" + "deepgram" ] }, "apiKey": { @@ -56106,7 +61742,7 @@ }, "apiUrl": { "type": "string", - "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." + "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com." } }, "required": [ @@ -56118,18 +61754,17 @@ "updatedAt" ] }, - "CerebrasCredential": { + "DeepInfraCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "cerebras" + "deepinfra" ] }, "apiKey": { "type": "string", - "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -56166,32 +61801,18 @@ "updatedAt" ] }, - "CloudflareCredential": { + "DeepSeekCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "cloudflare" - ], - "description": "Credential provider. Only allowed value is cloudflare" - }, - "accountId": { - "type": "string", - "description": "Cloudflare Account Id." + "deep-seek" + ] }, "apiKey": { "type": "string", - "description": "Cloudflare API Key / Token." - }, - "accountEmail": { - "type": "string", - "description": "Cloudflare Account Email." - }, - "fallbackIndex": { - "type": "number", - "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.", - "minimum": 1 + "description": "This is not returned in the API." }, "id": { "type": "string", @@ -56216,49 +61837,24 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 - }, - "bucketPlan": { - "description": "This is the bucket plan that can be provided to store call artifacts in R2", - "allOf": [ - { - "$ref": "#/components/schemas/CloudflareR2BucketPlan" - } - ] } }, "required": [ "provider", + "apiKey", "id", "orgId", "createdAt", "updatedAt" ] }, - "Oauth2AuthenticationSession": { - "type": "object", - "properties": { - "accessToken": { - "type": "string", - "description": "This is the OAuth2 access token." - }, - "expiresAt": { - "format": "date-time", - "type": "string", - "description": "This is the OAuth2 access token expiration." - }, - "refreshToken": { - "type": "string", - "description": "This is the OAuth2 refresh token." - } - } - }, - "CustomLLMCredential": { + "ElevenLabsCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "custom-llm" + "11labs" ] }, "apiKey": { @@ -56266,13 +61862,14 @@ "maxLength": 10000, "description": "This is not returned in the API." }, - "authenticationPlan": { - "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey", - "allOf": [ - { - "$ref": "#/components/schemas/OAuth2AuthenticationPlan" - } - ] + "apiUrl": { + "type": "string", + "enum": [ + "https://api.elevenlabs.io", + "https://api.eu.residency.elevenlabs.io" + ], + "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.", + "nullable": true }, "id": { "type": "string", @@ -56292,14 +61889,6 @@ "type": "string", "description": "This is the ISO 8601 date-time string of when the assistant was last updated." }, - "authenticationSession": { - "description": "This is the authentication session for the credential. Available for credentials that have an authentication plan.", - "allOf": [ - { - "$ref": "#/components/schemas/Oauth2AuthenticationSession" - } - ] - }, "name": { "type": "string", "description": "This is the name of credential. This is just for your reference.", @@ -56316,18 +61905,19 @@ "updatedAt" ] }, - "DeepgramCredential": { + "GcpCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "deepgram" + "gcp" ] }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "fallbackIndex": { + "type": "number", + "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.", + "minimum": 1 }, "id": { "type": "string", @@ -56353,27 +61943,39 @@ "minLength": 1, "maxLength": 40 }, - "apiUrl": { + "gcpKey": { + "description": "This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at https://console.cloud.google.com/iam-admin/serviceaccounts/details//keys.\n\nThe schema is identical to the JSON that GCP outputs.", + "allOf": [ + { + "$ref": "#/components/schemas/GcpKey" + } + ] + }, + "region": { "type": "string", - "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com." + "description": "This is the region of the GCP resource.", + "maxLength": 40 + }, + "bucketPlan": { + "$ref": "#/components/schemas/BucketPlan" } }, "required": [ "provider", - "apiKey", "id", "orgId", "createdAt", - "updatedAt" + "updatedAt", + "gcpKey" ] }, - "DeepInfraCredential": { + "GladiaCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "deepinfra" + "gladia" ] }, "apiKey": { @@ -56414,13 +62016,13 @@ "updatedAt" ] }, - "DeepSeekCredential": { + "GoHighLevelCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "deep-seek" + "gohighlevel" ] }, "apiKey": { @@ -56461,13 +62063,14 @@ "updatedAt" ] }, - "ElevenLabsCredential": { + "GoogleCredential": { "type": "object", "properties": { "provider": { "type": "string", + "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey", "enum": [ - "11labs" + "google" ] }, "apiKey": { @@ -56475,15 +62078,6 @@ "maxLength": 10000, "description": "This is not returned in the API." }, - "apiUrl": { - "type": "string", - "enum": [ - "https://api.elevenlabs.io", - "https://api.eu.residency.elevenlabs.io" - ], - "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.", - "nullable": true - }, "id": { "type": "string", "description": "This is the unique identifier for the credential." @@ -56518,19 +62112,18 @@ "updatedAt" ] }, - "GcpCredential": { + "GroqCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "gcp" + "groq" ] }, - "fallbackIndex": { - "type": "number", - "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.", - "minimum": 1 + "apiKey": { + "type": "string", + "description": "This is not returned in the API." }, "id": { "type": "string", @@ -56555,44 +62148,29 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 - }, - "gcpKey": { - "description": "This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at https://console.cloud.google.com/iam-admin/serviceaccounts/details//keys.\n\nThe schema is identical to the JSON that GCP outputs.", - "allOf": [ - { - "$ref": "#/components/schemas/GcpKey" - } - ] - }, - "region": { - "type": "string", - "description": "This is the region of the GCP resource.", - "maxLength": 40 - }, - "bucketPlan": { - "$ref": "#/components/schemas/BucketPlan" } }, "required": [ "provider", + "apiKey", "id", "orgId", "createdAt", - "updatedAt", - "gcpKey" + "updatedAt" ] }, - "GladiaCredential": { + "HumeCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "gladia" + "hume" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -56629,17 +62207,19 @@ "updatedAt" ] }, - "GoHighLevelCredential": { + "InflectionAICredential": { "type": "object", "properties": { "provider": { "type": "string", + "description": "This is the api key for Pi in InflectionAI's console. Get it from here: https://developers.inflection.ai/keys, billing will need to be setup", "enum": [ - "gohighlevel" + "inflection-ai" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -56676,20 +62256,26 @@ "updatedAt" ] }, - "GoogleCredential": { + "LangfuseCredential": { "type": "object", "properties": { "provider": { "type": "string", - "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey", "enum": [ - "google" + "langfuse" ] }, + "publicKey": { + "type": "string", + "description": "The public key for Langfuse project. Eg: pk-lf-..." + }, "apiKey": { "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." + "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API." + }, + "apiUrl": { + "type": "string", + "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com" }, "id": { "type": "string", @@ -56718,20 +62304,22 @@ }, "required": [ "provider", + "publicKey", "apiKey", + "apiUrl", "id", "orgId", "createdAt", "updatedAt" ] }, - "GroqCredential": { + "LmntCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "groq" + "lmnt" ] }, "apiKey": { @@ -56772,67 +62360,25 @@ "updatedAt" ] }, - "HumeCredential": { + "MakeCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "hume" + "make" ] }, - "apiKey": { - "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", + "teamId": { "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + "description": "Team ID" }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "InflectionAICredential": { - "type": "object", - "properties": { - "provider": { + "region": { "type": "string", - "description": "This is the api key for Pi in InflectionAI's console. Get it from here: https://developers.inflection.ai/keys, billing will need to be setup", - "enum": [ - "inflection-ai" - ] + "description": "Region of your application. For example: eu1, eu2, us1, us2" }, "apiKey": { "type": "string", - "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -56862,6 +62408,8 @@ }, "required": [ "provider", + "teamId", + "region", "apiKey", "id", "orgId", @@ -56869,26 +62417,25 @@ "updatedAt" ] }, - "LangfuseCredential": { + "MicrosoftCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "langfuse" + "microsoft" ] }, - "publicKey": { - "type": "string", - "description": "The public key for Langfuse project. Eg: pk-lf-..." - }, "apiKey": { "type": "string", - "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API." + "description": "This is not returned in the API.", + "maxLength": 10000 }, - "apiUrl": { + "region": { "type": "string", - "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com" + "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.", + "maxLength": 64, + "example": "eastus" }, "id": { "type": "string", @@ -56917,26 +62464,25 @@ }, "required": [ "provider", - "publicKey", "apiKey", - "apiUrl", "id", "orgId", "createdAt", "updatedAt" ] }, - "LmntCredential": { + "MistralCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "lmnt" + "mistral" ] }, "apiKey": { "type": "string", + "maxLength": 100, "description": "This is not returned in the API." }, "id": { @@ -56973,23 +62519,15 @@ "updatedAt" ] }, - "MakeCredential": { + "NeuphonicCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "make" + "neuphonic" ] }, - "teamId": { - "type": "string", - "description": "Team ID" - }, - "region": { - "type": "string", - "description": "Region of your application. For example: eu1, eu2, us1, us2" - }, "apiKey": { "type": "string", "description": "This is not returned in the API." @@ -57019,62 +62557,6 @@ "maxLength": 40 } }, - "required": [ - "provider", - "teamId", - "region", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "MicrosoftCredential": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "microsoft" - ] - }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API.", - "maxLength": 10000 - }, - "region": { - "type": "string", - "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.", - "maxLength": 64, - "example": "eastus" - }, - "id": { - "type": "string", - "description": "This is the unique identifier for the credential." - }, - "orgId": { - "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." - }, - "createdAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." - }, - "updatedAt": { - "format": "date-time", - "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, "required": [ "provider", "apiKey", @@ -57084,18 +62566,17 @@ "updatedAt" ] }, - "MistralCredential": { + "OpenAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "mistral" + "openai" ] }, "apiKey": { "type": "string", - "maxLength": 100, "description": "This is not returned in the API." }, "id": { @@ -57132,13 +62613,13 @@ "updatedAt" ] }, - "NeuphonicCredential": { + "OpenRouterCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "neuphonic" + "openrouter" ] }, "apiKey": { @@ -57179,13 +62660,13 @@ "updatedAt" ] }, - "OpenAICredential": { + "PerplexityAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "openai" + "perplexity-ai" ] }, "apiKey": { @@ -57226,13 +62707,13 @@ "updatedAt" ] }, - "OpenRouterCredential": { + "PlayHTCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "openrouter" + "playht" ] }, "apiKey": { @@ -57262,6 +62743,9 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 + }, + "userId": { + "type": "string" } }, "required": [ @@ -57270,16 +62754,17 @@ "id", "orgId", "createdAt", - "updatedAt" + "updatedAt", + "userId" ] }, - "PerplexityAICredential": { + "RimeAICredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "perplexity-ai" + "rime-ai" ] }, "apiKey": { @@ -57320,13 +62805,13 @@ "updatedAt" ] }, - "PlayHTCredential": { + "RunpodCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "playht" + "runpod" ] }, "apiKey": { @@ -57356,9 +62841,6 @@ "description": "This is the name of credential. This is just for your reference.", "minLength": 1, "maxLength": 40 - }, - "userId": { - "type": "string" } }, "required": [ @@ -57367,21 +62849,21 @@ "id", "orgId", "createdAt", - "updatedAt", - "userId" + "updatedAt" ] }, - "RimeAICredential": { + "WellSaidCredential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "rime-ai" + "wellsaid" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "id": { @@ -57418,66 +62900,40 @@ "updatedAt" ] }, - "RunpodCredential": { + "S3Credential": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "runpod" - ] - }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "s3" + ], + "description": "Credential provider. Only allowed value is s3" }, - "id": { + "awsAccessKeyId": { "type": "string", - "description": "This is the unique identifier for the credential." + "description": "AWS access key ID." }, - "orgId": { + "awsSecretAccessKey": { "type": "string", - "description": "This is the unique identifier for the org that this credential belongs to." + "description": "AWS access key secret. This is not returned in the API." }, - "createdAt": { - "format": "date-time", + "region": { "type": "string", - "description": "This is the ISO 8601 date-time string of when the credential was created." + "description": "AWS region in which the S3 bucket is located." }, - "updatedAt": { - "format": "date-time", + "s3BucketName": { "type": "string", - "description": "This is the ISO 8601 date-time string of when the assistant was last updated." + "description": "AWS S3 bucket name." }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey", - "id", - "orgId", - "createdAt", - "updatedAt" - ] - }, - "WellSaidCredential": { - "type": "object", - "properties": { - "provider": { + "s3PathPrefix": { "type": "string", - "enum": [ - "wellsaid" - ] + "description": "The path prefix for the uploaded recording. Ex. \"recordings/\"" }, - "apiKey": { - "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." + "fallbackIndex": { + "type": "number", + "minimum": 1, + "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order." }, "id": { "type": "string", @@ -57506,42 +62962,67 @@ }, "required": [ "provider", - "apiKey", + "awsAccessKeyId", + "awsSecretAccessKey", + "region", + "s3BucketName", + "s3PathPrefix", "id", "orgId", "createdAt", "updatedAt" ] }, - "S3Credential": { + "S3CompatibleBucketPlan": { "type": "object", "properties": { - "provider": { + "url": { "type": "string", - "enum": [ - "s3" - ], - "description": "Credential provider. Only allowed value is s3" + "description": "S3-compatible endpoint URL, such as https://s3.us-west-004.backblazeb2.com. Must be public HTTPS." }, - "awsAccessKeyId": { + "region": { "type": "string", - "description": "AWS access key ID." + "maxLength": 64, + "description": "SigV4 signing region expected by the object store. Most stores accept us-east-1." }, - "awsSecretAccessKey": { + "accessKeyId": { "type": "string", - "description": "AWS access key secret. This is not returned in the API." + "description": "S3 access key ID." }, - "region": { + "secretAccessKey": { "type": "string", - "description": "AWS region in which the S3 bucket is located." + "description": "S3 secret access key. This is not returned in the API.", + "writeOnly": true }, - "s3BucketName": { + "name": { "type": "string", - "description": "AWS S3 bucket name." + "description": "Bucket name." }, - "s3PathPrefix": { + "path": { "type": "string", - "description": "The path prefix for the uploaded recording. Ex. \"recordings/\"" + "description": "Optional key prefix inside the bucket, such as recordings/." + } + }, + "required": [ + "url", + "region", + "accessKeyId", + "secretAccessKey", + "name" + ] + }, + "S3CompatibleStorageCredential": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "s3-compatible" + ], + "description": "This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2." + }, + "bucketPlan": { + "$ref": "#/components/schemas/S3CompatibleBucketPlan" }, "fallbackIndex": { "type": "number", @@ -57575,11 +63056,7 @@ }, "required": [ "provider", - "awsAccessKeyId", - "awsSecretAccessKey", - "region", - "s3BucketName", - "s3PathPrefix", + "bucketPlan", "id", "orgId", "createdAt", @@ -58872,6 +64349,36 @@ "apiKey" ] }, + "CreateS3CompatibleCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "s3-compatible" + ], + "description": "This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2." + }, + "bucketPlan": { + "$ref": "#/components/schemas/S3CompatibleBucketPlan" + }, + "fallbackIndex": { + "type": "number", + "minimum": 1, + "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + }, + "required": [ + "provider", + "bucketPlan" + ] + }, "CreateSonioxCredentialDTO": { "type": "object", "properties": { @@ -60174,6 +65681,63 @@ } } }, + "UpdateS3CompatibleBucketPlanDTO": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "S3-compatible endpoint URL, such as https://s3.us-west-004.backblazeb2.com. Must be public HTTPS." + }, + "region": { + "type": "string", + "maxLength": 64, + "description": "SigV4 signing region expected by the object store. Most stores accept us-east-1." + }, + "accessKeyId": { + "type": "string", + "description": "S3 access key ID." + }, + "secretAccessKey": { + "type": "string", + "description": "S3 secret access key. This is not returned in the API.", + "writeOnly": true + }, + "name": { + "type": "string", + "description": "Bucket name." + }, + "path": { + "type": "string", + "description": "Optional key prefix inside the bucket, such as recordings/." + } + } + }, + "UpdateS3CompatibleCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "s3-compatible" + ], + "description": "This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2." + }, + "fallbackIndex": { + "type": "number", + "minimum": 1, + "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order." + }, + "bucketPlan": { + "$ref": "#/components/schemas/UpdateS3CompatibleBucketPlanDTO" + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 + } + } + }, "UpdateTogetherAICredentialDTO": { "type": "object", "properties": { @@ -62383,6 +67947,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"workflow.node.started\" is sent when the active node changes.", @@ -62456,6 +68025,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"assistant.started\" is sent when the assistant is started.", @@ -62533,6 +68107,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"conversation-update\" is sent when an update is committed to the conversation history.", @@ -62637,6 +68216,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"hang\" is sent when the assistant is hanging due to a delay. The delay can be caused by many factors, such as:\n- the model is too slow to respond\n- the voice is too slow to respond\n- the tool call is still waiting for a response from your server\n- etc.", @@ -62705,6 +68289,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"metadata\" is sent to forward metadata to the client.", @@ -62778,6 +68367,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"model-output\" is sent as the model outputs tokens.", @@ -62855,6 +68449,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"speech-update\" is sent whenever assistant or user start or stop speaking.", @@ -62945,6 +68544,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.", @@ -63052,6 +68656,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"tool-calls\" is sent to call a tool.", @@ -63164,6 +68773,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"tool-calls-result\" is sent to forward the result of a tool call to the client.", @@ -63237,6 +68851,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.", @@ -63346,6 +68965,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.", @@ -63418,6 +69042,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", @@ -63491,6 +69120,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", @@ -63564,6 +69198,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.", @@ -63666,6 +69305,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.", @@ -63743,6 +69387,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.", @@ -63820,6 +69469,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"session.created\" is sent when a new session is created.", @@ -63897,6 +69551,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"session.updated\" is sent when a session is updated.", @@ -63974,6 +69633,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.", @@ -64051,6 +69715,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", @@ -64119,6 +69788,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", @@ -64288,6 +69962,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"assistant-request\" is sent to fetch assistant configuration for an incoming call.", @@ -64372,6 +70051,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"conversation-update\" is sent when an update is committed to the conversation history.", @@ -64492,6 +70176,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"end-of-call-report\" is sent when the call ends and post-processing is complete.", @@ -64527,6 +70216,7 @@ "call.start.error-subscription-upgrade-failed", "call.start.error-subscription-concurrency-limit-reached", "call.start.error-enterprise-feature-not-available-recording-consent", + "call.start.assistant-version-error-validation", "assistant-not-valid", "call.start.error-vapifault-database-error", "assistant-not-found", @@ -65293,6 +70983,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"handoff-destination-request\" is sent when the model is requesting handoff but destination is unknown.", @@ -65382,6 +71077,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"hang\" is sent when the assistant is hanging due to a delay. The delay can be caused by many factors, such as:\n- the model is too slow to respond\n- the voice is too slow to respond\n- the tool call is still waiting for a response from your server\n- etc.", @@ -65466,6 +71166,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"knowledge-base-request\" is sent to request knowledge base documents. To enable, use `assistant.knowledgeBase.provider=custom-knowledge-base`.", @@ -65586,6 +71291,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"model-output\" is sent as the model outputs tokens.", @@ -65679,6 +71389,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"phone-call-control\" is an advanced type of message.\n\nWhen it is requested in `assistant.serverMessages`, the hangup and forwarding responsibilities are delegated to your server. Vapi will no longer do the actual transfer and hangup.", @@ -65785,6 +71500,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"speech-update\" is sent whenever assistant or user start or stop speaking.", @@ -65891,6 +71611,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"status-update\" is sent whenever the `call.status` changes.", @@ -65940,6 +71665,7 @@ "call.start.error-subscription-upgrade-failed", "call.start.error-subscription-concurrency-limit-reached", "call.start.error-enterprise-feature-not-available-recording-consent", + "call.start.assistant-version-error-validation", "assistant-not-valid", "call.start.error-vapifault-database-error", "assistant-not-found", @@ -66681,6 +72407,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"tool-calls\" is sent to call a tool.", @@ -66809,6 +72540,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"transfer-destination-request\" is sent when the model is requesting transfer but destination is unknown.", @@ -66893,6 +72629,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.", @@ -67018,6 +72759,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.", @@ -67141,6 +72887,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.", @@ -67229,6 +72980,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", @@ -67318,6 +73074,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", @@ -67407,6 +73168,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.", @@ -67525,6 +73291,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"voice-request\" is sent when using `assistant.voice={ \"type\": \"custom-voice\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.voice.server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nThe expected response is 1-channel 16-bit raw PCM audio at the sample rate specified in the request. Here is how the response will be piped to the transport:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```", @@ -67619,6 +73390,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"call.endpointing.request\" is sent when using `assistant.startSpeakingPlan.smartEndpointingPlan={ \"provider\": \"custom-endpointing-model\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.startSpeakingPlan.smartEndpointingPlan.server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nThe expected response:\n{\n \"timeoutSeconds\": 0.5\n}", @@ -67739,6 +73515,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.", @@ -67824,6 +73605,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.", @@ -67909,6 +73695,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"session.created\" is sent when a new session is created.", @@ -68002,6 +73793,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"session.updated\" is sent when a session is updated.", @@ -68095,6 +73891,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.", @@ -68188,6 +73989,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", @@ -68272,6 +74078,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.", @@ -68404,6 +74215,11 @@ } ] }, + "assistantVersion": { + "type": "string", + "nullable": true, + "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning." + }, "type": { "type": "string", "description": "This is the type of the message. \"campaign.predial\" is sent to the campaign's server before each contact is dialed, so the server can decide whether the contact is eligible to be called.",