{"openapi":"3.1.0","info":{"title":"API reference","version":"1.0.0"},"paths":{"/assistant":{"get":{"operationId":"list","summary":"List Assistants","description":"Returns assistants for the authenticated organization. Filter results by creation or update timestamps and limit the number returned.","tags":["Assistants"],"parameters":[{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Assistant"}}}}}}},"post":{"operationId":"create","summary":"Create Assistant","description":"Creates a reusable assistant configuration containing the model, voice, transcriber, tools, prompts, and call behavior.","tags":["Assistants"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assistant"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssistantDTO"}}}}}},"/assistant/{id}":{"get":{"operationId":"get","summary":"Get Assistant","description":"Returns the assistant identified by its ID.","tags":["Assistants"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the assistant.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assistant"}}}}}},"delete":{"operationId":"delete","summary":"Delete Assistant","description":"Deletes the assistant identified by its ID.","tags":["Assistants"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the assistant.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assistant"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPinnedConflictResponseDTO"}}}}}},"patch":{"operationId":"update","summary":"Update Assistant","description":"Updates the specified fields of the assistant identified by its ID.","tags":["Assistants"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the assistant.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assistant"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssistantDTO"}}}}}},"/squad":{"get":{"operationId":"list","summary":"List Squads","description":"Returns squads for the authenticated organization. Filter results by creation or update timestamps and limit the number returned.","tags":["Squads"],"parameters":[{"name":"idAny","in":"query","description":"Return only squads matching the provided ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Squad"}}}}}}},"post":{"operationId":"create","summary":"Create Squad","description":"Creates a squad that coordinates multiple assistants and their handoffs during a conversation.","tags":["Squads"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Squad"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSquadDTO"}}}}}},"/squad/{id}":{"get":{"operationId":"get","summary":"Get Squad","description":"Returns the squad identified by its ID.","tags":["Squads"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the squad.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Squad"}}}}}},"delete":{"operationId":"delete","summary":"Delete Squad","description":"Deletes the squad identified by its ID.","tags":["Squads"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the squad.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Squad"}}}}}},"patch":{"operationId":"update","summary":"Update Squad","description":"Updates the specified fields of the squad identified by its ID.","tags":["Squads"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the squad.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Squad"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSquadDTO"}}}}}},"/call":{"get":{"operationId":"list","summary":"List Calls","description":"Returns calls for the authenticated organization. Filter results by call ID, assistant ID, phone number ID, or creation and update timestamps.","tags":["Calls"],"parameters":[{"name":"id","in":"query","description":"This is the unique identifier for the call.","required":false,"schema":{"type":"string"}},{"name":"assistantId","in":"query","description":"This will return calls with the specified assistantId.","required":false,"schema":{"type":"string"}},{"name":"phoneNumberId","in":"query","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.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Call"}}}}}}},"post":{"operationId":"create","summary":"Create Call","description":"Creates a call using an assistant or squad. The request can reference saved resources or include transient configurations.","tags":["Calls"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/calls_create_Response_201"}}}},"400":{"description":"Client/policy failure (limits, validation, missing resources)","content":{"application/json":{"schema":{"description":"Any type"}}}},"500":{"description":"System failure (database, queue, or internal infra)","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCallDTO"}}}}}},"/call/{id}":{"get":{"operationId":"get","summary":"Get Call","description":"Returns the call identified by its ID, including its status, configuration, and available call data.","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the call.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Call"}}}}}},"delete":{"operationId":"delete","summary":"Delete Call","description":"Deletes the call identified by its ID.","tags":["Calls"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Call"}}}},"503":{"description":"Failed to erase call recordings; the call was not deleted. Retry the request.","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteCallDTO"}}}}},"patch":{"operationId":"update","summary":"Update Call","description":"Updates the call identified by its ID.","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the call.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Call"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCallDTO"}}}}}},"/call/{id}/mono-recording":{"get":{"operationId":"CallArtifactController_monoRecordingDownload","summary":"Download Call Mono Recording","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_monoRecordingDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/call/{id}/stereo-recording":{"get":{"operationId":"CallArtifactController_stereoRecordingDownload","summary":"Download Call Stereo Recording","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_stereoRecordingDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/call/{id}/video-recording":{"get":{"operationId":"CallArtifactController_videoRecordingDownload","summary":"Download Call Video Recording","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_videoRecordingDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/call/{id}/customer-recording":{"get":{"operationId":"CallArtifactController_customerRecordingDownload","summary":"Download Call Customer Recording","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_customerRecordingDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/call/{id}/assistant-recording":{"get":{"operationId":"CallArtifactController_assistantRecordingDownload","summary":"Download Call Assistant Recording","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_assistantRecordingDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/call/{id}/pcap":{"get":{"operationId":"CallArtifactController_pcapDownload","summary":"Download Call Packet Capture (pcap)","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_pcapDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/call/{id}/call-logs":{"get":{"operationId":"CallArtifactController_callLogsDownload","summary":"Download Call Logs","tags":["Calls"],"parameters":[{"name":"id","in":"path","description":"Call ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Calls_CallArtifactController_callLogsDownload_Response_200"}}}},"401":{"description":"Unauthorized — missing or invalid API token.","content":{"application/json":{"schema":{"description":"Any type"}}}},"404":{"description":"Artifact not found.","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/chat":{"get":{"operationId":"list","summary":"List Chats","tags":["Chats"],"parameters":[{"name":"id","in":"query","description":"This is the unique identifier for the chat to filter by.","required":false,"schema":{"type":"string"}},{"name":"assistantId","in":"query","description":"This is the unique identifier for the assistant that will be used for the chat.","required":false,"schema":{"type":"string"}},{"name":"assistantIdAny","in":"query","description":"Filter by multiple assistant IDs. Provide as comma-separated values.","required":false,"schema":{"type":"string"}},{"name":"squadId","in":"query","description":"This is the unique identifier for the squad that will be used for the chat.","required":false,"schema":{"type":"string"}},{"name":"sessionId","in":"query","description":"This is the unique identifier for the session that will be used for the chat.","required":false,"schema":{"type":"string"}},{"name":"previousChatId","in":"query","description":"This is the unique identifier for the previous chat to filter by.","required":false,"schema":{"type":"string"}},{"name":"idAny","in":"query","description":"Filter by multiple chat IDs. Provide as comma-separated values.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/ChatGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/ChatGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatPaginatedResponse"}}}}}},"post":{"operationId":"create","summary":"Create Chat","description":"Creates a new chat with optional SMS delivery via transport field. Requires at least one of: assistantId/assistant, sessionId, or previousChatId. Note: sessionId and previousChatId are mutually exclusive. Transport field enables SMS delivery with two modes: (1) New conversation - provide transport.phoneNumberId and transport.customer to create a new session, (2) Existing conversation - provide sessionId to use existing session data. Cannot specify both sessionId and transport fields together. The transport.useLLMGeneratedMessageForOutbound flag controls whether input is processed by LLM (true, default) or forwarded directly as SMS (false).","tags":["Chats"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Chat response - either non-streaming chat or streaming","content":{"application/json":{"schema":{"$ref":"#/components/schemas/chats_create_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChatDTO"}}}}}},"/chat/{id}":{"get":{"operationId":"get","summary":"Get Chat","tags":["Chats"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"}}}}}},"delete":{"operationId":"delete","summary":"Delete Chat","tags":["Chats"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"}}}}}}},"/chat/responses":{"post":{"operationId":"createResponse","summary":"Create Chat (OpenAI Compatible)","tags":["Chats"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OpenAI Responses API format - either non-streaming or streaming","content":{"application/json":{"schema":{"$ref":"#/components/schemas/chats_createResponse_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIResponsesRequest"}}}}}},"/campaign":{"get":{"operationId":"CampaignController_findAll","summary":"List Campaigns","description":"Returns outbound calling campaigns for the authenticated organization. Filter results by campaign ID, status, or creation and update timestamps.","tags":["campaigns"],"parameters":[{"name":"id","in":"query","description":"Filters campaigns by ID.","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filters campaigns by status.","required":false,"schema":{"$ref":"#/components/schemas/CampaignGetParametersStatus"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/CampaignGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/CampaignGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignPaginatedResponse"}}}}}},"post":{"operationId":"CampaignController_create","summary":"Create Campaign","description":"Creates an outbound calling campaign that calls a set of customers.","tags":["campaigns"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignDTO"}}}}}},"/v2/campaign":{"get":{"operationId":"CampaignController_findAllV2","summary":"List Campaigns V2","tags":["campaigns"],"parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/V2CampaignGetParametersStatus"}},{"name":"includeCounters","in":"query","description":"When true, every campaign in the response includes `contactCounters` and\n`callMetrics`. These are aggregate queries over contacts and events —\nbatched across the page, so the cost is three queries per request rather\nthan three per campaign, but still opt-in rather than paid for on every\nread. Defaults to false.","required":false,"schema":{"type":"boolean"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/V2CampaignGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/V2CampaignGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignSummaryPaginatedResponse"}}}}}},"post":{"operationId":"CampaignController_createV2","summary":"Create Campaign V2","tags":["campaigns"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignDTO"}}}}}},"/v2/campaign/{id}":{"get":{"operationId":"CampaignController_findOneV2","summary":"Get Campaign V2","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"includeCounters","in":"query","description":"When true, the response includes `contactCounters` and `callMetrics`.\nThese are aggregate queries over the campaign's contacts and events, so\nthey are opt-in rather than paid for on every read. Defaults to false.","required":false,"schema":{"type":"boolean"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignSummary"}}}}}},"delete":{"operationId":"CampaignController_removeV2","summary":"Delete Campaign","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}}},"patch":{"operationId":"CampaignController_updateV2","summary":"Update Campaign","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignDTO"}}}}}},"/campaign/{id}":{"get":{"operationId":"CampaignController_findOne","summary":"Get Campaign","description":"Returns the outbound calling campaign identified by its ID.","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the campaign.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}}},"delete":{"operationId":"CampaignController_remove","summary":"Delete Campaign","description":"Deletes the outbound calling campaign identified by its ID.","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the campaign.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}}},"patch":{"operationId":"CampaignController_update","summary":"Update Campaign","description":"Updates the outbound calling campaign identified by its ID. Campaigns can be ended by updating their status to `ended`.","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the campaign.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignDTO"}}}}}},"/v2/campaign/{id}/contacts":{"get":{"operationId":"CampaignController_getCampaignV2Contacts","summary":"Get Campaign V2 Contacts","tags":["campaigns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","description":"This is the status to filter contacts by. Pass once or multiple times to\nfilter on any of the provided statuses.","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/V2CampaignIdContactsGetParametersStatusSchemaItems"}}},{"name":"limit","in":"query","description":"This is the maximum number of contacts to return. Defaults to 50.","required":false,"schema":{"type":"number","format":"double","minimum":1,"maximum":1000}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to `position` — the order contacts\nwere uploaded, which is also dial order.\n\n`status` sorts by the enum's declaration order rather than alphabetically,\nwhich means it reads as a lifecycle: pending, dispatched, completed,\nfailed, skipped, predial-failed.\n\nOnly columns on `campaign_contact` are sortable. Call-level values such as\ncost or duration live on the call and are attached after this query, so\nsorting by them here would only reorder the current page.","required":false,"schema":{"$ref":"#/components/schemas/V2CampaignIdContactsGetParametersSortBy"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignContactPaginatedResponse"}}}}}}},"/session":{"get":{"operationId":"list","summary":"List Sessions","tags":["Sessions"],"parameters":[{"name":"id","in":"query","description":"This is the unique identifier for the session to filter by.","required":false,"schema":{"type":"string"}},{"name":"name","in":"query","description":"This is the name of the session to filter by.","required":false,"schema":{"type":"string"}},{"name":"assistantId","in":"query","description":"This is the ID of the assistant to filter sessions by.","required":false,"schema":{"type":"string"}},{"name":"assistantIdAny","in":"query","description":"Filter by multiple assistant IDs. Provide as comma-separated values.","required":false,"schema":{"type":"string"}},{"name":"squadId","in":"query","description":"This is the ID of the squad to filter sessions by.","required":false,"schema":{"type":"string"}},{"name":"workflowId","in":"query","description":"This is the ID of the workflow to filter sessions by.","required":false,"schema":{"type":"string"}},{"name":"numberE164CheckEnabled","in":"query","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)","required":false,"schema":{"type":"boolean","default":true}},{"name":"extension","in":"query","description":"This is the extension that will be dialed after the call is answered.","required":false,"schema":{"type":"string","maxLength":10}},{"name":"assistantOverrides","in":"query","description":"These are the overrides for the assistant's settings and template variables specific to this customer.\nThis allows customization of the assistant's behavior for individual customers in batch calls.","required":false,"schema":{"description":"Any type"}},{"name":"squadOverrides","in":"query","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.","required":false,"schema":{"description":"Any type"}},{"name":"number","in":"query","description":"This is the number of the customer.","required":false,"schema":{"type":"string","minLength":3,"maxLength":40}},{"name":"sipUri","in":"query","description":"This is the SIP URI of the customer.","required":false,"schema":{"type":"string"}},{"name":"name","in":"query","description":"This is the name of the customer. This is just for your own reference.\n\nFor SIP inbound calls, this is extracted from the `From` SIP header with format `\"Display Name\" <sip:username@domain>`.","required":false,"schema":{"type":"string","maxLength":40}},{"name":"email","in":"query","description":"This is the email of the customer.","required":false,"schema":{"type":"string","maxLength":40}},{"name":"externalId","in":"query","description":"This is the external ID of the customer.","required":false,"schema":{"type":"string","maxLength":40}},{"name":"customerNumberAny","in":"query","description":"Filter by any of the specified customer phone numbers (comma-separated).","required":false,"schema":{"type":"string"}},{"name":"idAny","in":"query","description":"Filter by multiple session IDs. Provide as comma-separated values.","required":false,"schema":{"type":"string"}},{"name":"phoneNumberId","in":"query","description":"This will return sessions with the specified phoneNumberId.","required":false,"schema":{"type":"string"}},{"name":"phoneNumberIdAny","in":"query","description":"This will return sessions with any of the specified phoneNumberIds.","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/SessionGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/SessionGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionPaginatedResponse"}}}}}},"post":{"operationId":"create","summary":"Create Session","tags":["Sessions"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionDTO"}}}}}},"/session/{id}":{"get":{"operationId":"get","summary":"Get Session","tags":["Sessions"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}}},"delete":{"operationId":"delete","summary":"Delete Session","tags":["Sessions"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}}},"patch":{"operationId":"update","summary":"Update Session","tags":["Sessions"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSessionDTO"}}}}}},"/phone-number":{"get":{"operationId":"list","summary":"List Phone Numbers","description":"Returns phone numbers for the authenticated organization. Filter results by creation or update timestamps and limit the number returned.","tags":["phoneNumbers"],"parameters":[{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberGetResponsesContentApplicationJsonSchemaItems"}}}}}}},"post":{"operationId":"create","summary":"Create Phone Number","description":"Creates a Vapi phone number or imports a phone number from a supported provider, including Twilio, Vonage, Telnyx, or a bring-your-own provider.","tags":["phoneNumbers"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/phoneNumbers_create_Response_201"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/phoneNumbers_create_Request"}}}}}},"/v2/phone-number":{"get":{"operationId":"PhoneNumberController_findAllPaginated","summary":"List Phone Numbers","description":"Returns a paginated list of phone numbers for the authenticated organization. Search by name, number, or SIP URI using a partial, case-insensitive match, and filter by creation or update timestamps.","tags":["phoneNumbers"],"parameters":[{"name":"search","in":"query","description":"This will search phone numbers by name, number, or SIP URI (partial match, case-insensitive).","required":false,"schema":{"type":"string","maxLength":100}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/V2PhoneNumberGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/V2PhoneNumberGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneNumberPaginatedResponse"}}}}}}},"/phone-number/{id}":{"get":{"operationId":"get","summary":"Get Phone Number","description":"Returns the phone number resource identified by its ID.","tags":["phoneNumbers"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the phone number.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/phoneNumbers_get_Response_200"}}}}}},"delete":{"operationId":"delete","summary":"Delete Phone Number","description":"Deletes the phone number resource identified by its ID.","tags":["phoneNumbers"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the phone number.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/phoneNumbers_delete_Response_200"}}}}}},"patch":{"operationId":"update","summary":"Update Phone Number","description":"Updates the specified fields of the phone number resource identified by its ID.","tags":["phoneNumbers"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the phone number.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/phoneNumbers_update_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/phoneNumbers_update_Request"}}}}}},"/tool":{"get":{"operationId":"list","summary":"List Tools","description":"Returns reusable tools for the authenticated organization. Filter results by creation or update timestamps and limit the number returned.","tags":["Tools"],"parameters":[{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ToolGetResponsesContentApplicationJsonSchemaItems"}}}}}}},"post":{"operationId":"create","summary":"Create Tool","description":"Creates a reusable tool that assistants can invoke during conversations.","tags":["Tools"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools_create_Response_201"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools_create_Request"}}}}}},"/tool/{id}":{"get":{"operationId":"get","summary":"Get Tool","description":"Returns the tool identified by its ID.","tags":["Tools"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the tool.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools_get_Response_200"}}}}}},"delete":{"operationId":"delete","summary":"Delete Tool","description":"Deletes the tool identified by its ID.","tags":["Tools"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the tool.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools_delete_Response_200"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolPinnedConflictResponseDTO"}}}}}},"patch":{"operationId":"update","summary":"Update Tool","description":"Updates the specified fields of the tool identified by its ID.","tags":["Tools"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the tool.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools_update_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/tools_update_Request"}}}}}},"/file":{"get":{"operationId":"list","summary":"List Files","description":"Returns files uploaded to the authenticated organization.","tags":["Files"],"parameters":[{"name":"purpose","in":"query","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/File"}}}}}}},"post":{"operationId":"create","summary":"Upload File","description":"Uploads a file for use with a Vapi knowledge base.","tags":["Files"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"File uploaded successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}}},"400":{"description":"Invalid file","content":{"application/json":{"schema":{"description":"Any type"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"The file to upload."},"purpose":{"$ref":"#/components/schemas/FilePostRequestBodyContentMultipartFormDataSchemaPurpose","description":"Optional product flow that owns the uploaded file."},"metadata":{"type":"string","maxLength":4096,"description":"Optional JSON-encoded metadata for multipart uploads."}},"required":["file"]}}}}}},"/file/{id}":{"get":{"operationId":"get","summary":"Get File","description":"Returns the uploaded file identified by its ID.","tags":["Files"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the file.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}}}}},"delete":{"operationId":"delete","summary":"Delete File","description":"Deletes the uploaded file identified by its ID.","tags":["Files"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the file.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}}}}},"patch":{"operationId":"update","summary":"Update File","description":"Updates the name of the uploaded file identified by its ID.","tags":["Files"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the file.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFileDTO"}}}}}},"/v2/knowledge-base":{"get":{"operationId":"KnowledgeBaseV2Controller_findAll","summary":"List Knowledge Bases V2","tags":["knowledgeBasesV2"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBaseV2"}}}}}}},"post":{"operationId":"KnowledgeBaseV2Controller_create","summary":"Create a Knowledge Base V2","tags":["knowledgeBasesV2"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKnowledgeBaseV2DTO"}}}}}},"/v2/knowledge-base/{id}/file":{"get":{"operationId":"KnowledgeBaseV2Controller_filesGet","summary":"List files in a Knowledge Base V2","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBaseV2File"}}}}}}},"post":{"operationId":"KnowledgeBaseV2Controller_fileAttach","summary":"Attach and ingest a file","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2File"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachKnowledgeBaseV2FileDTO"}}}}}},"/v2/knowledge-base/{id}/file/{fileId}":{"delete":{"operationId":"KnowledgeBaseV2Controller_fileDetach","summary":"Detach a file","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"fileId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2File"}}}}}}},"/v2/knowledge-base/{id}/file/{fileId}/retry":{"post":{"operationId":"KnowledgeBaseV2Controller_fileRetry","summary":"Retry indexing a failed file","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"fileId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2File"}}}}}}},"/v2/knowledge-base/{id}":{"get":{"operationId":"KnowledgeBaseV2Controller_findOne","summary":"Get a Knowledge Base V2","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2WithFiles"}}}}}},"delete":{"operationId":"KnowledgeBaseV2Controller_remove","summary":"Delete a Knowledge Base V2","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2"}}}}}},"patch":{"operationId":"KnowledgeBaseV2Controller_update","summary":"Update a Knowledge Base V2","tags":["knowledgeBasesV2"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseV2"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKnowledgeBaseV2DTO"}}}}}},"/structured-output":{"get":{"operationId":"StructuredOutputController_findAll","summary":"List Structured Outputs","description":"Returns structured-output definitions for the authenticated organization. Filter results by ID, name, or creation and update timestamps.","tags":["structuredOutputs"],"parameters":[{"name":"id","in":"query","description":"This will return structured outputs where the id matches the specified value.","required":false,"schema":{"type":"string"}},{"name":"name","in":"query","description":"This will return structured outputs where the name matches the specified value.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/StructuredOutputGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/StructuredOutputGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredOutputPaginatedResponse"}}}}}},"post":{"operationId":"StructuredOutputController_create","summary":"Create Structured Output","description":"Creates a reusable definition for extracting validated data from conversations using an AI model or regular expression.","tags":["structuredOutputs"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredOutput"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStructuredOutputDTO"}}}}}},"/structured-output/{id}":{"get":{"operationId":"StructuredOutputController_findOne","summary":"Get Structured Output","description":"Returns the structured-output definition identified by its ID.","tags":["structuredOutputs"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the structured output.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredOutput"}}}}}},"delete":{"operationId":"StructuredOutputController_remove","summary":"Delete Structured Output","description":"Deletes the structured-output definition identified by its ID.","tags":["structuredOutputs"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the structured output.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredOutput"}}}}}},"patch":{"operationId":"StructuredOutputController_update","summary":"Update Structured Output","description":"Updates the structured-output definition identified by its ID.","tags":["structuredOutputs"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the structured output.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"schemaOverride","in":"query","description":"Set to the string `true` to allow changing the schema's top-level type. Other values do not enable schema type changes.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredOutput"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStructuredOutputDTO"}}}}}},"/structured-output/run":{"post":{"operationId":"StructuredOutputController_run","summary":"Run Structured Output","description":"Runs a saved or transient structured-output definition against one or more calls, optionally returning a preview without updating call artifacts.","tags":["structuredOutputs"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Structured Outputs_StructuredOutputController_run_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredOutputRunDTO"}}}}}},"/eval/simulation/personality":{"get":{"operationId":"PersonalityController_findAll","summary":"List Personalities","description":"Returns the personalities for the authenticated organization.","tags":["simulationPersonalities"],"parameters":[{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationPersonalityGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationPersonalityGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Personality"}}}}}}},"post":{"operationId":"PersonalityController_create","summary":"Create Personality","description":"Creates a personality, the AI tester's configuration used in simulations.","tags":["simulationPersonalities"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Personality"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePersonalityDTO"}}}}}},"/eval/simulation/personality/{id}":{"get":{"operationId":"PersonalityController_findOne","summary":"Get Personality","description":"Returns the specified personality.","tags":["simulationPersonalities"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the personality.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Personality"}}}}}},"delete":{"operationId":"PersonalityController_remove","summary":"Delete Personality","description":"Deletes the specified personality.","tags":["simulationPersonalities"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the personality.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Personality"}}}}}},"patch":{"operationId":"PersonalityController_update","summary":"Update Personality","description":"Updates the specified personality. Changes apply to future runs.","tags":["simulationPersonalities"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the personality.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Personality"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePersonalityDTO"}}}}}},"/eval/simulation/scenario":{"get":{"operationId":"ScenarioController_findAll","summary":"List Scenarios","description":"Returns the scenarios for the authenticated organization.","tags":["simulationScenarios"],"parameters":[{"name":"idAny","in":"query","description":"Return only scenarios matching the provided ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"name","in":"query","description":"Search by scenario name","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationScenarioGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationScenarioGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Scenario"}}}}}}},"post":{"operationId":"ScenarioController_create","summary":"Create Scenario","description":"Creates a scenario, the AI tester's intent plus the success criteria that score a run.","tags":["simulationScenarios"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScenarioDTO"}}}}}},"/eval/simulation/scenario/{id}":{"get":{"operationId":"ScenarioController_findOne","summary":"Get Scenario","description":"Returns the specified scenario.","tags":["simulationScenarios"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the scenario.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}}}},"delete":{"operationId":"ScenarioController_remove","summary":"Delete Scenario","description":"Deletes the specified scenario.","tags":["simulationScenarios"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the scenario.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}}}},"patch":{"operationId":"ScenarioController_update","summary":"Update Scenario","description":"Updates the specified scenario.","tags":["simulationScenarios"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the scenario.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScenarioDTO"}}}}}},"/eval/simulation/run":{"get":{"operationId":"SimulationRunController_findAll","summary":"List Simulation Runs","description":"Returns the simulation runs for the authenticated organization.","tags":["simulationRuns"],"parameters":[{"name":"status","in":"query","description":"Filter by status","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunGetParametersStatus"}},{"name":"filterStatus","in":"query","description":"Filter by aggregate run result status","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunGetParametersFilterStatus"}},{"name":"targetType","in":"query","description":"Filter by target type","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunGetParametersTargetType"}},{"name":"targetId","in":"query","description":"Filter by target id","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation Runs_SimulationRunController_findAll_Response_200"}}}}}},"post":{"operationId":"SimulationRunController_create","summary":"Create Simulation Run","description":"Starts a simulation run against a target assistant or squad.","tags":["simulationRuns"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSimulationRunResponse"}}}},"402":{"description":"The organization is not eligible to start this run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRunPaymentRequiredResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSimulationRunDTO"}}}}}},"/eval/simulation/run/{id}":{"get":{"operationId":"SimulationRunController_findOne","summary":"Get Simulation Run","description":"Returns the specified simulation run, including its status and item counts.","tags":["simulationRuns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation run.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRun"}}}}}},"patch":{"operationId":"SimulationRunController_cancelGroup","summary":"Cancel Simulation Run","description":"Cancels the specified simulation run.","tags":["simulationRuns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation run.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRun"}}}}}}},"/eval/simulation/run/{id}/item":{"get":{"operationId":"SimulationRunController_findItems","summary":"List Simulation Run Items","description":"Returns the run items for the specified simulation run.","tags":["simulationRuns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation run.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"simulationId","in":"query","description":"Filters run items to a specific simulation.","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"runId","in":"query","description":"Filters run items to a specific run.","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","description":"Filters run items by status.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunIdItemGetParametersStatus"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunIdItemGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationRunIdItemGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunItem"}}}}}}}},"/eval/simulation/run/{id}/item/{itemId}":{"get":{"operationId":"SimulationRunController_findItem","summary":"Get Simulation Run Item","description":"Returns the specified run item, including its evaluation results and the ID of the call that ran it.","tags":["simulationRuns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation run.","required":true,"schema":{"type":"string"}},{"name":"itemId","in":"path","description":"The unique identifier of the run item.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRunItem"}}}}}},"patch":{"operationId":"SimulationRunController_cancelItem","summary":"Cancel Simulation Run Item","description":"Cancels the specified run item.","tags":["simulationRuns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation run.","required":true,"schema":{"type":"string"}},{"name":"itemId","in":"path","description":"The unique identifier of the run item.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationRunItem"}}}}}}},"/eval/simulation/run/{id}/item/{itemId}/generate":{"post":{"operationId":"SimulationRunController_generateSuggestions","summary":"Generate Improvement Suggestions","description":"Generates AI suggestions for improving the assistant or squad's system prompt, tools, and scenarios, based on the specified run item.","tags":["simulationRuns"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation run.","required":true,"schema":{"type":"string"}},{"name":"itemId","in":"path","description":"The unique identifier of the run item.","required":true,"schema":{"type":"string"}},{"name":"force","in":"query","description":"Set to the string `true` to regenerate improvement suggestions even if they already exist.","required":true,"schema":{"type":"string"}},{"name":"persist","in":"query","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation Runs_SimulationRunController_generateSuggestions_Response_201"}}}}}}},"/eval/simulation/suite":{"get":{"operationId":"SimulationSuiteController_findAll","summary":"List Simulation Suites","description":"Returns the simulation suites for the authenticated organization.","tags":["simulationSuites"],"parameters":[{"name":"name","in":"query","description":"Search by simulation suite name","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationSuiteGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationSuiteGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SimulationSuite"}}}}}}},"post":{"operationId":"SimulationSuiteController_create","summary":"Create Simulation Suite","description":"Creates a simulation suite, a group of simulations that run together.","tags":["simulationSuites"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationSuite"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSimulationSuiteDTO"}}}}}},"/eval/simulation/suite/{id}":{"get":{"operationId":"SimulationSuiteController_findOne","summary":"Get Simulation Suite","description":"Returns the specified simulation suite.","tags":["simulationSuites"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation suite.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationSuite"}}}}}},"delete":{"operationId":"SimulationSuiteController_remove","summary":"Delete Simulation Suite","description":"Deletes the specified simulation suite.","tags":["simulationSuites"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation suite.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationSuite"}}}}}},"patch":{"operationId":"SimulationSuiteController_update","summary":"Update Simulation Suite","description":"Updates the specified simulation suite.","tags":["simulationSuites"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation suite.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationSuite"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSimulationSuiteDTO"}}}}}},"/eval/simulation/scenario/generate":{"post":{"operationId":"SimulationGenerateController_generate","summary":"Generate Scenarios with AI","description":"Generates scenarios for an assistant or squad by analyzing its configuration with AI.","tags":["simulations"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateScenariosResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateScenariosDTO"}}}}}},"/eval/simulation":{"get":{"operationId":"SimulationController_findAll","summary":"List Simulations","description":"Returns the simulations for the authenticated organization.","tags":["simulations"],"parameters":[{"name":"idAny","in":"query","description":"Return only simulations matching the provided ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"standaloneOnly","in":"query","description":"Only include simulations that are not part of a suite","required":false,"schema":{"type":"boolean"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalSimulationGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Simulation"}}}}}}},"post":{"operationId":"SimulationController_create","summary":"Create Simulation","description":"Creates a simulation by pairing a scenario with a personality.","tags":["simulations"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSimulationDTO"}}}}}},"/eval/simulation/{id}":{"get":{"operationId":"SimulationController_findOne","summary":"Get Simulation","description":"Returns the specified simulation.","tags":["simulations"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation"}}}}}},"delete":{"operationId":"SimulationController_remove","summary":"Delete Simulation","description":"Deletes the specified simulation.","tags":["simulations"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation"}}}}}},"patch":{"operationId":"SimulationController_update","summary":"Update Simulation","description":"Updates the specified simulation.","tags":["simulations"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the simulation.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSimulationDTO"}}}}}},"/eval/simulation/concurrency":{"get":{"operationId":"SimulationController_getConcurrency","summary":"Get Simulation Concurrency","description":"Returns the organization's simulation concurrency limit, the number of active simulations, and how many more can start.","tags":["simulations"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulationConcurrencyResponse"}}}}}}},"/reporting/insight":{"get":{"operationId":"InsightController_findAll","summary":"Get Insights","description":"Returns saved reporting insights for the authenticated organization. Filter results by ID or creation and update timestamps.","tags":["insight"],"parameters":[{"name":"id","in":"query","description":"Filters reporting insights by ID.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/ReportingInsightGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/ReportingInsightGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightPaginatedResponse"}}}}}},"post":{"operationId":"InsightController_create","summary":"Create Insight","description":"Creates a saved reporting insight that queries call data and presents the results as a bar chart, pie chart, line chart, or text value.","tags":["insight"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_create_Response_201"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_create_Request"}}}}}},"/reporting/insight/{id}":{"get":{"operationId":"InsightController_findOne","summary":"Get Insight","description":"Returns the reporting insight identified by its ID.","tags":["insight"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the reporting insight.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_findOne_Response_200"}}}}}},"delete":{"operationId":"InsightController_remove","summary":"Delete Insight","description":"Deletes the reporting insight identified by its ID.","tags":["insight"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the reporting insight.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_remove_Response_200"}}}}}},"patch":{"operationId":"InsightController_update","summary":"Update Insight","description":"Updates the reporting insight identified by its ID.","tags":["insight"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the reporting insight.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_update_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_update_Request"}}}}}},"/reporting/insight/{id}/run":{"post":{"operationId":"InsightController_run","summary":"Run Insight","description":"Runs a saved reporting insight, optionally overriding its time range and response format.","tags":["insight"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the reporting insight.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightRunDTO"}}}}}},"/reporting/insight/preview":{"post":{"operationId":"InsightController_preview","summary":"Preview Insight","description":"Runs an insight definition without first saving it, returning a preview of the resulting chart or text value.","tags":["insight"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightRunResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insight_InsightController_preview_Request"}}}}}},"/reporting/board":{"get":{"operationId":"BoardController_findAll","summary":"Get Boards","tags":["board"],"parameters":[{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/ReportingBoardGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/ReportingBoardGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardPaginatedResponse"}}}}}},"post":{"operationId":"BoardController_create","summary":"Create Board","tags":["board"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBoardDTO"}}}}}},"/reporting/board/default/metrics-overview":{"get":{"operationId":"BoardController_metricsOverviewEnsure","summary":"Get Default Metrics Overview Board","tags":["board"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board"}}}}}}},"/reporting/board/{id}":{"get":{"operationId":"BoardController_findOne","summary":"Get Board","tags":["board"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board"}}}}}},"delete":{"operationId":"BoardController_remove","summary":"Delete Board","tags":["board"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board"}}}}}},"patch":{"operationId":"BoardController_update","summary":"Update Board","tags":["board"],"parameters":[{"name":"id","in":"path","description":"The unique identifier for the resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBoardDTO"}}}}}},"/eval":{"get":{"operationId":"EvalController_getPaginated","summary":"List Evals","description":"Returns eval definitions for the authenticated organization. Filter results by ID or creation and update timestamps.","tags":["eval"],"parameters":[{"name":"id","in":"query","description":"Filters eval definitions by ID.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalPaginatedResponse"}}}}}},"post":{"operationId":"EvalController_create","summary":"Create Eval","description":"Creates a reusable eval that defines a mock conversation and checkpoints for evaluating assistant responses and tool calls.","tags":["eval"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Eval"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEvalDTO"}}}}}},"/eval/{id}":{"get":{"operationId":"EvalController_get","summary":"Get Eval","description":"Returns the eval definition identified by its ID.","tags":["eval"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the eval definition.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Eval"}}}}}},"delete":{"operationId":"EvalController_remove","summary":"Delete Eval","description":"Deletes the eval definition identified by its ID.","tags":["eval"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the eval definition.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Eval"}}}}}},"patch":{"operationId":"EvalController_update","summary":"Update Eval","description":"Updates the eval definition identified by its ID.","tags":["eval"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the eval definition.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Eval"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEvalDTO"}}}}}},"/eval/run/{id}":{"get":{"operationId":"EvalController_getRun","summary":"Get Eval Run","description":"Returns the eval run identified by its ID.","tags":["eval"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the eval run.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalRun"}}}}}},"delete":{"operationId":"EvalController_removeRun","summary":"Delete Eval Run","description":"Deletes the eval run identified by its ID.","tags":["eval"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the eval run.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalRun"}}}}}}},"/eval/run":{"get":{"operationId":"EvalController_getRunsPaginated","summary":"List Eval Runs","description":"Returns eval runs for the authenticated organization. Filter results by ID or creation and update timestamps.","tags":["eval"],"parameters":[{"name":"id","in":"query","description":"Filters eval runs by ID.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/EvalRunGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/EvalRunGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalRunPaginatedResponse"}}}}}},"post":{"operationId":"EvalController_run","summary":"Create Eval Run","description":"Runs a saved or transient eval against an assistant or squad and creates an eval-run record containing the results.","tags":["eval"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Eval_EvalController_run_Response_200"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEvalRunDTO"}}}}}},"/observability/scorecard/{id}":{"get":{"operationId":"ScorecardController_get","summary":"Get Scorecard","description":"Returns the scorecard identified by its ID.","tags":["observabilityScorecard"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the scorecard.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scorecard"}}}}}},"delete":{"operationId":"ScorecardController_remove","summary":"Delete Scorecard","description":"Deletes the scorecard identified by its ID.","tags":["observabilityScorecard"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the scorecard.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scorecard"}}}}}},"patch":{"operationId":"ScorecardController_update","summary":"Update Scorecard","description":"Updates the scorecard identified by its ID.","tags":["observabilityScorecard"],"parameters":[{"name":"id","in":"path","description":"The unique identifier of the scorecard.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scorecard"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScorecardDTO"}}}}}},"/observability/scorecard":{"get":{"operationId":"ScorecardController_getPaginated","summary":"List Scorecards","description":"Returns scorecards for the authenticated organization. Filter results by ID or creation and update timestamps.","tags":["observabilityScorecard"],"parameters":[{"name":"id","in":"query","description":"Filters scorecards by ID.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/ObservabilityScorecardGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/ObservabilityScorecardGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScorecardPaginatedResponse"}}}}}},"post":{"operationId":"ScorecardController_create","summary":"Create Scorecard","description":"Creates a scorecard containing metrics, scoring conditions, and optional links to assistants whose calls should be evaluated.","tags":["observabilityScorecard"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scorecard"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScorecardDTO"}}}}}},"/provider/{provider}/{resourceName}":{"get":{"operationId":"ProviderResourceController_getProviderResourcesPaginated","summary":"List Provider Resources","description":"Returns a paginated list of provider resources for the authenticated organization. Filter pronunciation dictionaries by provider, resource ID, or creation and update timestamps.","tags":["providerResources"],"parameters":[{"name":"provider","in":"path","description":"The provider (e.g., 11labs)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameGetParametersProvider"}},{"name":"resourceName","in":"path","description":"The resource name (e.g., pronunciation-dictionary)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameGetParametersResourceName"}},{"name":"id","in":"query","description":"Filters provider resources by their resource ID.","required":false,"schema":{"type":"string"}},{"name":"resourceId","in":"query","description":"Filters provider resources by their provider-specific resource ID.","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"This is the page number to return. Defaults to 1.","required":false,"schema":{"type":"number","format":"double","minimum":1}},{"name":"sortOrder","in":"query","description":"This is the sort order for pagination. Defaults to 'DESC'.","required":false,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameGetParametersSortOrder"}},{"name":"sortBy","in":"query","description":"This is the column to sort by. Defaults to 'createdAt'.","required":false,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameGetParametersSortBy"}},{"name":"limit","in":"query","description":"This is the maximum number of items to return. Defaults to 100.","required":false,"schema":{"type":"number","format":"double","minimum":0,"maximum":1000}},{"name":"createdAtGt","in":"query","description":"This will return items where the createdAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLt","in":"query","description":"This will return items where the createdAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtGe","in":"query","description":"This will return items where the createdAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdAtLe","in":"query","description":"This will return items where the createdAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGt","in":"query","description":"This will return items where the updatedAt is greater than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLt","in":"query","description":"This will return items where the updatedAt is less than the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtGe","in":"query","description":"This will return items where the updatedAt is greater than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"updatedAtLe","in":"query","description":"This will return items where the updatedAt is less than or equal to the specified value.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of provider resources","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderResourcePaginatedResponse"}}}}}},"post":{"operationId":"ProviderResourceController_createProviderResource","summary":"Create Provider Resource","description":"Creates a pronunciation-dictionary resource for a supported provider, currently Cartesia or ElevenLabs.","tags":["providerResources"],"parameters":[{"name":"provider","in":"path","description":"The provider (e.g., 11labs)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNamePostParametersProvider"}},{"name":"resourceName","in":"path","description":"The resource name (e.g., pronunciation-dictionary)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNamePostParametersResourceName"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Successfully created provider resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderResource"}}}}}}},"/provider/{provider}/{resourceName}/{id}":{"get":{"operationId":"ProviderResourceController_getProviderResource","summary":"Get Provider Resource","description":"Returns the provider resource identified by its Vapi resource ID.","tags":["providerResources"],"parameters":[{"name":"provider","in":"path","description":"The provider (e.g., 11labs)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameIdGetParametersProvider"}},{"name":"resourceName","in":"path","description":"The resource name (e.g., pronunciation-dictionary)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameIdGetParametersResourceName"}},{"name":"id","in":"path","description":"The unique identifier of the provider resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully retrieved provider resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderResource"}}}},"404":{"description":"Provider resource not found","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"delete":{"operationId":"ProviderResourceController_deleteProviderResource","summary":"Delete Provider Resource","description":"Deletes the provider resource identified by its Vapi resource ID.","tags":["providerResources"],"parameters":[{"name":"provider","in":"path","description":"The provider (e.g., 11labs)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameIdDeleteParametersProvider"}},{"name":"resourceName","in":"path","description":"The resource name (e.g., pronunciation-dictionary)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameIdDeleteParametersResourceName"}},{"name":"id","in":"path","description":"The unique identifier of the provider resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderResource"}}}},"404":{"description":"Provider resource not found","content":{"application/json":{"schema":{"description":"Any type"}}}}}},"patch":{"operationId":"ProviderResourceController_updateProviderResource","summary":"Update Provider Resource","description":"Updates the provider resource identified by its Vapi resource ID.","tags":["providerResources"],"parameters":[{"name":"provider","in":"path","description":"The provider (e.g., 11labs)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameIdPatchParametersProvider"}},{"name":"resourceName","in":"path","description":"The resource name (e.g., pronunciation-dictionary)","required":true,"schema":{"$ref":"#/components/schemas/ProviderProviderResourceNameIdPatchParametersResourceName"}},{"name":"id","in":"path","description":"The unique identifier of the provider resource.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderResource"}}}},"404":{"description":"Provider resource not found","content":{"application/json":{"schema":{"description":"Any type"}}}}}}},"/analytics":{"post":{"operationId":"get","summary":"Create Analytics Queries","description":"Runs one or more metric queries against call or subscription data using the requested time range, groupings, and aggregate operations.","tags":["Analytics"],"parameters":[{"name":"Authorization","in":"header","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnalyticsQueryResult"}}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsQueryDTO"}}}}}}},"servers":[{"url":"https://api.vapi.ai","description":"https://api.vapi.ai"}],"components":{"schemas":{"AssemblyAiTranscriberProvider":{"type":"string","enum":["assembly-ai"],"description":"This is the transcription provider that will be used.","title":"AssemblyAiTranscriberProvider"},"AssemblyAiTranscriberLanguage":{"type":"string","enum":["multi","en"],"description":"This is the language that will be set for the transcription.","title":"AssemblyAiTranscriberLanguage"},"AssemblyAiTranscriberMode":{"type":"string","enum":["max_accuracy","min_latency","balanced"],"description":"This is the transcription mode used by the `universal-3-5-pro` speech model. Only applies to the `universal-3-5-pro` speech model.\n\n@default 'balanced'","title":"AssemblyAiTranscriberMode"},"AssemblyAiTranscriberLanguageCodes":{"type":"string","enum":["en","es","fr","de","it","pt","tr","nl","sv","no","da","fi","hi","vi","ar","he","ja","zh"],"description":"These are language codes used to steer automatic language detection. Only applies to the `universal-3-5-pro` speech model.","title":"AssemblyAiTranscriberLanguageCodes"},"AssemblyAiTranscriberSpeechModel":{"type":"string","enum":["universal-streaming-english","universal-streaming-multilingual","universal-3-5-pro"],"description":"This is the speech model used for the streaming session.\nKeyterms prompting is supported on universal-streaming-english and universal-3-5-pro.\nuniversal-3-5-pro is AssemblyAI's most accurate voice-agent model.\n@default 'universal-streaming-english'","title":"AssemblyAiTranscriberSpeechModel"},"FallbackAssemblyAiTranscriberProvider":{"type":"string","enum":["assembly-ai"],"description":"This is the transcription provider that will be used.","title":"FallbackAssemblyAiTranscriberProvider"},"FallbackAssemblyAiTranscriberLanguage":{"type":"string","enum":["multi","en"],"description":"This is the language that will be set for the transcription.","title":"FallbackAssemblyAiTranscriberLanguage"},"FallbackAssemblyAiTranscriberMode":{"type":"string","enum":["max_accuracy","min_latency","balanced"],"description":"This is the transcription mode used by the `universal-3-5-pro` speech model. Only applies to the `universal-3-5-pro` speech model.\n\n@default 'balanced'","title":"FallbackAssemblyAiTranscriberMode"},"FallbackAssemblyAiTranscriberLanguageCodes":{"type":"string","enum":["en","es","fr","de","it","pt","tr","nl","sv","no","da","fi","hi","vi","ar","he","ja","zh"],"description":"These are language codes used to steer automatic language detection. Only applies to the `universal-3-5-pro` speech model.","title":"FallbackAssemblyAiTranscriberLanguageCodes"},"FallbackAssemblyAiTranscriberSpeechModel":{"type":"string","enum":["universal-streaming-english","universal-streaming-multilingual","universal-3-5-pro"],"description":"This is the speech model used for the streaming session.\nKeyterms prompting is supported on universal-streaming-english and universal-3-5-pro.\nuniversal-3-5-pro is AssemblyAI's most accurate voice-agent model.\n@default 'universal-streaming-english'","title":"FallbackAssemblyAiTranscriberSpeechModel"},"FallbackAssemblyAITranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackAssemblyAiTranscriberProvider","description":"This is the transcription provider that will be used."},"language":{"$ref":"#/components/schemas/FallbackAssemblyAiTranscriberLanguage","description":"This is the language that will be set for the transcription."},"confidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Transcripts below this confidence threshold will be discarded.\n\n@default 0.4"},"formatTurns":{"type":"boolean","description":"This enables formatting of transcripts.\n\n@default true"},"endOfTurnConfidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"This is the end of turn confidence threshold. The minimum confidence that the end of turn is detected.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@min 0\n@max 1\n@default 0.7"},"minEndOfTurnSilenceWhenConfident":{"type":"number","format":"double","minimum":0,"description":"This is the minimum end of turn silence when confident in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 160"},"wordFinalizationMaxWaitTime":{"type":"number","format":"double","minimum":0,"deprecated":true},"maxTurnSilence":{"type":"number","format":"double","minimum":0,"description":"This is the maximum turn silence time in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 400"},"vadAssistedEndpointingEnabled":{"type":"boolean","description":"Use VAD to assist with endpointing decisions from the transcriber.\nWhen enabled, transcriber endpointing will be buffered if VAD detects the user is still speaking, preventing premature turn-taking.\nWhen disabled, transcriber endpointing will be used immediately regardless of VAD state, allowing for quicker but more aggressive turn-taking.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n\n@default true"},"mode":{"$ref":"#/components/schemas/FallbackAssemblyAiTranscriberMode","description":"This is the transcription mode used by the `universal-3-5-pro` speech model. Only applies to the `universal-3-5-pro` speech model.\n\n@default 'balanced'"},"prompt":{"type":"string","maxLength":1750,"description":"This is a prompt that provides additional context to the transcription model. Only applies to the `universal-3-5-pro` speech model."},"agentContext":{"type":"string","maxLength":1750,"description":"This is context about the voice agent that guides the transcription model. Only applies to the `universal-3-5-pro` speech model."},"languageCodes":{"$ref":"#/components/schemas/FallbackAssemblyAiTranscriberLanguageCodes","description":"These are language codes used to steer automatic language detection. Only applies to the `universal-3-5-pro` speech model."},"speechModel":{"$ref":"#/components/schemas/FallbackAssemblyAiTranscriberSpeechModel","description":"This is the speech model used for the streaming session.\nKeyterms prompting is supported on universal-streaming-english and universal-3-5-pro.\nuniversal-3-5-pro is AssemblyAI's most accurate voice-agent model.\n@default 'universal-streaming-english'"},"realtimeUrl":{"type":"string","description":"The WebSocket URL that the transcriber connects to."},"wordBoost":{"type":"array","items":{"type":"string","maxLength":2500},"description":"Add up to 2500 characters of custom vocabulary."},"keytermsPrompt":{"type":"array","items":{"type":"string","maxLength":50},"description":"Keyterms prompting improves recognition accuracy for specific words and phrases.\nCan include up to 100 keyterms, each up to 50 characters.\nCosts an additional $0.04/hour on universal-streaming-english and is included at no extra cost on universal-3-5-pro."},"endUtteranceSilenceThreshold":{"type":"number","format":"double","description":"The duration of the end utterance silence threshold in milliseconds."},"disablePartialTranscripts":{"type":"boolean","description":"Disable partial transcripts.\nSet to `true` to not receive partial transcripts. Defaults to `false`."}},"required":["provider"],"description":"Fallback configuration for transcribing speech with AssemblyAI, including language, streaming model, endpointing, and vocabulary.","title":"FallbackAssemblyAITranscriber"},"FallbackAzureSpeechTranscriberProvider":{"type":"string","enum":["azure"],"description":"This is the transcription provider that will be used.","title":"FallbackAzureSpeechTranscriberProvider"},"FallbackAzureSpeechTranscriberLanguage":{"type":"string","enum":["af-ZA","am-ET","ar-AE","ar-BH","ar-DZ","ar-EG","ar-IL","ar-IQ","ar-JO","ar-KW","ar-LB","ar-LY","ar-MA","ar-OM","ar-PS","ar-QA","ar-SA","ar-SY","ar-TN","ar-YE","az-AZ","bg-BG","bn-IN","bs-BA","ca-ES","cs-CZ","cy-GB","da-DK","de-AT","de-CH","de-DE","el-GR","en-AU","en-CA","en-GB","en-GH","en-HK","en-IE","en-IN","en-KE","en-NG","en-NZ","en-PH","en-SG","en-TZ","en-US","en-ZA","es-AR","es-BO","es-CL","es-CO","es-CR","es-CU","es-DO","es-EC","es-ES","es-GQ","es-GT","es-HN","es-MX","es-NI","es-PA","es-PE","es-PR","es-PY","es-SV","es-US","es-UY","es-VE","et-EE","eu-ES","fa-IR","fi-FI","fil-PH","fr-BE","fr-CA","fr-CH","fr-FR","ga-IE","gl-ES","gu-IN","he-IL","hi-IN","hr-HR","hu-HU","hy-AM","id-ID","is-IS","it-CH","it-IT","ja-JP","jv-ID","ka-GE","kk-KZ","km-KH","kn-IN","ko-KR","lo-LA","lt-LT","lv-LV","mk-MK","ml-IN","mn-MN","mr-IN","ms-MY","mt-MT","my-MM","nb-NO","ne-NP","nl-BE","nl-NL","pa-IN","pl-PL","ps-AF","pt-BR","pt-PT","ro-RO","ru-RU","si-LK","sk-SK","sl-SI","so-SO","sq-AL","sr-RS","sv-SE","sw-KE","sw-TZ","ta-IN","te-IN","th-TH","tr-TR","uk-UA","ur-IN","uz-UZ","vi-VN","wuu-CN","yue-CN","zh-CN","zh-CN-shandong","zh-CN-sichuan","zh-HK","zh-TW","zu-ZA"],"description":"This is the language that will be set for the transcription. The list of languages Azure supports can be found here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt","title":"FallbackAzureSpeechTranscriberLanguage"},"FallbackAzureSpeechTranscriberSegmentationStrategy":{"type":"string","enum":["Default","Time","Semantic"],"description":"Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced semantic segmentation.","title":"FallbackAzureSpeechTranscriberSegmentationStrategy"},"FallbackAzureSpeechTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackAzureSpeechTranscriberProvider","description":"This is the transcription provider that will be used."},"language":{"$ref":"#/components/schemas/FallbackAzureSpeechTranscriberLanguage","description":"This is the language that will be set for the transcription. The list of languages Azure supports can be found here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt"},"segmentationStrategy":{"$ref":"#/components/schemas/FallbackAzureSpeechTranscriberSegmentationStrategy","description":"Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced semantic segmentation."},"segmentationSilenceTimeoutMs":{"type":"number","format":"double","minimum":100,"maximum":5000,"description":"Duration of detected silence after which the service finalizes a phrase. Configure to adjust sensitivity to pauses in speech."},"segmentationMaximumTimeMs":{"type":"number","format":"double","minimum":20000,"maximum":70000,"description":"Maximum duration a segment can reach before being cut off when using time-based segmentation."}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Azure Speech, including language and segmentation.","title":"FallbackAzureSpeechTranscriber"},"FallbackCustomTranscriberProvider":{"type":"string","enum":["custom-transcriber"],"description":"This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not natively supported.","title":"FallbackCustomTranscriberProvider"},"ServerHeaders":{"type":"object","properties":{},"description":"These are the headers to include in the request.\n\nEach key-value pair represents a header name and its value.\n\nNote: Specifying an Authorization header here will override the authorization provided by the `credentialId` (if provided). This is an anti-pattern and should be avoided outside of edge case scenarios.","title":"ServerHeaders"},"BackoffPlanType":{"type":"string","enum":["fixed","exponential"],"description":"This is the type of backoff plan to use. Defaults to fixed.\n\n@default fixed","title":"BackoffPlanType"},"BackoffPlanExcludedStatusCodesItems":{"type":"object","properties":{},"title":"BackoffPlanExcludedStatusCodesItems"},"BackoffPlan":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BackoffPlanType","description":"This is the type of backoff plan to use. Defaults to fixed.\n\n@default fixed"},"maxRetries":{"type":"number","format":"double","minimum":0,"maximum":10,"description":"This is the maximum number of retries to attempt if the request fails. Defaults to 0 (no retries).\n\n@default 0"},"baseDelaySeconds":{"type":"number","format":"double","minimum":0,"maximum":10,"description":"Base delay in seconds. For fixed backoff, this is the delay between retries. For exponential backoff, this is the initial delay."},"excludedStatusCodes":{"type":"array","items":{"$ref":"#/components/schemas/BackoffPlanExcludedStatusCodesItems"},"description":"HTTP status codes that should not trigger a retry. By default, any non-2xx status code not listed here can be retried."}},"required":["type","maxRetries","baseDelaySeconds"],"description":"Controls retry behavior for failed server requests, including strategy, maximum retries, base delay, and status codes excluded from retries.","title":"BackoffPlan"},"Server":{"type":"object","properties":{"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for server authentication"},"staticIpAddressesEnabled":{"type":"boolean","description":"If enabled, requests will originate from a static set of IPs owned and managed by Vapi.\n\n@default false"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"url":{"type":"string","description":"This is where the request will be sent."},"headers":{"$ref":"#/components/schemas/ServerHeaders","description":"These are the headers to include in the request.\n\nEach key-value pair represents a header name and its value.\n\nNote: Specifying an Authorization header here will override the authorization provided by the `credentialId` (if provided). This is an anti-pattern and should be avoided outside of edge case scenarios."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"}},"description":"Configuration for requests Vapi sends to a customer server, including URL, authentication, headers, timeout, encryption, static IP addresses, and retry behavior.","title":"Server"},"FallbackCustomTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackCustomTranscriberProvider","description":"This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not natively supported."},"server":{"$ref":"#/components/schemas/Server","description":"This is where the transcription request will be sent.\n\nUsage:\n1. Vapi will initiate a websocket connection with `server.url`.\n\n2. Vapi will send an initial text frame with the sample rate. Format:\n```\n    {\n      \"type\": \"start\",\n      \"encoding\": \"linear16\", // 16-bit raw PCM format\n      \"container\": \"raw\",\n      \"sampleRate\": {{sampleRate}},\n      \"channels\": 2 // customer is channel 0, assistant is channel 1\n    }\n```\n\n3. Vapi will send the audio data in 16-bit raw PCM format as binary frames.\n\n4. You can read the messages something like this:\n```\nws.on('message', (data, isBinary) => {\n  if (isBinary) {\n    pcmBuffer = Buffer.concat([pcmBuffer, data]);\n    console.log(`Received PCM data, buffer size: ${pcmBuffer.length}`);\n  } else {\n    console.log('Received message:', JSON.parse(data.toString()));\n  }\n});\n```\n\n5. You will respond with transcriptions as you have them. Format:\n```\n {\n    \"type\": \"transcriber-response\",\n    \"transcription\": \"Hello, world!\",\n    \"channel\": \"customer\" | \"assistant\"\n }\n```"}},"required":["provider","server"],"description":"Fallback configuration for sending conversation audio to a custom WebSocket transcription server.","title":"FallbackCustomTranscriber"},"FallbackDeepgramTranscriberProvider":{"type":"string","enum":["deepgram"],"description":"This is the transcription provider that will be used.","title":"FallbackDeepgramTranscriberProvider"},"DeepgramTranscriberModel":{"type":"string","enum":["flux-general-en","nova-3","nova-3-general","nova-3-medical","nova-2","nova-2-general","nova-2-meeting","nova-2-phonecall","nova-2-finance","nova-2-conversationalai","nova-2-voicemail","nova-2-video","nova-2-medical","nova-2-drivethru","nova-2-automotive","nova","nova-general","nova-phonecall","nova-medical","enhanced","enhanced-general","enhanced-meeting","enhanced-phonecall","enhanced-finance","base","base-general","base-meeting","base-phonecall","base-finance","base-conversationalai","base-voicemail","base-video","whisper"],"title":"DeepgramTranscriberModel"},"DeepgramTranscriberLanguage":{"type":"string","enum":["bg","ca","cs","da","da-DK","de","de-CH","el","en","en-AU","en-GB","en-IN","en-NZ","en-US","es","es-419","es-LATAM","et","fi","fr","fr-CA","hi","hi-Latn","hu","id","it","ja","ko","ko-KR","lt","lv","ms","multi","nl","nl-BE","no","pl","pt","pt-BR","ro","ru","sk","sv","sv-SE","ta","taq","th","th-TH","tr","uk","vi","zh","zh-CN","zh-Hans","zh-Hant","zh-TW"],"title":"DeepgramTranscriberLanguage"},"FallbackDeepgramTranscriberRedaction":{"type":"string","enum":["pci","pii","phi","numbers"],"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.","title":"FallbackDeepgramTranscriberRedaction"},"FallbackDeepgramTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackDeepgramTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/DeepgramTranscriberModel","description":"This is the Deepgram model that will be used. A list of models can be found here: https://developers.deepgram.com/docs/models-languages-overview"},"language":{"$ref":"#/components/schemas/DeepgramTranscriberLanguage","description":"This is the language that will be set for the transcription. The list of languages Deepgram supports can be found here: https://developers.deepgram.com/docs/models-languages-overview"},"smartFormat":{"type":"boolean","description":"This will be use smart format option provided by Deepgram. It's default disabled because it can sometimes format numbers as times but it's getting better."},"mipOptOut":{"type":"boolean","default":false,"description":"If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false"},"numerals":{"type":"boolean","description":"If set to true, this will cause deepgram to convert spoken numbers to literal numerals. For example, \"my phone number is nine-seven-two...\" would become \"my phone number is 972...\"\n\n@default false"},"profanityFilter":{"type":"boolean","description":"If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false"},"redaction":{"$ref":"#/components/schemas/FallbackDeepgramTranscriberRedaction","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."},"confidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Transcripts below this confidence threshold will be discarded.\n\n@default 0.4"},"eotThreshold":{"type":"number","format":"double","minimum":0.5,"maximum":0.9,"description":"End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7"},"eotTimeoutMs":{"type":"number","format":"double","minimum":500,"maximum":10000,"description":"A turn will be finished when this much time has passed after speech, regardless of EOT confidence. Only used with Flux models.\n\n@default 5000"},"languages":{"type":"array","items":{"type":"string"},"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`."},"keywords":{"type":"array","items":{"type":"string","pattern":"/^\\p{L}[\\p{L}\\d]*(?::[+-]?\\d+)?$/u"},"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."},"keyterm":{"type":"array","items":{"type":"string"},"description":"Keyterm Prompting allows you improve Keyword Recall Rate (KRR) for important keyterms or phrases up to 90%."},"endpointing":{"type":"number","format":"double","minimum":10,"maximum":500,"description":"This is the timeout after which Deepgram will send transcription on user silence. You can read in-depth documentation here: https://developers.deepgram.com/docs/endpointing.\n\nHere are the most important bits:\n- Defaults to 10. This is recommended for most use cases to optimize for latency.\n- 10 can cause some missing transcriptions since because of the shorter context. This mostly happens for one-word utterances. For those uses cases, it's recommended to try 300. It will add a bit of latency but the quality and reliability of the experience will be better.\n- If neither 10 nor 300 work, contact support@vapi.ai and we'll find another solution.\n\n@default 10"}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Deepgram, including model, language, formatting, endpointing, and vocabulary.","title":"FallbackDeepgramTranscriber"},"FallbackElevenLabsTranscriberProvider":{"type":"string","enum":["11labs"],"description":"This is the transcription provider that will be used.","title":"FallbackElevenLabsTranscriberProvider"},"FallbackElevenLabsTranscriberModel0":{"type":"string","enum":["scribe_v1","scribe_v2","scribe_v2_realtime"],"title":"FallbackElevenLabsTranscriberModel0"},"FallbackElevenLabsTranscriberModel":{"oneOf":[{"$ref":"#/components/schemas/FallbackElevenLabsTranscriberModel0"}],"description":"This is the model that will be used for the transcription.","title":"FallbackElevenLabsTranscriberModel"},"FallbackElevenLabsTranscriberLanguage":{"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"],"description":"This is the language that will be used for the transcription.","title":"FallbackElevenLabsTranscriberLanguage"},"FallbackElevenLabsTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackElevenLabsTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackElevenLabsTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/FallbackElevenLabsTranscriberLanguage","description":"This is the language that will be used for the transcription."},"silenceThresholdSeconds":{"type":"number","format":"double","minimum":0.3,"maximum":3,"description":"This is the number of seconds of silence before VAD commits (0.3-3.0)."},"confidenceThreshold":{"type":"number","format":"double","minimum":0.1,"maximum":0.9,"description":"This is the VAD sensitivity (0.1-0.9, lower indicates more sensitive)."},"minSpeechDurationMs":{"type":"number","format":"double","minimum":50,"maximum":2000,"description":"This is the minimum speech duration for VAD (50-2000ms)."},"minSilenceDurationMs":{"type":"number","format":"double","minimum":50,"maximum":2000,"description":"This is the minimum silence duration for VAD (50-2000ms)."}},"required":["provider"],"description":"Fallback configuration for transcribing speech with ElevenLabs, including model, language, and speech thresholds.","title":"FallbackElevenLabsTranscriber"},"FallbackGladiaTranscriberProvider":{"type":"string","enum":["gladia"],"description":"This is the transcription provider that will be used.","title":"FallbackGladiaTranscriberProvider"},"FallbackGladiaTranscriberModel0":{"type":"string","enum":["fast","accurate","solaria-1"],"title":"FallbackGladiaTranscriberModel0"},"FallbackGladiaTranscriberModel":{"oneOf":[{"$ref":"#/components/schemas/FallbackGladiaTranscriberModel0"}],"description":"This is the Gladia model that will be used. Default is 'fast'","title":"FallbackGladiaTranscriberModel"},"FallbackGladiaTranscriberLanguageBehaviour0":{"type":"string","enum":["manual","automatic single language","automatic multiple languages"],"title":"FallbackGladiaTranscriberLanguageBehaviour0"},"FallbackGladiaTranscriberLanguageBehaviour":{"oneOf":[{"$ref":"#/components/schemas/FallbackGladiaTranscriberLanguageBehaviour0"}],"description":"Defines how the transcription model detects the audio language. Default value is 'automatic single language'.","title":"FallbackGladiaTranscriberLanguageBehaviour"},"FallbackGladiaTranscriberLanguage":{"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"],"description":"Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.","title":"FallbackGladiaTranscriberLanguage"},"FallbackGladiaTranscriberLanguagesItems":{"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"],"title":"FallbackGladiaTranscriberLanguagesItems"},"GladiaVocabularyItemDTO":{"type":"object","properties":{"value":{"type":"string","description":"The vocabulary word or phrase"},"pronunciations":{"type":"array","items":{"type":"string"},"description":"Alternative pronunciations for the vocabulary item"},"intensity":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Intensity for this specific vocabulary item (0.0 to 1.0)"},"language":{"type":"string","description":"Language code for this vocabulary item (ISO 639-1)"}},"required":["value"],"description":"A Gladia custom vocabulary word or phrase with optional pronunciations, intensity, and language.","title":"GladiaVocabularyItemDTO"},"GladiaCustomVocabularyConfigDtoVocabularyItems":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/GladiaVocabularyItemDTO"}],"title":"GladiaCustomVocabularyConfigDtoVocabularyItems"},"GladiaCustomVocabularyConfigDTO":{"type":"object","properties":{"vocabulary":{"type":"array","items":{"$ref":"#/components/schemas/GladiaCustomVocabularyConfigDtoVocabularyItems"},"description":"Array of vocabulary items (strings or objects with value, pronunciations, intensity, language)"},"defaultIntensity":{"type":"number","format":"double","minimum":0,"maximum":1,"default":0.5,"description":"Default intensity for vocabulary items (0.0 to 1.0)"}},"required":["vocabulary"],"description":"Custom vocabulary configuration for Gladia transcription, including vocabulary items and default recognition intensity.","title":"GladiaCustomVocabularyConfigDTO"},"FallbackGladiaTranscriberRegion":{"type":"string","enum":["us-west","eu-west"],"description":"Region for processing audio (us-west or eu-west)","title":"FallbackGladiaTranscriberRegion"},"FallbackGladiaTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackGladiaTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackGladiaTranscriberModel","description":"This is the Gladia model that will be used. Default is 'fast'"},"languageBehaviour":{"$ref":"#/components/schemas/FallbackGladiaTranscriberLanguageBehaviour","description":"Defines how the transcription model detects the audio language. Default value is 'automatic single language'."},"language":{"$ref":"#/components/schemas/FallbackGladiaTranscriberLanguage","description":"Defines the language to use for the transcription. Required when languageBehaviour is 'manual'."},"languages":{"type":"array","items":{"$ref":"#/components/schemas/FallbackGladiaTranscriberLanguagesItems"},"description":"Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'."},"transcriptionHint":{"type":"string","maxLength":600,"description":"Provides a custom vocabulary to the model to improve accuracy of transcribing context specific words, technical terms, names, etc. If empty, this argument is ignored.\n⚠️ Warning ⚠️: Please be aware that the transcription_hint field has a character limit of 600. If you provide a transcription_hint longer than 600 characters, it will be automatically truncated to meet this limit."},"prosody":{"type":"boolean","description":"If prosody is true, you will get a transcription that can contain prosodies i.e. (laugh) (giggles) (malefic laugh) (toss) (music)… Default value is false."},"audioEnhancer":{"type":"boolean","description":"If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false."},"confidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Transcripts below this confidence threshold will be discarded.\n\n@default 0.4"},"endpointing":{"type":"number","format":"double","minimum":0.01,"maximum":10,"description":"Endpointing time in seconds - time to wait before considering speech ended"},"speechThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)"},"customVocabularyEnabled":{"type":"boolean","description":"Enable custom vocabulary for improved accuracy"},"customVocabularyConfig":{"$ref":"#/components/schemas/GladiaCustomVocabularyConfigDTO","description":"Custom vocabulary configuration"},"region":{"$ref":"#/components/schemas/FallbackGladiaTranscriberRegion","description":"Region for processing audio (us-west or eu-west)"},"receivePartialTranscripts":{"type":"boolean","description":"Enable partial transcripts for low-latency streaming transcription"}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Gladia, including language behavior, audio processing, endpointing, vocabulary, and region.","title":"FallbackGladiaTranscriber"},"FallbackGoogleTranscriberProvider":{"type":"string","enum":["google"],"description":"This is the transcription provider that will be used.","title":"FallbackGoogleTranscriberProvider"},"FallbackGoogleTranscriberModel":{"type":"string","enum":["gemini-3.5-flash","gemini-3.1-flash-lite","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash-thinking-exp","gemini-2.0-pro-exp-02-05","gemini-2.0-flash","gemini-2.0-flash-lite","gemini-2.0-flash-exp","gemini-2.0-flash-realtime-exp","gemini-1.5-flash","gemini-1.5-flash-002","gemini-1.5-pro","gemini-1.5-pro-002","gemini-1.0-pro"],"description":"This is the model that will be used for the transcription.","title":"FallbackGoogleTranscriberModel"},"FallbackGoogleTranscriberLanguage":{"type":"string","enum":["Multilingual","Arabic","Bengali","Bulgarian","Chinese","Croatian","Czech","Danish","Dutch","English","Estonian","Finnish","French","German","Greek","Hebrew","Hindi","Hungarian","Indonesian","Italian","Japanese","Korean","Latvian","Lithuanian","Norwegian","Polish","Portuguese","Romanian","Russian","Serbian","Slovak","Slovenian","Spanish","Swahili","Swedish","Thai","Turkish","Ukrainian","Vietnamese"],"description":"This is the language that will be set for the transcription.","title":"FallbackGoogleTranscriberLanguage"},"FallbackGoogleTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackGoogleTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackGoogleTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/FallbackGoogleTranscriberLanguage","description":"This is the language that will be set for the transcription."}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Google, including model and language.","title":"FallbackGoogleTranscriber"},"FallbackTalkscriberTranscriberProvider":{"type":"string","enum":["talkscriber"],"description":"This is the transcription provider that will be used.","title":"FallbackTalkscriberTranscriberProvider"},"FallbackTalkscriberTranscriberModel":{"type":"string","enum":["whisper"],"description":"This is the model that will be used for the transcription.","title":"FallbackTalkscriberTranscriberModel"},"FallbackTalkscriberTranscriberLanguage":{"type":"string","enum":["en","zh","de","es","ru","ko","fr","ja","pt","tr","pl","ca","nl","ar","sv","it","id","hi","fi","vi","he","uk","el","ms","cs","ro","da","hu","ta","no","th","ur","hr","bg","lt","la","mi","ml","cy","sk","te","fa","lv","bn","sr","az","sl","kn","et","mk","br","eu","is","hy","ne","mn","bs","kk","sq","sw","gl","mr","pa","si","km","sn","yo","so","af","oc","ka","be","tg","sd","gu","am","yi","lo","uz","fo","ht","ps","tk","nn","mt","sa","lb","my","bo","tl","mg","as","tt","haw","ln","ha","ba","jw","su","yue"],"description":"This is the language that will be set for the transcription. The list of languages Whisper supports can be found here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py","title":"FallbackTalkscriberTranscriberLanguage"},"FallbackTalkscriberTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackTalkscriberTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackTalkscriberTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/FallbackTalkscriberTranscriberLanguage","description":"This is the language that will be set for the transcription. The list of languages Whisper supports can be found here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py"}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Talkscriber, including model and language.","title":"FallbackTalkscriberTranscriber"},"FallbackSpeechmaticsTranscriberProvider":{"type":"string","enum":["speechmatics"],"description":"This is the transcription provider that will be used.","title":"FallbackSpeechmaticsTranscriberProvider"},"FallbackSpeechmaticsTranscriberModel":{"type":"string","enum":["default"],"description":"This is the model that will be used for the transcription.","title":"FallbackSpeechmaticsTranscriberModel"},"FallbackSpeechmaticsTranscriberLanguage":{"type":"string","enum":["auto","ar","ar_en","ba","eu","be","bn","bg","yue","ca","hr","cs","da","nl","en","eo","et","fi","fr","gl","de","el","he","hi","hu","id","ia","ga","it","ja","ko","lv","lt","ms","en_ms","mt","cmn","cmn_en","mr","mn","no","fa","pl","pt","ro","ru","sk","sl","es","en_es","sw","sv","tl","ta","en_ta","th","tr","uk","ur","ug","vi","cy"],"description":"Language used for transcription. Set to `auto` to detect the language automatically.","title":"FallbackSpeechmaticsTranscriberLanguage"},"FallbackSpeechmaticsTranscriberOperatingPoint":{"type":"string","enum":["standard","enhanced"],"default":"enhanced","description":"This is the operating point for the transcription. Choose between `standard` for faster turnaround with strong accuracy or `enhanced` for highest accuracy when precision is critical.\n\n@default 'enhanced'","title":"FallbackSpeechmaticsTranscriberOperatingPoint"},"FallbackSpeechmaticsTranscriberRegion":{"type":"string","enum":["eu","us"],"default":"eu","description":"This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for lower latency and data sovereignty compliance.\n\n@default 'eu'","title":"FallbackSpeechmaticsTranscriberRegion"},"SpeechmaticsCustomVocabularyItem":{"type":"object","properties":{"content":{"type":"string","minLength":1,"description":"The word or phrase to add to the custom vocabulary."},"soundsLike":{"type":"array","items":{"type":"string"},"description":"Alternative phonetic representations of how the word might sound. This helps recognition when the word might be pronounced differently."}},"required":["content"],"description":"A word or phrase to prioritize during Speechmatics transcription, with optional phonetic alternatives.","title":"SpeechmaticsCustomVocabularyItem"},"FallbackSpeechmaticsTranscriberNumeralStyle":{"type":"string","enum":["written","spoken"],"default":"written","description":"This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.\n\n@default 'written'","title":"FallbackSpeechmaticsTranscriberNumeralStyle"},"FallbackSpeechmaticsTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriberLanguage","description":"Language used for transcription. Set to `auto` to detect the language automatically."},"operatingPoint":{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriberOperatingPoint","default":"enhanced","description":"This is the operating point for the transcription. Choose between `standard` for faster turnaround with strong accuracy or `enhanced` for highest accuracy when precision is critical.\n\n@default 'enhanced'"},"region":{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriberRegion","default":"eu","description":"This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for lower latency and data sovereignty compliance.\n\n@default 'eu'"},"enableDiarization":{"type":"boolean","default":false,"description":"This enables speaker diarization, which identifies and separates speakers in the transcription. Essential for multi-speaker conversations and conference calls.\n\n@default false"},"maxDelay":{"type":"number","format":"double","minimum":500,"maximum":10000,"default":3000,"description":"This sets the maximum delay in milliseconds for partial transcripts. Balances latency and accuracy.\n\n@default 3000"},"customVocabulary":{"type":"array","items":{"$ref":"#/components/schemas/SpeechmaticsCustomVocabularyItem"},"description":"Words and phrases that Speechmatics should recognize more accurately, with optional phonetic alternatives."},"numeralStyle":{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriberNumeralStyle","default":"written","description":"This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.\n\n@default 'written'"},"endOfTurnSensitivity":{"type":"number","format":"double","minimum":0,"maximum":1,"default":0.5,"description":"This is the sensitivity level for end-of-turn detection, which determines when a speaker has finished talking. Higher values are more sensitive.\n\n@default 0.5"},"removeDisfluencies":{"type":"boolean","default":false,"description":"This enables removal of disfluencies (um, uh) from the transcript to create cleaner, more professional output.\n\nThis is only supported for the English language transcriber.\n\n@default false"},"minimumSpeechDuration":{"type":"number","format":"double","minimum":0,"maximum":5,"default":0,"description":"This is the minimum duration in seconds for speech segments. Shorter segments will be filtered out. Helps remove noise and improve accuracy.\n\n@default 0.0"}},"required":["provider","customVocabulary"],"description":"Fallback configuration for transcribing speech with Speechmatics, including language, region, diarization, vocabulary, endpointing, and formatting.","title":"FallbackSpeechmaticsTranscriber"},"FallbackOpenAiTranscriberProvider":{"type":"string","enum":["openai"],"description":"This is the transcription provider that will be used.","title":"FallbackOpenAiTranscriberProvider"},"FallbackOpenAiTranscriberModel":{"type":"string","enum":["gpt-4o-transcribe","gpt-4o-mini-transcribe"],"description":"This is the model that will be used for the transcription.","title":"FallbackOpenAiTranscriberModel"},"FallbackOpenAiTranscriberLanguage":{"type":"string","enum":["af","ar","hy","az","be","bs","bg","ca","zh","hr","cs","da","nl","en","et","fi","fr","gl","de","el","he","hi","hu","is","id","it","ja","kn","kk","ko","lv","lt","mk","ms","mr","mi","ne","no","fa","pl","pt","ro","ru","sr","sk","sl","es","sw","sv","tl","ta","th","tr","uk","ur","vi","cy"],"description":"This is the language that will be set for the transcription.","title":"FallbackOpenAiTranscriberLanguage"},"FallbackOpenAITranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackOpenAiTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackOpenAiTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/FallbackOpenAiTranscriberLanguage","description":"This is the language that will be set for the transcription."}},"required":["provider","model"],"description":"Fallback configuration for transcribing speech with OpenAI, including model and language.","title":"FallbackOpenAITranscriber"},"FallbackCartesiaTranscriberProvider":{"type":"string","enum":["cartesia"],"description":"Selects Cartesia for speech-to-text transcription.","title":"FallbackCartesiaTranscriberProvider"},"FallbackCartesiaTranscriberModel":{"type":"string","enum":["ink-whisper","ink-2"],"description":"The Cartesia speech-to-text model used for transcription.","title":"FallbackCartesiaTranscriberModel"},"FallbackCartesiaTranscriberLanguage":{"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"],"description":"The language code used for transcription.","title":"FallbackCartesiaTranscriberLanguage"},"FallbackCartesiaTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackCartesiaTranscriberProvider","description":"Selects Cartesia for speech-to-text transcription."},"model":{"$ref":"#/components/schemas/FallbackCartesiaTranscriberModel","description":"The Cartesia speech-to-text model used for transcription."},"language":{"$ref":"#/components/schemas/FallbackCartesiaTranscriberLanguage","description":"The language code used for transcription."}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Cartesia, including model and language.","title":"FallbackCartesiaTranscriber"},"FallbackSonioxTranscriberProvider":{"type":"string","enum":["soniox"],"description":"Selects Soniox for speech-to-text transcription.","title":"FallbackSonioxTranscriberProvider"},"FallbackSonioxTranscriberModel":{"type":"string","enum":["stt-rt-v4","stt-rt-v5"],"description":"The Soniox model to use for transcription.","title":"FallbackSonioxTranscriberModel"},"FallbackSonioxTranscriberLanguage":{"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"],"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.","title":"FallbackSonioxTranscriberLanguage"},"FallbackSonioxTranscriberLanguagesItems":{"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"],"title":"FallbackSonioxTranscriberLanguagesItems"},"SonioxContextGeneralItem":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"The key describing the type of context (e.g., \"domain\", \"topic\", \"doctor\", \"organization\")."},"value":{"type":"string","minLength":1,"description":"The value for the context key (e.g., \"Healthcare\", \"Diabetes management consultation\")."}},"required":["key","value"],"title":"SonioxContextGeneralItem"},"FallbackSonioxTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackSonioxTranscriberProvider","description":"Selects Soniox for speech-to-text transcription."},"model":{"$ref":"#/components/schemas/FallbackSonioxTranscriberModel","description":"The Soniox model to use for transcription."},"language":{"$ref":"#/components/schemas/FallbackSonioxTranscriberLanguage","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","items":{"$ref":"#/components/schemas/FallbackSonioxTranscriberLanguagesItems"},"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."},"languageHintsStrict":{"type":"boolean","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","format":"double","minimum":500,"maximum":3000,"description":"Maximum delay in milliseconds between when the speaker stops and when the endpoint is detected. Lower values mean faster turn-taking but more false endpoints. Range: 500-3000. Default: 500."},"customVocabulary":{"type":"array","items":{"type":"string"},"description":"Custom vocabulary terms to boost recognition accuracy. Useful for brand names, product names, and domain-specific terminology. Maps to Soniox context.terms."},"contextGeneral":{"type":"array","items":{"$ref":"#/components/schemas/SonioxContextGeneralItem"},"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."}},"required":["provider"],"description":"Fallback configuration for transcribing speech with Soniox, including model, language detection, endpointing, and vocabulary.","title":"FallbackSonioxTranscriber"},"FallbackXaiTranscriberProvider":{"type":"string","enum":["xai"],"title":"FallbackXaiTranscriberProvider"},"FallbackXaiTranscriberModel":{"type":"string","enum":["default"],"description":"The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection.","title":"FallbackXaiTranscriberModel"},"FallbackXaiTranscriberLanguage":{"type":"string","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"],"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.","title":"FallbackXaiTranscriberLanguage"},"FallbackXaiTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/FallbackXaiTranscriberProvider"},"model":{"$ref":"#/components/schemas/FallbackXaiTranscriberModel","description":"The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection."},"language":{"$ref":"#/components/schemas/FallbackXaiTranscriberLanguage","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."}},"required":["provider"],"title":"FallbackXaiTranscriber"},"FallbackTranscriberPlanTranscribersItems":{"oneOf":[{"$ref":"#/components/schemas/FallbackAssemblyAITranscriber"},{"$ref":"#/components/schemas/FallbackAzureSpeechTranscriber"},{"$ref":"#/components/schemas/FallbackCustomTranscriber"},{"$ref":"#/components/schemas/FallbackDeepgramTranscriber"},{"$ref":"#/components/schemas/FallbackElevenLabsTranscriber"},{"$ref":"#/components/schemas/FallbackGladiaTranscriber"},{"$ref":"#/components/schemas/FallbackGoogleTranscriber"},{"$ref":"#/components/schemas/FallbackTalkscriberTranscriber"},{"$ref":"#/components/schemas/FallbackSpeechmaticsTranscriber"},{"$ref":"#/components/schemas/FallbackOpenAITranscriber"},{"$ref":"#/components/schemas/FallbackCartesiaTranscriber"},{"$ref":"#/components/schemas/FallbackSonioxTranscriber"},{"$ref":"#/components/schemas/FallbackXaiTranscriber"}],"title":"FallbackTranscriberPlanTranscribersItems"},"FallbackTranscriberPlan":{"type":"object","properties":{"transcribers":{"type":"array","items":{"$ref":"#/components/schemas/FallbackTranscriberPlanTranscribersItems"},"description":"Transcriber configurations available when the primary transcriber fails."}},"description":"Lists backup transcriber configurations that can be used if the primary transcriber fails.","title":"FallbackTranscriberPlan"},"AssemblyAITranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/AssemblyAiTranscriberProvider","description":"This is the transcription provider that will be used."},"language":{"$ref":"#/components/schemas/AssemblyAiTranscriberLanguage","description":"This is the language that will be set for the transcription."},"confidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Transcripts below this confidence threshold will be discarded.\n\n@default 0.4"},"formatTurns":{"type":"boolean","description":"This enables formatting of transcripts.\n\n@default true"},"endOfTurnConfidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"This is the end of turn confidence threshold. The minimum confidence that the end of turn is detected.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@min 0\n@max 1\n@default 0.7"},"minEndOfTurnSilenceWhenConfident":{"type":"number","format":"double","minimum":0,"description":"This is the minimum end of turn silence when confident in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 160"},"wordFinalizationMaxWaitTime":{"type":"number","format":"double","minimum":0,"deprecated":true},"maxTurnSilence":{"type":"number","format":"double","minimum":0,"description":"This is the maximum turn silence time in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 400"},"vadAssistedEndpointingEnabled":{"type":"boolean","description":"Use VAD to assist with endpointing decisions from the transcriber.\nWhen enabled, transcriber endpointing will be buffered if VAD detects the user is still speaking, preventing premature turn-taking.\nWhen disabled, transcriber endpointing will be used immediately regardless of VAD state, allowing for quicker but more aggressive turn-taking.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n\n@default true"},"mode":{"$ref":"#/components/schemas/AssemblyAiTranscriberMode","description":"This is the transcription mode used by the `universal-3-5-pro` speech model. Only applies to the `universal-3-5-pro` speech model.\n\n@default 'balanced'"},"prompt":{"type":"string","maxLength":1750,"description":"This is a prompt that provides additional context to the transcription model. Only applies to the `universal-3-5-pro` speech model."},"agentContext":{"type":"string","maxLength":1750,"description":"This is context about the voice agent that guides the transcription model. Only applies to the `universal-3-5-pro` speech model."},"languageCodes":{"$ref":"#/components/schemas/AssemblyAiTranscriberLanguageCodes","description":"These are language codes used to steer automatic language detection. Only applies to the `universal-3-5-pro` speech model."},"speechModel":{"$ref":"#/components/schemas/AssemblyAiTranscriberSpeechModel","description":"This is the speech model used for the streaming session.\nKeyterms prompting is supported on universal-streaming-english and universal-3-5-pro.\nuniversal-3-5-pro is AssemblyAI's most accurate voice-agent model.\n@default 'universal-streaming-english'"},"realtimeUrl":{"type":"string","description":"The WebSocket URL that the transcriber connects to."},"wordBoost":{"type":"array","items":{"type":"string","maxLength":2500},"description":"Add up to 2500 characters of custom vocabulary."},"keytermsPrompt":{"type":"array","items":{"type":"string","maxLength":50},"description":"Keyterms prompting improves recognition accuracy for specific words and phrases.\nCan include up to 100 keyterms, each up to 50 characters.\nCosts an additional $0.04/hour on universal-streaming-english and is included at no extra cost on universal-3-5-pro."},"endUtteranceSilenceThreshold":{"type":"number","format":"double","description":"The duration of the end utterance silence threshold in milliseconds."},"disablePartialTranscripts":{"type":"boolean","description":"Disable partial transcripts.\nSet to `true` to not receive partial transcripts. Defaults to `false`."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with AssemblyAI, including language, streaming model, endpointing, vocabulary, and fallback settings.","title":"AssemblyAITranscriber"},"AzureSpeechTranscriberProvider":{"type":"string","enum":["azure"],"description":"This is the transcription provider that will be used.","title":"AzureSpeechTranscriberProvider"},"AzureSpeechTranscriberLanguage":{"type":"string","enum":["af-ZA","am-ET","ar-AE","ar-BH","ar-DZ","ar-EG","ar-IL","ar-IQ","ar-JO","ar-KW","ar-LB","ar-LY","ar-MA","ar-OM","ar-PS","ar-QA","ar-SA","ar-SY","ar-TN","ar-YE","az-AZ","bg-BG","bn-IN","bs-BA","ca-ES","cs-CZ","cy-GB","da-DK","de-AT","de-CH","de-DE","el-GR","en-AU","en-CA","en-GB","en-GH","en-HK","en-IE","en-IN","en-KE","en-NG","en-NZ","en-PH","en-SG","en-TZ","en-US","en-ZA","es-AR","es-BO","es-CL","es-CO","es-CR","es-CU","es-DO","es-EC","es-ES","es-GQ","es-GT","es-HN","es-MX","es-NI","es-PA","es-PE","es-PR","es-PY","es-SV","es-US","es-UY","es-VE","et-EE","eu-ES","fa-IR","fi-FI","fil-PH","fr-BE","fr-CA","fr-CH","fr-FR","ga-IE","gl-ES","gu-IN","he-IL","hi-IN","hr-HR","hu-HU","hy-AM","id-ID","is-IS","it-CH","it-IT","ja-JP","jv-ID","ka-GE","kk-KZ","km-KH","kn-IN","ko-KR","lo-LA","lt-LT","lv-LV","mk-MK","ml-IN","mn-MN","mr-IN","ms-MY","mt-MT","my-MM","nb-NO","ne-NP","nl-BE","nl-NL","pa-IN","pl-PL","ps-AF","pt-BR","pt-PT","ro-RO","ru-RU","si-LK","sk-SK","sl-SI","so-SO","sq-AL","sr-RS","sv-SE","sw-KE","sw-TZ","ta-IN","te-IN","th-TH","tr-TR","uk-UA","ur-IN","uz-UZ","vi-VN","wuu-CN","yue-CN","zh-CN","zh-CN-shandong","zh-CN-sichuan","zh-HK","zh-TW","zu-ZA"],"description":"This is the language that will be set for the transcription. The list of languages Azure supports can be found here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt","title":"AzureSpeechTranscriberLanguage"},"AzureSpeechTranscriberSegmentationStrategy":{"type":"string","enum":["Default","Time","Semantic"],"description":"Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced semantic segmentation.","title":"AzureSpeechTranscriberSegmentationStrategy"},"AzureSpeechTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/AzureSpeechTranscriberProvider","description":"This is the transcription provider that will be used."},"language":{"$ref":"#/components/schemas/AzureSpeechTranscriberLanguage","description":"This is the language that will be set for the transcription. The list of languages Azure supports can be found here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt"},"segmentationStrategy":{"$ref":"#/components/schemas/AzureSpeechTranscriberSegmentationStrategy","description":"Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced semantic segmentation."},"segmentationSilenceTimeoutMs":{"type":"number","format":"double","minimum":100,"maximum":5000,"description":"Duration of detected silence after which the service finalizes a phrase. Configure to adjust sensitivity to pauses in speech."},"segmentationMaximumTimeMs":{"type":"number","format":"double","minimum":20000,"maximum":70000,"description":"Maximum duration a segment can reach before being cut off when using time-based segmentation."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Azure Speech, including language, segmentation, and fallback settings.","title":"AzureSpeechTranscriber"},"CustomTranscriberProvider":{"type":"string","enum":["custom-transcriber"],"description":"This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not natively supported.","title":"CustomTranscriberProvider"},"CustomTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CustomTranscriberProvider","description":"This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not natively supported."},"server":{"$ref":"#/components/schemas/Server","description":"This is where the transcription request will be sent.\n\nUsage:\n1. Vapi will initiate a websocket connection with `server.url`.\n\n2. Vapi will send an initial text frame with the sample rate. Format:\n```\n    {\n      \"type\": \"start\",\n      \"encoding\": \"linear16\", // 16-bit raw PCM format\n      \"container\": \"raw\",\n      \"sampleRate\": {{sampleRate}},\n      \"channels\": 2 // customer is channel 0, assistant is channel 1\n    }\n```\n\n3. Vapi will send the audio data in 16-bit raw PCM format as binary frames.\n\n4. You can read the messages something like this:\n```\nws.on('message', (data, isBinary) => {\n  if (isBinary) {\n    pcmBuffer = Buffer.concat([pcmBuffer, data]);\n    console.log(`Received PCM data, buffer size: ${pcmBuffer.length}`);\n  } else {\n    console.log('Received message:', JSON.parse(data.toString()));\n  }\n});\n```\n\n5. You will respond with transcriptions as you have them. Format:\n```\n {\n    \"type\": \"transcriber-response\",\n    \"transcription\": \"Hello, world!\",\n    \"channel\": \"customer\" | \"assistant\"\n }\n```"},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider","server"],"description":"Configuration for sending conversation audio to a custom WebSocket transcription server.","title":"CustomTranscriber"},"DeepgramTranscriberProvider":{"type":"string","enum":["deepgram"],"description":"This is the transcription provider that will be used.","title":"DeepgramTranscriberProvider"},"DeepgramTranscriberRedaction":{"type":"string","enum":["pci","pii","phi","numbers"],"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.","title":"DeepgramTranscriberRedaction"},"DeepgramTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/DeepgramTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/DeepgramTranscriberModel","description":"This is the Deepgram model that will be used. A list of models can be found here: https://developers.deepgram.com/docs/models-languages-overview"},"language":{"$ref":"#/components/schemas/DeepgramTranscriberLanguage","description":"This is the language that will be set for the transcription. The list of languages Deepgram supports can be found here: https://developers.deepgram.com/docs/models-languages-overview"},"smartFormat":{"type":"boolean","description":"This will be use smart format option provided by Deepgram. It's default disabled because it can sometimes format numbers as times but it's getting better."},"mipOptOut":{"type":"boolean","default":false,"description":"If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false"},"numerals":{"type":"boolean","description":"If set to true, this will cause deepgram to convert spoken numbers to literal numerals. For example, \"my phone number is nine-seven-two...\" would become \"my phone number is 972...\"\n\n@default false"},"profanityFilter":{"type":"boolean","description":"If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false"},"redaction":{"$ref":"#/components/schemas/DeepgramTranscriberRedaction","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."},"confidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Transcripts below this confidence threshold will be discarded.\n\n@default 0.4"},"eotThreshold":{"type":"number","format":"double","minimum":0.5,"maximum":0.9,"description":"End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7"},"eotTimeoutMs":{"type":"number","format":"double","minimum":500,"maximum":10000,"description":"A turn will be finished when this much time has passed after speech, regardless of EOT confidence. Only used with Flux models.\n\n@default 5000"},"languages":{"type":"array","items":{"type":"string"},"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`."},"keywords":{"type":"array","items":{"type":"string","pattern":"/^\\p{L}[\\p{L}\\d]*(?::[+-]?\\d+)?$/u"},"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."},"keyterm":{"type":"array","items":{"type":"string"},"description":"Keyterm Prompting allows you improve Keyword Recall Rate (KRR) for important keyterms or phrases up to 90%."},"endpointing":{"type":"number","format":"double","minimum":10,"maximum":500,"description":"This is the timeout after which Deepgram will send transcription on user silence. You can read in-depth documentation here: https://developers.deepgram.com/docs/endpointing.\n\nHere are the most important bits:\n- Defaults to 10. This is recommended for most use cases to optimize for latency.\n- 10 can cause some missing transcriptions since because of the shorter context. This mostly happens for one-word utterances. For those uses cases, it's recommended to try 300. It will add a bit of latency but the quality and reliability of the experience will be better.\n- If neither 10 nor 300 work, contact support@vapi.ai and we'll find another solution.\n\n@default 10"},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Deepgram, including model, language, formatting, endpointing, vocabulary, and fallback settings.","title":"DeepgramTranscriber"},"ElevenLabsTranscriberProvider":{"type":"string","enum":["11labs"],"description":"This is the transcription provider that will be used.","title":"ElevenLabsTranscriberProvider"},"ElevenLabsTranscriberModel0":{"type":"string","enum":["scribe_v1","scribe_v2","scribe_v2_realtime"],"title":"ElevenLabsTranscriberModel0"},"ElevenLabsTranscriberModel":{"oneOf":[{"$ref":"#/components/schemas/ElevenLabsTranscriberModel0"}],"description":"This is the model that will be used for the transcription.","title":"ElevenLabsTranscriberModel"},"ElevenLabsTranscriberLanguage":{"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"],"description":"This is the language that will be used for the transcription.","title":"ElevenLabsTranscriberLanguage"},"ElevenLabsTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/ElevenLabsTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/ElevenLabsTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/ElevenLabsTranscriberLanguage","description":"This is the language that will be used for the transcription."},"silenceThresholdSeconds":{"type":"number","format":"double","minimum":0.3,"maximum":3,"description":"This is the number of seconds of silence before VAD commits (0.3-3.0)."},"confidenceThreshold":{"type":"number","format":"double","minimum":0.1,"maximum":0.9,"description":"This is the VAD sensitivity (0.1-0.9, lower indicates more sensitive)."},"minSpeechDurationMs":{"type":"number","format":"double","minimum":50,"maximum":2000,"description":"This is the minimum speech duration for VAD (50-2000ms)."},"minSilenceDurationMs":{"type":"number","format":"double","minimum":50,"maximum":2000,"description":"This is the minimum silence duration for VAD (50-2000ms)."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with ElevenLabs, including model, language, speech thresholds, and fallback settings.","title":"ElevenLabsTranscriber"},"GladiaTranscriberProvider":{"type":"string","enum":["gladia"],"description":"This is the transcription provider that will be used.","title":"GladiaTranscriberProvider"},"GladiaTranscriberModel0":{"type":"string","enum":["fast","accurate","solaria-1"],"title":"GladiaTranscriberModel0"},"GladiaTranscriberModel":{"oneOf":[{"$ref":"#/components/schemas/GladiaTranscriberModel0"}],"description":"This is the Gladia model that will be used. Default is 'fast'","title":"GladiaTranscriberModel"},"GladiaTranscriberLanguageBehaviour0":{"type":"string","enum":["manual","automatic single language","automatic multiple languages"],"title":"GladiaTranscriberLanguageBehaviour0"},"GladiaTranscriberLanguageBehaviour":{"oneOf":[{"$ref":"#/components/schemas/GladiaTranscriberLanguageBehaviour0"}],"description":"Defines how the transcription model detects the audio language. Default value is 'automatic single language'.","title":"GladiaTranscriberLanguageBehaviour"},"GladiaTranscriberLanguage":{"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"],"description":"Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.","title":"GladiaTranscriberLanguage"},"GladiaTranscriberLanguagesItems":{"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"],"title":"GladiaTranscriberLanguagesItems"},"GladiaTranscriberRegion":{"type":"string","enum":["us-west","eu-west"],"description":"Region for processing audio (us-west or eu-west)","title":"GladiaTranscriberRegion"},"GladiaTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/GladiaTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/GladiaTranscriberModel","description":"This is the Gladia model that will be used. Default is 'fast'"},"languageBehaviour":{"$ref":"#/components/schemas/GladiaTranscriberLanguageBehaviour","description":"Defines how the transcription model detects the audio language. Default value is 'automatic single language'."},"language":{"$ref":"#/components/schemas/GladiaTranscriberLanguage","description":"Defines the language to use for the transcription. Required when languageBehaviour is 'manual'."},"languages":{"type":"array","items":{"$ref":"#/components/schemas/GladiaTranscriberLanguagesItems"},"description":"Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'."},"transcriptionHint":{"type":"string","maxLength":600,"description":"Provides a custom vocabulary to the model to improve accuracy of transcribing context specific words, technical terms, names, etc. If empty, this argument is ignored.\n⚠️ Warning ⚠️: Please be aware that the transcription_hint field has a character limit of 600. If you provide a transcription_hint longer than 600 characters, it will be automatically truncated to meet this limit."},"prosody":{"type":"boolean","description":"If prosody is true, you will get a transcription that can contain prosodies i.e. (laugh) (giggles) (malefic laugh) (toss) (music)… Default value is false."},"audioEnhancer":{"type":"boolean","description":"If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false."},"confidenceThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Transcripts below this confidence threshold will be discarded.\n\n@default 0.4"},"endpointing":{"type":"number","format":"double","minimum":0.01,"maximum":10,"description":"Endpointing time in seconds - time to wait before considering speech ended"},"speechThreshold":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)"},"customVocabularyEnabled":{"type":"boolean","description":"Enable custom vocabulary for improved accuracy"},"customVocabularyConfig":{"$ref":"#/components/schemas/GladiaCustomVocabularyConfigDTO","description":"Custom vocabulary configuration"},"region":{"$ref":"#/components/schemas/GladiaTranscriberRegion","description":"Region for processing audio (us-west or eu-west)"},"receivePartialTranscripts":{"type":"boolean","description":"Enable partial transcripts for low-latency streaming transcription"},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Gladia, including language behavior, audio processing, endpointing, vocabulary, region, and fallback settings.","title":"GladiaTranscriber"},"GoogleTranscriberProvider":{"type":"string","enum":["google"],"description":"This is the transcription provider that will be used.","title":"GoogleTranscriberProvider"},"GoogleTranscriberModel":{"type":"string","enum":["gemini-3.5-flash","gemini-3.1-flash-lite","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash-thinking-exp","gemini-2.0-pro-exp-02-05","gemini-2.0-flash","gemini-2.0-flash-lite","gemini-2.0-flash-exp","gemini-2.0-flash-realtime-exp","gemini-1.5-flash","gemini-1.5-flash-002","gemini-1.5-pro","gemini-1.5-pro-002","gemini-1.0-pro"],"description":"This is the model that will be used for the transcription.","title":"GoogleTranscriberModel"},"GoogleTranscriberLanguage":{"type":"string","enum":["Multilingual","Arabic","Bengali","Bulgarian","Chinese","Croatian","Czech","Danish","Dutch","English","Estonian","Finnish","French","German","Greek","Hebrew","Hindi","Hungarian","Indonesian","Italian","Japanese","Korean","Latvian","Lithuanian","Norwegian","Polish","Portuguese","Romanian","Russian","Serbian","Slovak","Slovenian","Spanish","Swahili","Swedish","Thai","Turkish","Ukrainian","Vietnamese"],"description":"This is the language that will be set for the transcription.","title":"GoogleTranscriberLanguage"},"GoogleTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/GoogleTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/GoogleTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/GoogleTranscriberLanguage","description":"This is the language that will be set for the transcription."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Google, including model, language, and fallback settings.","title":"GoogleTranscriber"},"SpeechmaticsTranscriberProvider":{"type":"string","enum":["speechmatics"],"description":"This is the transcription provider that will be used.","title":"SpeechmaticsTranscriberProvider"},"SpeechmaticsTranscriberModel":{"type":"string","enum":["default"],"description":"This is the model that will be used for the transcription.","title":"SpeechmaticsTranscriberModel"},"SpeechmaticsTranscriberLanguage":{"type":"string","enum":["auto","ar","ar_en","ba","eu","be","bn","bg","yue","ca","hr","cs","da","nl","en","eo","et","fi","fr","gl","de","el","he","hi","hu","id","ia","ga","it","ja","ko","lv","lt","ms","en_ms","mt","cmn","cmn_en","mr","mn","no","fa","pl","pt","ro","ru","sk","sl","es","en_es","sw","sv","tl","ta","en_ta","th","tr","uk","ur","ug","vi","cy"],"description":"Language used for transcription. Set to `auto` to detect the language automatically.","title":"SpeechmaticsTranscriberLanguage"},"SpeechmaticsTranscriberOperatingPoint":{"type":"string","enum":["standard","enhanced"],"default":"enhanced","description":"This is the operating point for the transcription. Choose between `standard` for faster turnaround with strong accuracy or `enhanced` for highest accuracy when precision is critical.\n\n@default 'enhanced'","title":"SpeechmaticsTranscriberOperatingPoint"},"SpeechmaticsTranscriberRegion":{"type":"string","enum":["eu","us"],"default":"eu","description":"This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for lower latency and data sovereignty compliance.\n\n@default 'eu'","title":"SpeechmaticsTranscriberRegion"},"SpeechmaticsTranscriberNumeralStyle":{"type":"string","enum":["written","spoken"],"default":"written","description":"This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.\n\n@default 'written'","title":"SpeechmaticsTranscriberNumeralStyle"},"SpeechmaticsTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/SpeechmaticsTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/SpeechmaticsTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/SpeechmaticsTranscriberLanguage","description":"Language used for transcription. Set to `auto` to detect the language automatically."},"operatingPoint":{"$ref":"#/components/schemas/SpeechmaticsTranscriberOperatingPoint","default":"enhanced","description":"This is the operating point for the transcription. Choose between `standard` for faster turnaround with strong accuracy or `enhanced` for highest accuracy when precision is critical.\n\n@default 'enhanced'"},"region":{"$ref":"#/components/schemas/SpeechmaticsTranscriberRegion","default":"eu","description":"This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for lower latency and data sovereignty compliance.\n\n@default 'eu'"},"enableDiarization":{"type":"boolean","default":false,"description":"This enables speaker diarization, which identifies and separates speakers in the transcription. Essential for multi-speaker conversations and conference calls.\n\n@default false"},"maxDelay":{"type":"number","format":"double","minimum":500,"maximum":10000,"default":3000,"description":"This sets the maximum delay in milliseconds for partial transcripts. Balances latency and accuracy.\n\n@default 3000"},"customVocabulary":{"type":"array","items":{"$ref":"#/components/schemas/SpeechmaticsCustomVocabularyItem"},"description":"Words and phrases that Speechmatics should recognize more accurately, with optional phonetic alternatives."},"numeralStyle":{"$ref":"#/components/schemas/SpeechmaticsTranscriberNumeralStyle","default":"written","description":"This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.\n\n@default 'written'"},"endOfTurnSensitivity":{"type":"number","format":"double","minimum":0,"maximum":1,"default":0.5,"description":"This is the sensitivity level for end-of-turn detection, which determines when a speaker has finished talking. Higher values are more sensitive.\n\n@default 0.5"},"removeDisfluencies":{"type":"boolean","default":false,"description":"This enables removal of disfluencies (um, uh) from the transcript to create cleaner, more professional output.\n\nThis is only supported for the English language transcriber.\n\n@default false"},"minimumSpeechDuration":{"type":"number","format":"double","minimum":0,"maximum":5,"default":0,"description":"This is the minimum duration in seconds for speech segments. Shorter segments will be filtered out. Helps remove noise and improve accuracy.\n\n@default 0.0"},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider","customVocabulary"],"description":"Configuration for transcribing speech during assistant conversations with Speechmatics, including language, region, diarization, vocabulary, endpointing, formatting, and fallback settings.","title":"SpeechmaticsTranscriber"},"TalkscriberTranscriberProvider":{"type":"string","enum":["talkscriber"],"description":"This is the transcription provider that will be used.","title":"TalkscriberTranscriberProvider"},"TalkscriberTranscriberModel":{"type":"string","enum":["whisper"],"description":"This is the model that will be used for the transcription.","title":"TalkscriberTranscriberModel"},"TalkscriberTranscriberLanguage":{"type":"string","enum":["en","zh","de","es","ru","ko","fr","ja","pt","tr","pl","ca","nl","ar","sv","it","id","hi","fi","vi","he","uk","el","ms","cs","ro","da","hu","ta","no","th","ur","hr","bg","lt","la","mi","ml","cy","sk","te","fa","lv","bn","sr","az","sl","kn","et","mk","br","eu","is","hy","ne","mn","bs","kk","sq","sw","gl","mr","pa","si","km","sn","yo","so","af","oc","ka","be","tg","sd","gu","am","yi","lo","uz","fo","ht","ps","tk","nn","mt","sa","lb","my","bo","tl","mg","as","tt","haw","ln","ha","ba","jw","su","yue"],"description":"This is the language that will be set for the transcription. The list of languages Whisper supports can be found here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py","title":"TalkscriberTranscriberLanguage"},"TalkscriberTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/TalkscriberTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/TalkscriberTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/TalkscriberTranscriberLanguage","description":"This is the language that will be set for the transcription. The list of languages Whisper supports can be found here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py"},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Talkscriber, including model, language, and fallback settings.","title":"TalkscriberTranscriber"},"OpenAiTranscriberProvider":{"type":"string","enum":["openai"],"description":"This is the transcription provider that will be used.","title":"OpenAiTranscriberProvider"},"OpenAiTranscriberModel":{"type":"string","enum":["gpt-4o-transcribe","gpt-4o-mini-transcribe"],"description":"This is the model that will be used for the transcription.","title":"OpenAiTranscriberModel"},"OpenAiTranscriberLanguage":{"type":"string","enum":["af","ar","hy","az","be","bs","bg","ca","zh","hr","cs","da","nl","en","et","fi","fr","gl","de","el","he","hi","hu","is","id","it","ja","kn","kk","ko","lv","lt","mk","ms","mr","mi","ne","no","fa","pl","pt","ro","ru","sr","sk","sl","es","sw","sv","tl","ta","th","tr","uk","ur","vi","cy"],"description":"This is the language that will be set for the transcription.","title":"OpenAiTranscriberLanguage"},"OpenAITranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/OpenAiTranscriberProvider","description":"This is the transcription provider that will be used."},"model":{"$ref":"#/components/schemas/OpenAiTranscriberModel","description":"This is the model that will be used for the transcription."},"language":{"$ref":"#/components/schemas/OpenAiTranscriberLanguage","description":"This is the language that will be set for the transcription."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider","model"],"description":"Configuration for transcribing speech during assistant conversations with OpenAI, including model, language, and fallback settings.","title":"OpenAITranscriber"},"CartesiaTranscriberProvider":{"type":"string","enum":["cartesia"],"description":"Selects Cartesia for speech-to-text transcription.","title":"CartesiaTranscriberProvider"},"CartesiaTranscriberModel":{"type":"string","enum":["ink-whisper","ink-2"],"description":"The Cartesia speech-to-text model used for transcription.","title":"CartesiaTranscriberModel"},"CartesiaTranscriberLanguage":{"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"],"description":"The language code used for transcription.","title":"CartesiaTranscriberLanguage"},"CartesiaTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CartesiaTranscriberProvider","description":"Selects Cartesia for speech-to-text transcription."},"model":{"$ref":"#/components/schemas/CartesiaTranscriberModel","description":"The Cartesia speech-to-text model used for transcription."},"language":{"$ref":"#/components/schemas/CartesiaTranscriberLanguage","description":"The language code used for transcription."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Cartesia, including model, language, and fallback settings.","title":"CartesiaTranscriber"},"SonioxTranscriberProvider":{"type":"string","enum":["soniox"],"description":"Selects Soniox for speech-to-text transcription.","title":"SonioxTranscriberProvider"},"SonioxTranscriberModel":{"type":"string","enum":["stt-rt-v4","stt-rt-v5"],"description":"The Soniox model to use for transcription.","title":"SonioxTranscriberModel"},"SonioxTranscriberLanguage":{"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"],"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.","title":"SonioxTranscriberLanguage"},"SonioxTranscriberLanguagesItems":{"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"],"title":"SonioxTranscriberLanguagesItems"},"SonioxTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/SonioxTranscriberProvider","description":"Selects Soniox for speech-to-text transcription."},"model":{"$ref":"#/components/schemas/SonioxTranscriberModel","description":"The Soniox model to use for transcription."},"language":{"$ref":"#/components/schemas/SonioxTranscriberLanguage","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","items":{"$ref":"#/components/schemas/SonioxTranscriberLanguagesItems"},"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."},"languageHintsStrict":{"type":"boolean","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","format":"double","minimum":500,"maximum":3000,"description":"Maximum delay in milliseconds between when the speaker stops and when the endpoint is detected. Lower values mean faster turn-taking but more false endpoints. Range: 500-3000. Default: 500."},"customVocabulary":{"type":"array","items":{"type":"string"},"description":"Custom vocabulary terms to boost recognition accuracy. Useful for brand names, product names, and domain-specific terminology. Maps to Soniox context.terms."},"contextGeneral":{"type":"array","items":{"$ref":"#/components/schemas/SonioxContextGeneralItem"},"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."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"description":"Configuration for transcribing speech during assistant conversations with Soniox, including model, language detection, endpointing, vocabulary, and fallback settings.","title":"SonioxTranscriber"},"XaiTranscriberProvider":{"type":"string","enum":["xai"],"title":"XaiTranscriberProvider"},"XaiTranscriberModel":{"type":"string","enum":["default"],"description":"The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection.","title":"XaiTranscriberModel"},"XaiTranscriberLanguage":{"type":"string","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"],"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.","title":"XaiTranscriberLanguage"},"XaiTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/XaiTranscriberProvider"},"model":{"$ref":"#/components/schemas/XaiTranscriberModel","description":"The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection."},"language":{"$ref":"#/components/schemas/XaiTranscriberLanguage","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."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackTranscriberPlan","description":"This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails."}},"required":["provider"],"title":"XaiTranscriber"},"VapiTranscriberProvider":{"type":"string","enum":["vapi"],"title":"VapiTranscriberProvider"},"VapiTranscriberVersion":{"type":"string","enum":["latest","1"],"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`.","title":"VapiTranscriberVersion"},"VapiTranscriberLanguage":{"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"],"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.","title":"VapiTranscriberLanguage"},"VapiTranscriberLanguages":{"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"],"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.","title":"VapiTranscriberLanguages"},"VapiTranscriberTurnTaking":{"type":"string","enum":["intelligent","manual"],"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`.","title":"VapiTranscriberTurnTaking"},"VapiTranscriber":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/VapiTranscriberProvider"},"version":{"$ref":"#/components/schemas/VapiTranscriberVersion","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`."},"language":{"$ref":"#/components/schemas/VapiTranscriberLanguage","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."},"languages":{"$ref":"#/components/schemas/VapiTranscriberLanguages","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."},"keywords":{"type":"array","items":{"type":"string"},"description":"These are custom keywords/vocabulary to boost recognition of use-case\nspecific words (company names, product names, jargon)."},"turnTaking":{"$ref":"#/components/schemas/VapiTranscriberTurnTaking","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`."}},"required":["provider"],"title":"VapiTranscriber"},"AssistantTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"These are the options for the assistant's transcriber.","title":"AssistantTranscriber"},"OpenAiMessageRole":{"type":"string","enum":["assistant","function","user","system","tool"],"description":"Role associated with the conversation message.","title":"OpenAiMessageRole"},"OpenAIMessage":{"type":"object","properties":{"content":{"type":["string","null"],"maxLength":100000000,"description":"Content of the conversation message."},"role":{"$ref":"#/components/schemas/OpenAiMessageRole","description":"Role associated with the conversation message."}},"required":["content","role"],"description":"A conversation message represented in OpenAI chat format.","title":"OpenAIMessage"},"TextContentType":{"type":"string","enum":["text"],"description":"Selects text as the content type.","title":"TextContentType"},"TextContentLanguage":{"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"],"description":"Language code associated with this text variant.","title":"TextContentLanguage"},"TextContent":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/TextContentType","description":"Selects text as the content type."},"text":{"type":"string","description":"Text spoken or displayed for this content variant."},"language":{"$ref":"#/components/schemas/TextContentLanguage","description":"Language code associated with this text variant."}},"required":["type","text","language"],"description":"Localized text content used as a language-specific message variant.","title":"TextContent"},"ToolMessageStartContentsItems":{"oneOf":[{"$ref":"#/components/schemas/TextContent"}],"title":"ToolMessageStartContentsItems"},"ToolMessageStartType":{"type":"string","enum":["request-start"],"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.","title":"ToolMessageStartType"},"ConditionOperator":{"type":"string","enum":["eq","neq","gt","gte","lt","lte"],"description":"This is the operator you want to use to compare the parameter and value.","title":"ConditionOperator"},"Condition":{"type":"object","properties":{"operator":{"$ref":"#/components/schemas/ConditionOperator","description":"This is the operator you want to use to compare the parameter and value."},"param":{"type":"string","maxLength":1000,"description":"This is the name of the parameter that you want to check."},"value":{"type":"string","maxLength":1000,"description":"This is the value you want to compare against the parameter."}},"required":["operator","param","value"],"description":"Compares a named parameter with a value using the selected comparison operator.","title":"Condition"},"ToolMessageStart":{"type":"object","properties":{"contents":{"type":"array","items":{"$ref":"#/components/schemas/ToolMessageStartContentsItems"},"description":"This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- If you don't provide content for a language, the first item in the array will be automatically translated to the active language at that moment.\n\nThis will override the `content` property."},"type":{"$ref":"#/components/schemas/ToolMessageStartType","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","default":false,"description":"This is an optional boolean that if true, the tool call will only trigger after the message is spoken. Default is false.\n\n@default false"},"content":{"type":"string","maxLength":1000,"description":"This is the content that the assistant says when this message is triggered."},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/Condition"},"description":"This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered."}},"required":["type"],"description":"Message spoken when a tool call starts, with optional language variants, argument conditions, and blocking behavior.","title":"ToolMessageStart"},"ToolMessageCompleteContentsItems":{"oneOf":[{"$ref":"#/components/schemas/TextContent"}],"title":"ToolMessageCompleteContentsItems"},"ToolMessageCompleteType":{"type":"string","enum":["request-complete"],"description":"This message is triggered when the tool call is complete.\n\nThis message is triggered immediately without waiting for your server to respond for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf this message is provided, only this message will be spoken and the model will not be requested to come up with a response. It's an exclusive OR.","title":"ToolMessageCompleteType"},"ToolMessageCompleteRole":{"type":"string","enum":["assistant","system"],"description":"This is optional and defaults to \"assistant\".\n\nWhen role=assistant, `content` is said out loud.\n\nWhen role=system, `content` is passed to the model in a system message. Example:\n    system: default one\n    assistant:\n    user:\n    assistant:\n    user:\n    assistant:\n    user:\n    assistant: tool called\n    tool: your server response\n    <--- system prompt as hint\n    ---> model generates response which is spoken\nThis is useful when you want to provide a hint to the model about what to say next.","title":"ToolMessageCompleteRole"},"ToolMessageComplete":{"type":"object","properties":{"contents":{"type":"array","items":{"$ref":"#/components/schemas/ToolMessageCompleteContentsItems"},"description":"This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- If you don't provide content for a language, the first item in the array will be automatically translated to the active language at that moment.\n\nThis will override the `content` property."},"type":{"$ref":"#/components/schemas/ToolMessageCompleteType","description":"This message is triggered when the tool call is complete.\n\nThis message is triggered immediately without waiting for your server to respond for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf this message is provided, only this message will be spoken and the model will not be requested to come up with a response. It's an exclusive OR."},"role":{"$ref":"#/components/schemas/ToolMessageCompleteRole","description":"This is optional and defaults to \"assistant\".\n\nWhen role=assistant, `content` is said out loud.\n\nWhen role=system, `content` is passed to the model in a system message. Example:\n    system: default one\n    assistant:\n    user:\n    assistant:\n    user:\n    assistant:\n    user:\n    assistant: tool called\n    tool: your server response\n    <--- system prompt as hint\n    ---> model generates response which is spoken\nThis is useful when you want to provide a hint to the model about what to say next."},"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\nThis is ignored if `role` is set to `system`.\n\n@default false"},"content":{"type":"string","maxLength":1000,"description":"This is the content that the assistant says when this message is triggered."},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/Condition"},"description":"This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered."}},"required":["type"],"description":"Message spoken when a tool call completes, with optional language variants, argument conditions, role, and end-call behavior.","title":"ToolMessageComplete"},"ToolMessageFailedContentsItems":{"oneOf":[{"$ref":"#/components/schemas/TextContent"}],"title":"ToolMessageFailedContentsItems"},"ToolMessageFailedType":{"type":"string","enum":["request-failed"],"description":"This message is triggered when the tool call fails.\n\nThis message is never triggered for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf this message is provided, only this message will be spoken and the model will not be requested to come up with a response. It's an exclusive OR.","title":"ToolMessageFailedType"},"ToolMessageFailedRole":{"type":"string","enum":["assistant","system"],"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.","title":"ToolMessageFailedRole"},"ToolMessageFailed":{"type":"object","properties":{"contents":{"type":"array","items":{"$ref":"#/components/schemas/ToolMessageFailedContentsItems"},"description":"This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- If you don't provide content for a language, the first item in the array will be automatically translated to the active language at that moment.\n\nThis will override the `content` property."},"type":{"$ref":"#/components/schemas/ToolMessageFailedType","description":"This message is triggered when the tool call fails.\n\nThis message is never triggered for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf this message is provided, only this message will be spoken and the model will not be requested to come up with a response. It's an exclusive OR."},"role":{"$ref":"#/components/schemas/ToolMessageFailedRole","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."},"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\nThis is ignored if `role` is set to `system`.\n\n@default false"},"content":{"type":"string","maxLength":1000,"description":"This is the content that the assistant says when this message is triggered."},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/Condition"},"description":"This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered."}},"required":["type"],"description":"Message spoken when a tool call fails, with optional language variants, argument conditions, and end-call behavior.","title":"ToolMessageFailed"},"ToolMessageDelayedContentsItems":{"oneOf":[{"$ref":"#/components/schemas/TextContent"}],"title":"ToolMessageDelayedContentsItems"},"ToolMessageDelayedType":{"type":"string","enum":["request-response-delayed"],"description":"This message is triggered when the tool call is delayed. Same timing means variants; different timings mean staged updates.","title":"ToolMessageDelayedType"},"ToolMessageDelayed":{"type":"object","properties":{"contents":{"type":"array","items":{"$ref":"#/components/schemas/ToolMessageDelayedContentsItems"},"description":"This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- If you don't provide content for a language, the first item in the array will be automatically translated to the active language at that moment.\n\nThis will override the `content` property."},"type":{"$ref":"#/components/schemas/ToolMessageDelayedType","description":"This message is triggered when the tool call is delayed. Same timing means variants; different timings mean staged updates."},"timingMilliseconds":{"type":"number","format":"double","minimum":100,"maximum":120000,"description":"The number of milliseconds to wait for the server response before saying this delayed message."},"content":{"type":"string","maxLength":1000,"description":"This is the content that the assistant says when this message is triggered."},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/Condition"},"description":"This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered."}},"required":["type"],"description":"Message spoken when a tool call exceeds a configured response delay, with optional language variants and argument conditions.","title":"ToolMessageDelayed"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod":{"type":"string","enum":["POST","GET","PUT","PATCH","DELETE"],"description":"The HTTP method used for the API request.","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod"},"ToolParameterValue":{"oneOf":[{"type":"string"},{"type":"number","format":"double"},{"type":"boolean"},{"type":"object","additionalProperties":{"description":"Any type"}},{"type":"array","items":{"description":"Any type"}}],"description":"The value of the parameter. Any JSON type. String values support Liquid templates.","title":"ToolParameterValue"},"ToolParameter":{"type":"object","properties":{"key":{"type":"string","description":"This is the key of the parameter."},"value":{"$ref":"#/components/schemas/ToolParameterValue","description":"The value of the parameter. Any JSON type. String values support Liquid templates."}},"required":["key","value"],"description":"Static key-value parameter added to a tool request, with Liquid template support for string values.","title":"ToolParameter"},"JsonSchemaType":{"type":"string","enum":["string","number","integer","boolean","array","object"],"description":"This is the type of output you'd like.\n\n`string`, `number`, `integer`, `boolean` are the primitive types and should be obvious.\n\n`array` and `object` are more interesting and quite powerful. They allow you to define nested structures.\n\nFor `array`, you can define the schema of the items in the array using the `items` property.\n\nFor `object`, you can define the properties of the object using the `properties` property.","title":"JsonSchemaType"},"JsonSchemaFormat":{"type":"string","enum":["date-time","time","date","duration","email","hostname","ipv4","ipv6","uuid"],"description":"This is the format of the string. To pass a regex, use the `pattern` property instead.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat&type-restrictions=string-restrictions","title":"JsonSchemaFormat"},"JsonSchema":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/JsonSchemaType","description":"This is the type of output you'd like.\n\n`string`, `number`, `integer`, `boolean` are the primitive types and should be obvious.\n\n`array` and `object` are more interesting and quite powerful. They allow you to define nested structures.\n\nFor `array`, you can define the schema of the items in the array using the `items` property.\n\nFor `object`, you can define the properties of the object using the `properties` property."},"items":{"$ref":"#/components/schemas/JsonSchema","description":"This is required if the type is \"array\". This is the schema of the items in the array. This is a recursive reference to JsonSchema."},"properties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/JsonSchema"},"description":"This is required if the type is \"object\". This specifies the properties of the object. This is a map of property names to JsonSchema objects."},"description":{"type":"string","description":"This is the description to help the model understand what it needs to output."},"pattern":{"type":"string","description":"This is the pattern of the string. This is a regex that will be used to validate the data in question. To use a common format, use the `format` property instead.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs#supported-properties"},"format":{"$ref":"#/components/schemas/JsonSchemaFormat","description":"This is the format of the string. To pass a regex, use the `pattern` property instead.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat&type-restrictions=string-restrictions"},"required":{"type":"array","items":{"type":"string"},"description":"This is a list of properties that are required.\n\nThis only makes sense if the type is \"object\"."},"enum":{"type":"array","items":{"type":"string"},"description":"This array specifies the allowed values that can be used to restrict the output of the model."},"title":{"type":"string","description":"This is the title of the schema."}},"required":["type"],"description":"JSON Schema definition used to describe structured data for extraction, validation, or model output.","title":"JsonSchema"},"VariableExtractionAlias":{"type":"object","properties":{"key":{"type":"string","pattern":"/^[a-zA-Z][a-zA-Z0-9_]*$/","minLength":1,"maxLength":40,"description":"This is the key of the variable.\n\nThis variable will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the call.\n\nRules:\n- Must start with a letter (a-z, A-Z).\n- Subsequent characters can be letters, numbers, or underscores.\n- Minimum length of 1 and maximum length of 40."},"value":{"type":"string","maxLength":10000,"description":"This is the value of the variable.\n\nThis can reference existing variables, use filters, and perform transformations.\n\nExamples: \"{{name}}\", \"{{customer.email}}\", \"Hello {{name | upcase}}\""}},"required":["key","value"],"description":"Defines an additional Liquid-based variable from values extracted during a call.","title":"VariableExtractionAlias"},"VariableExtractionPlan":{"type":"object","properties":{"schema":{"$ref":"#/components/schemas/JsonSchema","description":"This is the schema to extract.\n\nExamples:\n1. To extract object properties, you can use the following schema:\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"type\": \"string\"\n    },\n    \"age\": {\n      \"type\": \"number\"\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n2. To extract nested properties, you can use the following schema:\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"first\": {\n          \"type\": \"string\"\n        },\n        \"last\": {\n          \"type\": \"string\"\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n3. To extract array items, you can use the following schema:\n```json\n{\n  \"type\": \"array\",\n  \"title\": \"zipCodes\",\n  \"items\": {\n    \"type\": \"string\"\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4. To extract array of objects, you can use the following schema:\n\n```json\n{\n  \"type\": \"array\",\n  \"name\": \"people\",\n  \"items\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      },\n      \"zipCodes\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`."},"aliases":{"type":"array","items":{"$ref":"#/components/schemas/VariableExtractionAlias"},"description":"These are additional variables to create.\n\nThese will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the call.\n\nExample:\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{name}}\"\n    },\n    {\n      \"key\": \"fullName\",\n      \"value\": \"{{firstName}} {{lastName}}\"\n    },\n    {\n      \"key\": \"greeting\",\n      \"value\": \"Hello {{name}}, welcome to {{company}}!\"\n    },\n    {\n      \"key\": \"customerCity\",\n      \"value\": \"{{addresses[0].city}}\"\n    },\n    {\n      \"key\": \"something\",\n      \"value\": \"{{any liquid}}\"\n    }\n  ]\n}\n```\n\nThis will create variables `customerName`, `fullName`, `greeting`, `customerCity`, and `something`. To access these variables, you can reference them as `{{customerName}}`, `{{fullName}}`, `{{greeting}}`, `{{customerCity}}`, and `{{something}}`."}},"description":"Defines structured variables to extract and optional aliases made available during and after a call.","title":"VariableExtractionPlan"},"RegexConditionType":{"type":"string","enum":["regex"],"description":"This is the type discriminator for regex condition","title":"RegexConditionType"},"MessageTargetRole":{"type":"string","enum":["user","assistant"],"description":"This is the role of the message to target.\n\nIf not specified, will find the position in the message history ignoring role (effectively `any`).","title":"MessageTargetRole"},"MessageTarget":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/MessageTargetRole","description":"This is the role of the message to target.\n\nIf not specified, will find the position in the message history ignoring role (effectively `any`)."},"position":{"type":"number","format":"double","description":"This is the position of the message to target.\n- Negative numbers: Count from end (-1 = most recent, -2 = second most recent)\n- 0: First/oldest message in history\n- Positive numbers: Specific position (0-indexed from start)\n\n@default -1 (most recent message)"}},"description":"Selects a conversation message by participant role and position for condition evaluation.","title":"MessageTarget"},"RegexCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/RegexConditionType","description":"This is the type discriminator for regex condition"},"regex":{"type":"string","description":"This is the regular expression pattern to match against message content.\n\nNote:\n- This works by using the RegExp.test method in Node.JS. Eg. /hello/.test(\"hello there\") will return true.\n\nHot tips:\n- In JavaScript, escape \\ when sending the regex pattern. Eg. \"hello\\sthere\" will be sent over the wire as \"hellosthere\". Send \"hello\\\\sthere\" instead.\n- RegExp.test does substring matching, so /cat/.test(\"I love cats\") will return true. To do full string matching, use anchors: /^cat$/ will only match exactly \"cat\".\n- Word boundaries \\b are useful for matching whole words: /\\bcat\\b/ matches \"cat\" but not \"cats\" or \"category\".\n- Use inline flags for portability: (?i) for case insensitive, (?m) for multiline"},"target":{"$ref":"#/components/schemas/MessageTarget","description":"This is the target for messages to check against.\nIf not specified, the condition will run on the last message (position: -1).\nIf role is not specified, it will look at the last message regardless of role.\n@default { position: -1 }"},"negate":{"type":"boolean","description":"This is the flag that when true, the condition matches if the pattern does NOT match.\nUseful for ensuring certain words/phrases are absent.\n\n@default false"}},"required":["type","regex"],"description":"Evaluates whether targeted conversation-message content matches a regular expression.","title":"RegexCondition"},"LiquidConditionType":{"type":"string","enum":["liquid"],"description":"This is the type discriminator for liquid condition","title":"LiquidConditionType"},"LiquidCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/LiquidConditionType","description":"This is the type discriminator for liquid condition"},"liquid":{"type":"string","description":"This is the Liquid template that must return exactly \"true\" or \"false\" as a string.\nThe template is evaluated and the entire output must be either \"true\" or \"false\" - nothing else.\n\nAvailable variables:\n- `messages`: Array of recent messages in OpenAI chat completions format (ChatCompletionMessageParam[])\n  Each message has properties like: role ('user', 'assistant', 'system'), content (string), etc.\n- `now`: Current timestamp in milliseconds (built-in Liquid variable)\n- Any assistant variable values (e.g., `userName`, `accountStatus`)\n\nUseful Liquid filters for messages:\n- `messages | last: 5` - Get the 5 most recent messages\n- `messages | where: 'role', 'user'` - Filter to only user messages\n- `messages | reverse` - Reverse the order of messages"}},"required":["type","liquid"],"description":"Evaluates a Liquid template that must return `true` or `false`.","title":"LiquidCondition"},"GroupConditionType":{"type":"string","enum":["group"],"description":"This is the type discriminator for group condition","title":"GroupConditionType"},"GroupConditionOperator":{"type":"string","enum":["AND","OR"],"description":"This is the logical operator for combining conditions in this group","title":"GroupConditionOperator"},"GroupConditionConditionsItems":{"oneOf":[{"$ref":"#/components/schemas/RegexCondition"},{"$ref":"#/components/schemas/LiquidCondition"},{"$ref":"#/components/schemas/GroupCondition"}],"title":"GroupConditionConditionsItems"},"GroupCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/GroupConditionType","description":"This is the type discriminator for group condition"},"operator":{"$ref":"#/components/schemas/GroupConditionOperator","description":"This is the logical operator for combining conditions in this group"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/GroupConditionConditionsItems"},"description":"This is the list of nested conditions to evaluate.\nSupports recursive nesting of groups for complex logic."}},"required":["type","operator","conditions"],"description":"Combines nested regular-expression, Liquid, or grouped conditions with an `AND` or `OR` operator.","title":"GroupCondition"},"ToolRejectionPlanConditionsItems":{"oneOf":[{"$ref":"#/components/schemas/RegexCondition"},{"$ref":"#/components/schemas/LiquidCondition"},{"$ref":"#/components/schemas/GroupCondition"}],"title":"ToolRejectionPlanConditionsItems"},"ToolRejectionPlan":{"type":"object","properties":{"conditions":{"type":"array","items":{"$ref":"#/components/schemas/ToolRejectionPlanConditionsItems"},"description":"This is the list of conditions that must be evaluated.\n\nUsage:\n- If all conditions match (AND logic), the tool call is rejected.\n- For OR logic at the top level, use a single 'group' condition with operator: 'OR'.\n\n@default [] - Empty array means tool always executes"}},"description":"Conditions evaluated to determine whether a requested tool call should be rejected.","title":"ToolRejectionPlan"},"CreateApiRequestToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["method","url"],"description":"Configuration used to create a reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses.","title":"CreateApiRequestToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType":{"type":"string","enum":["bash_20241022"],"description":"The sub type of tool.","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName":{"type":"string","enum":["bash"],"default":"bash","description":"The name of the tool, fixed to 'bash'","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName"},"CreateBashToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"name":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["subType","name"],"description":"Configuration used to create a tool that executes shell commands in a configured environment.","title":"CreateBashToolDTO"},"CreateCodeToolDtoMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"CreateCodeToolDtoMessagesItems"},"CreateCodeToolDtoType":{"type":"string","enum":["code"],"description":"The type of tool. \"code\" for Code tool.","title":"CreateCodeToolDtoType"},"CodeToolEnvironmentVariable":{"type":"object","properties":{"name":{"type":"string","pattern":"/^[A-Z][A-Z0-9_]*$/","maxLength":64,"description":"Name of the environment variable"},"value":{"type":"string","maxLength":10000,"description":"Value of the environment variable. Supports Liquid templates."}},"required":["name","value"],"description":"An environment variable supplied to code-tool execution, with support for Liquid templates in its value.","title":"CodeToolEnvironmentVariable"},"OpenAiFunctionParametersType":{"type":"string","enum":["object"],"description":"This must be set to 'object'. It instructs the model to return a JSON object containing the function call properties.","title":"OpenAiFunctionParametersType"},"OpenAIFunctionParameters":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/OpenAiFunctionParametersType","description":"This must be set to 'object'. It instructs the model to return a JSON object containing the function call properties."},"properties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/JsonSchema"},"description":"This provides a description of the properties required by the function.\nJSON Schema can be used to specify expectations for each property.\nRefer to [this doc](https://ajv.js.org/json-schema.html#json-data-type) for a comprehensive guide on JSON Schema."},"required":{"type":"array","items":{"type":"string"},"description":"This specifies the properties that are required by the function."}},"required":["type","properties"],"description":"JSON object schema defining the properties accepted by a function and which properties are required.","title":"OpenAIFunctionParameters"},"OpenAIFunction":{"type":"object","properties":{"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,64}$/","maxLength":64,"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."},"strict":{"type":"boolean","default":false,"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"},"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."},"parameters":{"$ref":"#/components/schemas/OpenAIFunctionParameters","description":"These are the parameters the functions accepts, described as a JSON Schema object.\n\nSee the [OpenAI guide](https://platform.openai.com/docs/guides/function-calling) for examples, and the [JSON Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format.\n\nOmitting parameters defines a function with an empty parameter list."}},"required":["name"],"description":"Function definition exposed to a language model, including its name, purpose, parameter schema, and strict-schema behavior.","title":"OpenAIFunction"},"CreateCodeToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/CreateCodeToolDtoMessagesItems"},"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."},"type":{"$ref":"#/components/schemas/CreateCodeToolDtoType","description":"The type of tool. \"code\" for Code tool."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"code":{"type":"string","maxLength":50000,"description":"TypeScript code to execute when the tool is called"},"environmentVariables":{"type":"array","items":{"$ref":"#/components/schemas/CodeToolEnvironmentVariable"},"description":"Environment variables available in code via `env` object"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10"},"credentialId":{"type":"string","description":"Credential ID containing the Val Town API key"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","code"],"description":"Configuration used to create a reusable tool that executes TypeScript code with configured credentials, environment variables, and timeout.","title":"CreateCodeToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType":{"type":"string","enum":["computer_20241022"],"description":"The sub type of tool.","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName":{"type":"string","enum":["computer"],"default":"computer","description":"The name of the tool, fixed to 'computer'","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName"},"CreateComputerToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"name":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["subType","name","displayWidthPx","displayHeightPx"],"description":"Configuration used to create a tool that lets the model interact with a computer display through screen, pointer, and keyboard actions.","title":"CreateComputerToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"CreateDtmfToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that lets an assistant send DTMF keypad tones during a call.","title":"CreateDtmfToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"CreateEndCallToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that lets an assistant end the active call.","title":"CreateEndCallToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"CreateFunctionToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a custom function tool that sends model-generated arguments to a server and returns the result to the assistant.","title":"CreateFunctionToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"CreateGoHighLevelCalendarAvailabilityToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that checks calendar availability in a connected GoHighLevel account.","title":"CreateGoHighLevelCalendarAvailabilityToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"CreateGoHighLevelCalendarEventCreateToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that adds calendar events to a connected GoHighLevel account.","title":"CreateGoHighLevelCalendarEventCreateToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"CreateGoHighLevelContactCreateToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that adds contacts to a connected GoHighLevel account.","title":"CreateGoHighLevelContactCreateToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"CreateGoHighLevelContactGetToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that retrieves contacts from a connected GoHighLevel account.","title":"CreateGoHighLevelContactGetToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"CreateGoogleCalendarCheckAvailabilityToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that checks availability in a connected Google Calendar.","title":"CreateGoogleCalendarCheckAvailabilityToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"CreateGoogleCalendarCreateEventToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that adds events to a connected Google Calendar.","title":"CreateGoogleCalendarCreateEventToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"CreateGoogleSheetsRowAppendToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that appends rows to a connected Google Sheet.","title":"CreateGoogleSheetsRowAppendToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"HandoffDestinationAssistantType":{"type":"string","enum":["assistant"],"description":"Selects an assistant as the handoff destination.","title":"HandoffDestinationAssistantType"},"ContextEngineeringPlanLastNMessagesType":{"type":"string","enum":["lastNMessages"],"description":"Selects inclusion of the most recent messages.","title":"ContextEngineeringPlanLastNMessagesType"},"ContextEngineeringPlanLastNMessages":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ContextEngineeringPlanLastNMessagesType","description":"Selects inclusion of the most recent messages."},"maxMessages":{"type":"number","format":"double","minimum":0,"description":"This is the maximum number of messages to include in the context engineering plan."}},"required":["type","maxMessages"],"description":"Includes a configured number of the most recent messages when constructing context for a handoff.","title":"ContextEngineeringPlanLastNMessages"},"ContextEngineeringPlanNoneType":{"type":"string","enum":["none"],"description":"Selects exclusion of prior conversation messages.","title":"ContextEngineeringPlanNoneType"},"ContextEngineeringPlanNone":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ContextEngineeringPlanNoneType","description":"Selects exclusion of prior conversation messages."}},"required":["type"],"description":"Excludes prior conversation messages when constructing context for a handoff.","title":"ContextEngineeringPlanNone"},"ContextEngineeringPlanAllType":{"type":"string","enum":["all"],"description":"Selects inclusion of all available messages.","title":"ContextEngineeringPlanAllType"},"ContextEngineeringPlanAll":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ContextEngineeringPlanAllType","description":"Selects inclusion of all available messages."}},"required":["type"],"description":"Includes all available messages when constructing context for a handoff.","title":"ContextEngineeringPlanAll"},"ContextEngineeringPlanUserAndAssistantMessagesType":{"type":"string","enum":["userAndAssistantMessages"],"description":"Selects inclusion of user and assistant messages only.","title":"ContextEngineeringPlanUserAndAssistantMessagesType"},"ContextEngineeringPlanUserAndAssistantMessages":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ContextEngineeringPlanUserAndAssistantMessagesType","description":"Selects inclusion of user and assistant messages only."}},"required":["type"],"description":"Includes only user and assistant messages when constructing context for a handoff.","title":"ContextEngineeringPlanUserAndAssistantMessages"},"ContextEngineeringPlanPreviousAssistantMessagesType":{"type":"string","enum":["previousAssistantMessages"],"title":"ContextEngineeringPlanPreviousAssistantMessagesType"},"ContextEngineeringPlanPreviousAssistantMessages":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ContextEngineeringPlanPreviousAssistantMessagesType"}},"required":["type"],"title":"ContextEngineeringPlanPreviousAssistantMessages"},"HandoffDestinationAssistantContextEngineeringPlan":{"oneOf":[{"$ref":"#/components/schemas/ContextEngineeringPlanLastNMessages"},{"$ref":"#/components/schemas/ContextEngineeringPlanNone"},{"$ref":"#/components/schemas/ContextEngineeringPlanAll"},{"$ref":"#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages"},{"$ref":"#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages"}],"description":"This is the plan for manipulating the message context before handing off the call to the next assistant.","title":"HandoffDestinationAssistantContextEngineeringPlan"},"CreateAssistantDtoTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"These are the options for the assistant's transcriber.","title":"CreateAssistantDtoTranscriber"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"McpToolMessagesMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"McpToolMessagesMessagesItems"},"McpToolMessages":{"type":"object","properties":{"name":{"type":"string","description":"The name of the tool from the MCP server."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessagesMessagesItems"},"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."}},"required":["name"],"description":"Per-tool message overrides for a tool discovered through an MCP server.","title":"McpToolMessages"},"McpToolMetadataProtocol":{"type":"string","enum":["sse","shttp"],"description":"This is the protocol used for MCP communication. Defaults to Streamable HTTP.","title":"McpToolMetadataProtocol"},"McpToolMetadata":{"type":"object","properties":{"protocol":{"$ref":"#/components/schemas/McpToolMetadataProtocol","description":"This is the protocol used for MCP communication. Defaults to Streamable HTTP."}},"description":"Protocol metadata used to communicate with an MCP server.","title":"McpToolMetadata"},"CreateMcpToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that connects an assistant to a Model Context Protocol server and exposes its available tools.","title":"CreateMcpToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"KnowledgeBaseProvider":{"type":"string","enum":["google"],"description":"The provider of the knowledge base","title":"KnowledgeBaseProvider"},"KnowledgeBaseModel":{"type":"string","enum":["gemini-3.5-flash","gemini-3.1-flash-lite","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash-thinking-exp","gemini-2.0-pro-exp-02-05","gemini-2.0-flash","gemini-2.0-flash-lite","gemini-2.0-flash-exp","gemini-2.0-flash-realtime-exp","gemini-1.5-flash","gemini-1.5-flash-002","gemini-1.5-pro","gemini-1.5-pro-002","gemini-1.0-pro"],"description":"The model to use for the knowledge base","title":"KnowledgeBaseModel"},"KnowledgeBase":{"type":"object","properties":{"name":{"type":"string","description":"The name of the knowledge base"},"provider":{"$ref":"#/components/schemas/KnowledgeBaseProvider","description":"The provider of the knowledge base"},"model":{"$ref":"#/components/schemas/KnowledgeBaseModel","description":"The model to use for the knowledge base"},"description":{"type":"string","description":"A description of the knowledge base"},"fileIds":{"type":"array","items":{"type":"string"},"description":"The file IDs associated with this knowledge base"}},"required":["name","provider","description","fileIds"],"description":"A knowledge-base configuration, including its provider, model, description, and associated files.","title":"KnowledgeBase"},"CreateQueryToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that searches configured knowledge bases and returns relevant content to the assistant.","title":"CreateQueryToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"CreateSlackSendMessageToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that lets an assistant send a message to Slack.","title":"CreateSlackSendMessageToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"CreateSmsToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that lets an assistant send an SMS message during a call.","title":"CreateSmsToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType":{"type":"string","enum":["text_editor_20241022"],"description":"The sub type of tool.","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName":{"type":"string","enum":["str_replace_editor"],"default":"str_replace_editor","description":"The name of the tool, fixed to 'str_replace_editor'","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName"},"CreateTextEditorToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"name":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["subType","name"],"description":"Configuration used to create a tool that reads and edits text files in a configured environment.","title":"CreateTextEditorToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"CustomMessageContentsItems":{"oneOf":[{"$ref":"#/components/schemas/TextContent"}],"title":"CustomMessageContentsItems"},"CustomMessageType":{"type":"string","enum":["custom-message"],"description":"This is a custom message.","title":"CustomMessageType"},"CustomMessage":{"type":"object","properties":{"contents":{"type":"array","items":{"$ref":"#/components/schemas/CustomMessageContentsItems"},"description":"This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- If you don't provide content for a language, the first item in the array will be automatically translated to the active language at that moment.\n\nThis will override the `content` property."},"type":{"$ref":"#/components/schemas/CustomMessageType","description":"This is a custom message."},"content":{"type":"string","maxLength":1000,"description":"This is the content that the assistant will say when this message is triggered."}},"required":["type"],"description":"A message spoken by the assistant with optional language-specific content variants.","title":"CustomMessage"},"TransferDestinationAssistantMessage":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/CustomMessage"}],"description":"This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- If set to \"\", nothing is spoken. This is useful when you want to silently transfer. This is especially useful when transferring between assistants in a squad. In this scenario, you likely also want to set `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.","title":"TransferDestinationAssistantMessage"},"TransferDestinationAssistantType":{"type":"string","enum":["assistant"],"description":"Selects another assistant as the transfer destination.","title":"TransferDestinationAssistantType"},"TransferMode":{"type":"string","enum":["rolling-history","swap-system-message-in-history"],"title":"TransferMode"},"TransferDestinationAssistant":{"type":"object","properties":{"message":{"$ref":"#/components/schemas/TransferDestinationAssistantMessage","description":"This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- If set to \"\", nothing is spoken. This is useful when you want to silently transfer. This is especially useful when transferring between assistants in a squad. In this scenario, you likely also want to set `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field."},"type":{"$ref":"#/components/schemas/TransferDestinationAssistantType","description":"Selects another assistant as the transfer destination."},"transferMode":{"$ref":"#/components/schemas/TransferMode","description":"This is the mode to use for the transfer. Defaults to `rolling-history`.\n\n- `rolling-history`: This is the default mode. It keeps the entire conversation history and appends the new assistant's system message on transfer.\n\n  Example:\n\n  Pre-transfer:\n    system: assistant1 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    assistant: (destination.message)\n\n  Post-transfer:\n    system: assistant1 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    assistant: (destination.message)\n    system: assistant2 system message\n    assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n- `swap-system-message-in-history`: This replaces the original system message with the new assistant's system message on transfer.\n\n  Example:\n\n  Pre-transfer:\n    system: assistant1 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    assistant: (destination.message)\n\n  Post-transfer:\n    system: assistant2 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    assistant: (destination.message)\n    assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n- `delete-history`: This deletes the entire conversation history on transfer.\n\n  Example:\n\n  Pre-transfer:\n    system: assistant1 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    assistant: (destination.message)\n\n  Post-transfer:\n    system: assistant2 system message\n    assistant: assistant2 first message\n    user: Yes, please\n    assistant: how can i help?\n    user: i need help with my account\n\n- `swap-system-message-in-history-and-remove-transfer-tool-messages`: This replaces the original system message with the new assistant's system message on transfer and removes transfer tool messages from conversation history sent to the LLM.\n\n  Example:\n\n  Pre-transfer:\n    system: assistant1 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    transfer-tool\n    transfer-tool-result\n    assistant: (destination.message)\n\n  Post-transfer:\n    system: assistant2 system message\n    assistant: assistant1 first message\n    user: hey, good morning\n    assistant: how can i help?\n    user: i need help with my account\n    assistant: (destination.message)\n    assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n@default 'rolling-history'"},"assistantName":{"type":"string","description":"This is the assistant to transfer the call to."},"description":{"type":"string","description":"This is the description of the destination, used by the AI to choose when and how to transfer the call."}},"required":["type","assistantName"],"description":"Transfers a call to another assistant by name, with an optional message and assistant-transfer mode.","title":"TransferDestinationAssistant"},"TransferDestinationNumberMessage":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/CustomMessage"}],"description":"This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- If set to \"\", nothing is spoken. This is useful when you want to silently transfer. This is especially useful when transferring between assistants in a squad. In this scenario, you likely also want to set `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.","title":"TransferDestinationNumberMessage"},"TransferDestinationNumberType":{"type":"string","enum":["number"],"description":"Selects a phone number as the transfer destination.","title":"TransferDestinationNumberType"},"TransferPlanMode":{"type":"string","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"],"description":"This configures how transfer is executed and the experience of the destination party receiving the call.\n\nUsage:\n- `blind-transfer`: The assistant forwards the call to the destination without any message or summary.\n- `blind-transfer-add-summary-to-sip-header`: The assistant forwards the call to the destination and adds a SIP header X-Transfer-Summary to the call to include the summary.\n- `warm-transfer-say-message`: The assistant dials the destination, delivers the `message` to the destination party, connects the customer, and leaves the call.\n- `warm-transfer-say-summary`: The assistant dials the destination, provides a summary of the call to the destination party, connects the customer, and leaves the call.\n- `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`: The assistant dials the destination, waits for the operator to speak, delivers the `message` to the destination party, and then connects the customer.\n- `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary`: The assistant dials the destination, waits for the operator to speak, provides a summary of the call to the destination party, and then connects the customer.\n- `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the destination call leg, connects the customer, and leaves the call.\n- `warm-transfer-experimental`: The assistant puts the customer on hold, dials the destination, and if the destination answers (and is human), delivers a message or summary before connecting the customer. If the destination is unreachable or not human (e.g., with voicemail detection), the assistant delivers the `fallbackMessage` to the customer and optionally ends the call.\n\n@default 'blind-transfer'","title":"TransferPlanMode"},"TransferPlanMessage":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/CustomMessage"}],"description":"This is the message the assistant will deliver to the destination party before connecting the customer.\n\nUsage:\n- Used only when `mode` is `blind-transfer-add-summary-to-sip-header`, `warm-transfer-say-message`, `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`, or `warm-transfer-experimental`.","title":"TransferPlanMessage"},"TransferPlanSipVerb":{"type":"string","enum":["refer","bye","dial"],"default":"refer","description":"This specifies the SIP verb to use while transferring the call.\n- 'refer': Uses SIP REFER to transfer the call (default)\n- 'bye': Ends current call with SIP BYE\n- 'dial': Uses SIP DIAL to transfer the call","title":"TransferPlanSipVerb"},"TransferPlanContextEngineeringPlan":{"oneOf":[{"$ref":"#/components/schemas/ContextEngineeringPlanLastNMessages"},{"$ref":"#/components/schemas/ContextEngineeringPlanNone"},{"$ref":"#/components/schemas/ContextEngineeringPlanAll"}],"description":"This is the plan for manipulating the message context before initiating the warm transfer.\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- These messages will automatically be added to the transferAssistant's system message.\n- If 'none', we will not add any transcript to the transferAssistant's system message.\n- If you want to provide your own messages, use transferAssistant.model.messages instead.\n\n@default { type: 'all' }","title":"TransferPlanContextEngineeringPlan"},"SummaryPlanMessagesItems":{"type":"object","properties":{},"title":"SummaryPlanMessagesItems"},"SummaryPlan":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/SummaryPlanMessagesItems"},"description":"These are the messages used to generate the summary.\n\n@default: ```\n[\n  {\n    \"role\": \"system\",\n    \"content\": \"You are an expert note-taker. You will be given a transcript of a call. Summarize the call in 2-3 sentences. DO NOT return anything except the summary.\"\n  },\n  {\n    \"role\": \"user\",\n    \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n  }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{transcript}}: The transcript of the call from `call.artifact.transcript` \n- {{systemPrompt}}: The system prompt of the call from `assistant.model.messages[type=system].content` \n- {{messages}}: The messages of the call from `assistant.model.messages` \n- {{endedReason}}: The ended reason of the call from `call.endedReason`"},"enabled":{"type":"boolean","description":"This determines whether a summary is generated and stored in `call.analysis.summary`. Defaults to true.\n\nUsage:\n- If you want to disable the summary, set this to false.\n\n@default true"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":60,"description":"This is how long the request is tried before giving up. When request times out, `call.analysis.summary` will be empty.\n\nUsage:\n- To guarantee the summary is generated, set this value high. Note, this will delay the end of call report in cases where model is slow to respond.\n\n@default 5 seconds"}},"description":"Controls generation of a post-call summary, including prompt messages, enablement, and request timeout.","title":"SummaryPlan"},"TransferFallbackPlanMessage":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/CustomMessage"}],"description":"This is the message the assistant will deliver to the customer if the transfer fails.","title":"TransferFallbackPlanMessage"},"TransferFallbackPlan":{"type":"object","properties":{"message":{"$ref":"#/components/schemas/TransferFallbackPlanMessage","description":"This is the message the assistant will deliver to the customer if the transfer fails."},"endCallEnabled":{"type":"boolean","default":true,"description":"This controls what happens after delivering the failure message to the customer.\n- true: End the call after delivering the failure message (default)\n- false: Keep the assistant on the call to continue handling the customer's request\n\n@default true"}},"required":["message"],"description":"Controls the message and end-call behavior used when a call transfer fails.","title":"TransferFallbackPlan"},"TransferPlan":{"type":"object","properties":{"mode":{"$ref":"#/components/schemas/TransferPlanMode","description":"This configures how transfer is executed and the experience of the destination party receiving the call.\n\nUsage:\n- `blind-transfer`: The assistant forwards the call to the destination without any message or summary.\n- `blind-transfer-add-summary-to-sip-header`: The assistant forwards the call to the destination and adds a SIP header X-Transfer-Summary to the call to include the summary.\n- `warm-transfer-say-message`: The assistant dials the destination, delivers the `message` to the destination party, connects the customer, and leaves the call.\n- `warm-transfer-say-summary`: The assistant dials the destination, provides a summary of the call to the destination party, connects the customer, and leaves the call.\n- `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`: The assistant dials the destination, waits for the operator to speak, delivers the `message` to the destination party, and then connects the customer.\n- `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary`: The assistant dials the destination, waits for the operator to speak, provides a summary of the call to the destination party, and then connects the customer.\n- `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the destination call leg, connects the customer, and leaves the call.\n- `warm-transfer-experimental`: The assistant puts the customer on hold, dials the destination, and if the destination answers (and is human), delivers a message or summary before connecting the customer. If the destination is unreachable or not human (e.g., with voicemail detection), the assistant delivers the `fallbackMessage` to the customer and optionally ends the call.\n\n@default 'blind-transfer'"},"message":{"$ref":"#/components/schemas/TransferPlanMessage","description":"This is the message the assistant will deliver to the destination party before connecting the customer.\n\nUsage:\n- Used only when `mode` is `blind-transfer-add-summary-to-sip-header`, `warm-transfer-say-message`, `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`, or `warm-transfer-experimental`."},"timeout":{"type":"number","format":"double","minimum":1,"maximum":600,"default":60,"description":"This is the timeout in seconds for the warm-transfer-wait-for-operator-to-speak-first-and-then-say-message/summary\n\n@default 60"},"sipVerb":{"$ref":"#/components/schemas/TransferPlanSipVerb","default":"refer","description":"This specifies the SIP verb to use while transferring the call.\n- 'refer': Uses SIP REFER to transfer the call (default)\n- 'bye': Ends current call with SIP BYE\n- 'dial': Uses SIP DIAL to transfer the call"},"dialTimeout":{"type":"number","format":"double","minimum":1,"maximum":600,"default":60,"description":"This sets the timeout for the dial operation in seconds. This is the duration the call will ring before timing out.\n\nOnly applicable when `sipVerb='dial'`. Not applicable for SIP REFER or BYE.\n\n@default 60"},"holdAudioUrl":{"type":"string","description":"This is the URL to an audio file played while the customer is on hold during transfer.\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- Used when transferring calls to play hold audio for the customer.\n- Must be a publicly accessible URL to an audio file.\n- Supported formats: MP3 and WAV.\n- If not provided, the default hold audio will be used."},"transferCompleteAudioUrl":{"type":"string","description":"This is the URL to an audio file played after the warm transfer message or summary is delivered to the destination party.\nIt can be used to play a custom sound like 'beep' to notify that the transfer is complete.\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- Used when transferring calls to play hold audio for the destination party.\n- Must be a publicly accessible URL to an audio file.\n- Supported formats: MP3 and WAV."},"contextEngineeringPlan":{"$ref":"#/components/schemas/TransferPlanContextEngineeringPlan","description":"This is the plan for manipulating the message context before initiating the warm transfer.\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- These messages will automatically be added to the transferAssistant's system message.\n- If 'none', we will not add any transcript to the transferAssistant's system message.\n- If you want to provide your own messages, use transferAssistant.model.messages instead.\n\n@default { type: 'all' }"},"twiml":{"type":"string","maxLength":4096,"description":"This is the TwiML instructions to execute on the destination call leg before connecting the customer.\n\nUsage:\n- Used only when `mode` is `warm-transfer-twiml`.\n- Supports only `Play`, `Say`, `Gather`, `Hangup` and `Pause` verbs.\n- Maximum length is 4096 characters.\n\nExample:\n```\n<Say voice=\"alice\" language=\"en-US\">Hello, transferring a customer to you.</Say>\n<Pause length=\"2\"/>\n<Say>They called about billing questions.</Say>\n```"},"summaryPlan":{"$ref":"#/components/schemas/SummaryPlan","description":"This is the plan for generating a summary of the call to present to the destination party.\n\nUsage:\n- Used only when `mode` is `blind-transfer-add-summary-to-sip-header` or `warm-transfer-say-summary` or `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary` or `warm-transfer-experimental`."},"sipHeadersInReferToEnabled":{"type":"boolean","description":"This flag includes the sipHeaders from above in the refer to sip uri as url encoded query params.\n\n@default false"},"fallbackPlan":{"$ref":"#/components/schemas/TransferFallbackPlan","description":"This configures the fallback plan when the transfer fails (destination unreachable, busy, or not human).\n\nUsage:\n- Used when `mode` is `warm-transfer-experimental`. If not provided, a default message will be used.\n- Used for SIP cold transfers (`blind-transfer` modes) when transfer outcome detection and fallback\n  are enabled for the organization: on a failed transfer, the assistant speaks `message`, then ends\n  the call or continues with the customer per `endCallEnabled`."}},"required":["mode"],"description":"Controls how a call transfer is executed, including blind and warm transfer modes, dialing and SIP behavior, hold audio, context, summary, and failure handling.","title":"TransferPlan"},"TransferDestinationNumber":{"type":"object","properties":{"message":{"$ref":"#/components/schemas/TransferDestinationNumberMessage","description":"This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- If set to \"\", nothing is spoken. This is useful when you want to silently transfer. This is especially useful when transferring between assistants in a squad. In this scenario, you likely also want to set `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field."},"type":{"$ref":"#/components/schemas/TransferDestinationNumberType","description":"Selects a phone number as the transfer destination."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the phone number to transfer the call to."},"extension":{"type":"string","minLength":1,"maxLength":10,"description":"This is the extension to dial after transferring the call to the `number`."},"callerId":{"type":"string","maxLength":40,"description":"This is the caller ID to use when transferring the call to the `number`.\n\nUsage:\n- If not provided, the caller ID will be the number the call is coming **from**.\n  Example: a customer with number +14151111111 calls in to and the assistant transfers out to +16470000000. +16470000000 will see +14151111111 as the caller.\n  For inbound calls, the caller ID is the customer's number. For outbound calls, the caller ID is the phone number of the assistant.\n- To change this behavior, provide a `callerId`.\n- Set to '{{customer.number}}' to always use the customer's number as the caller ID.\n- Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.\n- Set to any E164 number to always use that number as the caller ID. This needs to be a number that is owned or verified by your Transport provider like Twilio.\n\nFor Twilio, you can read up more here: https://www.twilio.com/docs/voice/twiml/dial#callerid"},"transferPlan":{"$ref":"#/components/schemas/TransferPlan","description":"This configures how transfer is executed and the experience of the destination party receiving the call. Defaults to `blind-transfer`.\n\n@default `transferPlan.mode='blind-transfer'`"},"description":{"type":"string","description":"This is the description of the destination, used by the AI to choose when and how to transfer the call."}},"required":["type","number"],"description":"Transfers a call to a phone number, with optional extension, caller ID, message, transfer plan, and number validation.","title":"TransferDestinationNumber"},"TransferDestinationSipMessage":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/CustomMessage"}],"description":"This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- If set to \"\", nothing is spoken. This is useful when you want to silently transfer. This is especially useful when transferring between assistants in a squad. In this scenario, you likely also want to set `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.","title":"TransferDestinationSipMessage"},"TransferDestinationSipType":{"type":"string","enum":["sip"],"description":"Selects a SIP URI as the transfer destination.","title":"TransferDestinationSipType"},"TransferDestinationSipSipHeaders":{"type":"object","properties":{},"description":"These are custom headers to be added to SIP refer during transfer call.","title":"TransferDestinationSipSipHeaders"},"TransferDestinationSip":{"type":"object","properties":{"message":{"$ref":"#/components/schemas/TransferDestinationSipMessage","description":"This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- If set to \"\", nothing is spoken. This is useful when you want to silently transfer. This is especially useful when transferring between assistants in a squad. In this scenario, you likely also want to set `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field."},"type":{"$ref":"#/components/schemas/TransferDestinationSipType","description":"Selects a SIP URI as the transfer destination."},"sipUri":{"type":"string","description":"This is the SIP URI to transfer the call to."},"callerId":{"type":"string","maxLength":40,"description":"This is the caller ID to use when transferring the call to the `sipUri`.\n\nUsage:\n- If not provided, the caller ID will be determined by the SIP infrastructure.\n- Set to '{{customer.number}}' to always use the customer's number as the caller ID.\n- Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.\n- Set to any E164 number to always use that number as the caller ID.\n\nOnly applicable when `transferPlan.sipVerb='dial'`. Not applicable for SIP REFER."},"transferPlan":{"$ref":"#/components/schemas/TransferPlan","description":"This configures how transfer is executed and the experience of the destination party receiving the call. Defaults to `blind-transfer`.\n\n@default `transferPlan.mode='blind-transfer'`"},"sipHeaders":{"$ref":"#/components/schemas/TransferDestinationSipSipHeaders","description":"These are custom headers to be added to SIP refer during transfer call."},"description":{"type":"string","description":"This is the description of the destination, used by the AI to choose when and how to transfer the call."}},"required":["type","sipUri"],"description":"Transfers a call to a SIP URI, with optional caller ID, headers, message, and transfer plan.","title":"TransferDestinationSip"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationAssistant"},{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"CreateTransferCallToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that transfers the active call to one of its configured destinations.","title":"CreateTransferCallToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb":{"type":"string","enum":["INFO","MESSAGE","NOTIFY"],"description":"The SIP method to send.","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/JsonSchema"}],"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.","title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody"},"CreateSipRequestToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["verb"],"description":"Configuration used to create a tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body.","title":"CreateSipRequestToolDTO"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"CreateVoicemailToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a voicemail-detection tool with optional beep detection for supported calls.","title":"CreateVoicemailToolDTO"},"AnthropicBedrockModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"AnthropicBedrockModelToolsItems"},"ToolRef":{"type":"object","properties":{"toolId":{"type":"string","format":"uuid","description":"This is the unique identifier of the tool whose version is being pinned."},"version":{"type":"string","description":"Public version label of the tool, e.g. \"v3\""}},"required":["toolId","version"],"title":"ToolRef"},"CreateCustomKnowledgeBaseDtoProvider":{"type":"string","enum":["custom-knowledge-base"],"description":"This knowledge base is bring your own knowledge base implementation.","title":"CreateCustomKnowledgeBaseDtoProvider"},"CreateCustomKnowledgeBaseDTO":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDtoProvider","description":"This knowledge base is bring your own knowledge base implementation."},"server":{"$ref":"#/components/schemas/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```"}},"required":["provider","server"],"description":"Configuration for connecting a custom knowledge-base implementation through a customer-hosted server.","title":"CreateCustomKnowledgeBaseDTO"},"AnthropicBedrockModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"AnthropicBedrockModelKnowledgeBase"},"AnthropicBedrockModelProvider":{"type":"string","enum":["anthropic-bedrock"],"description":"The provider identifier for Anthropic via AWS Bedrock.","title":"AnthropicBedrockModelProvider"},"AnthropicBedrockModelModel":{"type":"string","enum":["claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307","claude-3-5-sonnet-20240620","claude-3-5-sonnet-20241022","claude-3-5-haiku-20241022","claude-3-7-sonnet-20250219","claude-opus-4-20250514","claude-opus-4-5-20251101","claude-opus-4-6","claude-sonnet-4-20250514","claude-sonnet-4-5-20250929","claude-sonnet-4-6","claude-haiku-4-5-20251001","global.anthropic.claude-haiku-4-5-20251001-v1:0"],"description":"The specific Anthropic/Claude model that will be used via Bedrock.","title":"AnthropicBedrockModelModel"},"AnthropicThinkingConfigType":{"type":"string","enum":["enabled"],"description":"Enables Anthropic extended thinking.","title":"AnthropicThinkingConfigType"},"AnthropicThinkingConfig":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AnthropicThinkingConfigType","description":"Enables Anthropic extended thinking."},"budgetTokens":{"type":"number","format":"double","minimum":1024,"maximum":100000,"description":"The maximum number of tokens to allocate for thinking.\nMust be between 1024 and 100000 tokens."}},"required":["type","budgetTokens"],"description":"Enables Anthropic extended thinking with a maximum thinking-token budget.","title":"AnthropicThinkingConfig"},"AnthropicBedrockModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/AnthropicBedrockModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/AnthropicBedrockModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/AnthropicBedrockModelProvider","description":"The provider identifier for Anthropic via AWS Bedrock."},"model":{"$ref":"#/components/schemas/AnthropicBedrockModelModel","description":"The specific Anthropic/Claude model that will be used via Bedrock."},"thinking":{"$ref":"#/components/schemas/AnthropicThinkingConfig","description":"Optional configuration for Anthropic's thinking feature.\nOnly applicable for claude-3-7-sonnet-20250219 model.\nIf provided, maxTokens must be greater than thinking.budgetTokens."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with Anthropic models through Amazon Bedrock, including model, prompts, tools, knowledge-base access, reasoning, and generation settings.","title":"AnthropicBedrockModel"},"AnyscaleModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"AnyscaleModelToolsItems"},"AnyscaleModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"AnyscaleModelKnowledgeBase"},"AnyscaleModelProvider":{"type":"string","enum":["anyscale"],"description":"Routes assistant response generation through Anyscale.","title":"AnyscaleModelProvider"},"AnyscaleModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/AnyscaleModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/AnyscaleModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/AnyscaleModelProvider","description":"Routes assistant response generation through Anyscale."},"model":{"type":"string","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with Anyscale, including model, prompts, tools, knowledge-base access, and generation settings.","title":"AnyscaleModel"},"CerebrasModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"CerebrasModelToolsItems"},"CerebrasModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"CerebrasModelKnowledgeBase"},"CerebrasModelModel":{"type":"string","enum":["llama3.1-8b","llama-3.3-70b"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"CerebrasModelModel"},"CerebrasModelProvider":{"type":"string","enum":["cerebras"],"description":"Routes assistant response generation through Cerebras.","title":"CerebrasModelProvider"},"CerebrasModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/CerebrasModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/CerebrasModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/CerebrasModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"provider":{"$ref":"#/components/schemas/CerebrasModelProvider","description":"Routes assistant response generation through Cerebras."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with Cerebras, including model, prompts, tools, knowledge-base access, and generation settings.","title":"CerebrasModel"},"CustomLlmModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"CustomLlmModelToolsItems"},"CustomLlmModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"CustomLlmModelKnowledgeBase"},"CustomLlmModelProvider":{"type":"string","enum":["custom-llm"],"description":"This is the provider that will be used for the model. Any service, including your own server, that is compatible with the OpenAI API can be used.","title":"CustomLlmModelProvider"},"CustomLlmModelMetadataSendMode":{"type":"string","enum":["off","variable","destructured"],"description":"This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`.","title":"CustomLlmModelMetadataSendMode"},"CustomLLMModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/CustomLlmModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/CustomLlmModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/CustomLlmModelProvider","description":"This is the provider that will be used for the model. Any service, including your own server, that is compatible with the OpenAI API can be used."},"metadataSendMode":{"$ref":"#/components/schemas/CustomLlmModelMetadataSendMode","description":"This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`."},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Custom headers to send with requests. These headers can override default OpenAI headers except for Authorization (which should be specified using a custom-llm credential)."},"url":{"type":"string","description":"These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1"},"wordLevelConfidenceEnabled":{"type":"boolean","description":"This determines whether the transcriber's word level confidence is sent in requests to the custom provider. Default is false.\nThis only works for Deepgram transcribers."},"timeoutSeconds":{"type":"number","format":"double","minimum":0,"maximum":300,"description":"This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds."},"model":{"type":"string","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","url","model"],"description":"Configuration for generating assistant responses through a custom language model endpoint, including server URL, headers, metadata, prompts, tools, and generation settings.","title":"CustomLLMModel"},"DeepInfraModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"DeepInfraModelToolsItems"},"DeepInfraModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"DeepInfraModelKnowledgeBase"},"DeepInfraModelProvider":{"type":"string","enum":["deepinfra"],"description":"Routes assistant response generation through DeepInfra.","title":"DeepInfraModelProvider"},"DeepInfraModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/DeepInfraModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/DeepInfraModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/DeepInfraModelProvider","description":"Routes assistant response generation through DeepInfra."},"model":{"type":"string","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with DeepInfra, including model, prompts, tools, knowledge-base access, and generation settings.","title":"DeepInfraModel"},"DeepSeekModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"DeepSeekModelToolsItems"},"DeepSeekModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"DeepSeekModelKnowledgeBase"},"DeepSeekModelModel":{"type":"string","enum":["deepseek-chat","deepseek-reasoner"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"DeepSeekModelModel"},"DeepSeekModelProvider":{"type":"string","enum":["deep-seek"],"description":"Routes assistant response generation through DeepSeek.","title":"DeepSeekModelProvider"},"DeepSeekModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/DeepSeekModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/DeepSeekModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/DeepSeekModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"provider":{"$ref":"#/components/schemas/DeepSeekModelProvider","description":"Routes assistant response generation through DeepSeek."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with DeepSeek, including model, prompts, tools, knowledge-base access, and generation settings.","title":"DeepSeekModel"},"GoogleModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"GoogleModelToolsItems"},"GoogleModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"GoogleModelKnowledgeBase"},"GoogleModelModel":{"type":"string","enum":["gemini-3.5-flash","gemini-3.1-flash-lite","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash-thinking-exp","gemini-2.0-pro-exp-02-05","gemini-2.0-flash","gemini-2.0-flash-lite","gemini-2.0-flash-exp","gemini-2.0-flash-realtime-exp","gemini-1.5-flash","gemini-1.5-flash-002","gemini-1.5-pro","gemini-1.5-pro-002","gemini-1.0-pro"],"description":"This is the Google model that will be used.","title":"GoogleModelModel"},"GoogleModelProvider":{"type":"string","enum":["google"],"description":"Routes assistant response generation through Google.","title":"GoogleModelProvider"},"GeminiMultimodalLivePrebuiltVoiceConfigVoiceName":{"type":"string","enum":["Puck","Charon","Kore","Fenrir","Aoede"],"description":"Prebuilt Gemini voice used for audio output.","title":"GeminiMultimodalLivePrebuiltVoiceConfigVoiceName"},"GeminiMultimodalLivePrebuiltVoiceConfig":{"type":"object","properties":{"voiceName":{"$ref":"#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfigVoiceName","description":"Prebuilt Gemini voice used for audio output."}},"required":["voiceName"],"description":"Selects a prebuilt voice for Gemini Multimodal Live audio output.","title":"GeminiMultimodalLivePrebuiltVoiceConfig"},"GeminiMultimodalLiveVoiceConfig":{"type":"object","properties":{"prebuiltVoiceConfig":{"$ref":"#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfig","description":"Prebuilt voice used for Gemini Multimodal Live speech output."}},"required":["prebuiltVoiceConfig"],"description":"Voice selection configuration for Gemini Multimodal Live.","title":"GeminiMultimodalLiveVoiceConfig"},"GeminiMultimodalLiveSpeechConfig":{"type":"object","properties":{"voiceConfig":{"$ref":"#/components/schemas/GeminiMultimodalLiveVoiceConfig","description":"Voice configuration used for Gemini Multimodal Live speech output."}},"required":["voiceConfig"],"description":"Speech-output configuration for Gemini Multimodal Live.","title":"GeminiMultimodalLiveSpeechConfig"},"GoogleRealtimeConfig":{"type":"object","properties":{"topP":{"type":"number","format":"double","description":"This is the nucleus sampling parameter that controls the cumulative probability of tokens considered during text generation.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."},"topK":{"type":"number","format":"double","description":"This is the top-k sampling parameter that limits the number of highest probability tokens considered during text generation.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."},"presencePenalty":{"type":"number","format":"double","description":"This is the presence penalty parameter that influences the model's likelihood to repeat information by penalizing tokens based on their presence in the text.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."},"frequencyPenalty":{"type":"number","format":"double","description":"This is the frequency penalty parameter that influences the model's likelihood to repeat tokens by penalizing them based on their frequency in the text.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."},"speechConfig":{"$ref":"#/components/schemas/GeminiMultimodalLiveSpeechConfig","description":"This is the speech configuration object that defines the voice settings to be used for the model's speech output.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."}},"description":"Realtime Gemini generation and speech-output settings, including sampling, repetition penalties, and voice configuration.","title":"GoogleRealtimeConfig"},"GoogleModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/GoogleModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/GoogleModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/GoogleModelModel","description":"This is the Google model that will be used."},"provider":{"$ref":"#/components/schemas/GoogleModelProvider","description":"Routes assistant response generation through Google."},"realtimeConfig":{"$ref":"#/components/schemas/GoogleRealtimeConfig","description":"This is the session configuration for the Gemini Flash 2.0 Multimodal Live API.\nOnly applicable if the model `gemini-2.0-flash-realtime-exp` is selected."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with Google, including model, prompts, tools, knowledge-base access, realtime settings, and generation settings.","title":"GoogleModel"},"GroqModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"GroqModelToolsItems"},"GroqModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"GroqModelKnowledgeBase"},"GroqModelModel":{"type":"string","enum":["openai/gpt-oss-20b","openai/gpt-oss-120b","deepseek-r1-distill-llama-70b","llama-3.3-70b-versatile","llama-3.1-405b-reasoning","llama-3.1-8b-instant","llama3-8b-8192","llama3-70b-8192","gemma2-9b-it","moonshotai/kimi-k2-instruct-0905","meta-llama/llama-4-scout-17b-16e-instruct","mistral-saba-24b","compound-beta","compound-beta-mini"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"GroqModelModel"},"GroqModelProvider":{"type":"string","enum":["groq"],"description":"Routes assistant response generation through Groq.","title":"GroqModelProvider"},"GroqModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/GroqModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/GroqModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/GroqModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"provider":{"$ref":"#/components/schemas/GroqModelProvider","description":"Routes assistant response generation through Groq."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with Groq, including model, prompts, tools, knowledge-base access, and generation settings.","title":"GroqModel"},"InflectionAiModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"InflectionAiModelToolsItems"},"InflectionAiModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"InflectionAiModelKnowledgeBase"},"InflectionAiModelModel":{"type":"string","enum":["inflection_3_pi"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"InflectionAiModelModel"},"InflectionAiModelProvider":{"type":"string","enum":["inflection-ai"],"description":"Routes assistant response generation through Inflection AI.","title":"InflectionAiModelProvider"},"InflectionAIModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/InflectionAiModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/InflectionAiModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/InflectionAiModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"provider":{"$ref":"#/components/schemas/InflectionAiModelProvider","description":"Routes assistant response generation through Inflection AI."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with Inflection AI, including model, prompts, tools, knowledge-base access, and generation settings.","title":"InflectionAIModel"},"MinimaxLlmModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"MinimaxLlmModelToolsItems"},"MinimaxLlmModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"MinimaxLlmModelKnowledgeBase"},"MinimaxLlmModelProvider":{"type":"string","enum":["minimax"],"description":"Routes assistant response generation through MiniMax.","title":"MinimaxLlmModelProvider"},"MinimaxLlmModelModel":{"type":"string","enum":["MiniMax-M2.7"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"MinimaxLlmModelModel"},"MinimaxLLMModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/MinimaxLlmModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/MinimaxLlmModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/MinimaxLlmModelProvider","description":"Routes assistant response generation through MiniMax."},"model":{"$ref":"#/components/schemas/MinimaxLlmModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with MiniMax, including model, prompts, tools, knowledge-base access, and generation settings.","title":"MinimaxLLMModel"},"OpenAiModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"OpenAiModelToolsItems"},"OpenAiModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"OpenAiModelKnowledgeBase"},"OpenAiModelProvider":{"type":"string","enum":["openai"],"description":"This is the provider that will be used for the model.","title":"OpenAiModelProvider"},"OpenAiModelModel":{"type":"string","enum":["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5","chat-latest","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.2-chat-latest","gpt-5.1","gpt-5.1-chat-latest","gpt-5","gpt-5-chat-latest","gpt-5-mini","gpt-5-nano","gpt-4.1-2025-04-14","gpt-4.1-mini-2025-04-14","gpt-4.1-nano-2025-04-14","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","chatgpt-4o-latest","o3","o3-mini","o4-mini","o1-mini","o1-mini-2024-09-12","gpt-4o-realtime-preview-2024-10-01","gpt-4o-realtime-preview-2024-12-17","gpt-4o-mini-realtime-preview-2024-12-17","gpt-realtime-2025-08-28","gpt-realtime-mini-2025-12-15","gpt-realtime-2","gpt-4o-mini-2024-07-18","gpt-4o-mini","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-3.5-turbo","gpt-3.5-turbo-0125","gpt-3.5-turbo-1106","gpt-3.5-turbo-16k","gpt-3.5-turbo-0613","gpt-5.6-luna:westus3","gpt-5.6-terra:westus3","gpt-5.6-sol:westus3","gpt-5.4:eastus2","gpt-5.4:swedencentral","gpt-5.4-mini:eastus2","gpt-5.4-mini:swedencentral","gpt-5.4-nano:eastus2","gpt-5.4-nano:swedencentral","gpt-5.2:eastus2","gpt-5.2:swedencentral","gpt-5.1:eastus2","gpt-5.1:swedencentral","gpt-5:eastus2","gpt-5:swedencentral","gpt-5:canadaeast","gpt-5:eastus","gpt-5:westeurope","gpt-5:germanywestcentral","gpt-5:polandcentral","gpt-5:spaincentral","gpt-5-mini:eastus2","gpt-5-mini:swedencentral","gpt-5-mini:westeurope","gpt-5-mini:germanywestcentral","gpt-5-mini:polandcentral","gpt-5-mini:spaincentral","gpt-5-nano:eastus2","gpt-5-nano:swedencentral","gpt-4.1-2025-04-14:westus","gpt-4.1-2025-04-14:eastus2","gpt-4.1-2025-04-14:eastus","gpt-4.1-2025-04-14:westus3","gpt-4.1-2025-04-14:northcentralus","gpt-4.1-2025-04-14:southcentralus","gpt-4.1-2025-04-14:westeurope","gpt-4.1-2025-04-14:germanywestcentral","gpt-4.1-2025-04-14:polandcentral","gpt-4.1-2025-04-14:spaincentral","gpt-4.1-mini-2025-04-14:westus","gpt-4.1-mini-2025-04-14:eastus2","gpt-4.1-mini-2025-04-14:eastus","gpt-4.1-mini-2025-04-14:westus3","gpt-4.1-mini-2025-04-14:northcentralus","gpt-4.1-mini-2025-04-14:southcentralus","gpt-4.1-mini-2025-04-14:westeurope","gpt-4.1-mini-2025-04-14:germanywestcentral","gpt-4.1-mini-2025-04-14:polandcentral","gpt-4.1-mini-2025-04-14:spaincentral","gpt-4.1-nano-2025-04-14:westus","gpt-4.1-nano-2025-04-14:eastus2","gpt-4.1-nano-2025-04-14:westus3","gpt-4.1-nano-2025-04-14:northcentralus","gpt-4.1-nano-2025-04-14:southcentralus","gpt-4o-2024-11-20:swedencentral","gpt-4o-2024-11-20:westus","gpt-4o-2024-11-20:eastus2","gpt-4o-2024-11-20:eastus","gpt-4o-2024-11-20:westus3","gpt-4o-2024-11-20:southcentralus","gpt-4o-2024-11-20:westeurope","gpt-4o-2024-11-20:germanywestcentral","gpt-4o-2024-11-20:polandcentral","gpt-4o-2024-11-20:spaincentral","gpt-4o-2024-08-06:westus","gpt-4o-2024-08-06:westus3","gpt-4o-2024-08-06:eastus","gpt-4o-2024-08-06:eastus2","gpt-4o-2024-08-06:northcentralus","gpt-4o-2024-08-06:southcentralus","gpt-4o-mini-2024-07-18:westus","gpt-4o-mini-2024-07-18:westus3","gpt-4o-mini-2024-07-18:eastus","gpt-4o-mini-2024-07-18:eastus2","gpt-4o-mini-2024-07-18:northcentralus","gpt-4o-mini-2024-07-18:southcentralus","gpt-4o-2024-05-13:eastus2","gpt-4o-2024-05-13:eastus","gpt-4o-2024-05-13:northcentralus","gpt-4o-2024-05-13:southcentralus","gpt-4o-2024-05-13:westus3","gpt-4o-2024-05-13:westus","gpt-4-turbo-2024-04-09:eastus2","gpt-4-0125-preview:eastus","gpt-4-0125-preview:northcentralus","gpt-4-0125-preview:southcentralus","gpt-4-1106-preview:australiaeast","gpt-4-1106-preview:canadaeast","gpt-4-1106-preview:france","gpt-4-1106-preview:india","gpt-4-1106-preview:norway","gpt-4-1106-preview:swedencentral","gpt-4-1106-preview:uk","gpt-4-1106-preview:westus","gpt-4-1106-preview:westus3","gpt-4-0613:canadaeast","gpt-3.5-turbo-0125:canadaeast","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-4.1:australiaeast","gpt-4o:australiaeast","gpt-5.4-mini:australiaeast"],"description":"This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.\n\n@default undefined","title":"OpenAiModelModel"},"OpenAiModelFallbackModelsItems":{"type":"string","enum":["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5","chat-latest","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.2-chat-latest","gpt-5.1","gpt-5.1-chat-latest","gpt-5","gpt-5-chat-latest","gpt-5-mini","gpt-5-nano","gpt-4.1-2025-04-14","gpt-4.1-mini-2025-04-14","gpt-4.1-nano-2025-04-14","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","chatgpt-4o-latest","o3","o3-mini","o4-mini","o1-mini","o1-mini-2024-09-12","gpt-4o-realtime-preview-2024-10-01","gpt-4o-realtime-preview-2024-12-17","gpt-4o-mini-realtime-preview-2024-12-17","gpt-realtime-2025-08-28","gpt-realtime-mini-2025-12-15","gpt-realtime-2","gpt-4o-mini-2024-07-18","gpt-4o-mini","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-3.5-turbo","gpt-3.5-turbo-0125","gpt-3.5-turbo-1106","gpt-3.5-turbo-16k","gpt-3.5-turbo-0613","gpt-5.6-luna:westus3","gpt-5.6-terra:westus3","gpt-5.6-sol:westus3","gpt-5.4:eastus2","gpt-5.4:swedencentral","gpt-5.4-mini:eastus2","gpt-5.4-mini:swedencentral","gpt-5.4-nano:eastus2","gpt-5.4-nano:swedencentral","gpt-5.2:eastus2","gpt-5.2:swedencentral","gpt-5.1:eastus2","gpt-5.1:swedencentral","gpt-5:eastus2","gpt-5:swedencentral","gpt-5:canadaeast","gpt-5:eastus","gpt-5:westeurope","gpt-5:germanywestcentral","gpt-5:polandcentral","gpt-5:spaincentral","gpt-5-mini:eastus2","gpt-5-mini:swedencentral","gpt-5-mini:westeurope","gpt-5-mini:germanywestcentral","gpt-5-mini:polandcentral","gpt-5-mini:spaincentral","gpt-5-nano:eastus2","gpt-5-nano:swedencentral","gpt-4.1-2025-04-14:westus","gpt-4.1-2025-04-14:eastus2","gpt-4.1-2025-04-14:eastus","gpt-4.1-2025-04-14:westus3","gpt-4.1-2025-04-14:northcentralus","gpt-4.1-2025-04-14:southcentralus","gpt-4.1-2025-04-14:westeurope","gpt-4.1-2025-04-14:germanywestcentral","gpt-4.1-2025-04-14:polandcentral","gpt-4.1-2025-04-14:spaincentral","gpt-4.1-mini-2025-04-14:westus","gpt-4.1-mini-2025-04-14:eastus2","gpt-4.1-mini-2025-04-14:eastus","gpt-4.1-mini-2025-04-14:westus3","gpt-4.1-mini-2025-04-14:northcentralus","gpt-4.1-mini-2025-04-14:southcentralus","gpt-4.1-mini-2025-04-14:westeurope","gpt-4.1-mini-2025-04-14:germanywestcentral","gpt-4.1-mini-2025-04-14:polandcentral","gpt-4.1-mini-2025-04-14:spaincentral","gpt-4.1-nano-2025-04-14:westus","gpt-4.1-nano-2025-04-14:eastus2","gpt-4.1-nano-2025-04-14:westus3","gpt-4.1-nano-2025-04-14:northcentralus","gpt-4.1-nano-2025-04-14:southcentralus","gpt-4o-2024-11-20:swedencentral","gpt-4o-2024-11-20:westus","gpt-4o-2024-11-20:eastus2","gpt-4o-2024-11-20:eastus","gpt-4o-2024-11-20:westus3","gpt-4o-2024-11-20:southcentralus","gpt-4o-2024-11-20:westeurope","gpt-4o-2024-11-20:germanywestcentral","gpt-4o-2024-11-20:polandcentral","gpt-4o-2024-11-20:spaincentral","gpt-4o-2024-08-06:westus","gpt-4o-2024-08-06:westus3","gpt-4o-2024-08-06:eastus","gpt-4o-2024-08-06:eastus2","gpt-4o-2024-08-06:northcentralus","gpt-4o-2024-08-06:southcentralus","gpt-4o-mini-2024-07-18:westus","gpt-4o-mini-2024-07-18:westus3","gpt-4o-mini-2024-07-18:eastus","gpt-4o-mini-2024-07-18:eastus2","gpt-4o-mini-2024-07-18:northcentralus","gpt-4o-mini-2024-07-18:southcentralus","gpt-4o-2024-05-13:eastus2","gpt-4o-2024-05-13:eastus","gpt-4o-2024-05-13:northcentralus","gpt-4o-2024-05-13:southcentralus","gpt-4o-2024-05-13:westus3","gpt-4o-2024-05-13:westus","gpt-4-turbo-2024-04-09:eastus2","gpt-4-0125-preview:eastus","gpt-4-0125-preview:northcentralus","gpt-4-0125-preview:southcentralus","gpt-4-1106-preview:australiaeast","gpt-4-1106-preview:canadaeast","gpt-4-1106-preview:france","gpt-4-1106-preview:india","gpt-4-1106-preview:norway","gpt-4-1106-preview:swedencentral","gpt-4-1106-preview:uk","gpt-4-1106-preview:westus","gpt-4-1106-preview:westus3","gpt-4-0613:canadaeast","gpt-3.5-turbo-0125:canadaeast","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-4.1:australiaeast","gpt-4o:australiaeast","gpt-5.4-mini:australiaeast"],"title":"OpenAiModelFallbackModelsItems"},"OpenAiModelToolStrictCompatibilityMode":{"type":"string","enum":["strip-parameters-with-unsupported-validation","strip-unsupported-validation"],"description":"Azure OpenAI doesn't support `maxLength` right now https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/structured-outputs?tabs=python-secure%2Cdotnet-entra-id&pivots=programming-language-csharp#unsupported-type-specific-keywords. Need to strip.\n\n- `strip-parameters-with-unsupported-validation` will strip parameters with unsupported validation.\n- `strip-unsupported-validation` will keep the parameters but strip unsupported validation.\n\n@default `strip-unsupported-validation`","title":"OpenAiModelToolStrictCompatibilityMode"},"OpenAiModelPromptCacheRetention":{"type":"string","enum":["in_memory","24h"],"description":"This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5 series).\n\n- `in_memory`: Default behavior, cache retained in GPU memory only\n- `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local storage\n\nOnly applies to models: gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, chat-latest, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-5.1-codex, gpt-5.1-codex-mini, gpt-5.1-chat-latest, gpt-5, gpt-5-codex, gpt-4.1\n\n@default undefined (uses API default which is 'in_memory')","title":"OpenAiModelPromptCacheRetention"},"OpenAiModelReasoningEffort":{"type":"string","enum":["minimal","none","low","medium","high","xhigh"],"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, model-aware validation limits newly public\nvalues while preserving the existing four-value storage contract.","title":"OpenAiModelReasoningEffort"},"OpenAIModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/OpenAiModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/OpenAiModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/OpenAiModelProvider","description":"This is the provider that will be used for the model."},"model":{"$ref":"#/components/schemas/OpenAiModelModel","description":"This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.\n\n@default undefined"},"fallbackModels":{"type":"array","items":{"$ref":"#/components/schemas/OpenAiModelFallbackModelsItems"},"description":"These are the fallback models that will be used if the primary model fails. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest fallbacks that make sense."},"toolStrictCompatibilityMode":{"$ref":"#/components/schemas/OpenAiModelToolStrictCompatibilityMode","description":"Azure OpenAI doesn't support `maxLength` right now https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/structured-outputs?tabs=python-secure%2Cdotnet-entra-id&pivots=programming-language-csharp#unsupported-type-specific-keywords. Need to strip.\n\n- `strip-parameters-with-unsupported-validation` will strip parameters with unsupported validation.\n- `strip-unsupported-validation` will keep the parameters but strip unsupported validation.\n\n@default `strip-unsupported-validation`"},"promptCacheRetention":{"$ref":"#/components/schemas/OpenAiModelPromptCacheRetention","description":"This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5 series).\n\n- `in_memory`: Default behavior, cache retained in GPU memory only\n- `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local storage\n\nOnly applies to models: gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, chat-latest, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-5.1-codex, gpt-5.1-codex-mini, gpt-5.1-chat-latest, gpt-5, gpt-5-codex, gpt-4.1\n\n@default undefined (uses API default which is 'in_memory')"},"promptCacheKey":{"type":"string","maxLength":64,"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"},"reasoningEffort":{"$ref":"#/components/schemas/OpenAiModelReasoningEffort","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, model-aware validation limits newly public\nvalues while preserving the existing four-value storage contract."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with OpenAI, including model selection, fallback models, prompts, tools, prompt caching, and generation settings.","title":"OpenAIModel"},"OpenRouterModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"OpenRouterModelToolsItems"},"OpenRouterModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"OpenRouterModelKnowledgeBase"},"OpenRouterModelProvider":{"type":"string","enum":["openrouter"],"description":"Routes assistant response generation through OpenRouter.","title":"OpenRouterModelProvider"},"OpenRouterModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/OpenRouterModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/OpenRouterModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/OpenRouterModelProvider","description":"Routes assistant response generation through OpenRouter."},"model":{"type":"string","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses through OpenRouter, including routed model selection, prompts, tools, knowledge-base access, and generation settings.","title":"OpenRouterModel"},"PerplexityAiModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"PerplexityAiModelToolsItems"},"PerplexityAiModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"PerplexityAiModelKnowledgeBase"},"PerplexityAiModelProvider":{"type":"string","enum":["perplexity-ai"],"description":"Routes assistant response generation through Perplexity AI.","title":"PerplexityAiModelProvider"},"PerplexityAIModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/PerplexityAiModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/PerplexityAiModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/PerplexityAiModelProvider","description":"Routes assistant response generation through Perplexity AI."},"model":{"type":"string","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with Perplexity AI, including model, prompts, tools, knowledge-base access, and generation settings.","title":"PerplexityAIModel"},"TogetherAiModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"TogetherAiModelToolsItems"},"TogetherAiModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"TogetherAiModelKnowledgeBase"},"TogetherAiModelProvider":{"type":"string","enum":["together-ai"],"description":"Routes assistant response generation through Together AI.","title":"TogetherAiModelProvider"},"TogetherAIModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/TogetherAiModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/TogetherAiModelKnowledgeBase","description":"These are the options for the knowledge base."},"provider":{"$ref":"#/components/schemas/TogetherAiModelProvider","description":"Routes assistant response generation through Together AI."},"model":{"type":"string","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider","model"],"description":"Configuration for generating assistant responses with Together AI, including model, prompts, tools, knowledge-base access, and generation settings.","title":"TogetherAIModel"},"XaiModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"XaiModelToolsItems"},"XaiModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"XaiModelKnowledgeBase"},"XaiModelModel":{"type":"string","enum":["grok-beta","grok-2","grok-3","grok-4-fast-reasoning","grok-4-fast-non-reasoning","grok-4.20-0309-reasoning","grok-4.20-0309-non-reasoning","grok-4.3"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"XaiModelModel"},"XaiModelProvider":{"type":"string","enum":["xai"],"description":"Routes assistant response generation through xAI.","title":"XaiModelProvider"},"XaiModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/XaiModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/XaiModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/XaiModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"provider":{"$ref":"#/components/schemas/XaiModelProvider","description":"Routes assistant response generation through xAI."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with xAI, including model, prompts, tools, knowledge-base access, and generation settings.","title":"XaiModel"},"VapiModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"VapiModelToolsItems"},"VapiModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"VapiModelKnowledgeBase"},"VapiModelVersion":{"type":"string","enum":["latest","1"],"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`).","title":"VapiModelVersion"},"VapiModelProvider":{"type":"string","enum":["vapi"],"title":"VapiModelProvider"},"ConversationNodeType":{"type":"string","enum":["conversation"],"description":"This is the Conversation node. This can be used to start a conversation with the customer.\n\nThe flow is:\n- Workflow starts the conversation node\n- Model is active with the `prompt` and global context.\n- Model will call a tool to exit this node.\n- Workflow will extract variables from the conversation.\n- Workflow continues.","title":"ConversationNodeType"},"WorkflowOpenAiModelProvider":{"type":"string","enum":["openai"],"description":"This is the provider of the model (`openai`).","title":"WorkflowOpenAiModelProvider"},"WorkflowOpenAiModelModel":{"type":"string","enum":["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5","chat-latest","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.2-chat-latest","gpt-5.1","gpt-5.1-chat-latest","gpt-5","gpt-5-chat-latest","gpt-5-mini","gpt-5-nano","gpt-4.1-2025-04-14","gpt-4.1-mini-2025-04-14","gpt-4.1-nano-2025-04-14","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","chatgpt-4o-latest","o3","o3-mini","o4-mini","o1-mini","o1-mini-2024-09-12","gpt-4o-mini-2024-07-18","gpt-4o-mini","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-3.5-turbo","gpt-3.5-turbo-0125","gpt-3.5-turbo-1106","gpt-3.5-turbo-16k","gpt-3.5-turbo-0613","gpt-5.6-luna:westus3","gpt-5.6-terra:westus3","gpt-5.6-sol:westus3","gpt-5.4:eastus2","gpt-5.4:swedencentral","gpt-5.4-mini:eastus2","gpt-5.4-mini:swedencentral","gpt-5.4-nano:eastus2","gpt-5.4-nano:swedencentral","gpt-5.2:eastus2","gpt-5.2:swedencentral","gpt-5.1:eastus2","gpt-5.1:swedencentral","gpt-5:eastus2","gpt-5:swedencentral","gpt-5:canadaeast","gpt-5:eastus","gpt-5:westeurope","gpt-5:germanywestcentral","gpt-5:polandcentral","gpt-5:spaincentral","gpt-5-mini:eastus2","gpt-5-mini:swedencentral","gpt-5-mini:westeurope","gpt-5-mini:germanywestcentral","gpt-5-mini:polandcentral","gpt-5-mini:spaincentral","gpt-5-nano:eastus2","gpt-5-nano:swedencentral","gpt-4.1-2025-04-14:westus","gpt-4.1-2025-04-14:eastus2","gpt-4.1-2025-04-14:eastus","gpt-4.1-2025-04-14:westus3","gpt-4.1-2025-04-14:northcentralus","gpt-4.1-2025-04-14:southcentralus","gpt-4.1-2025-04-14:westeurope","gpt-4.1-2025-04-14:germanywestcentral","gpt-4.1-2025-04-14:polandcentral","gpt-4.1-2025-04-14:spaincentral","gpt-4.1-mini-2025-04-14:westus","gpt-4.1-mini-2025-04-14:eastus2","gpt-4.1-mini-2025-04-14:eastus","gpt-4.1-mini-2025-04-14:westus3","gpt-4.1-mini-2025-04-14:northcentralus","gpt-4.1-mini-2025-04-14:southcentralus","gpt-4.1-mini-2025-04-14:westeurope","gpt-4.1-mini-2025-04-14:germanywestcentral","gpt-4.1-mini-2025-04-14:polandcentral","gpt-4.1-mini-2025-04-14:spaincentral","gpt-4.1-nano-2025-04-14:westus","gpt-4.1-nano-2025-04-14:eastus2","gpt-4.1-nano-2025-04-14:westus3","gpt-4.1-nano-2025-04-14:northcentralus","gpt-4.1-nano-2025-04-14:southcentralus","gpt-4o-2024-11-20:swedencentral","gpt-4o-2024-11-20:westus","gpt-4o-2024-11-20:eastus2","gpt-4o-2024-11-20:eastus","gpt-4o-2024-11-20:westus3","gpt-4o-2024-11-20:southcentralus","gpt-4o-2024-11-20:westeurope","gpt-4o-2024-11-20:germanywestcentral","gpt-4o-2024-11-20:polandcentral","gpt-4o-2024-11-20:spaincentral","gpt-4o-2024-08-06:westus","gpt-4o-2024-08-06:westus3","gpt-4o-2024-08-06:eastus","gpt-4o-2024-08-06:eastus2","gpt-4o-2024-08-06:northcentralus","gpt-4o-2024-08-06:southcentralus","gpt-4o-mini-2024-07-18:westus","gpt-4o-mini-2024-07-18:westus3","gpt-4o-mini-2024-07-18:eastus","gpt-4o-mini-2024-07-18:eastus2","gpt-4o-mini-2024-07-18:northcentralus","gpt-4o-mini-2024-07-18:southcentralus","gpt-4o-2024-05-13:eastus2","gpt-4o-2024-05-13:eastus","gpt-4o-2024-05-13:northcentralus","gpt-4o-2024-05-13:southcentralus","gpt-4o-2024-05-13:westus3","gpt-4o-2024-05-13:westus","gpt-4-turbo-2024-04-09:eastus2","gpt-4-0125-preview:eastus","gpt-4-0125-preview:northcentralus","gpt-4-0125-preview:southcentralus","gpt-4-1106-preview:australiaeast","gpt-4-1106-preview:canadaeast","gpt-4-1106-preview:france","gpt-4-1106-preview:india","gpt-4-1106-preview:norway","gpt-4-1106-preview:swedencentral","gpt-4-1106-preview:uk","gpt-4-1106-preview:westus","gpt-4-1106-preview:westus3","gpt-4-0613:canadaeast","gpt-3.5-turbo-0125:canadaeast","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-4.1:australiaeast","gpt-4o:australiaeast","gpt-5.4-mini:australiaeast"],"description":"This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.","title":"WorkflowOpenAiModelModel"},"WorkflowOpenAIModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. Message contents support LiquidJS templating with the following variables:\n- `{{transcript}}` or `{{messages}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\n`{{messages}}` is the full message history including tool calls; `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used."},"provider":{"$ref":"#/components/schemas/WorkflowOpenAiModelProvider","description":"This is the provider of the model (`openai`)."},"model":{"$ref":"#/components/schemas/WorkflowOpenAiModelModel","description":"This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model."}},"required":["provider","model"],"description":"Workflow model configuration for OpenAI, including model selection, temperature, and maximum output tokens.","title":"WorkflowOpenAIModel"},"WorkflowAnthropicModelProvider":{"type":"string","enum":["anthropic"],"description":"This is the provider of the model (`anthropic`).","title":"WorkflowAnthropicModelProvider"},"WorkflowAnthropicModelModel":{"type":"string","enum":["claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307","claude-3-5-sonnet-20240620","claude-3-5-sonnet-20241022","claude-3-5-haiku-20241022","claude-3-7-sonnet-20250219","claude-opus-4-20250514","claude-opus-4-5-20251101","claude-opus-4-6","claude-sonnet-4-20250514","claude-sonnet-4-5-20250929","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5-20251001"],"description":"This is the specific model that will be used.","title":"WorkflowAnthropicModelModel"},"WorkflowAnthropicModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. Message contents support LiquidJS templating with the following variables:\n- `{{transcript}}` or `{{messages}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\n`{{messages}}` is the full message history including tool calls; `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used."},"provider":{"$ref":"#/components/schemas/WorkflowAnthropicModelProvider","description":"This is the provider of the model (`anthropic`)."},"model":{"$ref":"#/components/schemas/WorkflowAnthropicModelModel","description":"This is the specific model that will be used."},"thinking":{"$ref":"#/components/schemas/AnthropicThinkingConfig","description":"This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model."}},"required":["provider","model"],"description":"Workflow model configuration for Anthropic, including model selection, thinking, temperature, and maximum output tokens.","title":"WorkflowAnthropicModel"},"WorkflowAnthropicBedrockModelProvider":{"type":"string","enum":["anthropic-bedrock"],"description":"This is the provider of the model (`anthropic-bedrock`).","title":"WorkflowAnthropicBedrockModelProvider"},"WorkflowAnthropicBedrockModelModel":{"type":"string","enum":["claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307","claude-3-5-sonnet-20240620","claude-3-5-sonnet-20241022","claude-3-5-haiku-20241022","claude-3-7-sonnet-20250219","claude-opus-4-20250514","claude-opus-4-5-20251101","claude-opus-4-6","claude-sonnet-4-20250514","claude-sonnet-4-5-20250929","claude-sonnet-4-6","claude-haiku-4-5-20251001","global.anthropic.claude-haiku-4-5-20251001-v1:0"],"description":"This is the specific model that will be used.","title":"WorkflowAnthropicBedrockModelModel"},"WorkflowAnthropicBedrockModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. Message contents support LiquidJS templating with the following variables:\n- `{{transcript}}` or `{{messages}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\n`{{messages}}` is the full message history including tool calls; `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used."},"provider":{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModelProvider","description":"This is the provider of the model (`anthropic-bedrock`)."},"model":{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModelModel","description":"This is the specific model that will be used."},"thinking":{"$ref":"#/components/schemas/AnthropicThinkingConfig","description":"This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model."}},"required":["provider","model"],"description":"Workflow model configuration for Anthropic through Amazon Bedrock, including model selection, thinking, temperature, and maximum output tokens.","title":"WorkflowAnthropicBedrockModel"},"WorkflowGoogleModelProvider":{"type":"string","enum":["google"],"description":"This is the provider of the model (`google`).","title":"WorkflowGoogleModelProvider"},"WorkflowGoogleModelModel":{"type":"string","enum":["gemini-3.5-flash","gemini-3.1-flash-lite","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash-thinking-exp","gemini-2.0-pro-exp-02-05","gemini-2.0-flash","gemini-2.0-flash-lite","gemini-2.0-flash-exp","gemini-2.0-flash-realtime-exp","gemini-1.5-flash","gemini-1.5-flash-002","gemini-1.5-pro","gemini-1.5-pro-002","gemini-1.0-pro"],"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b","title":"WorkflowGoogleModelModel"},"WorkflowGoogleModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. Message contents support LiquidJS templating with the following variables:\n- `{{transcript}}` or `{{messages}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\n`{{messages}}` is the full message history including tool calls; `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used."},"provider":{"$ref":"#/components/schemas/WorkflowGoogleModelProvider","description":"This is the provider of the model (`google`)."},"model":{"$ref":"#/components/schemas/WorkflowGoogleModelModel","description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model."}},"required":["provider","model"],"description":"Workflow model configuration for Google, including model selection, temperature, and maximum output tokens.","title":"WorkflowGoogleModel"},"WorkflowCustomModelProvider":{"type":"string","enum":["custom-llm"],"description":"This is the provider of the model (`custom-llm`).","title":"WorkflowCustomModelProvider"},"WorkflowCustomModelMetadataSendMode":{"type":"string","enum":["off","variable","destructured"],"description":"This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`.","title":"WorkflowCustomModelMetadataSendMode"},"WorkflowCustomModelHeaders":{"type":"object","properties":{},"description":"These are the headers we'll use for the OpenAI client's `headers`.","title":"WorkflowCustomModelHeaders"},"WorkflowCustomModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. Message contents support LiquidJS templating with the following variables:\n- `{{transcript}}` or `{{messages}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\n`{{messages}}` is the full message history including tool calls; `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used."},"provider":{"$ref":"#/components/schemas/WorkflowCustomModelProvider","description":"This is the provider of the model (`custom-llm`)."},"metadataSendMode":{"$ref":"#/components/schemas/WorkflowCustomModelMetadataSendMode","description":"This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`."},"url":{"type":"string","description":"These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1"},"headers":{"$ref":"#/components/schemas/WorkflowCustomModelHeaders","description":"These are the headers we'll use for the OpenAI client's `headers`."},"timeoutSeconds":{"type":"number","format":"double","minimum":20,"maximum":600,"description":"This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds."},"model":{"type":"string","maxLength":100,"description":"This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model."}},"required":["provider","url","model"],"description":"Workflow model configuration for a custom language model endpoint, including URL, headers, metadata delivery, timeout, model, temperature, and maximum output tokens.","title":"WorkflowCustomModel"},"ConversationNodeModel":{"oneOf":[{"$ref":"#/components/schemas/WorkflowOpenAIModel"},{"$ref":"#/components/schemas/WorkflowAnthropicModel"},{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModel"},{"$ref":"#/components/schemas/WorkflowGoogleModel"},{"$ref":"#/components/schemas/WorkflowCustomModel"}],"description":"This is the model for the node.\n\nThis overrides `workflow.model`.","title":"ConversationNodeModel"},"ConversationNodeTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"This is the transcriber for the node.\n\nThis overrides `workflow.transcriber`.","title":"ConversationNodeTranscriber"},"AzureVoiceProvider":{"type":"string","enum":["azure"],"description":"This is the voice provider that will be used.","title":"AzureVoiceProvider"},"AzureVoiceId0":{"type":"string","enum":["andrew","brian","emma"],"title":"AzureVoiceId0"},"AzureVoiceId":{"oneOf":[{"$ref":"#/components/schemas/AzureVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"AzureVoiceId"},"ChunkPlanPunctuationBoundaries":{"type":"string","enum":["。","，",".","!","?",";",")","،","۔","।","॥","|","||",",",":"],"description":"These are the punctuations that are considered valid boundaries for a chunk to be created.\n\nUsage:\n- To increase quality, constrain to fewer boundaries.\n- To decrease latency, enable all.\n\nDefault is automatically set to balance the trade-off between quality and latency based on the provider.","title":"ChunkPlanPunctuationBoundaries"},"ExactReplacementType":{"type":"string","enum":["exact"],"description":"This is the exact replacement type. You can use this to replace a specific word or phrase with a different word or phrase.\n\nUsage:\n- Replace \"hello\" with \"hi\": { type: 'exact', key: 'hello', value: 'hi' }\n- Replace \"good morning\" with \"good day\": { type: 'exact', key: 'good morning', value: 'good day' }\n- Replace a specific name: { type: 'exact', key: 'John Doe', value: 'Jane Smith' }\n- Replace an acronym: { type: 'exact', key: 'AI', value: 'Artificial Intelligence' }\n- Replace a company name with its phonetic pronunciation: { type: 'exact', key: 'Vapi', value: 'Vappy' }","title":"ExactReplacementType"},"ExactReplacement":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ExactReplacementType","description":"This is the exact replacement type. You can use this to replace a specific word or phrase with a different word or phrase.\n\nUsage:\n- Replace \"hello\" with \"hi\": { type: 'exact', key: 'hello', value: 'hi' }\n- Replace \"good morning\" with \"good day\": { type: 'exact', key: 'good morning', value: 'good day' }\n- Replace a specific name: { type: 'exact', key: 'John Doe', value: 'Jane Smith' }\n- Replace an acronym: { type: 'exact', key: 'AI', value: 'Artificial Intelligence' }\n- Replace a company name with its phonetic pronunciation: { type: 'exact', key: 'Vapi', value: 'Vappy' }"},"replaceAllEnabled":{"type":"boolean","default":false,"description":"This option let's you control whether to replace all instances of the key or only the first one. By default, it only replaces the first instance.\nExamples:\n- For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: false }. Before: \"hello world, hello universe\" | After: \"hi world, hello universe\"\n- For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: true }. Before: \"hello world, hello universe\" | After: \"hi world, hi universe\"\n@default false"},"key":{"type":"string","description":"This is the key to replace."},"value":{"type":"string","maxLength":1000,"description":"This is the value that will replace the match."}},"required":["type","key","value"],"description":"Replaces an exact word or phrase before text is sent to a voice provider.","title":"ExactReplacement"},"RegexReplacementType":{"type":"string","enum":["regex"],"description":"This is the regex replacement type. You can use this to replace a word or phrase that matches a pattern.\n\nUsage:\n- Replace all numbers with \"some number\": { type: 'regex', regex: '\\\\d+', value: 'some number' }\n- Replace email addresses with \"[EMAIL]\": { type: 'regex', regex: '\\\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Z|a-z]{2,}\\\\b', value: '[EMAIL]' }\n- Replace phone numbers with a formatted version: { type: 'regex', regex: '(\\\\d{3})(\\\\d{3})(\\\\d{4})', value: '($1) $2-$3' }\n- Replace all instances of \"color\" or \"colour\" with \"hue\": { type: 'regex', regex: 'colou?r', value: 'hue' }\n- Capitalize the first letter of every sentence: { type: 'regex', regex: '(?<=\\\\. |^)[a-z]', value: (match) => match.toUpperCase() }","title":"RegexReplacementType"},"RegexOptionType":{"type":"string","enum":["ignore-case","whole-word","multi-line"],"description":"This is the type of the regex option. Options are:\n- `ignore-case`: Ignores the case of the text being matched. Add\n- `whole-word`: Matches whole words only.\n- `multi-line`: Matches across multiple lines.","title":"RegexOptionType"},"RegexOption":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/RegexOptionType","description":"This is the type of the regex option. Options are:\n- `ignore-case`: Ignores the case of the text being matched. Add\n- `whole-word`: Matches whole words only.\n- `multi-line`: Matches across multiple lines."},"enabled":{"type":"boolean","description":"This is whether to enable the option.\n\n@default false"}},"required":["type","enabled"],"description":"Enables or disables one regular-expression matching option for a text replacement.","title":"RegexOption"},"RegexReplacement":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/RegexReplacementType","description":"This is the regex replacement type. You can use this to replace a word or phrase that matches a pattern.\n\nUsage:\n- Replace all numbers with \"some number\": { type: 'regex', regex: '\\\\d+', value: 'some number' }\n- Replace email addresses with \"[EMAIL]\": { type: 'regex', regex: '\\\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Z|a-z]{2,}\\\\b', value: '[EMAIL]' }\n- Replace phone numbers with a formatted version: { type: 'regex', regex: '(\\\\d{3})(\\\\d{3})(\\\\d{4})', value: '($1) $2-$3' }\n- Replace all instances of \"color\" or \"colour\" with \"hue\": { type: 'regex', regex: 'colou?r', value: 'hue' }\n- Capitalize the first letter of every sentence: { type: 'regex', regex: '(?<=\\\\. |^)[a-z]', value: (match) => match.toUpperCase() }"},"regex":{"type":"string","description":"This is the regex pattern to replace.\n\nNote:\n- This works by using the `string.replace` method in Node.JS. Eg. `\"hello there\".replace(/hello/g, \"hi\")` will return `\"hi there\"`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead."},"options":{"type":"array","items":{"$ref":"#/components/schemas/RegexOption"},"description":"These are the options for the regex replacement. Defaults to all disabled.\n\n@default []"},"value":{"type":"string","maxLength":1000,"description":"This is the value that will replace the match."}},"required":["type","regex","value"],"description":"Replaces text matching a regular expression before it is sent to a voice provider.","title":"RegexReplacement"},"FormatPlanReplacementsItems":{"oneOf":[{"$ref":"#/components/schemas/ExactReplacement"},{"$ref":"#/components/schemas/RegexReplacement"}],"title":"FormatPlanReplacementsItems"},"FormatPlanFormattersEnabled":{"type":"string","enum":["markdown","asterisk","quote","dash","newline","colon","acronym","dollarAmount","email","date","time","distance","unit","percentage","phoneNumber","number","stripAsterisk"],"description":"List of formatters to apply. If not provided, all default formatters will be applied.\nIf provided, only the specified formatters will be applied.\nNote: Some essential formatters like angle bracket removal will always be applied.\n@default undefined","title":"FormatPlanFormattersEnabled"},"FormatPlan":{"type":"object","properties":{"enabled":{"type":"boolean","description":"This determines whether the chunk is formatted before being sent to the voice provider. This helps with enunciation. This includes phone numbers, emails and addresses. Default `true`.\n\nUsage:\n- To rely on the voice provider's formatting logic, set this to `false`.\n\nIf `voice.chunkPlan.enabled` is `false`, this is automatically `false` since there's no chunk to format.\n\n@default true"},"numberToDigitsCutoff":{"type":"number","format":"double","minimum":0,"description":"This is the cutoff after which a number is converted to individual digits instead of being spoken as words.\n\nExample:\n- If cutoff 2025, \"12345\" is converted to \"1 2 3 4 5\" while \"1200\" is converted to \"twelve hundred\".\n\nUsage:\n- If your use case doesn't involve IDs like zip codes, set this to a high value.\n- If your use case involves IDs that are shorter than 5 digits, set this to a lower value.\n\n@default 2025"},"replacements":{"type":"array","items":{"$ref":"#/components/schemas/FormatPlanReplacementsItems"},"description":"These are the custom replacements you can make to the chunk before it is sent to the voice provider.\n\nUsage:\n- To replace a specific word or phrase with a different word or phrase, use the `ExactReplacement` type. Eg. `{ type: 'exact', key: 'hello', value: 'hi' }`\n- To replace a word or phrase that matches a pattern, use the `RegexReplacement` type. Eg. `{ type: 'regex', regex: '\\\\b[a-zA-Z]{5}\\\\b', value: 'hi' }`\n\n@default []"},"formattersEnabled":{"$ref":"#/components/schemas/FormatPlanFormattersEnabled","description":"List of formatters to apply. If not provided, all default formatters will be applied.\nIf provided, only the specified formatters will be applied.\nNote: Some essential formatters like angle bracket removal will always be applied.\n@default undefined"}},"description":"Controls text normalization before voice synthesis, including built-in formatters, number handling, and custom replacements.","title":"FormatPlan"},"ChunkPlan":{"type":"object","properties":{"enabled":{"type":"boolean","description":"This determines whether the model output is chunked before being sent to the voice provider. Default `true`.\n\nUsage:\n- To rely on the voice provider's audio generation logic, set this to `false`.\n- If seeing issues with quality, set this to `true`.\n\nIf disabled, Vapi-provided audio control tokens like <flush /> will not work.\n\n@default true"},"minCharacters":{"type":"number","format":"double","minimum":1,"maximum":80,"description":"This is the minimum number of characters in a chunk.\n\nUsage:\n- To increase quality, set this to a higher value.\n- To decrease latency, set this to a lower value.\n\n@default 30"},"punctuationBoundaries":{"$ref":"#/components/schemas/ChunkPlanPunctuationBoundaries","description":"These are the punctuations that are considered valid boundaries for a chunk to be created.\n\nUsage:\n- To increase quality, constrain to fewer boundaries.\n- To decrease latency, enable all.\n\nDefault is automatically set to balance the trade-off between quality and latency based on the provider."},"formatPlan":{"$ref":"#/components/schemas/FormatPlan","description":"This is the plan for formatting the chunk before it is sent to the voice provider."}},"description":"Controls how model output is split into chunks before voice synthesis, including minimum length, punctuation boundaries, and formatting.","title":"ChunkPlan"},"FallbackAzureVoiceProvider":{"type":"string","enum":["azure"],"description":"This is the voice provider that will be used.","title":"FallbackAzureVoiceProvider"},"FallbackAzureVoiceId0":{"type":"string","enum":["andrew","brian","emma"],"title":"FallbackAzureVoiceId0"},"FallbackAzureVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackAzureVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"FallbackAzureVoiceId"},"FallbackAzureVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackAzureVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackAzureVoiceId","description":"This is the provider-specific ID that will be used."},"speed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"oneOf":{"description":"Any type"}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Azure, including voice selection, speed, chunking, and caching.","title":"FallbackAzureVoice"},"FallbackCartesiaVoiceProvider":{"type":"string","enum":["cartesia"],"description":"This is the voice provider that will be used.","title":"FallbackCartesiaVoiceProvider"},"FallbackCartesiaVoiceModel":{"type":"string","enum":["sonic-3.5","sonic-3.5-2026-05-04","sonic-3","sonic-3-2026-01-12","sonic-3-2025-10-27","sonic-2","sonic-2-2025-06-11","sonic-english","sonic-multilingual","sonic-preview","sonic"],"description":"This is the model that will be used. This is optional and will default to the correct model for the voiceId.","title":"FallbackCartesiaVoiceModel"},"FallbackCartesiaVoiceLanguage":{"type":"string","enum":["ar","bg","bn","cs","da","de","el","en","es","fi","fr","gu","he","hi","hr","hu","id","it","ja","ka","kn","ko","ml","mr","ms","nl","no","pa","pl","pt","ro","ru","sk","sv","ta","te","th","tl","tr","uk","vi","zh"],"description":"This is the language that will be used. This is optional and will default to the correct language for the voiceId.","title":"FallbackCartesiaVoiceLanguage"},"CartesiaSpeedControl0":{"type":"string","enum":["slowest","slow","normal","fast","fastest"],"title":"CartesiaSpeedControl0"},"CartesiaSpeedControl":{"oneOf":[{"$ref":"#/components/schemas/CartesiaSpeedControl0"},{"type":"number","format":"double","minimum":-1,"maximum":1}],"description":"Speaking-speed control expressed as a preset or a value from -1 to 1.","title":"CartesiaSpeedControl"},"CartesiaExperimentalControlsEmotion":{"type":"string","enum":["anger:lowest","anger:low","anger:high","anger:highest","positivity:lowest","positivity:low","positivity:high","positivity:highest","surprise:lowest","surprise:low","surprise:high","surprise:highest","sadness:lowest","sadness:low","sadness:high","sadness:highest","curiosity:lowest","curiosity:low","curiosity:high","curiosity:highest"],"description":"Emotion and intensity applied to the Cartesia voice.","title":"CartesiaExperimentalControlsEmotion"},"CartesiaExperimentalControls":{"type":"object","properties":{"speed":{"$ref":"#/components/schemas/CartesiaSpeedControl","description":"Speaking-speed control expressed as a preset or a value from -1 to 1."},"emotion":{"$ref":"#/components/schemas/CartesiaExperimentalControlsEmotion","description":"Emotion and intensity applied to the Cartesia voice."}},"description":"Cartesia voice controls for speed and emotion.","title":"CartesiaExperimentalControls"},"CartesiaGenerationConfigExperimental":{"type":"object","properties":{"accentLocalization":{"type":"integer","minimum":0,"maximum":1,"default":0,"description":"Toggle accent localization for sonic-3: 0 (disabled, default) or 1 (enabled). When enabled, the voice adapts to match the transcript language accent while preserving vocal characteristics."}},"description":"Cartesia Sonic 3 generation controls, including accent localization.","title":"CartesiaGenerationConfigExperimental"},"CartesiaGenerationConfig":{"type":"object","properties":{"speed":{"type":"number","format":"double","minimum":0.6,"maximum":1.5,"default":1,"description":"Fine-grained speed control for sonic-3. Only available for sonic-3 model."},"volume":{"type":"number","format":"double","minimum":0.5,"maximum":2,"default":1,"description":"Fine-grained volume control for sonic-3. Only available for sonic-3 model."},"experimental":{"$ref":"#/components/schemas/CartesiaGenerationConfigExperimental","description":"Experimental model controls for sonic-3. These are subject to breaking changes."}},"description":"Generation controls for Cartesia Sonic 3 voices, including speed, volume, and accent localization.","title":"CartesiaGenerationConfig"},"FallbackCartesiaVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackCartesiaVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"The ID of the particular voice you want to use."},"model":{"$ref":"#/components/schemas/FallbackCartesiaVoiceModel","description":"This is the model that will be used. This is optional and will default to the correct model for the voiceId."},"language":{"$ref":"#/components/schemas/FallbackCartesiaVoiceLanguage","description":"This is the language that will be used. This is optional and will default to the correct language for the voiceId."},"experimentalControls":{"$ref":"#/components/schemas/CartesiaExperimentalControls","description":"Experimental controls for Cartesia voice generation"},"generationConfig":{"$ref":"#/components/schemas/CartesiaGenerationConfig","description":"Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model."},"pronunciationDictId":{"type":"string","description":"Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for sonic-3 model."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Cartesia, including voice and model selection, language, generation controls, pronunciation dictionaries, chunking, and caching.","title":"FallbackCartesiaVoice"},"FallbackHumeVoiceProvider":{"type":"string","enum":["hume"],"description":"This is the voice provider that will be used.","title":"FallbackHumeVoiceProvider"},"FallbackHumeVoiceModel":{"type":"string","enum":["octave","octave2"],"description":"This is the model that will be used.","title":"FallbackHumeVoiceModel"},"FallbackHumeVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackHumeVoiceProvider","description":"This is the voice provider that will be used."},"model":{"$ref":"#/components/schemas/FallbackHumeVoiceModel","description":"This is the model that will be used."},"voiceId":{"type":"string","description":"The ID of the particular voice you want to use."},"isCustomHumeVoice":{"type":"boolean","description":"Indicates whether the chosen voice is a preset Hume AI voice or a custom voice."},"description":{"type":"string","description":"Natural language instructions describing how the synthesized speech should sound, including but not limited to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent').\n\nIf a Voice is specified in the request, this description serves as acting instructions.\nIf no Voice is specified, a new voice is generated based on this description."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Hume, including model and voice selection, custom voice metadata, chunking, and caching.","title":"FallbackHumeVoice"},"FallbackCustomVoiceProvider":{"type":"string","enum":["custom-voice"],"description":"This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.","title":"FallbackCustomVoiceProvider"},"FallbackCustomVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackCustomVoiceProvider","description":"This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used. This is passed in the voice request payload to identify the voice to use."},"server":{"$ref":"#/components/schemas/Server","description":"This is where the voice request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n  \"message\": {\n    \"type\": \"voice-request\",\n    \"text\": \"Hello, world!\",\n    \"sampleRate\": 24000,\n    ...other metadata about the call...\n  }\n}\n\nResponse Expected: 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```"},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","server"],"description":"Fallback configuration for synthesizing assistant speech through a custom server, including voice selection, server connection, chunking, and caching.","title":"FallbackCustomVoice"},"FallbackDeepgramVoiceProvider":{"type":"string","enum":["deepgram"],"description":"This is the voice provider that will be used.","title":"FallbackDeepgramVoiceProvider"},"FallbackDeepgramVoiceId":{"type":"string","enum":["asteria","luna","stella","athena","hera","orion","arcas","perseus","angus","orpheus","helios","zeus","thalia","andromeda","helena","apollo","arcas","aries","amalthea","asteria","athena","atlas","aurora","callista","cora","cordelia","delia","draco","electra","harmonia","hera","hermes","hyperion","iris","janus","juno","jupiter","luna","mars","minerva","neptune","odysseus","ophelia","orion","orpheus","pandora","phoebe","pluto","saturn","selene","theia","vesta","zeus","celeste","estrella","nestor","sirio","carina","alvaro","diana","aquila","selena","javier","viktoria","kara","fabian","julius","lara","elara","aurelia"],"description":"This is the provider-specific ID that will be used.","title":"FallbackDeepgramVoiceId"},"FallbackDeepgramVoiceModel":{"type":"string","enum":["aura","aura-2"],"description":"This is the model that will be used. Defaults to 'aura-2' when not specified.","title":"FallbackDeepgramVoiceModel"},"FallbackDeepgramVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackDeepgramVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackDeepgramVoiceId","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/FallbackDeepgramVoiceModel","description":"This is the model that will be used. Defaults to 'aura-2' when not specified."},"mipOptOut":{"type":"boolean","default":false,"description":"If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false"},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Deepgram, including voice and model selection, model-improvement preferences, chunking, and caching.","title":"FallbackDeepgramVoice"},"FallbackElevenLabsVoiceId0":{"type":"string","enum":["burt","marissa","andrea","sarah","phillip","steve","joseph","myra","paula","ryan","drew","paul","mrb","matilda","mark"],"title":"FallbackElevenLabsVoiceId0"},"FallbackElevenLabsVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackElevenLabsVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.","title":"FallbackElevenLabsVoiceId"},"FallbackElevenLabsVoiceModel":{"type":"string","enum":["eleven_multilingual_v2","eleven_turbo_v2","eleven_turbo_v2_5","eleven_flash_v2","eleven_flash_v2_5","eleven_monolingual_v1","eleven_v3"],"description":"This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.","title":"FallbackElevenLabsVoiceModel"},"ElevenLabsPronunciationDictionaryLocator":{"type":"object","properties":{"pronunciationDictionaryId":{"type":"string","description":"This is the ID of the pronunciation dictionary to use."},"versionId":{"type":"string","description":"This is the version ID of the pronunciation dictionary to use.\n\nOmit to use the dictionary's latest version."}},"required":["pronunciationDictionaryId"],"description":"Identifies a specific version of an ElevenLabs pronunciation dictionary.","title":"ElevenLabsPronunciationDictionaryLocator"},"FallbackElevenLabsVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"type":"string","enum":["11labs"],"description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackElevenLabsVoiceId","description":"This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library."},"stability":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Defines the stability for voice settings."},"similarityBoost":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Defines the similarity boost for voice settings."},"style":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Defines the style for voice settings."},"useSpeakerBoost":{"type":"boolean","description":"Defines the use speaker boost for voice settings."},"speed":{"type":"number","format":"double","minimum":0.7,"maximum":1.2,"description":"Defines the speed for voice settings."},"optimizeStreamingLatency":{"type":"number","format":"double","minimum":0,"maximum":4,"description":"Defines the optimize streaming latency for voice settings. Defaults to 3."},"enableSsmlParsing":{"type":"boolean","description":"This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false"},"autoMode":{"type":"boolean","description":"Defines the auto mode for voice settings. Defaults to false."},"model":{"$ref":"#/components/schemas/FallbackElevenLabsVoiceModel","description":"This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified."},"language":{"type":"string","description":"This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5 supports language enforcement. For other models, an error will be returned if language code is provided."},"pronunciationDictionaryLocators":{"type":"array","items":{"$ref":"#/components/schemas/ElevenLabsPronunciationDictionaryLocator"},"description":"This is the pronunciation dictionary locators to use."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with ElevenLabs, including voice and model selection, language, voice tuning, streaming, Speech Synthesis Markup Language parsing, pronunciation dictionaries, chunking, and caching.","title":"FallbackElevenLabsVoice"},"FallbackVapiVoiceProvider":{"type":"string","enum":["vapi"],"description":"This is the voice provider that will be used.","title":"FallbackVapiVoiceProvider"},"FallbackVapiVoiceVersion":{"type":"string","enum":["1","2","latest"],"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.","title":"FallbackVapiVoiceVersion"},"FallbackVapiVoiceLanguage":{"type":"string","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"],"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.","title":"FallbackVapiVoiceLanguage"},"VapiPronunciationDictionaryLocatorProvider":{"type":"string","enum":["cartesia","11labs"],"description":"Provider that hosts this pronunciation dictionary","title":"VapiPronunciationDictionaryLocatorProvider"},"VapiPronunciationDictionaryLocator":{"type":"object","properties":{"pronunciationDictId":{"type":"string","description":"The pronunciation dictionary ID"},"versionId":{"type":"string","description":"Version ID (only used by ElevenLabs, ignored for Cartesia)"},"provider":{"$ref":"#/components/schemas/VapiPronunciationDictionaryLocatorProvider","description":"Provider that hosts this pronunciation dictionary"}},"required":["pronunciationDictId"],"description":"Identifies a pronunciation dictionary and optional version used for voice synthesis.","title":"VapiPronunciationDictionaryLocator"},"FallbackVapiVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackVapiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"The voice to use: a built-in Vapi voice name, or a cloned voice id (used with version 2)."},"version":{"$ref":"#/components/schemas/FallbackVapiVoiceVersion","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."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":2,"default":1,"description":"This is the speed multiplier that will be used.\n\n@default 1"},"language":{"$ref":"#/components/schemas/FallbackVapiVoiceLanguage","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."},"pronunciationDictionary":{"type":"array","items":{"$ref":"#/components/schemas/VapiPronunciationDictionaryLocator"},"description":"List of pronunciation dictionary locators for custom word pronunciations."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Vapi, including voice selection, speed, pronunciation dictionary, chunking, and caching.","title":"FallbackVapiVoice"},"FallbackLmntVoiceProvider":{"type":"string","enum":["lmnt"],"description":"This is the voice provider that will be used.","title":"FallbackLmntVoiceProvider"},"FallbackLmntVoiceId0":{"type":"string","enum":["amy","ansel","autumn","ava","brandon","caleb","cassian","chloe","dalton","daniel","dustin","elowen","evander","huxley","james","juniper","kennedy","lauren","leah","lily","lucas","magnus","miles","morgan","natalie","nathan","noah","nyssa","oliver","paige","ryan","sadie","sophie","stella","terrence","tyler","vesper","violet","warrick","zain","zeke","zoe"],"title":"FallbackLmntVoiceId0"},"FallbackLMNTVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackLmntVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"FallbackLMNTVoiceId"},"FallbackLmntVoiceLanguage":{"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","auto"],"description":"Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.","title":"FallbackLmntVoiceLanguage"},"FallbackLMNTVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackLmntVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackLMNTVoiceId","description":"This is the provider-specific ID that will be used."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":2,"description":"This is the speed multiplier that will be used."},"language":{"$ref":"#/components/schemas/FallbackLmntVoiceLanguage","description":"Two letter ISO 639-1 language code. Use \"auto\" for auto-detection."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with LMNT, including voice selection, language, speed, chunking, and caching.","title":"FallbackLMNTVoice"},"FallbackOpenAiVoiceProvider":{"type":"string","enum":["openai"],"description":"This is the voice provider that will be used.","title":"FallbackOpenAiVoiceProvider"},"FallbackOpenAiVoiceId0":{"type":"string","enum":["alloy","echo","fable","onyx","nova","shimmer","marin","cedar"],"title":"FallbackOpenAiVoiceId0"},"FallbackOpenAIVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackOpenAiVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models.","title":"FallbackOpenAIVoiceId"},"FallbackOpenAiVoiceModel":{"type":"string","enum":["tts-1","tts-1-hd","gpt-4o-mini-tts"],"description":"This is the model that will be used for text-to-speech.","title":"FallbackOpenAiVoiceModel"},"FallbackOpenAIVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackOpenAiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackOpenAIVoiceId","description":"This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models."},"model":{"$ref":"#/components/schemas/FallbackOpenAiVoiceModel","description":"This is the model that will be used for text-to-speech."},"instructions":{"type":"string","maxLength":10000,"description":"This is a prompt that allows you to control the voice of your generated audio.\nDoes not work with 'tts-1' or 'tts-1-hd' models."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":4,"description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with OpenAI, including voice and model selection, delivery instructions, speed, chunking, and caching.","title":"FallbackOpenAIVoice"},"FallbackPlayHtVoiceProvider":{"type":"string","enum":["playht"],"description":"This is the voice provider that will be used.","title":"FallbackPlayHtVoiceProvider"},"FallbackPlayHtVoiceId0":{"type":"string","enum":["jennifer","melissa","will","chris","matt","jack","ruby","davis","donna","michael"],"title":"FallbackPlayHtVoiceId0"},"FallbackPlayHTVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackPlayHtVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"FallbackPlayHTVoiceId"},"FallbackPlayHtVoiceEmotion":{"type":"string","enum":["female_happy","female_sad","female_angry","female_fearful","female_disgust","female_surprised","male_happy","male_sad","male_angry","male_fearful","male_disgust","male_surprised"],"description":"An emotion to be applied to the speech.","title":"FallbackPlayHtVoiceEmotion"},"FallbackPlayHtVoiceModel":{"type":"string","enum":["PlayHT2.0","PlayHT2.0-turbo","Play3.0-mini","PlayDialog"],"description":"Playht voice model/engine to use.","title":"FallbackPlayHtVoiceModel"},"FallbackPlayHtVoiceLanguage":{"type":"string","enum":["afrikaans","albanian","amharic","arabic","bengali","bulgarian","catalan","croatian","czech","danish","dutch","english","french","galician","german","greek","hebrew","hindi","hungarian","indonesian","italian","japanese","korean","malay","mandarin","polish","portuguese","russian","serbian","spanish","swedish","tagalog","thai","turkish","ukrainian","urdu","xhosa"],"description":"The language to use for the speech.","title":"FallbackPlayHtVoiceLanguage"},"FallbackPlayHTVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackPlayHtVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackPlayHTVoiceId","description":"This is the provider-specific ID that will be used."},"speed":{"type":"number","format":"double","minimum":0.1,"maximum":5,"description":"This is the speed multiplier that will be used."},"temperature":{"type":"number","format":"double","minimum":0.1,"maximum":2,"description":"A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the model's default temperature will be used. The temperature parameter controls variance. Lower temperatures result in more predictable results, higher temperatures allow each run to vary more, so the voice may sound less like the baseline voice."},"emotion":{"$ref":"#/components/schemas/FallbackPlayHtVoiceEmotion","description":"An emotion to be applied to the speech."},"voiceGuidance":{"type":"number","format":"double","minimum":1,"maximum":6,"description":"A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other voices."},"styleGuidance":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"A number between 1 and 30. Use lower numbers to to reduce how strong your chosen emotion will be. Higher numbers will create a very emotional performance."},"textGuidance":{"type":"number","format":"double","minimum":1,"maximum":2,"description":"A number between 1 and 2. This number influences how closely the generated speech adheres to the input text. Use lower values to create more fluid speech, but with a higher chance of deviating from the input text. Higher numbers will make the generated speech more accurate to the input text, ensuring that the words spoken align closely with the provided text."},"model":{"$ref":"#/components/schemas/FallbackPlayHtVoiceModel","description":"Playht voice model/engine to use."},"language":{"$ref":"#/components/schemas/FallbackPlayHtVoiceLanguage","description":"The language to use for the speech."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with PlayHT, including voice and model selection, language, emotion and style guidance, chunking, and caching.","title":"FallbackPlayHTVoice"},"FallbackWellSaidVoiceProvider":{"type":"string","enum":["wellsaid"],"description":"This is the voice provider that will be used.","title":"FallbackWellSaidVoiceProvider"},"FallbackWellSaidVoiceModel":{"type":"string","enum":["caruso","legacy"],"description":"This is the model that will be used.","title":"FallbackWellSaidVoiceModel"},"FallbackWellSaidVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackWellSaidVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"The WellSaid speaker ID to synthesize."},"model":{"$ref":"#/components/schemas/FallbackWellSaidVoiceModel","description":"This is the model that will be used."},"enableSsml":{"type":"boolean","description":"Enables limited SSML translation for input text."},"libraryIds":{"type":"array","items":{"type":"string"},"description":"Array of library IDs to use for voice synthesis."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with WellSaid, including voice and model selection, Speech Synthesis Markup Language support, voice libraries, chunking, and caching.","title":"FallbackWellSaidVoice"},"FallbackRimeAiVoiceProvider":{"type":"string","enum":["rime-ai"],"description":"This is the voice provider that will be used.","title":"FallbackRimeAiVoiceProvider"},"FallbackRimeAiVoiceId0":{"type":"string","enum":["cove","moon","wildflower","eva","amber","maya","lagoon","breeze","helen","joy","marsh","creek","cedar","alpine","summit","nicholas","tyler","colin","hank","thunder","astra","eucalyptus","moraine","peak","tundra","mesa_extra","talon","marlu","glacier","falcon","luna","celeste","estelle","andromeda","esther","lyra","lintel","oculus","vespera","transom","bond","arcade","atrium","cupola","fern","sirius","orion","masonry","albion","parapet"],"description":"Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions.","title":"FallbackRimeAiVoiceId0"},"FallbackRimeAIVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackRimeAiVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"FallbackRimeAIVoiceId"},"FallbackRimeAiVoiceModel":{"type":"string","enum":["arcana","mistv2","mist"],"description":"This is the model that will be used. Defaults to 'arcana' when not specified.","title":"FallbackRimeAiVoiceModel"},"FallbackRimeAiVoiceLanguage":{"type":"string","enum":["en","es","de","fr","ar","hi","ja","he","pt","ta","si"],"description":"Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.","title":"FallbackRimeAiVoiceLanguage"},"FallbackRimeAIVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackRimeAiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackRimeAIVoiceId","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/FallbackRimeAiVoiceModel","description":"This is the model that will be used. Defaults to 'arcana' when not specified."},"speed":{"type":"number","format":"double","minimum":0.1,"description":"This is the speed multiplier that will be used."},"pauseBetweenBrackets":{"type":"boolean","description":"This is a flag that controls whether to add slight pauses using angle brackets. Example: \"Hi. <200> I'd love to have a conversation with you.\" adds a 200ms pause between the first and second sentences."},"phonemizeBetweenBrackets":{"type":"boolean","description":"This is a flag that controls whether text inside brackets should be phonemized (converted to phonetic pronunciation) - Example: \"{h'El.o} World\" will pronounce \"Hello\" as expected."},"reduceLatency":{"type":"boolean","description":"This is a flag that controls whether to optimize for reduced latency in streaming. https://docs.rime.ai/api-reference/endpoint/websockets#param-reduce-latency"},"inlineSpeedAlpha":{"type":"string","description":"This is a string that allows inline speed control using alpha notation. https://docs.rime.ai/api-reference/endpoint/websockets#param-inline-speed-alpha"},"language":{"$ref":"#/components/schemas/FallbackRimeAiVoiceLanguage","description":"Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Rime AI, including voice and model selection, language, speed, pauses, phonemization, latency, chunking, and caching.","title":"FallbackRimeAIVoice"},"FallbackSmallestAiVoiceProvider":{"type":"string","enum":["smallest-ai"],"description":"This is the voice provider that will be used.","title":"FallbackSmallestAiVoiceProvider"},"FallbackSmallestAiVoiceId0":{"type":"string","enum":["emily","jasmine","arman","james","mithali","aravind","raj","diya","raman","ananya","isha","william","aarav","monika","niharika","deepika","raghav","kajal","radhika","mansi","nisha","saurabh","pooja","saina","sanya"],"title":"FallbackSmallestAiVoiceId0"},"FallbackSmallestAIVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackSmallestAiVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"FallbackSmallestAIVoiceId"},"FallbackSmallestAiVoiceModel":{"type":"string","enum":["lightning"],"description":"Smallest AI voice model to use. Defaults to 'lightning' when not specified.","title":"FallbackSmallestAiVoiceModel"},"FallbackSmallestAIVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackSmallestAiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackSmallestAIVoiceId","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/FallbackSmallestAiVoiceModel","description":"Smallest AI voice model to use. Defaults to 'lightning' when not specified."},"speed":{"type":"number","format":"double","description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Smallest AI, including voice and model selection, speed, chunking, and caching.","title":"FallbackSmallestAIVoice"},"FallbackTavusVoiceProvider":{"type":"string","enum":["tavus"],"description":"This is the voice provider that will be used.","title":"FallbackTavusVoiceProvider"},"FallbackTavusVoiceVoiceId0":{"type":"string","enum":["r52da2535a"],"title":"FallbackTavusVoiceVoiceId0"},"FallbackTavusVoiceVoiceId":{"oneOf":[{"$ref":"#/components/schemas/FallbackTavusVoiceVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"FallbackTavusVoiceVoiceId"},"TavusConversationProperties":{"type":"object","properties":{"maxCallDuration":{"type":"number","format":"double","description":"The maximum duration of the call in seconds. The default `maxCallDuration` is 3600 seconds (1 hour).\nOnce the time limit specified by this parameter has been reached, the conversation will automatically shut down."},"participantLeftTimeout":{"type":"number","format":"double","description":"The duration in seconds after which the call will be automatically shut down once the last participant leaves."},"participantAbsentTimeout":{"type":"number","format":"double","description":"Starting from conversation creation, the duration in seconds after which the call will be automatically shut down if no participant joins the call.\nDefault is 300 seconds (5 minutes)."},"enableRecording":{"type":"boolean","description":"If true, the user will be able to record the conversation."},"enableTranscription":{"type":"boolean","description":"If true, the user will be able to transcribe the conversation.\nYou can find more instructions on displaying transcriptions if you are using your custom DailyJS components here.\nYou need to have an event listener on Daily that listens for `app-messages`."},"applyGreenscreen":{"type":"boolean","description":"If true, the background will be replaced with a greenscreen (RGB values: `[0, 255, 155]`).\nYou can use WebGL on the frontend to make the greenscreen transparent or change its color."},"language":{"type":"string","description":"The language of the conversation. Please provide the **full language name**, not the two-letter code.\nIf you are using your own TTS voice, please ensure it supports the language you provide.\nIf you are using a stock replica or default persona, please note that only ElevenLabs and Cartesia supported languages are available.\nYou can find a full list of supported languages for Cartesia here, for ElevenLabs here, and for PlayHT here."},"recordingS3BucketName":{"type":"string","description":"The name of the S3 bucket where the recording will be stored."},"recordingS3BucketRegion":{"type":"string","description":"The region of the S3 bucket where the recording will be stored."},"awsAssumeRoleArn":{"type":"string","description":"The ARN of the role that will be assumed to access the S3 bucket."}},"description":"Tavus conversation behavior and media settings, including duration, participant timeouts, recording, transcription, background, language, and recording storage.","title":"TavusConversationProperties"},"FallbackTavusVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackTavusVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackTavusVoiceVoiceId","description":"This is the provider-specific ID that will be used."},"personaId":{"type":"string","description":"This is the unique identifier for the persona that the replica will use in the conversation."},"callbackUrl":{"type":"string","description":"This is the url that will receive webhooks with updates regarding the conversation state."},"conversationName":{"type":"string","description":"This is the name for the conversation."},"conversationalContext":{"type":"string","description":"This is the context that will be appended to any context provided in the persona, if one is provided."},"customGreeting":{"type":"string","description":"This is the custom greeting that the replica will give once a participant joines the conversation."},"properties":{"$ref":"#/components/schemas/TavusConversationProperties","description":"These are optional properties used to customize the conversation."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for using Tavus as the assistant's voice provider, including persona, callback, context, greeting, conversation properties, chunking, and caching.","title":"FallbackTavusVoice"},"FallbackNeuphonicVoiceProvider":{"type":"string","enum":["neuphonic"],"description":"This is the voice provider that will be used.","title":"FallbackNeuphonicVoiceProvider"},"FallbackNeuphonicVoiceModel":{"type":"string","enum":["neu_hq","neu_fast"],"description":"This is the model that will be used. Defaults to 'neu_fast' if not specified.","title":"FallbackNeuphonicVoiceModel"},"FallbackNeuphonicVoiceLanguage":{"type":"object","properties":{},"description":"This is the language (ISO 639-1) that is enforced for the model.","title":"FallbackNeuphonicVoiceLanguage"},"FallbackNeuphonicVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackNeuphonicVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/FallbackNeuphonicVoiceModel","description":"This is the model that will be used. Defaults to 'neu_fast' if not specified."},"language":{"$ref":"#/components/schemas/FallbackNeuphonicVoiceLanguage","description":"This is the language (ISO 639-1) that is enforced for the model."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":2,"description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId","language"],"description":"Fallback configuration for synthesizing assistant speech with Neuphonic, including voice and model selection, language, speed, chunking, and caching.","title":"FallbackNeuphonicVoice"},"FallbackSesameVoiceProvider":{"type":"string","enum":["sesame"],"description":"This is the voice provider that will be used.","title":"FallbackSesameVoiceProvider"},"FallbackSesameVoiceModel":{"type":"string","enum":["csm-1b"],"description":"This is the model that will be used.","title":"FallbackSesameVoiceModel"},"FallbackSesameVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackSesameVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/FallbackSesameVoiceModel","description":"This is the model that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId","model"],"description":"Fallback configuration for synthesizing assistant speech with Sesame, including voice and model selection, chunking, and caching.","title":"FallbackSesameVoice"},"FallbackInworldVoiceProvider":{"type":"string","enum":["inworld"],"description":"This is the voice provider that will be used.","title":"FallbackInworldVoiceProvider"},"FallbackInworldVoiceVoiceId":{"type":"string","enum":["Alex","Ashley","Craig","Deborah","Dennis","Edward","Elizabeth","Hades","Julia","Pixie","Mark","Olivia","Priya","Ronald","Sarah","Shaun","Theodore","Timothy","Wendy","Dominus","Hana","Clive","Carter","Blake","Luna","Yichen","Xiaoyin","Xinyi","Jing","Erik","Katrien","Lennart","Lore","Alain","Hélène","Mathieu","Étienne","Johanna","Josef","Gianni","Orietta","Asuka","Satoshi","Hyunwoo","Minji","Seojun","Yoona","Szymon","Wojciech","Heitor","Maitê","Diego","Lupita","Miguel","Rafael","Svetlana","Elena","Dmitry","Nikolai","Riya","Manoj","Yael","Oren","Nour","Omar"],"description":"Available voices by language:\n• en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya, Ronald, Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar","title":"FallbackInworldVoiceVoiceId"},"FallbackInworldVoiceModel":{"type":"string","enum":["inworld-tts-1"],"default":"inworld-tts-1","description":"This is the model that will be used.","title":"FallbackInworldVoiceModel"},"FallbackInworldVoiceLanguageCode":{"type":"string","enum":["en","zh","ko","nl","fr","es","ja","de","it","pl","pt","ru","hi","he","ar"],"default":"en","description":"Language code for Inworld TTS synthesis","title":"FallbackInworldVoiceLanguageCode"},"FallbackInworldVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackInworldVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackInworldVoiceVoiceId","description":"Available voices by language:\n• en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya, Ronald, Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar"},"model":{"$ref":"#/components/schemas/FallbackInworldVoiceModel","default":"inworld-tts-1","description":"This is the model that will be used."},"languageCode":{"$ref":"#/components/schemas/FallbackInworldVoiceLanguageCode","default":"en","description":"Language code for Inworld TTS synthesis"},"temperature":{"type":"number","format":"double","minimum":0.1,"maximum":2,"default":1.1,"description":"A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the model's default temperature of 1.1 will be used. The temperature parameter controls variance.\nHigher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details."},"speakingRate":{"type":"number","format":"double","minimum":0.5,"maximum":1.5,"default":1,"description":"A floating point number between 0.5, inclusive, and 1.5, inclusive. If equal to null or not provided, the model's default speaking speed of 1.0 will be used.\nValues above 0.8 are recommended for higher quality.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Fallback configuration for synthesizing assistant speech with Inworld, including voice and model selection, language, temperature, speaking rate, chunking, and caching.","title":"FallbackInworldVoice"},"FallbackXaiVoiceProvider":{"type":"string","enum":["xai"],"description":"This is the voice provider that will be used.","title":"FallbackXaiVoiceProvider"},"FallbackXaiVoiceVoiceId":{"type":"string","enum":["eve","ara","rex","sal","leo"],"description":"Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.","title":"FallbackXaiVoiceVoiceId"},"FallbackXaiVoiceLanguage":{"type":"string","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","description":"BCP-47 language code for xAI TTS synthesis.","title":"FallbackXaiVoiceLanguage"},"FallbackXaiVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackXaiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackXaiVoiceVoiceId","description":"Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted."},"language":{"$ref":"#/components/schemas/FallbackXaiVoiceLanguage","default":"en","description":"BCP-47 language code for xAI TTS synthesis."},"speed":{"type":"number","format":"double","minimum":0.7,"maximum":1.5,"default":1.1,"description":"Speed multiplier for xAI TTS synthesis."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"title":"FallbackXaiVoice"},"FallbackMicrosoftVoiceProvider":{"type":"string","enum":["microsoft"],"description":"This is the voice provider that will be used.","title":"FallbackMicrosoftVoiceProvider"},"FallbackMicrosoftVoiceVoiceId":{"type":"string","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"],"description":"MAI-Voice-2 voice ID. Built-in voices listed in enum.","title":"FallbackMicrosoftVoiceVoiceId"},"FallbackMicrosoftVoiceStyle":{"type":"string","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"],"description":"Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.","title":"FallbackMicrosoftVoiceStyle"},"FallbackMicrosoftVoiceRole":{"type":"string","enum":["Girl","Boy","YoungAdultFemale","YoungAdultMale","OlderAdultFemale","OlderAdultMale","SeniorFemale","SeniorMale"],"description":"Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.","title":"FallbackMicrosoftVoiceRole"},"FallbackMicrosoftVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/FallbackMicrosoftVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/FallbackMicrosoftVoiceVoiceId","description":"MAI-Voice-2 voice ID. Built-in voices listed in enum."},"style":{"$ref":"#/components/schemas/FallbackMicrosoftVoiceStyle","description":"Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral."},"styleDegree":{"type":"number","format":"double","minimum":0.01,"maximum":2,"default":1,"description":"Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set."},"role":{"$ref":"#/components/schemas/FallbackMicrosoftVoiceRole","description":"Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise."},"speed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"title":"FallbackMicrosoftVoice"},"FallbackPlanVoicesItems":{"oneOf":[{"$ref":"#/components/schemas/FallbackAzureVoice"},{"$ref":"#/components/schemas/FallbackCartesiaVoice"},{"$ref":"#/components/schemas/FallbackHumeVoice"},{"$ref":"#/components/schemas/FallbackCustomVoice"},{"$ref":"#/components/schemas/FallbackDeepgramVoice"},{"$ref":"#/components/schemas/FallbackElevenLabsVoice"},{"$ref":"#/components/schemas/FallbackVapiVoice"},{"$ref":"#/components/schemas/FallbackLMNTVoice"},{"$ref":"#/components/schemas/FallbackOpenAIVoice"},{"$ref":"#/components/schemas/FallbackPlayHTVoice"},{"$ref":"#/components/schemas/FallbackWellSaidVoice"},{"$ref":"#/components/schemas/FallbackRimeAIVoice"},{"$ref":"#/components/schemas/FallbackSmallestAIVoice"},{"$ref":"#/components/schemas/FallbackTavusVoice"},{"$ref":"#/components/schemas/FallbackNeuphonicVoice"},{"$ref":"#/components/schemas/FallbackSesameVoice"},{"$ref":"#/components/schemas/FallbackInworldVoice"},{"$ref":"#/components/schemas/FallbackXaiVoice"},{"$ref":"#/components/schemas/FallbackMicrosoftVoice"}],"title":"FallbackPlanVoicesItems"},"FallbackPlan":{"type":"object","properties":{"voices":{"type":"array","items":{"$ref":"#/components/schemas/FallbackPlanVoicesItems"},"description":"This is the list of voices to fallback to in the event that the primary voice provider fails."}},"required":["voices"],"description":"Lists backup voice configurations that can be used if the primary voice provider fails.","title":"FallbackPlan"},"AzureVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/AzureVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/AzureVoiceId","description":"This is the provider-specific ID that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"speed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"This is the speed multiplier that will be used."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Azure, including voice selection, speed, chunking, caching, and fallback settings.","title":"AzureVoice"},"CartesiaVoiceProvider":{"type":"string","enum":["cartesia"],"description":"This is the voice provider that will be used.","title":"CartesiaVoiceProvider"},"CartesiaVoiceModel":{"type":"string","enum":["sonic-3.5","sonic-3.5-2026-05-04","sonic-3","sonic-3-2026-01-12","sonic-3-2025-10-27","sonic-2","sonic-2-2025-06-11","sonic-english","sonic-multilingual","sonic-preview","sonic"],"description":"This is the model that will be used. This is optional and will default to the correct model for the voiceId.","title":"CartesiaVoiceModel"},"CartesiaVoiceLanguage":{"type":"string","enum":["ar","bg","bn","cs","da","de","el","en","es","fi","fr","gu","he","hi","hr","hu","id","it","ja","ka","kn","ko","ml","mr","ms","nl","no","pa","pl","pt","ro","ru","sk","sv","ta","te","th","tl","tr","uk","vi","zh"],"description":"This is the language that will be used. This is optional and will default to the correct language for the voiceId.","title":"CartesiaVoiceLanguage"},"CartesiaVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/CartesiaVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"The ID of the particular voice you want to use."},"model":{"$ref":"#/components/schemas/CartesiaVoiceModel","description":"This is the model that will be used. This is optional and will default to the correct model for the voiceId."},"language":{"$ref":"#/components/schemas/CartesiaVoiceLanguage","description":"This is the language that will be used. This is optional and will default to the correct language for the voiceId."},"experimentalControls":{"$ref":"#/components/schemas/CartesiaExperimentalControls","description":"Experimental controls for Cartesia voice generation"},"generationConfig":{"$ref":"#/components/schemas/CartesiaGenerationConfig","description":"Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model."},"pronunciationDictId":{"type":"string","description":"Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for sonic-3 model."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Cartesia, including voice and model selection, language, generation controls, pronunciation dictionaries, chunking, caching, and fallback settings.","title":"CartesiaVoice"},"CustomVoiceProvider":{"type":"string","enum":["custom-voice"],"description":"This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.","title":"CustomVoiceProvider"},"CustomVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/CustomVoiceProvider","description":"This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used. This is passed in the voice request payload to identify the voice to use."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"server":{"$ref":"#/components/schemas/Server","description":"This is where the voice request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n  \"message\": {\n    \"type\": \"voice-request\",\n    \"text\": \"Hello, world!\",\n    \"sampleRate\": 24000,\n    ...other metadata about the call...\n  }\n}\n\nResponse Expected: 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```"},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","server"],"description":"Configuration for synthesizing assistant speech through a custom server, including voice selection, server connection, chunking, caching, and fallback settings.","title":"CustomVoice"},"DeepgramVoiceProvider":{"type":"string","enum":["deepgram"],"description":"This is the voice provider that will be used.","title":"DeepgramVoiceProvider"},"DeepgramVoiceId":{"type":"string","enum":["asteria","luna","stella","athena","hera","orion","arcas","perseus","angus","orpheus","helios","zeus","thalia","andromeda","helena","apollo","arcas","aries","amalthea","asteria","athena","atlas","aurora","callista","cora","cordelia","delia","draco","electra","harmonia","hera","hermes","hyperion","iris","janus","juno","jupiter","luna","mars","minerva","neptune","odysseus","ophelia","orion","orpheus","pandora","phoebe","pluto","saturn","selene","theia","vesta","zeus","celeste","estrella","nestor","sirio","carina","alvaro","diana","aquila","selena","javier","viktoria","kara","fabian","julius","lara","elara","aurelia"],"description":"This is the provider-specific ID that will be used.","title":"DeepgramVoiceId"},"DeepgramVoiceModel":{"type":"string","enum":["aura","aura-2"],"description":"This is the model that will be used. Defaults to 'aura-2' when not specified.","title":"DeepgramVoiceModel"},"DeepgramVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/DeepgramVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/DeepgramVoiceId","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/DeepgramVoiceModel","description":"This is the model that will be used. Defaults to 'aura-2' when not specified."},"mipOptOut":{"type":"boolean","default":false,"description":"If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false"},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Deepgram, including voice and model selection, model-improvement preferences, chunking, caching, and fallback settings.","title":"DeepgramVoice"},"ElevenLabsVoiceId0":{"type":"string","enum":["burt","marissa","andrea","sarah","phillip","steve","joseph","myra","paula","ryan","drew","paul","mrb","matilda","mark"],"title":"ElevenLabsVoiceId0"},"ElevenLabsVoiceId":{"oneOf":[{"$ref":"#/components/schemas/ElevenLabsVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.","title":"ElevenLabsVoiceId"},"ElevenLabsVoiceModel":{"type":"string","enum":["eleven_multilingual_v2","eleven_turbo_v2","eleven_turbo_v2_5","eleven_flash_v2","eleven_flash_v2_5","eleven_monolingual_v1","eleven_v3"],"description":"This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.","title":"ElevenLabsVoiceModel"},"ElevenLabsVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"type":"string","enum":["11labs"],"description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/ElevenLabsVoiceId","description":"This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library."},"stability":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Defines the stability for voice settings."},"similarityBoost":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Defines the similarity boost for voice settings."},"style":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Defines the style for voice settings."},"useSpeakerBoost":{"type":"boolean","description":"Defines the use speaker boost for voice settings."},"speed":{"type":"number","format":"double","minimum":0.7,"maximum":1.2,"description":"Defines the speed for voice settings."},"optimizeStreamingLatency":{"type":"number","format":"double","minimum":0,"maximum":4,"description":"Defines the optimize streaming latency for voice settings. Defaults to 3."},"enableSsmlParsing":{"type":"boolean","description":"This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false"},"autoMode":{"type":"boolean","description":"Defines the auto mode for voice settings. Defaults to false."},"model":{"$ref":"#/components/schemas/ElevenLabsVoiceModel","description":"This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified."},"language":{"type":"string","description":"This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5 supports language enforcement. For other models, an error will be returned if language code is provided."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"pronunciationDictionaryLocators":{"type":"array","items":{"$ref":"#/components/schemas/ElevenLabsPronunciationDictionaryLocator"},"description":"This is the pronunciation dictionary locators to use."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with ElevenLabs, including voice and model selection, language, voice tuning, streaming, Speech Synthesis Markup Language parsing, pronunciation dictionaries, chunking, caching, and fallback settings.","title":"ElevenLabsVoice"},"HumeVoiceProvider":{"type":"string","enum":["hume"],"description":"This is the voice provider that will be used.","title":"HumeVoiceProvider"},"HumeVoiceModel":{"type":"string","enum":["octave","octave2"],"description":"This is the model that will be used.","title":"HumeVoiceModel"},"HumeVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/HumeVoiceProvider","description":"This is the voice provider that will be used."},"model":{"$ref":"#/components/schemas/HumeVoiceModel","description":"This is the model that will be used."},"voiceId":{"type":"string","description":"The ID of the particular voice you want to use."},"isCustomHumeVoice":{"type":"boolean","description":"Indicates whether the chosen voice is a preset Hume AI voice or a custom voice."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"description":{"type":"string","description":"Natural language instructions describing how the synthesized speech should sound, including but not limited to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent').\n\nIf a Voice is specified in the request, this description serves as acting instructions.\nIf no Voice is specified, a new voice is generated based on this description."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Hume, including model and voice selection, custom voice metadata, chunking, caching, and fallback settings.","title":"HumeVoice"},"LmntVoiceProvider":{"type":"string","enum":["lmnt"],"description":"This is the voice provider that will be used.","title":"LmntVoiceProvider"},"LmntVoiceId0":{"type":"string","enum":["amy","ansel","autumn","ava","brandon","caleb","cassian","chloe","dalton","daniel","dustin","elowen","evander","huxley","james","juniper","kennedy","lauren","leah","lily","lucas","magnus","miles","morgan","natalie","nathan","noah","nyssa","oliver","paige","ryan","sadie","sophie","stella","terrence","tyler","vesper","violet","warrick","zain","zeke","zoe"],"title":"LmntVoiceId0"},"LMNTVoiceId":{"oneOf":[{"$ref":"#/components/schemas/LmntVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"LMNTVoiceId"},"LmntVoiceLanguage":{"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","auto"],"description":"Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.","title":"LmntVoiceLanguage"},"LMNTVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/LmntVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/LMNTVoiceId","description":"This is the provider-specific ID that will be used."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":2,"description":"This is the speed multiplier that will be used."},"language":{"$ref":"#/components/schemas/LmntVoiceLanguage","description":"Two letter ISO 639-1 language code. Use \"auto\" for auto-detection."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with LMNT, including voice selection, language, speed, chunking, caching, and fallback settings.","title":"LMNTVoice"},"NeuphonicVoiceProvider":{"type":"string","enum":["neuphonic"],"description":"This is the voice provider that will be used.","title":"NeuphonicVoiceProvider"},"NeuphonicVoiceModel":{"type":"string","enum":["neu_hq","neu_fast"],"description":"This is the model that will be used. Defaults to 'neu_fast' if not specified.","title":"NeuphonicVoiceModel"},"NeuphonicVoiceLanguage":{"type":"object","properties":{},"description":"This is the language (ISO 639-1) that is enforced for the model.","title":"NeuphonicVoiceLanguage"},"NeuphonicVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/NeuphonicVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/NeuphonicVoiceModel","description":"This is the model that will be used. Defaults to 'neu_fast' if not specified."},"language":{"$ref":"#/components/schemas/NeuphonicVoiceLanguage","description":"This is the language (ISO 639-1) that is enforced for the model."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":2,"description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId","language"],"description":"Configuration for synthesizing assistant speech with Neuphonic, including voice and model selection, language, speed, chunking, caching, and fallback settings.","title":"NeuphonicVoice"},"OpenAiVoiceProvider":{"type":"string","enum":["openai"],"description":"This is the voice provider that will be used.","title":"OpenAiVoiceProvider"},"OpenAiVoiceId0":{"type":"string","enum":["alloy","echo","fable","onyx","nova","shimmer","marin","cedar"],"title":"OpenAiVoiceId0"},"OpenAIVoiceId":{"oneOf":[{"$ref":"#/components/schemas/OpenAiVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models.","title":"OpenAIVoiceId"},"OpenAiVoiceModel":{"type":"string","enum":["tts-1","tts-1-hd","gpt-4o-mini-tts"],"description":"This is the model that will be used for text-to-speech.","title":"OpenAiVoiceModel"},"OpenAIVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/OpenAiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/OpenAIVoiceId","description":"This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models."},"model":{"$ref":"#/components/schemas/OpenAiVoiceModel","description":"This is the model that will be used for text-to-speech."},"instructions":{"type":"string","maxLength":10000,"description":"This is a prompt that allows you to control the voice of your generated audio.\nDoes not work with 'tts-1' or 'tts-1-hd' models."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":4,"description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with OpenAI, including voice and model selection, delivery instructions, speed, chunking, caching, and fallback settings.","title":"OpenAIVoice"},"PlayHtVoiceProvider":{"type":"string","enum":["playht"],"description":"This is the voice provider that will be used.","title":"PlayHtVoiceProvider"},"PlayHtVoiceId0":{"type":"string","enum":["jennifer","melissa","will","chris","matt","jack","ruby","davis","donna","michael"],"title":"PlayHtVoiceId0"},"PlayHTVoiceId":{"oneOf":[{"$ref":"#/components/schemas/PlayHtVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"PlayHTVoiceId"},"PlayHtVoiceEmotion":{"type":"string","enum":["female_happy","female_sad","female_angry","female_fearful","female_disgust","female_surprised","male_happy","male_sad","male_angry","male_fearful","male_disgust","male_surprised"],"description":"An emotion to be applied to the speech.","title":"PlayHtVoiceEmotion"},"PlayHtVoiceModel":{"type":"string","enum":["PlayHT2.0","PlayHT2.0-turbo","Play3.0-mini","PlayDialog"],"description":"Playht voice model/engine to use.","title":"PlayHtVoiceModel"},"PlayHtVoiceLanguage":{"type":"string","enum":["afrikaans","albanian","amharic","arabic","bengali","bulgarian","catalan","croatian","czech","danish","dutch","english","french","galician","german","greek","hebrew","hindi","hungarian","indonesian","italian","japanese","korean","malay","mandarin","polish","portuguese","russian","serbian","spanish","swedish","tagalog","thai","turkish","ukrainian","urdu","xhosa"],"description":"The language to use for the speech.","title":"PlayHtVoiceLanguage"},"PlayHTVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/PlayHtVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/PlayHTVoiceId","description":"This is the provider-specific ID that will be used."},"speed":{"type":"number","format":"double","minimum":0.1,"maximum":5,"description":"This is the speed multiplier that will be used."},"temperature":{"type":"number","format":"double","minimum":0.1,"maximum":2,"description":"A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the model's default temperature will be used. The temperature parameter controls variance. Lower temperatures result in more predictable results, higher temperatures allow each run to vary more, so the voice may sound less like the baseline voice."},"emotion":{"$ref":"#/components/schemas/PlayHtVoiceEmotion","description":"An emotion to be applied to the speech."},"voiceGuidance":{"type":"number","format":"double","minimum":1,"maximum":6,"description":"A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other voices."},"styleGuidance":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"A number between 1 and 30. Use lower numbers to to reduce how strong your chosen emotion will be. Higher numbers will create a very emotional performance."},"textGuidance":{"type":"number","format":"double","minimum":1,"maximum":2,"description":"A number between 1 and 2. This number influences how closely the generated speech adheres to the input text. Use lower values to create more fluid speech, but with a higher chance of deviating from the input text. Higher numbers will make the generated speech more accurate to the input text, ensuring that the words spoken align closely with the provided text."},"model":{"$ref":"#/components/schemas/PlayHtVoiceModel","description":"Playht voice model/engine to use."},"language":{"$ref":"#/components/schemas/PlayHtVoiceLanguage","description":"The language to use for the speech."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with PlayHT, including voice and model selection, language, emotion and style guidance, chunking, caching, and fallback settings.","title":"PlayHTVoice"},"WellSaidVoiceProvider":{"type":"string","enum":["wellsaid"],"description":"This is the voice provider that will be used.","title":"WellSaidVoiceProvider"},"WellSaidVoiceModel":{"type":"string","enum":["caruso","legacy"],"description":"This is the model that will be used.","title":"WellSaidVoiceModel"},"WellSaidVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/WellSaidVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"The WellSaid speaker ID to synthesize."},"model":{"$ref":"#/components/schemas/WellSaidVoiceModel","description":"This is the model that will be used."},"enableSsml":{"type":"boolean","description":"Enables limited SSML translation for input text."},"libraryIds":{"type":"array","items":{"type":"string"},"description":"Array of library IDs to use for voice synthesis."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with WellSaid, including voice and model selection, Speech Synthesis Markup Language support, voice libraries, chunking, caching, and fallback settings.","title":"WellSaidVoice"},"RimeAiVoiceProvider":{"type":"string","enum":["rime-ai"],"description":"This is the voice provider that will be used.","title":"RimeAiVoiceProvider"},"RimeAiVoiceId0":{"type":"string","enum":["cove","moon","wildflower","eva","amber","maya","lagoon","breeze","helen","joy","marsh","creek","cedar","alpine","summit","nicholas","tyler","colin","hank","thunder","astra","eucalyptus","moraine","peak","tundra","mesa_extra","talon","marlu","glacier","falcon","luna","celeste","estelle","andromeda","esther","lyra","lintel","oculus","vespera","transom","bond","arcade","atrium","cupola","fern","sirius","orion","masonry","albion","parapet"],"description":"Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions.","title":"RimeAiVoiceId0"},"RimeAIVoiceId":{"oneOf":[{"$ref":"#/components/schemas/RimeAiVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"RimeAIVoiceId"},"RimeAiVoiceModel":{"type":"string","enum":["arcana","mistv2","mist"],"description":"This is the model that will be used. Defaults to 'arcana' when not specified.","title":"RimeAiVoiceModel"},"RimeAiVoiceLanguage":{"type":"string","enum":["en","es","de","fr","ar","hi","ja","he","pt","ta","si"],"description":"Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.","title":"RimeAiVoiceLanguage"},"RimeAIVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/RimeAiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/RimeAIVoiceId","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/RimeAiVoiceModel","description":"This is the model that will be used. Defaults to 'arcana' when not specified."},"speed":{"type":"number","format":"double","minimum":0.1,"description":"This is the speed multiplier that will be used."},"pauseBetweenBrackets":{"type":"boolean","description":"This is a flag that controls whether to add slight pauses using angle brackets. Example: \"Hi. <200> I'd love to have a conversation with you.\" adds a 200ms pause between the first and second sentences."},"phonemizeBetweenBrackets":{"type":"boolean","description":"This is a flag that controls whether text inside brackets should be phonemized (converted to phonetic pronunciation) - Example: \"{h'El.o} World\" will pronounce \"Hello\" as expected."},"reduceLatency":{"type":"boolean","description":"This is a flag that controls whether to optimize for reduced latency in streaming. https://docs.rime.ai/api-reference/endpoint/websockets#param-reduce-latency"},"inlineSpeedAlpha":{"type":"string","description":"This is a string that allows inline speed control using alpha notation. https://docs.rime.ai/api-reference/endpoint/websockets#param-inline-speed-alpha"},"language":{"$ref":"#/components/schemas/RimeAiVoiceLanguage","description":"Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Rime AI, including voice and model selection, language, speed, pauses, phonemization, latency, chunking, caching, and fallback settings.","title":"RimeAIVoice"},"SmallestAiVoiceProvider":{"type":"string","enum":["smallest-ai"],"description":"This is the voice provider that will be used.","title":"SmallestAiVoiceProvider"},"SmallestAiVoiceId0":{"type":"string","enum":["emily","jasmine","arman","james","mithali","aravind","raj","diya","raman","ananya","isha","william","aarav","monika","niharika","deepika","raghav","kajal","radhika","mansi","nisha","saurabh","pooja","saina","sanya"],"title":"SmallestAiVoiceId0"},"SmallestAIVoiceId":{"oneOf":[{"$ref":"#/components/schemas/SmallestAiVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"SmallestAIVoiceId"},"SmallestAiVoiceModel":{"type":"string","enum":["lightning"],"description":"Smallest AI voice model to use. Defaults to 'lightning' when not specified.","title":"SmallestAiVoiceModel"},"SmallestAIVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/SmallestAiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/SmallestAIVoiceId","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/SmallestAiVoiceModel","description":"Smallest AI voice model to use. Defaults to 'lightning' when not specified."},"speed":{"type":"number","format":"double","description":"This is the speed multiplier that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Smallest AI, including voice and model selection, speed, chunking, caching, and fallback settings.","title":"SmallestAIVoice"},"TavusVoiceProvider":{"type":"string","enum":["tavus"],"description":"This is the voice provider that will be used.","title":"TavusVoiceProvider"},"TavusVoiceVoiceId0":{"type":"string","enum":["r52da2535a"],"title":"TavusVoiceVoiceId0"},"TavusVoiceVoiceId":{"oneOf":[{"$ref":"#/components/schemas/TavusVoiceVoiceId0"},{"type":"string"}],"description":"This is the provider-specific ID that will be used.","title":"TavusVoiceVoiceId"},"TavusVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/TavusVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/TavusVoiceVoiceId","description":"This is the provider-specific ID that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"personaId":{"type":"string","description":"This is the unique identifier for the persona that the replica will use in the conversation."},"callbackUrl":{"type":"string","description":"This is the url that will receive webhooks with updates regarding the conversation state."},"conversationName":{"type":"string","description":"This is the name for the conversation."},"conversationalContext":{"type":"string","description":"This is the context that will be appended to any context provided in the persona, if one is provided."},"customGreeting":{"type":"string","description":"This is the custom greeting that the replica will give once a participant joines the conversation."},"properties":{"$ref":"#/components/schemas/TavusConversationProperties","description":"These are optional properties used to customize the conversation."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for using Tavus as the assistant's voice provider, including persona, callback, context, greeting, conversation properties, chunking, caching, and fallback settings.","title":"TavusVoice"},"VapiVoiceProvider":{"type":"string","enum":["vapi"],"description":"This is the voice provider that will be used.","title":"VapiVoiceProvider"},"VapiVoiceVersion":{"type":"string","enum":["1","2","latest"],"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.","title":"VapiVoiceVersion"},"VapiVoiceLanguage":{"type":"string","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"],"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.","title":"VapiVoiceLanguage"},"VapiVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/VapiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"The voice to use: a built-in Vapi voice name, or a cloned voice id (used with version 2)."},"version":{"$ref":"#/components/schemas/VapiVoiceVersion","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."},"speed":{"type":"number","format":"double","minimum":0.25,"maximum":2,"default":1,"description":"This is the speed multiplier that will be used.\n\n@default 1"},"language":{"$ref":"#/components/schemas/VapiVoiceLanguage","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."},"pronunciationDictionary":{"type":"array","items":{"$ref":"#/components/schemas/VapiPronunciationDictionaryLocator"},"description":"List of pronunciation dictionary locators for custom word pronunciations."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Vapi, including voice selection, speed, pronunciation dictionary, chunking, caching, and fallback settings.","title":"VapiVoice"},"SesameVoiceProvider":{"type":"string","enum":["sesame"],"description":"This is the voice provider that will be used.","title":"SesameVoiceProvider"},"SesameVoiceModel":{"type":"string","enum":["csm-1b"],"description":"This is the model that will be used.","title":"SesameVoiceModel"},"SesameVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/SesameVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used."},"model":{"$ref":"#/components/schemas/SesameVoiceModel","description":"This is the model that will be used."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId","model"],"description":"Configuration for synthesizing assistant speech with Sesame, including voice and model selection, chunking, caching, and fallback settings.","title":"SesameVoice"},"InworldVoiceProvider":{"type":"string","enum":["inworld"],"description":"This is the voice provider that will be used.","title":"InworldVoiceProvider"},"InworldVoiceVoiceId":{"type":"string","enum":["Alex","Ashley","Craig","Deborah","Dennis","Edward","Elizabeth","Hades","Julia","Pixie","Mark","Olivia","Priya","Ronald","Sarah","Shaun","Theodore","Timothy","Wendy","Dominus","Hana","Clive","Carter","Blake","Luna","Yichen","Xiaoyin","Xinyi","Jing","Erik","Katrien","Lennart","Lore","Alain","Hélène","Mathieu","Étienne","Johanna","Josef","Gianni","Orietta","Asuka","Satoshi","Hyunwoo","Minji","Seojun","Yoona","Szymon","Wojciech","Heitor","Maitê","Diego","Lupita","Miguel","Rafael","Svetlana","Elena","Dmitry","Nikolai","Riya","Manoj","Yael","Oren","Nour","Omar"],"description":"Available voices by language:\n• en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya, Ronald, Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar","title":"InworldVoiceVoiceId"},"InworldVoiceModel":{"type":"string","enum":["inworld-tts-1"],"default":"inworld-tts-1","description":"This is the model that will be used.","title":"InworldVoiceModel"},"InworldVoiceLanguageCode":{"type":"string","enum":["en","zh","ko","nl","fr","es","ja","de","it","pl","pt","ru","hi","he","ar"],"default":"en","description":"Language code for Inworld TTS synthesis","title":"InworldVoiceLanguageCode"},"InworldVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/InworldVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/InworldVoiceVoiceId","description":"Available voices by language:\n• en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya, Ronald, Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar"},"model":{"$ref":"#/components/schemas/InworldVoiceModel","default":"inworld-tts-1","description":"This is the model that will be used."},"languageCode":{"$ref":"#/components/schemas/InworldVoiceLanguageCode","default":"en","description":"Language code for Inworld TTS synthesis"},"temperature":{"type":"number","format":"double","minimum":0.1,"maximum":2,"default":1.1,"description":"A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the model's default temperature of 1.1 will be used. The temperature parameter controls variance.\nHigher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details."},"speakingRate":{"type":"number","format":"double","minimum":0.5,"maximum":1.5,"default":1,"description":"A floating point number between 0.5, inclusive, and 1.5, inclusive. If equal to null or not provided, the model's default speaking speed of 1.0 will be used.\nValues above 0.8 are recommended for higher quality.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with Inworld, including voice and model selection, language, temperature, speaking rate, chunking, caching, and fallback settings.","title":"InworldVoice"},"MinimaxVoiceProvider":{"type":"string","enum":["minimax"],"description":"This is the voice provider that will be used.","title":"MinimaxVoiceProvider"},"MinimaxVoiceModel":{"type":"string","enum":["speech-02-hd","speech-02-turbo","speech-2.5-turbo-preview"],"default":"speech-02-turbo","description":"This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.\nspeech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.\nspeech-02-turbo is designed for real-time applications with low latency.\n\n@default \"speech-02-turbo\"","title":"MinimaxVoiceModel"},"MinimaxVoiceSubtitleType":{"type":"string","enum":["word","sentence"],"default":"sentence","description":"Controls the granularity of subtitle/timing data returned by Minimax\nduring synthesis. Set to 'word' to receive per-word timestamps in\nassistant.speechStarted events for karaoke-style caption rendering.\n\n@default \"sentence\"","title":"MinimaxVoiceSubtitleType"},"MinimaxVoiceRegion":{"type":"string","enum":["worldwide","china"],"default":"worldwide","description":"The region for Minimax API. Defaults to \"worldwide\".","title":"MinimaxVoiceRegion"},"MinimaxVoiceLanguageBoost":{"type":"string","enum":["Chinese","Chinese,Yue","English","Arabic","Russian","Spanish","French","Portuguese","German","Turkish","Dutch","Ukrainian","Vietnamese","Indonesian","Japanese","Italian","Korean","Thai","Polish","Romanian","Greek","Czech","Finnish","Hindi","Bulgarian","Danish","Hebrew","Malay","Persian","Slovak","Swedish","Croatian","Filipino","Hungarian","Norwegian","Slovenian","Catalan","Nynorsk","Tamil","Afrikaans","auto"],"description":"Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).","title":"MinimaxVoiceLanguageBoost"},"MinimaxVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/MinimaxVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"type":"string","description":"This is the provider-specific ID that will be used. Use a voice from MINIMAX_PREDEFINED_VOICES or a custom cloned voice ID."},"model":{"$ref":"#/components/schemas/MinimaxVoiceModel","default":"speech-02-turbo","description":"This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.\nspeech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.\nspeech-02-turbo is designed for real-time applications with low latency.\n\n@default \"speech-02-turbo\""},"emotion":{"type":"string","description":"The emotion to use for the voice. If not provided, will use auto-detect mode.\nOptions include: 'happy', 'sad', 'angry', 'fearful', 'surprised', 'disgusted', 'neutral'"},"subtitleType":{"$ref":"#/components/schemas/MinimaxVoiceSubtitleType","default":"sentence","description":"Controls the granularity of subtitle/timing data returned by Minimax\nduring synthesis. Set to 'word' to receive per-word timestamps in\nassistant.speechStarted events for karaoke-style caption rendering.\n\n@default \"sentence\""},"pitch":{"type":"number","format":"double","minimum":-12,"maximum":12,"default":0,"description":"Voice pitch adjustment. Range from -12 to 12 semitones.\n@default 0"},"speed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"default":1,"description":"Voice speed adjustment. Range from 0.5 to 2.0.\n@default 1.0"},"volume":{"type":"number","format":"double","minimum":0.5,"maximum":2,"default":1,"description":"Voice volume adjustment. Range from 0.5 to 2.0.\n@default 1.0"},"region":{"$ref":"#/components/schemas/MinimaxVoiceRegion","default":"worldwide","description":"The region for Minimax API. Defaults to \"worldwide\"."},"languageBoost":{"$ref":"#/components/schemas/MinimaxVoiceLanguageBoost","description":"Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English)."},"textNormalizationEnabled":{"type":"boolean","default":true,"description":"Enable MiniMax text normalization to improve number reading and formatting."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"description":"Configuration for synthesizing assistant speech with MiniMax, including voice and model selection, emotion, pitch, speed, volume, region, language, text normalization, chunking, caching, and fallback settings.","title":"MinimaxVoice"},"XaiVoiceProvider":{"type":"string","enum":["xai"],"description":"This is the voice provider that will be used.","title":"XaiVoiceProvider"},"XaiVoiceVoiceId":{"type":"string","enum":["eve","ara","rex","sal","leo"],"description":"Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.","title":"XaiVoiceVoiceId"},"XaiVoiceLanguage":{"type":"string","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","description":"BCP-47 language code for xAI TTS synthesis.","title":"XaiVoiceLanguage"},"XaiVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/XaiVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/XaiVoiceVoiceId","description":"Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted."},"language":{"$ref":"#/components/schemas/XaiVoiceLanguage","default":"en","description":"BCP-47 language code for xAI TTS synthesis."},"speed":{"type":"number","format":"double","minimum":0.7,"maximum":1.5,"default":1.1,"description":"Speed multiplier for xAI TTS synthesis."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"title":"XaiVoice"},"MicrosoftVoiceProvider":{"type":"string","enum":["microsoft"],"description":"This is the voice provider that will be used.","title":"MicrosoftVoiceProvider"},"MicrosoftVoiceVoiceId":{"type":"string","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"],"description":"MAI-Voice-2 voice ID. Built-in voices listed in enum.","title":"MicrosoftVoiceVoiceId"},"MicrosoftVoiceStyle":{"type":"string","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"],"description":"Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.","title":"MicrosoftVoiceStyle"},"MicrosoftVoiceRole":{"type":"string","enum":["Girl","Boy","YoungAdultFemale","YoungAdultMale","OlderAdultFemale","OlderAdultMale","SeniorFemale","SeniorMale"],"description":"Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.","title":"MicrosoftVoiceRole"},"MicrosoftVoice":{"type":"object","properties":{"cachingEnabled":{"type":"boolean","default":true,"description":"This is the flag to toggle voice caching for the assistant."},"provider":{"$ref":"#/components/schemas/MicrosoftVoiceProvider","description":"This is the voice provider that will be used."},"voiceId":{"$ref":"#/components/schemas/MicrosoftVoiceVoiceId","description":"MAI-Voice-2 voice ID. Built-in voices listed in enum."},"style":{"$ref":"#/components/schemas/MicrosoftVoiceStyle","description":"Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral."},"styleDegree":{"type":"number","format":"double","minimum":0.01,"maximum":2,"default":1,"description":"Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set."},"role":{"$ref":"#/components/schemas/MicrosoftVoiceRole","description":"Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise."},"chunkPlan":{"$ref":"#/components/schemas/ChunkPlan","description":"This is the plan for chunking the model output before it is sent to the voice provider."},"speed":{"type":"number","format":"double","minimum":0.5,"maximum":2,"description":"This is the speed multiplier that will be used."},"fallbackPlan":{"$ref":"#/components/schemas/FallbackPlan","description":"This is the plan for voice provider fallbacks in the event that the primary voice provider fails."}},"required":["provider","voiceId"],"title":"MicrosoftVoice"},"ConversationNodeVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"This is the voice for the node.\n\nThis overrides `workflow.voice`.","title":"ConversationNodeVoice"},"ConversationNodeToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"ConversationNodeToolsItems"},"GlobalNodePlan":{"type":"object","properties":{"enabled":{"type":"boolean","default":false,"description":"This is the flag to determine if this node is a global node\n\n@default false"},"enterCondition":{"type":"string","maxLength":1000,"default":"","description":"This is the condition that will be checked to determine if the global node should be executed.\n\n@default ''"}},"description":"Controls whether a conversation node can be entered globally and the condition evaluated before that node runs.","title":"GlobalNodePlan"},"ConversationNodeMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the task.","title":"ConversationNodeMetadata"},"ConversationNode":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ConversationNodeType","description":"This is the Conversation node. This can be used to start a conversation with the customer.\n\nThe flow is:\n- Workflow starts the conversation node\n- Model is active with the `prompt` and global context.\n- Model will call a tool to exit this node.\n- Workflow will extract variables from the conversation.\n- Workflow continues."},"model":{"$ref":"#/components/schemas/ConversationNodeModel","description":"This is the model for the node.\n\nThis overrides `workflow.model`."},"transcriber":{"$ref":"#/components/schemas/ConversationNodeTranscriber","description":"This is the transcriber for the node.\n\nThis overrides `workflow.transcriber`."},"voice":{"$ref":"#/components/schemas/ConversationNodeVoice","description":"This is the voice for the node.\n\nThis overrides `workflow.voice`."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/ConversationNodeToolsItems"},"description":"These are the tools that the conversation node can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the conversation node can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"prompt":{"type":"string","maxLength":5000,"description":"Prompt that guides the assistant while this node is active."},"globalNodePlan":{"$ref":"#/components/schemas/GlobalNodePlan","description":"This is the plan for the global node."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan that controls the variable extraction from the user's responses.\n\nUsage:\nUse `schema` to specify what you want to extract from the user's responses.\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"user\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\"\n          },\n          \"age\": {\n            \"type\": \"number\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ user.name }}` and `{{ user.age }}` respectively.\n\n(Optional) Use `aliases` to create new variables.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"userAge\",\n      \"value\": \"{{user.age}}\"\n    },\n    {\n      \"key\": \"userName\",\n      \"value\": \"{{user.name}}\"\n    }\n  ]\n}\n```\n\nThis will be extracted as `{{ userAge }}` and `{{ userName }}` respectively.\n\nNote: The `schema` field is required for Conversation nodes if you want to extract variables from the user's responses. `aliases` is just a convenience."},"name":{"type":"string","maxLength":80,"description":"Unique name used to identify this workflow node."},"isStart":{"type":"boolean","description":"This is whether or not the node is the start of the workflow."},"metadata":{"$ref":"#/components/schemas/ConversationNodeMetadata","description":"This is for metadata you want to store on the task."}},"required":["type","name"],"description":"A workflow node where the assistant conducts a conversation using optional node-specific providers, tools, prompt, and variable extraction.","title":"ConversationNode"},"ToolNodeType":{"type":"string","enum":["tool"],"description":"This is the Tool node. This can be used to call a tool in your workflow.\n\nThe flow is:\n- Workflow starts the tool node\n- Model is called to extract parameters needed by the tool from the conversation history\n- Tool is called with the parameters\n- Server returns a response\n- Workflow continues with the response","title":"ToolNodeType"},"ToolNodeTool":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"description":"This is the tool to call. To use an existing tool, send `toolId` instead.","title":"ToolNodeTool"},"ToolNodeMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the task.","title":"ToolNodeMetadata"},"ToolNode":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ToolNodeType","description":"This is the Tool node. This can be used to call a tool in your workflow.\n\nThe flow is:\n- Workflow starts the tool node\n- Model is called to extract parameters needed by the tool from the conversation history\n- Tool is called with the parameters\n- Server returns a response\n- Workflow continues with the response"},"tool":{"$ref":"#/components/schemas/ToolNodeTool","description":"This is the tool to call. To use an existing tool, send `toolId` instead."},"toolId":{"type":"string","description":"This is the tool to call. To use a transient tool, send `tool` instead."},"name":{"type":"string","maxLength":80,"description":"Unique name used to identify this workflow node."},"isStart":{"type":"boolean","description":"This is whether or not the node is the start of the workflow."},"metadata":{"$ref":"#/components/schemas/ToolNodeMetadata","description":"This is for metadata you want to store on the task."}},"required":["type","name"],"description":"A workflow node that invokes an inline tool or an existing saved tool.","title":"ToolNode"},"WorkflowUserEditableNodesItems":{"oneOf":[{"$ref":"#/components/schemas/ConversationNode"},{"$ref":"#/components/schemas/ToolNode"}],"title":"WorkflowUserEditableNodesItems"},"WorkflowUserEditableModel":{"oneOf":[{"$ref":"#/components/schemas/WorkflowOpenAIModel"},{"$ref":"#/components/schemas/WorkflowAnthropicModel"},{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModel"},{"$ref":"#/components/schemas/WorkflowGoogleModel"},{"$ref":"#/components/schemas/WorkflowCustomModel"}],"description":"This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.","title":"WorkflowUserEditableModel"},"WorkflowUserEditableTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.","title":"WorkflowUserEditableTranscriber"},"WorkflowUserEditableVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.","title":"WorkflowUserEditableVoice"},"LangfuseObservabilityPlanProvider":{"type":"string","enum":["langfuse"],"description":"Routes assistant call observability data to Langfuse.","title":"LangfuseObservabilityPlanProvider"},"LangfuseObservabilityPlanMetadata":{"type":"object","properties":{},"description":"This is a JSON object that will be added to the Langfuse trace. Traces can be enriched with metadata to better understand your users, application, and experiments. https://langfuse.com/docs/tracing-features/metadata\nBy default it includes the call metadata, assistant metadata, and assistant overrides.","title":"LangfuseObservabilityPlanMetadata"},"LangfuseObservabilityPlan":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/LangfuseObservabilityPlanProvider","description":"Routes assistant call observability data to Langfuse."},"promptName":{"type":"string","description":"The name of a Langfuse prompt to link generations to. This enables tracking which prompt version was used for each generation. https://langfuse.com/docs/prompt-management/features/link-to-traces"},"promptVersion":{"type":"number","format":"double","minimum":1,"description":"The version number of the Langfuse prompt to link generations to. Used together with promptName to identify the exact prompt version. https://langfuse.com/docs/prompt-management/features/link-to-traces"},"traceName":{"type":"string","description":"Custom name for the Langfuse trace. Supports Liquid templates.\n\nAvailable variables:\n- {{ call.id }} - Call UUID\n- {{ call.type }} - 'inboundPhoneCall', 'outboundPhoneCall', 'webCall'\n- {{ assistant.name }} - Assistant name\n- {{ assistant.id }} - Assistant ID\n\nExample: \"{{ assistant.name }} - {{ call.type }}\"\n\nDefaults to call ID if not provided."},"tags":{"type":"array","items":{"type":"string"},"description":"This is an array of tags to be added to the Langfuse trace. Tags allow you to categorize and filter traces. https://langfuse.com/docs/tracing-features/tags"},"metadata":{"$ref":"#/components/schemas/LangfuseObservabilityPlanMetadata","description":"This is a JSON object that will be added to the Langfuse trace. Traces can be enriched with metadata to better understand your users, application, and experiments. https://langfuse.com/docs/tracing-features/metadata\nBy default it includes the call metadata, assistant metadata, and assistant overrides."}},"required":["provider","tags"],"description":"Configuration for sending assistant call traces to Langfuse, including prompt version linkage, trace naming, tags, and metadata.","title":"LangfuseObservabilityPlan"},"WorkflowUserEditableBackgroundSound0":{"type":"string","enum":["off","office"],"title":"WorkflowUserEditableBackgroundSound0"},"WorkflowUserEditableBackgroundSound":{"oneOf":[{"$ref":"#/components/schemas/WorkflowUserEditableBackgroundSound0"},{"type":"string","format":"uri"}],"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.","title":"WorkflowUserEditableBackgroundSound"},"CallHookCallEndingOn":{"type":"string","enum":["call.ending"],"description":"This is the event that triggers this hook","title":"CallHookCallEndingOn"},"ToolCallHookActionType":{"type":"string","enum":["tool"],"description":"This is the type of action - must be \"tool\"","title":"ToolCallHookActionType"},"ToolCallHookActionTool":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"description":"This is the tool to call. To use an existing tool, send `toolId` instead.","title":"ToolCallHookActionTool"},"ToolCallHookAction":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ToolCallHookActionType","description":"This is the type of action - must be \"tool\""},"tool":{"$ref":"#/components/schemas/ToolCallHookActionTool","description":"This is the tool to call. To use an existing tool, send `toolId` instead."},"toolId":{"type":"string","description":"This is the tool to call. To use a transient tool, send `tool` instead."}},"required":["type"],"description":"A hook action that invokes an inline tool or an existing tool when the hook triggers.","title":"ToolCallHookAction"},"MessageAddHookActionType":{"type":"string","enum":["message.add"],"description":"This is the type of action - must be \"message.add\"","title":"MessageAddHookActionType"},"MessageAddHookAction":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MessageAddHookActionType","description":"This is the type of action - must be \"message.add\""},"message":{"$ref":"#/components/schemas/OpenAIMessage","description":"The message to add to the conversation in OpenAI format"},"triggerResponseEnabled":{"type":"boolean","default":true,"description":"Whether to trigger an assistant response after adding the message"}},"required":["type","message"],"description":"A hook action that adds an OpenAI-format message to the conversation and can trigger an assistant response.","title":"MessageAddHookAction"},"CallHookCallEndingDoItems":{"oneOf":[{"$ref":"#/components/schemas/ToolCallHookAction"},{"$ref":"#/components/schemas/MessageAddHookAction"}],"title":"CallHookCallEndingDoItems"},"CallHookFilterType":{"type":"string","enum":["oneOf"],"description":"This is the type of filter - currently only \"oneOf\" is supported","title":"CallHookFilterType"},"CallHookFilter":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/CallHookFilterType","description":"This is the type of filter - currently only \"oneOf\" is supported"},"key":{"type":"string","maxLength":1000,"description":"This is the key to filter on (e.g. \"call.endedReason\")"},"oneOf":{"type":"array","items":{"type":"string","maxLength":1000},"description":"This is the array of possible values to match against"}},"required":["type","key","oneOf"],"description":"Matches a call field against one or more allowed values to determine whether a hook runs.","title":"CallHookFilter"},"CallHookCallEnding":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/CallHookCallEndingOn","description":"This is the event that triggers this hook"},"do":{"type":"array","items":{"$ref":"#/components/schemas/CallHookCallEndingDoItems"},"description":"This is the set of actions to perform when the hook triggers"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/CallHookFilter"},"description":"This is the set of filters that must match for the hook to trigger"}},"required":["on","do"],"description":"Runs configured actions when a call is ending, optionally only when its filters match.","title":"CallHookCallEnding"},"CallHookAssistantSpeechInterruptedOn":{"type":"string","enum":["assistant.speech.interrupted"],"description":"This is the event that triggers this hook","title":"CallHookAssistantSpeechInterruptedOn"},"SayHookActionType":{"type":"string","enum":["say"],"description":"This is the type of action - must be \"say\"","title":"SayHookActionType"},"SayHookActionExact":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"This is the exact message to say. When a string array is provided, one is randomly selected.","title":"SayHookActionExact"},"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","format":"double","description":"The timestamp when the message was sent."},"secondsFromStart":{"type":"number","format":"double","description":"The number of seconds from the start of the conversation."}},"required":["role","message","time","secondsFromStart"],"description":"A system-authored entry in the call message history, including its content and timing.","title":"SystemMessage"},"UserMessageMetadata":{"type":"object","properties":{},"description":"The metadata associated with the message. Currently used to store the transcriber's word level confidence.","title":"UserMessageMetadata"},"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","format":"double","description":"The timestamp when the message was sent."},"endTime":{"type":"number","format":"double","description":"The timestamp when the message ended."},"secondsFromStart":{"type":"number","format":"double","description":"The number of seconds from the start of the conversation."},"duration":{"type":"number","format":"double","description":"The duration of the message in seconds."},"isFiltered":{"type":"boolean","description":"Indicates if the message was filtered for security reasons."},"detectedThreats":{"type":"array","items":{"type":"string"},"description":"List of detected security threats if the message was filtered."},"originalMessage":{"type":"string","description":"The original message before filtering (only included if content was filtered)."},"metadata":{"$ref":"#/components/schemas/UserMessageMetadata","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"],"description":"A user-authored entry in the call message history, including content, timing, security-filter results, and optional speaker metadata.","title":"UserMessage"},"AssistantMessageRole":{"type":"string","enum":["assistant"],"default":"assistant","description":"This is the role of the message author","title":"AssistantMessageRole"},"ToolCallFunction":{"type":"object","properties":{"arguments":{"type":"string","description":"This is the arguments to call the function with"},"name":{"type":"string","maxLength":80,"description":"This is the name of the function to call"}},"required":["arguments","name"],"description":"The function name and serialized arguments associated with a tool call.","title":"ToolCallFunction"},"ToolCall":{"type":"object","properties":{"id":{"type":"string","description":"This is the ID of the tool call"},"type":{"type":"string","description":"This is the type of tool"},"function":{"$ref":"#/components/schemas/ToolCallFunction","description":"This is the function that was called"}},"required":["id","type","function"],"description":"A tool invocation requested by the assistant, including its identifier, type, and function details.","title":"ToolCall"},"AssistantMessageMetadata":{"type":"object","properties":{},"description":"This is an optional metadata for the message","title":"AssistantMessageMetadata"},"AssistantMessage":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/AssistantMessageRole","description":"This is the role of the message author"},"content":{"type":"string","maxLength":10000,"description":"This is the content of the assistant message"},"refusal":{"type":"string","maxLength":10000,"description":"This is the refusal message generated by the model"},"tool_calls":{"type":"array","items":{"$ref":"#/components/schemas/ToolCall"},"description":"This is the tool calls generated by the model"},"name":{"type":"string","maxLength":40,"description":"This is an optional name for the participant"},"metadata":{"$ref":"#/components/schemas/AssistantMessageMetadata","description":"This is an optional metadata for the message"}},"required":["role"],"description":"An assistant-authored message, including content, refusal text, tool calls, participant name, and metadata.","title":"AssistantMessage"},"ToolMessageRole":{"type":"string","enum":["tool"],"default":"tool","description":"This is the role of the message author","title":"ToolMessageRole"},"ToolMessageMetadata":{"type":"object","properties":{},"description":"This is an optional metadata for the message","title":"ToolMessageMetadata"},"ToolMessage":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ToolMessageRole","description":"This is the role of the message author"},"content":{"type":"string","maxLength":10000,"description":"This is the content of the tool message"},"tool_call_id":{"type":"string","description":"This is the ID of the tool call this message is responding to"},"name":{"type":"string","maxLength":40,"description":"This is an optional name for the participant"},"metadata":{"$ref":"#/components/schemas/ToolMessageMetadata","description":"This is an optional metadata for the message"}},"required":["role","content","tool_call_id"],"description":"A tool-result message associated with a specific tool call.","title":"ToolMessage"},"DeveloperMessageRole":{"type":"string","enum":["developer"],"default":"developer","description":"This is the role of the message author","title":"DeveloperMessageRole"},"DeveloperMessageMetadata":{"type":"object","properties":{},"description":"This is an optional metadata for the message","title":"DeveloperMessageMetadata"},"DeveloperMessage":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/DeveloperMessageRole","description":"This is the role of the message author"},"content":{"type":"string","maxLength":10000,"description":"This is the content of the developer message"},"name":{"type":"string","maxLength":40,"description":"This is an optional name for the participant"},"metadata":{"$ref":"#/components/schemas/DeveloperMessageMetadata","description":"This is an optional metadata for the message"}},"required":["role","content"],"description":"A developer-authored instruction message supplied to the language model.","title":"DeveloperMessage"},"SayHookActionPromptOneOf1Items":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"SayHookActionPromptOneOf1Items"},"SayHookActionPrompt1":{"type":"array","items":{"$ref":"#/components/schemas/SayHookActionPromptOneOf1Items"},"title":"SayHookActionPrompt1"},"SayHookActionPrompt":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/SayHookActionPrompt1"}],"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.","title":"SayHookActionPrompt"},"SayHookAction":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SayHookActionType","description":"This is the type of action - must be \"say\""},"exact":{"$ref":"#/components/schemas/SayHookActionExact","description":"This is the exact message to say. When a string array is provided, one is randomly selected."},"prompt":{"$ref":"#/components/schemas/SayHookActionPrompt","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."}},"required":["type"],"description":"A hook action that makes the assistant speak exact text or generate a response from a prompt.","title":"SayHookAction"},"CallHookAssistantSpeechInterruptedDoItems":{"oneOf":[{"$ref":"#/components/schemas/SayHookAction"},{"$ref":"#/components/schemas/ToolCallHookAction"},{"$ref":"#/components/schemas/MessageAddHookAction"}],"title":"CallHookAssistantSpeechInterruptedDoItems"},"CallHookAssistantSpeechInterrupted":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/CallHookAssistantSpeechInterruptedOn","description":"This is the event that triggers this hook"},"do":{"type":"array","items":{"$ref":"#/components/schemas/CallHookAssistantSpeechInterruptedDoItems"},"description":"This is the set of actions to perform when the hook triggers"}},"required":["on","do"],"description":"Runs configured actions when the customer's speech interrupts the assistant.","title":"CallHookAssistantSpeechInterrupted"},"CallHookCustomerSpeechInterruptedOn":{"type":"string","enum":["customer.speech.interrupted"],"description":"This is the event that triggers this hook","title":"CallHookCustomerSpeechInterruptedOn"},"CallHookCustomerSpeechInterruptedDoItems":{"oneOf":[{"$ref":"#/components/schemas/SayHookAction"},{"$ref":"#/components/schemas/ToolCallHookAction"},{"$ref":"#/components/schemas/MessageAddHookAction"}],"title":"CallHookCustomerSpeechInterruptedDoItems"},"CallHookCustomerSpeechInterrupted":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/CallHookCustomerSpeechInterruptedOn","description":"This is the event that triggers this hook"},"do":{"type":"array","items":{"$ref":"#/components/schemas/CallHookCustomerSpeechInterruptedDoItems"},"description":"This is the set of actions to perform when the hook triggers"}},"required":["on","do"],"description":"Runs configured actions when the assistant interrupts the customer's speech.","title":"CallHookCustomerSpeechInterrupted"},"CallHookCustomerSpeechTimeoutDoItems":{"oneOf":[{"$ref":"#/components/schemas/SayHookAction"},{"$ref":"#/components/schemas/ToolCallHookAction"},{"$ref":"#/components/schemas/MessageAddHookAction"}],"title":"CallHookCustomerSpeechTimeoutDoItems"},"CustomerSpeechTimeoutOptionsTriggerResetMode":{"type":"string","enum":["onUserSpeech","never"],"description":"Controls whether the hook's trigger counter resets after the customer speaks. Defaults to `never`.","title":"CustomerSpeechTimeoutOptionsTriggerResetMode"},"CustomerSpeechTimeoutOptions":{"type":"object","properties":{"triggerResetMode":{"$ref":"#/components/schemas/CustomerSpeechTimeoutOptionsTriggerResetMode","description":"Controls whether the hook's trigger counter resets after the customer speaks. Defaults to `never`."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":1000,"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"},"triggerMaxCount":{"type":"number","format":"double","minimum":1,"maximum":10,"description":"This is the maximum number of times the hook will trigger in a call.\n\n@default 3"}},"required":["timeoutSeconds"],"description":"Controls how long a hook waits for customer speech, how often it can trigger, and when its trigger counter resets.","title":"CustomerSpeechTimeoutOptions"},"CallHookCustomerSpeechTimeout":{"type":"object","properties":{"on":{"type":"string","maxLength":1000,"description":"Must be either \"customer.speech.timeout\" or match the pattern \"customer.speech.timeout[property=value]\""},"do":{"type":"array","items":{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeoutDoItems"},"description":"This is the set of actions to perform when the hook triggers"},"options":{"$ref":"#/components/schemas/CustomerSpeechTimeoutOptions","description":"Controls the speech timeout, maximum trigger count, and counter reset behavior for this hook."},"name":{"type":"string","maxLength":1000,"description":"This is the name of the hook, it can be set by the user to identify the hook.\nIf no name is provided, the hook will be auto generated as UUID.\n\n@default UUID"}},"required":["on","do"],"description":"Runs configured actions when the customer does not speak before the configured timeout, with support for trigger limits and named instances.","title":"CallHookCustomerSpeechTimeout"},"CallHookModelResponseTimeoutOn":{"type":"string","enum":["model.response.timeout"],"description":"This is the event that triggers this hook","title":"CallHookModelResponseTimeoutOn"},"CallHookModelResponseTimeoutDoItems":{"oneOf":[{"$ref":"#/components/schemas/SayHookAction"},{"$ref":"#/components/schemas/ToolCallHookAction"},{"$ref":"#/components/schemas/MessageAddHookAction"}],"title":"CallHookModelResponseTimeoutDoItems"},"CallHookModelResponseTimeout":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/CallHookModelResponseTimeoutOn","description":"This is the event that triggers this hook"},"do":{"type":"array","items":{"$ref":"#/components/schemas/CallHookModelResponseTimeoutDoItems"},"description":"This is the set of actions to perform when the hook triggers"}},"required":["on","do"],"description":"Runs configured actions when the language model does not respond before its timeout.","title":"CallHookModelResponseTimeout"},"WorkflowUserEditableHooksItems":{"oneOf":[{"$ref":"#/components/schemas/CallHookCallEnding"},{"$ref":"#/components/schemas/CallHookAssistantSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeout"},{"$ref":"#/components/schemas/CallHookModelResponseTimeout"}],"title":"WorkflowUserEditableHooksItems"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl":{"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. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion":{"type":"string","enum":["us-east-1","us-west-2","eu-central-1","eu-west-1","eu-west-3","ap-northeast-1","ap-southeast-2"],"description":"AWS region where Bedrock is configured.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion"},"AwsiamCredentialsAuthenticationPlanType":{"type":"string","enum":["aws-iam"],"description":"Selects direct AWS IAM credential authentication.","title":"AwsiamCredentialsAuthenticationPlanType"},"AWSIAMCredentialsAuthenticationPlan":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AwsiamCredentialsAuthenticationPlanType","description":"Selects direct AWS IAM credential authentication."},"awsAccessKeyId":{"type":"string","maxLength":128,"description":"AWS Access Key ID. This is not returned in the API."},"awsSecretAccessKey":{"type":"string","maxLength":256,"description":"AWS Secret Access Key. This is not returned in the API."}},"required":["type","awsAccessKeyId","awsSecretAccessKey"],"description":"Direct AWS IAM credentials used to authenticate requests.","title":"AWSIAMCredentialsAuthenticationPlan"},"AwsStsAuthenticationPlanType":{"type":"string","enum":["aws-sts"],"description":"This is the type of authentication plan","title":"AwsStsAuthenticationPlanType"},"AWSStsAuthenticationPlan":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AwsStsAuthenticationPlanType","description":"This is the type of authentication plan"},"roleArn":{"type":"string","description":"This is the role ARN for the AWS credential"},"externalId":{"type":"string","maxLength":256,"description":"Optional external ID for additional security in the role trust policy."}},"required":["type","roleArn"],"description":"AWS Security Token Service role-assumption configuration used to authenticate requests.","title":"AWSStsAuthenticationPlan"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan":{"oneOf":[{"$ref":"#/components/schemas/AWSIAMCredentialsAuthenticationPlan"},{"$ref":"#/components/schemas/AWSStsAuthenticationPlan"}],"description":"Authentication method - either direct IAM credentials or cross-account role assumption.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion":{"type":"string","enum":["australiaeast","canadaeast","canadacentral","centralus","eastus2","eastus","france","germanywestcentral","india","japaneast","japanwest","northcentralus","norway","polandcentral","southcentralus","spaincentral","swedencentral","switzerland","switzerlandnorth","switzerlandwest","uaenorth","uk","westeurope","westus","westus3"],"description":"Azure region that hosts the OpenAI resource.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels":{"type":"string","enum":["gpt-5.6-luna-2026-07-09","gpt-5.6-terra-2026-07-09","gpt-5.6-sol-2026-07-09","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.2-chat","gpt-5.1","gpt-5.1-chat","gpt-5","gpt-5-mini","gpt-5-nano","gpt-4.1-2025-04-14","gpt-4.1-mini-2025-04-14","gpt-4.1-nano-2025-04-14","gpt-4o-2024-11-20","gpt-4o-2024-08-06","gpt-4o-2024-05-13","gpt-4o-mini-2024-07-18","gpt-4-turbo-2024-04-09","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4-0613","gpt-35-turbo-0125","gpt-35-turbo-1106","gpt-4o","gpt-4.1","gpt-5.4-mini-2026-03-17"],"description":"Azure OpenAI models available through this credential.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService":{"type":"string","enum":["speech","blob_storage"],"default":"speech","description":"This is the service being used in Azure.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion":{"type":"string","enum":["australiaeast","canadaeast","canadacentral","centralus","eastus2","eastus","france","germanywestcentral","india","japaneast","japanwest","northcentralus","norway","polandcentral","southcentralus","spaincentral","swedencentral","switzerland","switzerlandnorth","switzerlandwest","uaenorth","uk","westeurope","westus","westus3"],"description":"This is the region of the Azure resource.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion"},"AzureBlobStorageBucketPlan":{"type":"object","properties":{"connectionString":{"type":"string","description":"This is the blob storage connection string for the Azure resource."},"containerName":{"type":"string","description":"This is the container name for the Azure blob storage."},"path":{"type":"string","description":"This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""}},"required":["connectionString","containerName"],"description":"Azure Blob Storage container configuration for call artifacts, including its connection string, container name, and storage path.","title":"AzureBlobStorageBucketPlan"},"SipTrunkGatewayOutboundProtocol":{"type":"string","enum":["tls/srtp","tcp","tls","udp"],"description":"This is the protocol to use for SIP signaling outbound calls. Default is udp.\n\n@default udp","title":"SipTrunkGatewayOutboundProtocol"},"SipTrunkGateway":{"type":"object","properties":{"ip":{"type":"string","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","format":"double","minimum":1,"maximum":65535,"description":"This is the port number of the gateway. Default is 5060.\n\n@default 5060"},"netmask":{"type":"number","format":"double","minimum":24,"maximum":32,"description":"This is the netmask of the gateway. Defaults to 32.\n\n@default 32"},"inboundEnabled":{"type":"boolean","description":"This is whether inbound calls are allowed from this gateway. Default is true.\n\n@default true"},"outboundEnabled":{"type":"boolean","description":"This is whether outbound calls should be sent to this gateway. Default is true.\n\nNote, if netmask is less than 32, it doesn't affect the outbound IPs that are tried. 1 attempt is made to `ip:port`.\n\n@default true"},"outboundProtocol":{"$ref":"#/components/schemas/SipTrunkGatewayOutboundProtocol","description":"This is the protocol to use for SIP signaling outbound calls. Default is udp.\n\n@default udp"},"optionsPingEnabled":{"type":"boolean","description":"This is whether to send options ping to the gateway. This can be used to check if the gateway is reachable. Default is false.\n\nThis is useful for high availability setups where you want to check if the gateway is reachable before routing calls to it. Note, if no gateway for a trunk is reachable, outbound calls will be rejected.\n\n@default false"}},"required":["ip"],"description":"Network and routing settings for a SIP trunk gateway, including address, port, netmask, inbound and outbound use, signaling protocol, and OPTIONS health checks.","title":"SipTrunkGateway"},"SipTrunkOutboundSipRegisterPlan":{"type":"object","properties":{"domain":{"type":"string","description":"SIP registrar domain used for registration."},"username":{"type":"string","description":"Username sent with the SIP REGISTER request."},"realm":{"type":"string","description":"Authentication realm used for SIP registration."}},"description":"Registration settings used when the SIP trunk requires SIP REGISTER.","title":"SipTrunkOutboundSipRegisterPlan"},"SipTrunkOutboundAuthenticationPlan":{"type":"object","properties":{"authPassword":{"type":"string","description":"This is not returned in the API."},"authUsername":{"type":"string","description":"Username used to authenticate outbound SIP requests."},"sipRegisterPlan":{"$ref":"#/components/schemas/SipTrunkOutboundSipRegisterPlan","description":"This can be used to configure if SIP register is required by the SIP trunk. If not provided, no SIP registration will be attempted."}},"description":"Credentials and optional SIP REGISTER settings used to authenticate outbound calls with a SIP trunk.","title":"SipTrunkOutboundAuthenticationPlan"},"CreateCerebrasCredentialDtoProvider":{"type":"string","enum":["cerebras"],"description":"Selects Cerebras as the credential provider.","title":"CreateCerebrasCredentialDtoProvider"},"CloudflareR2BucketPlan":{"type":"object","properties":{"accessKeyId":{"type":"string","description":"Cloudflare R2 Access key ID."},"secretAccessKey":{"type":"string","description":"Cloudflare R2 access key secret. This is not returned in the API."},"url":{"type":"string","description":"Cloudflare R2 base url."},"name":{"type":"string","description":"This is the name of the bucket."},"path":{"type":"string","description":"This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""}},"required":["name"],"description":"Cloudflare R2 bucket configuration for call-artifact storage, including access keys, base URL, bucket name, and path.","title":"CloudflareR2BucketPlan"},"OAuth2AuthenticationPlan":{"type":"object","properties":{"url":{"type":"string","description":"This is the OAuth2 URL."},"clientId":{"type":"string","description":"This is the OAuth2 client ID."},"clientSecret":{"type":"string","description":"This is the OAuth2 client secret."},"scope":{"type":"string","maxLength":1000,"description":"This is the scope of the OAuth2 token."}},"required":["url","clientId","clientSecret"],"description":"Client-credentials configuration for obtaining an OAuth 2.0 access token used to authenticate outbound requests.","title":"OAuth2AuthenticationPlan"},"GcpKey":{"type":"object","properties":{"type":{"type":"string","description":"This is the type of the key. Most likely, this is \"service_account\"."},"projectId":{"type":"string","description":"This is the ID of the Google Cloud project associated with this key."},"privateKeyId":{"type":"string","description":"This is the unique identifier for the private key."},"privateKey":{"type":"string","description":"This is the private key in PEM format.\n\nNote: This is not returned in the API."},"clientEmail":{"type":"string","description":"This is the email address associated with the service account."},"clientId":{"type":"string","description":"This is the unique identifier for the client."},"authUri":{"type":"string","description":"This is the URI for the auth provider's authorization endpoint."},"tokenUri":{"type":"string","description":"This is the URI for the auth provider's token endpoint."},"authProviderX509CertUrl":{"type":"string","description":"This is the URL of the public x509 certificate for the auth provider."},"clientX509CertUrl":{"type":"string","description":"This is the URL of the public x509 certificate for the client."},"universeDomain":{"type":"string","description":"This is the domain associated with the universe this service account belongs to."}},"required":["type","projectId","privateKeyId","privateKey","clientEmail","clientId","authUri","tokenUri","authProviderX509CertUrl","clientX509CertUrl","universeDomain"],"description":"Google Cloud service-account key used to authenticate access to Google Cloud resources.","title":"GcpKey"},"BucketPlan":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the bucket."},"region":{"type":"string","description":"This is the region of the bucket.\n\nUsage:\n- If `credential.type` is `aws`, then this is required.\n- If `credential.type` is `gcp`, then this is optional since GCP allows buckets to be accessed without a region but region is required for data residency requirements. Read here: https://cloud.google.com/storage/docs/request-endpoints\n\nThis overrides the `credential.region` field if it is provided."},"path":{"type":"string","description":"This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""},"hmacAccessKey":{"type":"string","description":"This is the HMAC access key offered by GCP for interoperability with S3 clients. Here is the guide on how to create: https://cloud.google.com/storage/docs/authentication/managing-hmackeys#console\n\nUsage:\n- If `credential.type` is `gcp`, then this is required.\n- If `credential.type` is `aws`, then this is not required since credential.awsAccessKeyId is used instead."},"hmacSecret":{"type":"string","description":"This is the secret for the HMAC access key. Here is the guide on how to create: https://cloud.google.com/storage/docs/authentication/managing-hmackeys#console\n\nUsage:\n- If `credential.type` is `gcp`, then this is required.\n- If `credential.type` is `aws`, then this is not required since credential.awsSecretAccessKey is used instead.\n\nNote: This is not returned in the API."}},"required":["name"],"description":"Google Cloud Storage bucket configuration for call artifacts, including bucket name, region, path, and optional HMAC credentials.","title":"BucketPlan"},"CreateGoogleCredentialDtoProvider":{"type":"string","enum":["google"],"description":"Selects Google AI as the credential provider.","title":"CreateGoogleCredentialDtoProvider"},"CreateInflectionAiCredentialDtoProvider":{"type":"string","enum":["inflection-ai"],"description":"Selects Inflection AI as the credential provider.","title":"CreateInflectionAiCredentialDtoProvider"},"CreateS3CompatibleCredentialDtoProvider":{"type":"string","enum":["s3-compatible"],"description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2.","title":"CreateS3CompatibleCredentialDtoProvider"},"S3CompatibleBucketPlan":{"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."},"name":{"type":"string","description":"Bucket name."},"path":{"type":"string","description":"Optional key prefix inside the bucket, such as recordings/."}},"required":["url","region","accessKeyId","secretAccessKey","name"],"title":"S3CompatibleBucketPlan"},"SupabaseBucketPlanRegion":{"type":"string","enum":["us-west-1","us-east-1","us-east-2","ca-central-1","eu-west-1","eu-west-2","eu-west-3","eu-central-1","eu-central-2","eu-north-1","ap-south-1","ap-southeast-1","ap-northeast-1","ap-northeast-2","ap-southeast-2","sa-east-1"],"description":"This is the S3 Region. It should look like us-east-1\nIt should be one of the supabase regions defined in the SUPABASE_REGION enum\nCheck https://supabase.com/docs/guides/platform/regions for up to date regions","title":"SupabaseBucketPlanRegion"},"SupabaseBucketPlan":{"type":"object","properties":{"region":{"$ref":"#/components/schemas/SupabaseBucketPlanRegion","description":"This is the S3 Region. It should look like us-east-1\nIt should be one of the supabase regions defined in the SUPABASE_REGION enum\nCheck https://supabase.com/docs/guides/platform/regions for up to date regions"},"url":{"type":"string","description":"This is the S3 compatible URL for Supabase S3\nThis should look like https://<project-ID>.supabase.co/storage/v1/s3"},"accessKeyId":{"type":"string","description":"This is the Supabase S3 Access Key ID.\nThe user creates this in the Supabase project Storage settings"},"secretAccessKey":{"type":"string","description":"This is the Supabase S3 Secret Access Key.\nThe user creates this in the Supabase project Storage settings along with the access key id"},"name":{"type":"string","description":"This is the Supabase S3 Bucket Name.\nThe user must create this in Supabase under Storage > Buckets\nA bucket that does not exist will not be checked now, but file uploads will fail"},"path":{"type":"string","description":"This is the Supabase S3 Bucket Folder Path.\nThe user can create this in Supabase under Storage > Buckets\nA path that does not exist will not be checked now, but file uploads will fail\nA Path is like a folder in the bucket\nEg. If the bucket is called \"my-bucket\" and the path is \"my-folder\", the full path is \"my-bucket/my-folder\""}},"required":["region","url","accessKeyId","secretAccessKey","name"],"description":"Supabase S3-compatible bucket configuration for call artifacts, including region, endpoint, access keys, bucket name, and path.","title":"SupabaseBucketPlan"},"HmacAuthenticationPlanType":{"type":"string","enum":["hmac"],"description":"Selects HMAC request authentication.","title":"HmacAuthenticationPlanType"},"HmacAuthenticationPlanAlgorithm":{"type":"string","enum":["sha256","sha512","sha1"],"description":"This is the HMAC algorithm to use for signing.","title":"HmacAuthenticationPlanAlgorithm"},"HmacAuthenticationPlanSignatureEncoding":{"type":"string","enum":["hex","base64"],"description":"The encoding format for the signature. Defaults to 'hex'.","title":"HmacAuthenticationPlanSignatureEncoding"},"BearerAuthenticationPlanType":{"type":"string","enum":["bearer"],"description":"Selects bearer-token authentication.","title":"BearerAuthenticationPlanType"},"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["oauth2"],"description":"Discriminator value: oauth2"},"url":{"type":"string","description":"This is the OAuth2 URL."},"clientId":{"type":"string","description":"This is the OAuth2 client ID."},"clientSecret":{"type":"string","description":"This is the OAuth2 client secret."},"scope":{"type":"string","maxLength":1000,"description":"This is the scope of the OAuth2 token."}},"required":["type","url","clientId","clientSecret"],"description":"Client-credentials configuration for obtaining an OAuth 2.0 access token used to authenticate outbound requests."},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/HmacAuthenticationPlanType","description":"Selects HMAC request authentication."},"secretKey":{"type":"string","description":"This is the HMAC secret key used to sign requests."},"algorithm":{"$ref":"#/components/schemas/HmacAuthenticationPlanAlgorithm","description":"This is the HMAC algorithm to use for signing."},"signatureHeader":{"type":"string","description":"This is the header name where the signature will be sent. Defaults to 'x-signature'."},"timestampHeader":{"type":"string","description":"This is the header name where the timestamp will be sent. Defaults to 'x-timestamp'."},"signaturePrefix":{"type":"string","description":"This is the prefix for the signature. For example, 'sha256=' for GitHub-style signatures."},"includeTimestamp":{"type":"boolean","description":"Whether to include a timestamp in the signature payload. Defaults to true."},"payloadFormat":{"type":"string","description":"Custom payload format. Use {body} for request body, {timestamp} for timestamp, {method} for HTTP method, {url} for URL, {svix-id} for unique message ID. Defaults to '{timestamp}.{body}'."},"messageIdHeader":{"type":"string","description":"This is the header name where the unique message ID will be sent. Used for Svix-style webhooks."},"signatureEncoding":{"$ref":"#/components/schemas/HmacAuthenticationPlanSignatureEncoding","description":"The encoding format for the signature. Defaults to 'hex'."},"secretIsBase64":{"type":"boolean","description":"Whether the secret key is base64-encoded and should be decoded before use. Defaults to false."}},"required":["type","secretKey","algorithm"],"description":"Configuration for signing outbound requests with an HMAC secret, including algorithm, headers, payload format, and signature encoding."},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BearerAuthenticationPlanType","description":"Selects bearer-token authentication."},"token":{"type":"string","description":"This is the bearer token value."},"headerName":{"type":"string","description":"This is the header name where the bearer token will be sent. Defaults to 'Authorization'."},"bearerPrefixEnabled":{"type":"boolean","description":"Whether to include the 'Bearer ' prefix in the header value. Defaults to true."}},"required":["type","token"],"description":"Configuration for authenticating outbound requests with a bearer token, including header name and optional `Bearer` prefix."}],"discriminator":{"propertyName":"type"},"description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.","title":"UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan"},"CreateCustomCredentialDtoProvider":{"type":"string","enum":["custom-credential"],"description":"Selects a custom credential configuration.","title":"CreateCustomCredentialDtoProvider"},"CreateCustomCredentialDtoAuthenticationPlan":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["oauth2"],"description":"Discriminator value: oauth2"},"url":{"type":"string","description":"This is the OAuth2 URL."},"clientId":{"type":"string","description":"This is the OAuth2 client ID."},"clientSecret":{"type":"string","description":"This is the OAuth2 client secret."},"scope":{"type":"string","maxLength":1000,"description":"This is the scope of the OAuth2 token."}},"required":["type","url","clientId","clientSecret"],"description":"Client-credentials configuration for obtaining an OAuth 2.0 access token used to authenticate outbound requests."},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/HmacAuthenticationPlanType","description":"Selects HMAC request authentication."},"secretKey":{"type":"string","description":"This is the HMAC secret key used to sign requests."},"algorithm":{"$ref":"#/components/schemas/HmacAuthenticationPlanAlgorithm","description":"This is the HMAC algorithm to use for signing."},"signatureHeader":{"type":"string","description":"This is the header name where the signature will be sent. Defaults to 'x-signature'."},"timestampHeader":{"type":"string","description":"This is the header name where the timestamp will be sent. Defaults to 'x-timestamp'."},"signaturePrefix":{"type":"string","description":"This is the prefix for the signature. For example, 'sha256=' for GitHub-style signatures."},"includeTimestamp":{"type":"boolean","description":"Whether to include a timestamp in the signature payload. Defaults to true."},"payloadFormat":{"type":"string","description":"Custom payload format. Use {body} for request body, {timestamp} for timestamp, {method} for HTTP method, {url} for URL, {svix-id} for unique message ID. Defaults to '{timestamp}.{body}'."},"messageIdHeader":{"type":"string","description":"This is the header name where the unique message ID will be sent. Used for Svix-style webhooks."},"signatureEncoding":{"$ref":"#/components/schemas/HmacAuthenticationPlanSignatureEncoding","description":"The encoding format for the signature. Defaults to 'hex'."},"secretIsBase64":{"type":"boolean","description":"Whether the secret key is base64-encoded and should be decoded before use. Defaults to false."}},"required":["type","secretKey","algorithm"],"description":"Configuration for signing outbound requests with an HMAC secret, including algorithm, headers, payload format, and signature encoding."},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BearerAuthenticationPlanType","description":"Selects bearer-token authentication."},"token":{"type":"string","description":"This is the bearer token value."},"headerName":{"type":"string","description":"This is the header name where the bearer token will be sent. Defaults to 'Authorization'."},"bearerPrefixEnabled":{"type":"boolean","description":"Whether to include the 'Bearer ' prefix in the header value. Defaults to true."}},"required":["type","token"],"description":"Configuration for authenticating outbound requests with a bearer token, including header name and optional `Bearer` prefix."}],"discriminator":{"propertyName":"type"},"description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.","title":"CreateCustomCredentialDtoAuthenticationPlan"},"PublicKeyEncryptionPlanType":{"type":"string","enum":["public-key"],"description":"The type of encryption plan.","title":"PublicKeyEncryptionPlanType"},"PublicKeyEncryptionPlanAlgorithm":{"type":"string","enum":["RSA-OAEP-256"],"description":"The encryption algorithm to use.","title":"PublicKeyEncryptionPlanAlgorithm"},"SpkiPemPublicKeyConfigFormat":{"type":"string","enum":["spki-pem"],"description":"The format of the public key.","title":"SpkiPemPublicKeyConfigFormat"},"SpkiPemPublicKeyConfig":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"description":"Optional name of the key for identification purposes."},"format":{"$ref":"#/components/schemas/SpkiPemPublicKeyConfigFormat","description":"The format of the public key."},"pem":{"type":"string","description":"The PEM-encoded public key."}},"required":["format","pem"],"description":"An SPKI public key in PEM format used to encrypt sensitive request data.","title":"SpkiPemPublicKeyConfig"},"PublicKeyEncryptionPlan":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/PublicKeyEncryptionPlanType","description":"The type of encryption plan."},"algorithm":{"$ref":"#/components/schemas/PublicKeyEncryptionPlanAlgorithm","description":"The encryption algorithm to use."},"publicKey":{"$ref":"#/components/schemas/SpkiPemPublicKeyConfig","description":"The public key configuration."}},"required":["type","algorithm","publicKey"],"description":"Configuration for encrypting sensitive outbound request data with a public key.","title":"PublicKeyEncryptionPlan"},"CreateMicrosoftCredentialDtoProvider":{"type":"string","enum":["microsoft"],"title":"CreateMicrosoftCredentialDtoProvider"},"CreateNeuphonicCredentialDtoProvider":{"type":"string","enum":["neuphonic"],"description":"Selects Neuphonic as the credential provider.","title":"CreateNeuphonicCredentialDtoProvider"},"CreateHumeCredentialDtoProvider":{"type":"string","enum":["hume"],"description":"Selects Hume as the credential provider.","title":"CreateHumeCredentialDtoProvider"},"CreateMistralCredentialDtoProvider":{"type":"string","enum":["mistral"],"description":"Selects Mistral as the credential provider.","title":"CreateMistralCredentialDtoProvider"},"CreateSpeechmaticsCredentialDtoProvider":{"type":"string","enum":["speechmatics"],"description":"Selects Speechmatics as the credential provider.","title":"CreateSpeechmaticsCredentialDtoProvider"},"CreateSonioxCredentialDtoProvider":{"type":"string","enum":["soniox"],"description":"Selects Soniox as the credential provider.","title":"CreateSonioxCredentialDtoProvider"},"CreateGoHighLevelMcpCredentialDtoProvider":{"type":"string","enum":["ghl.oauth2-authorization"],"description":"Selects GoHighLevel OAuth 2.0 authorization for MCP.","title":"CreateGoHighLevelMcpCredentialDtoProvider"},"Oauth2AuthenticationSession":{"type":"object","properties":{"accessToken":{"type":"string","description":"This is the OAuth2 access token."},"expiresAt":{"type":"string","format":"date-time","description":"This is the OAuth2 access token expiration."},"refreshToken":{"type":"string","description":"This is the OAuth2 refresh token."}},"description":"OAuth 2.0 session tokens and expiration used to authenticate integration requests.","title":"Oauth2AuthenticationSession"},"CreateInworldCredentialDtoProvider":{"type":"string","enum":["inworld"],"description":"Selects Inworld as the credential provider.","title":"CreateInworldCredentialDtoProvider"},"CreateWellSaidCredentialDtoProvider":{"type":"string","enum":["wellsaid"],"description":"Selects WellSaid as the credential provider.","title":"CreateWellSaidCredentialDtoProvider"},"CreateEmailCredentialDtoProvider":{"type":"string","enum":["email"],"description":"Selects email as the alert destination provider.","title":"CreateEmailCredentialDtoProvider"},"CreateSlackWebhookCredentialDtoProvider":{"type":"string","enum":["slack-webhook"],"description":"Selects a Slack incoming webhook as the credential provider.","title":"CreateSlackWebhookCredentialDtoProvider"},"WorkflowUserEditableCredentialsItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["11labs"],"description":"Discriminator value: 11labs"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"apiUrl":{"oneOf":[{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},{"type":"null"}],"description":"ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with ElevenLabs."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"],"description":"Discriminator value: anthropic"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anthropic."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic-bedrock"],"description":"Discriminator value: anthropic-bedrock"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion","description":"AWS region where Bedrock is configured."},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan","description":"Authentication method - either direct IAM credentials or cross-account role assumption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","authenticationPlan"],"description":"Credentials for authenticating Anthropic model requests through Amazon Bedrock, including AWS region and authentication method."},{"type":"object","properties":{"provider":{"type":"string","enum":["anyscale"],"description":"Discriminator value: anyscale"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anyscale."},{"type":"object","properties":{"provider":{"type":"string","enum":["assembly-ai"],"description":"Discriminator value: assembly-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with AssemblyAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure-openai"],"description":"Discriminator value: azure-openai"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion","description":"Azure region that hosts the OpenAI resource."},"models":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels","description":"Azure OpenAI models available through this credential."},"openAIKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"ocpApimSubscriptionKey":{"type":"string","description":"This is not returned in the API."},"openAIEndpoint":{"type":"string","maxLength":10000,"description":"Endpoint URL for the Azure OpenAI resource."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","models","openAIKey","openAIEndpoint"],"description":"Credentials for authenticating assistant model requests with Azure OpenAI, including region, endpoint, and available models."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure"],"description":"Discriminator value: azure"},"service":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService","description":"This is the service being used in Azure."},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion","description":"This is the region of the Azure resource."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"fallbackIndex":{"type":"number","format":"double","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/AzureBlobStorageBucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","service"],"description":"Credentials for Azure Speech or Blob Storage, including service, region, and optional storage bucket settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["byo-sip-trunk"],"description":"Discriminator value: byo-sip-trunk"},"gateways":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunkGateway"},"description":"This is the list of SIP trunk's gateways."},"outboundAuthenticationPlan":{"$ref":"#/components/schemas/SipTrunkOutboundAuthenticationPlan","description":"This can be used to configure the outbound authentication if required by the SIP trunk."},"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","maxLength":10000,"description":"This can be used to configure the tech prefix on outbound calls. This is an advanced property."},"sipDiversionHeader":{"type":"string","maxLength":10000,"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gateways"],"description":"Configuration for connecting Vapi to a bring-your-own SIP trunk or carrier, including gateways, outbound authentication, number handling, and optional session border controller routing."},{"type":"object","properties":{"provider":{"type":"string","enum":["cartesia"],"description":"Discriminator value: cartesia"},"apiKey":{"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Cartesia."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCerebrasCredentialDtoProvider","description":"Selects Cerebras as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Cerebras."},{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare"],"description":"Discriminator value: 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","format":"double","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/CloudflareR2BucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in R2"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Cloudflare R2, including account details, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["custom-llm"],"description":"Discriminator value: custom-llm"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"authenticationPlan":{"$ref":"#/components/schemas/OAuth2AuthenticationPlan","description":"This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating requests to a custom language model with an API key or OAuth 2.0 authentication plan."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepgram"],"description":"Discriminator value: deepgram"},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiUrl":{"type":"string","description":"This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Deepgram, with an optional API URL for an on-premises instance."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepinfra"],"description":"Discriminator value: deepinfra"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepInfra."},{"type":"object","properties":{"provider":{"type":"string","enum":["deep-seek"],"description":"Discriminator value: deep-seek"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepSeek."},{"type":"object","properties":{"provider":{"type":"string","enum":["gcp"],"description":"Discriminator value: gcp"},"fallbackIndex":{"type":"number","format":"double","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."},"gcpKey":{"$ref":"#/components/schemas/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/<service-account-id>/keys.\n\nThe schema is identical to the JSON that GCP outputs."},"region":{"type":"string","maxLength":40,"description":"This is the region of the GCP resource."},"bucketPlan":{"$ref":"#/components/schemas/BucketPlan","description":"Bucket configuration used to store call artifacts in Google Cloud Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gcpKey"],"description":"Service-account credentials for Google Cloud resources and optional call-artifact storage, including region, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["gladia"],"description":"Discriminator value: gladia"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Gladia."},{"type":"object","properties":{"provider":{"type":"string","enum":["gohighlevel"],"description":"Discriminator value: gohighlevel"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating Vapi integrations with GoHighLevel."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoogleCredentialDtoProvider","description":"Selects Google AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Google AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["groq"],"description":"Discriminator value: groq"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Groq."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInflectionAiCredentialDtoProvider","description":"Selects Inflection AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Inflection AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["langfuse"],"description":"Discriminator value: langfuse"},"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"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","publicKey","apiKey","apiUrl"],"description":"Credentials for sending assistant call traces to a Langfuse project, including its public key, secret key, and host URL."},{"type":"object","properties":{"provider":{"type":"string","enum":["lmnt"],"description":"Discriminator value: lmnt"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with LMNT."},{"type":"object","properties":{"provider":{"type":"string","enum":["make"],"description":"Discriminator value: 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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","teamId","region","apiKey"],"description":"Credentials for authenticating Vapi integrations with Make, including team, region, and API key."},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"],"description":"Discriminator value: openai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model, transcription, and voice synthesis requests with OpenAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["openrouter"],"description":"Discriminator value: openrouter"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with OpenRouter."},{"type":"object","properties":{"provider":{"type":"string","enum":["perplexity-ai"],"description":"Discriminator value: perplexity-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Perplexity AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["playht"],"description":"Discriminator value: playht"},"apiKey":{"type":"string","description":"This is not returned in the API."},"userId":{"type":"string","description":"PlayHT user identifier associated with the API key."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","userId"],"description":"Credentials for authenticating voice synthesis requests with PlayHT, including the PlayHT user identifier."},{"type":"object","properties":{"provider":{"type":"string","enum":["rime-ai"],"description":"Discriminator value: rime-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Rime AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["runpod"],"description":"Discriminator value: runpod"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests through Runpod."},{"type":"object","properties":{"provider":{"type":"string","enum":["s3"],"description":"Discriminator value: 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","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","awsAccessKeyId","awsSecretAccessKey","region","s3BucketName","s3PathPrefix"],"description":"Credentials for storing call artifacts in Amazon S3, including access keys, region, bucket, path prefix, and upload fallback order."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateS3CompatibleCredentialDtoProvider","description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."},"bucketPlan":{"$ref":"#/components/schemas/S3CompatibleBucketPlan"},"fallbackIndex":{"type":"number","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","bucketPlan"],"description":"s3-compatible variant"},{"type":"object","properties":{"provider":{"type":"string","enum":["supabase"],"description":"Discriminator value: supabase"},"fallbackIndex":{"type":"number","format":"double","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/SupabaseBucketPlan","description":"Supabase S3-compatible bucket configuration used to store call artifacts."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Supabase's S3-compatible storage, including bucket configuration and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["smallest-ai"],"description":"Discriminator value: smallest-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Smallest AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["tavus"],"description":"Discriminator value: tavus"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Tavus."},{"type":"object","properties":{"provider":{"type":"string","enum":["together-ai"],"description":"Discriminator value: together-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Together AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"authToken":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiSecret":{"type":"string","description":"This is not returned in the API."},"accountSid":{"type":"string","description":"Twilio Account SID associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","accountSid"],"description":"Credentials for authenticating telephony requests with Twilio using an account SID and either an auth token or API key credentials."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"apiSecret":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"Vonage API key associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiSecret","apiKey"],"description":"Credentials for authenticating telephony requests with Vonage."},{"type":"object","properties":{"provider":{"type":"string","enum":["webhook"],"description":"Discriminator value: webhook"},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"CreateWebhookCredentialDTO variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomCredentialDtoProvider","description":"Selects a custom credential configuration."},"authenticationPlan":{"$ref":"#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"encryptionPlan":{"$ref":"#/components/schemas/PublicKeyEncryptionPlan","description":"This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"Reusable custom credentials for authenticating outbound requests, with optional public-key encryption for sensitive request data."},{"type":"object","properties":{"provider":{"type":"string","enum":["xai"],"description":"Discriminator value: xai"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with xAI."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMicrosoftCredentialDtoProvider"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"region":{"type":"string","maxLength":64,"description":"Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"microsoft variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateNeuphonicCredentialDtoProvider","description":"Selects Neuphonic as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Neuphonic."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateHumeCredentialDtoProvider","description":"Selects Hume as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Hume."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMistralCredentialDtoProvider","description":"Selects Mistral as the credential provider."},"apiKey":{"type":"string","maxLength":100,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Mistral."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSpeechmaticsCredentialDtoProvider","description":"Selects Speechmatics as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Speechmatics."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSonioxCredentialDtoProvider","description":"Selects Soniox as the credential provider."},"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Soniox."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-client"],"description":"Discriminator value: google.calendar.oauth2-client"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"OAuth 2.0 client credential for Google Calendar integrations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-authorization"],"description":"Discriminator value: google.calendar.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Calendar operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.sheets.oauth2-authorization"],"description":"Discriminator value: google.sheets.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Sheets operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["slack.oauth2-authorization"],"description":"Discriminator value: slack.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Slack operations."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider","description":"Selects GoHighLevel OAuth 2.0 authorization for MCP."},"authenticationSession":{"$ref":"#/components/schemas/Oauth2AuthenticationSession","description":"This is the authentication session for the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationSession"],"description":"OAuth 2.0 session credentials for authenticating GoHighLevel MCP requests."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInworldCredentialDtoProvider","description":"Selects Inworld as the credential provider."},"apiKey":{"type":"string","description":"This is the Inworld Basic (Base64) authentication token. This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Inworld."},{"type":"object","properties":{"provider":{"type":"string","enum":["minimax"],"description":"Discriminator value: minimax"},"apiKey":{"type":"string","description":"This is not returned in the API."},"groupId":{"type":"string","description":"This is the Minimax Group ID."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","groupId"],"description":"Credentials for authenticating assistant model and voice synthesis requests with MiniMax, including the MiniMax group identifier."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateWellSaidCredentialDtoProvider","description":"Selects WellSaid as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with WellSaid."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateEmailCredentialDtoProvider","description":"Selects email as the alert destination provider."},"email":{"type":"string","description":"The recipient email address for alerts"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","email"],"description":"Destination configuration for sending Vapi alerts to an email address."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSlackWebhookCredentialDtoProvider","description":"Selects a Slack incoming webhook as the credential provider."},"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","webhookUrl"],"description":"Credentials for sending Vapi alerts through a Slack incoming webhook."}],"discriminator":{"propertyName":"provider"},"title":"WorkflowUserEditableCredentialsItems"},"WorkflowUserEditableVoicemailDetection0":{"type":"string","enum":["off"],"title":"WorkflowUserEditableVoicemailDetection0"},"GoogleVoicemailDetectionPlanProvider":{"type":"string","enum":["google"],"description":"This is the provider to use for voicemail detection.","title":"GoogleVoicemailDetectionPlanProvider"},"VoicemailDetectionBackoffPlan":{"type":"object","properties":{"startAtSeconds":{"type":"number","format":"double","minimum":0,"default":5,"description":"This is the number of seconds to wait before starting the first retry attempt."},"frequencySeconds":{"type":"number","format":"double","minimum":2.5,"default":5,"description":"This is the interval in seconds between retry attempts."},"maxRetries":{"type":"number","format":"double","minimum":1,"maximum":10,"default":6,"description":"This is the maximum number of retry attempts before giving up."}},"description":"Controls voicemail-detection retry timing, including when retries start, retry frequency, and maximum attempts.","title":"VoicemailDetectionBackoffPlan"},"GoogleVoicemailDetectionPlanType":{"type":"string","enum":["audio","transcript"],"description":"This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)","title":"GoogleVoicemailDetectionPlanType"},"GoogleVoicemailDetectionPlan":{"type":"object","properties":{"beepMaxAwaitSeconds":{"type":"number","format":"double","minimum":0,"maximum":30,"default":30,"description":"This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- Setting too low a value means that the bot will start speaking its voicemail message too early. If it does so before the actual beep, it will get cut off. You should definitely tune this to your use case.\n\n@default 30\n@min 0\n@max 60"},"provider":{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlanProvider","description":"This is the provider to use for voicemail detection."},"backoffPlan":{"$ref":"#/components/schemas/VoicemailDetectionBackoffPlan","description":"This is the backoff plan for the voicemail detection."},"type":{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlanType","description":"This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)"}},"required":["provider"],"description":"Configuration for detecting voicemail with Google, including detection type, maximum beep wait, and retry backoff.","title":"GoogleVoicemailDetectionPlan"},"OpenAiVoicemailDetectionPlanProvider":{"type":"string","enum":["openai"],"description":"This is the provider to use for voicemail detection.","title":"OpenAiVoicemailDetectionPlanProvider"},"OpenAiVoicemailDetectionPlanType":{"type":"string","enum":["audio","transcript"],"description":"This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)","title":"OpenAiVoicemailDetectionPlanType"},"OpenAIVoicemailDetectionPlan":{"type":"object","properties":{"beepMaxAwaitSeconds":{"type":"number","format":"double","minimum":0,"maximum":30,"default":30,"description":"This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- Setting too low a value means that the bot will start speaking its voicemail message too early. If it does so before the actual beep, it will get cut off. You should definitely tune this to your use case.\n\n@default 30\n@min 0\n@max 60"},"provider":{"$ref":"#/components/schemas/OpenAiVoicemailDetectionPlanProvider","description":"This is the provider to use for voicemail detection."},"backoffPlan":{"$ref":"#/components/schemas/VoicemailDetectionBackoffPlan","description":"This is the backoff plan for the voicemail detection."},"type":{"$ref":"#/components/schemas/OpenAiVoicemailDetectionPlanType","description":"This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)"}},"required":["provider"],"description":"Configuration for detecting voicemail with OpenAI, including detection type, maximum beep wait, and retry backoff.","title":"OpenAIVoicemailDetectionPlan"},"TwilioVoicemailDetectionPlanProvider":{"type":"string","enum":["twilio"],"description":"This is the provider to use for voicemail detection.","title":"TwilioVoicemailDetectionPlanProvider"},"TwilioVoicemailDetectionPlanVoicemailDetectionTypes":{"type":"string","enum":["machine_start","human","fax","unknown","machine_end_beep","machine_end_silence","machine_end_other"],"description":"These are the AMD messages from Twilio that are considered as voicemail. Default is ['machine_end_beep', 'machine_end_silence'].\n\n@default {Array} ['machine_end_beep', 'machine_end_silence']","title":"TwilioVoicemailDetectionPlanVoicemailDetectionTypes"},"TwilioVoicemailDetectionPlan":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlanProvider","description":"This is the provider to use for voicemail detection."},"voicemailDetectionTypes":{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlanVoicemailDetectionTypes","description":"These are the AMD messages from Twilio that are considered as voicemail. Default is ['machine_end_beep', 'machine_end_silence'].\n\n@default {Array} ['machine_end_beep', 'machine_end_silence']"},"enabled":{"type":"boolean","description":"This sets whether the assistant should detect voicemail. Defaults to true.\n\n@default true"},"machineDetectionTimeout":{"type":"number","format":"double","minimum":3,"maximum":59,"description":"The number of seconds that Twilio should attempt to perform answering machine detection before timing out and returning AnsweredBy as unknown. Default is 30 seconds.\n\nIncreasing this value will provide the engine more time to make a determination. This can be useful when DetectMessageEnd is provided in the MachineDetection parameter and there is an expectation of long answering machine greetings that can exceed 30 seconds.\n\nDecreasing this value will reduce the amount of time the engine has to make a determination. This can be particularly useful when the Enable option is provided in the MachineDetection parameter and you want to limit the time for initial detection.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 30"},"machineDetectionSpeechThreshold":{"type":"number","format":"double","minimum":1000,"maximum":6000,"description":"The number of milliseconds that is used as the measuring stick for the length of the speech activity. Durations lower than this value will be interpreted as a human, longer as a machine. Default is 2400 milliseconds.\n\nIncreasing this value will reduce the chance of a False Machine (detected machine, actually human) for a long human greeting (e.g., a business greeting) but increase the time it takes to detect a machine.\n\nDecreasing this value will reduce the chances of a False Human (detected human, actually machine) for short voicemail greetings. The value of this parameter may need to be reduced by more than 1000ms to detect very short voicemail greetings. A reduction of that significance can result in increased False Machine detections. Adjusting the MachineDetectionSpeechEndThreshold is likely the better approach for short voicemails. Decreasing MachineDetectionSpeechThreshold will also reduce the time it takes to detect a machine.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 2400"},"machineDetectionSpeechEndThreshold":{"type":"number","format":"double","minimum":500,"maximum":5000,"description":"The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Default is 1200 milliseconds.\n\nIncreasing this value will typically be used to better address the short voicemail greeting scenarios. For short voicemails, there is typically 1000-2000ms of audio followed by 1200-2400ms of silence and then additional audio before the beep. Increasing the MachineDetectionSpeechEndThreshold to ~2500ms will treat the 1200-2400ms of silence as a gap in the greeting but not the end of the greeting and will result in a machine detection. The downsides of such a change include:\n- Increasing the delay for human detection by the amount you increase this parameter, e.g., a change of 1200ms to 2500ms increases human detection delay by 1300ms.\n- Cases where a human has two utterances separated by a period of silence (e.g. a \"Hello\", then 2000ms of silence, and another \"Hello\") may be interpreted as a machine.\n\nDecreasing this value will result in faster human detection. The consequence is that it can lead to increased False Human (detected human, actually machine) detections because a silence gap in a voicemail greeting (not necessarily just in short voicemail scenarios) can be incorrectly interpreted as the end of speech.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 1200"},"machineDetectionSilenceTimeout":{"type":"number","format":"double","minimum":2000,"maximum":10000,"description":"The number of milliseconds of initial silence after which an unknown AnsweredBy result will be returned. Default is 5000 milliseconds.\n\nIncreasing this value will result in waiting for a longer period of initial silence before returning an 'unknown' AMD result.\n\nDecreasing this value will result in waiting for a shorter period of initial silence before returning an 'unknown' AMD result.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 5000"}},"required":["provider"],"description":"Configuration for Twilio answering-machine detection, including recognized outcomes, enablement, timeout, speech thresholds, and silence timeout.","title":"TwilioVoicemailDetectionPlan"},"VapiVoicemailDetectionPlanProvider":{"type":"string","enum":["vapi"],"description":"This is the provider to use for voicemail detection.","title":"VapiVoicemailDetectionPlanProvider"},"VapiVoicemailDetectionPlanType":{"type":"string","enum":["audio","transcript"],"description":"This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)","title":"VapiVoicemailDetectionPlanType"},"VapiVoicemailDetectionPlan":{"type":"object","properties":{"beepMaxAwaitSeconds":{"type":"number","format":"double","minimum":0,"maximum":30,"default":30,"description":"This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- Setting too low a value means that the bot will start speaking its voicemail message too early. If it does so before the actual beep, it will get cut off. You should definitely tune this to your use case.\n\n@default 30\n@min 0\n@max 60"},"provider":{"$ref":"#/components/schemas/VapiVoicemailDetectionPlanProvider","description":"This is the provider to use for voicemail detection."},"backoffPlan":{"$ref":"#/components/schemas/VoicemailDetectionBackoffPlan","description":"This is the backoff plan for the voicemail detection."},"type":{"$ref":"#/components/schemas/VapiVoicemailDetectionPlanType","description":"This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)"}},"required":["provider"],"description":"Configuration for detecting voicemail with Vapi, including detection type, maximum beep wait, and retry backoff.","title":"VapiVoicemailDetectionPlan"},"WorkflowUserEditableVoicemailDetection":{"oneOf":[{"$ref":"#/components/schemas/WorkflowUserEditableVoicemailDetection0"},{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlan"},{"$ref":"#/components/schemas/OpenAIVoicemailDetectionPlan"},{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlan"},{"$ref":"#/components/schemas/VapiVoicemailDetectionPlan"}],"description":"This is the voicemail detection plan for the workflow.","title":"WorkflowUserEditableVoicemailDetection"},"AiEdgeConditionType":{"type":"string","enum":["ai"],"description":"Selects an AI-evaluated workflow edge condition.","title":"AiEdgeConditionType"},"AIEdgeCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AiEdgeConditionType","description":"Selects an AI-evaluated workflow edge condition."},"prompt":{"type":"string","maxLength":1000,"description":"This is the prompt for the AI edge condition. It should evaluate to a boolean."}},"required":["type","prompt"],"description":"An AI-evaluated boolean condition that determines whether a workflow follows an edge.","title":"AIEdgeCondition"},"EdgeCondition":{"oneOf":[{"$ref":"#/components/schemas/AIEdgeCondition"}],"description":"Condition that must evaluate to true to follow this edge.","title":"EdgeCondition"},"EdgeMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the edge.","title":"EdgeMetadata"},"Edge":{"type":"object","properties":{"condition":{"$ref":"#/components/schemas/EdgeCondition","description":"Condition that must evaluate to true to follow this edge."},"from":{"type":"string","maxLength":80,"description":"Name of the source workflow node."},"to":{"type":"string","maxLength":80,"description":"Name of the destination workflow node."},"metadata":{"$ref":"#/components/schemas/EdgeMetadata","description":"This is for metadata you want to store on the edge."}},"required":["from","to"],"description":"A directed connection between two workflow nodes, with an optional AI-evaluated transition condition.","title":"Edge"},"SecurityFilterBase":{"type":"object","properties":{},"description":"Base configuration for a security filter applied to transcripts before model processing.","title":"SecurityFilterBase"},"SecurityFilterPlanMode":{"type":"string","enum":["sanitize","reject","replace"],"default":"sanitize","description":"Mode of operation when a security threat is detected.\n- 'sanitize': Remove or replace the threatening content\n- 'reject': Replace the entire transcript with replacement text\n- 'replace': Replace threatening patterns with replacement text\n@default 'sanitize'","title":"SecurityFilterPlanMode"},"SecurityFilterPlan":{"type":"object","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether the security filter is enabled.\n@default false"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/SecurityFilterBase"},"description":"Array of security filter types to apply.\nIf array is not empty, only those security filters are run."},"mode":{"$ref":"#/components/schemas/SecurityFilterPlanMode","default":"sanitize","description":"Mode of operation when a security threat is detected.\n- 'sanitize': Remove or replace the threatening content\n- 'reject': Replace the entire transcript with replacement text\n- 'replace': Replace threatening patterns with replacement text\n@default 'sanitize'"},"replacementText":{"type":"string","default":"[FILTERED]","description":"Text to use when replacing filtered content.\n@default '[FILTERED]'"}},"description":"Controls filtering of transcripts for security threats before content is sent to the assistant's language model, including filter selection, handling mode, and replacement text.","title":"SecurityFilterPlan"},"CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience.","title":"CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineVoice"},"CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineFirstMessageMode":{"type":"string","enum":["assistant-speaks-first","assistant-waits-for-user"],"default":"assistant-speaks-first","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'","title":"CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineFirstMessageMode"},"CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience.","title":"CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalVoice"},"CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalFirstMessageMode":{"type":"string","enum":["assistant-speaks-first","assistant-waits-for-user"],"default":"assistant-speaks-first","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'","title":"CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalFirstMessageMode"},"CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalDeclineTool":{"type":"object","properties":{},"description":"Tool to execute if user verbally declines recording consent","title":"CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalDeclineTool"},"CompliancePlanRecordingConsentPlan":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["stay-on-line"],"description":"Discriminator value: stay-on-line"},"message":{"type":"string","maxLength":1000,"description":"This is the message asking for consent to record the call.\nIf the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.\nIf the type is `verbal`, the message should ask the user to verbally consent or decline."},"voice":{"$ref":"#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineVoice","description":"This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience."},"firstMessageMode":{"$ref":"#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineFirstMessageMode","default":"assistant-speaks-first","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'"},"waitSeconds":{"type":"number","format":"double","minimum":1,"maximum":6,"default":3,"description":"Number of seconds to wait before transferring to the assistant if user stays on the call"}},"required":["type","message"],"description":"Configuration for requesting recording consent by treating continued presence on the call as consent, including the announcement voice and wait time."},{"type":"object","properties":{"type":{"type":"string","enum":["verbal"],"description":"Discriminator value: verbal"},"message":{"type":"string","maxLength":1000,"description":"This is the message asking for consent to record the call.\nIf the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.\nIf the type is `verbal`, the message should ask the user to verbally consent or decline."},"voice":{"$ref":"#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalVoice","description":"This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience."},"firstMessageMode":{"$ref":"#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalFirstMessageMode","default":"assistant-speaks-first","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'"},"declineTool":{"$ref":"#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalDeclineTool","description":"Tool to execute if user verbally declines recording consent"},"declineToolId":{"type":"string","description":"ID of existing tool to execute if user verbally declines recording consent"}},"required":["type","message"],"description":"Configuration for requesting explicit verbal recording consent, including the announcement voice and action to take when the customer declines."}],"discriminator":{"propertyName":"type"},"description":"Controls how recording consent is requested before the assistant joins the call.","title":"CompliancePlanRecordingConsentPlan"},"CompliancePlan":{"type":"object","properties":{"hipaaEnabled":{"type":"boolean","description":"When this is enabled, logs, recordings, and transcriptions will be stored in HIPAA-compliant storage. Defaults to false. Only HIPAA-compliant providers will be available for LLM, Voice, and Transcriber respectively. This setting is only honored if the organization is on an Enterprise subscription or has purchased the HIPAA add-on."},"pciEnabled":{"type":"boolean","description":"When this is enabled, the user will be restricted to use PCI-compliant providers, and no logs or transcripts are stored.\nAt the end of the call, you will receive an end-of-call-report message to store on your server. Defaults to false."},"securityFilterPlan":{"$ref":"#/components/schemas/SecurityFilterPlan","description":"This is the security filter plan for the assistant. It allows filtering of transcripts for security threats before sending to LLM."},"recordingConsentPlan":{"$ref":"#/components/schemas/CompliancePlanRecordingConsentPlan","description":"Controls how recording consent is requested before the assistant joins the call."}},"description":"Controls HIPAA and PCI requirements, transcript security filtering, and recording-consent handling for assistant calls.","title":"CompliancePlan"},"StructuredDataPlanMessagesItems":{"type":"object","properties":{},"title":"StructuredDataPlanMessagesItems"},"StructuredDataPlan":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/StructuredDataPlanMessagesItems"},"description":"These are the messages used to generate the structured data.\n\n@default: ```\n[\n  {\n    \"role\": \"system\",\n    \"content\": \"You are an expert data extractor. You will be given a transcript of a call. Extract structured data per the JSON Schema. DO NOT return anything except the structured data.\\n\\nJson Schema:\\\\n{{schema}}\\n\\nOnly respond with the JSON.\"\n  },\n  {\n    \"role\": \"user\",\n    \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n  }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{transcript}}: the transcript of the call from `call.artifact.transcript`- {{systemPrompt}}: the system prompt of the call from `assistant.model.messages[type=system].content`- {{messages}}: the messages of the call from `assistant.model.messages`- {{schema}}: the schema of the structured data from `structuredDataPlan.schema`- {{endedReason}}: the ended reason of the call from `call.endedReason`"},"enabled":{"type":"boolean","description":"This determines whether structured data is generated and stored in `call.analysis.structuredData`. Defaults to false.\n\nUsage:\n- If you want to extract structured data, set this to true and provide a `schema`.\n\n@default false"},"schema":{"$ref":"#/components/schemas/JsonSchema","description":"This is the schema of the structured data. The output is stored in `call.analysis.structuredData`.\n\nComplete guide on JSON Schema can be found [here](https://ajv.js.org/json-schema.html#json-data-type)."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":60,"description":"This is how long the request is tried before giving up. When request times out, `call.analysis.structuredData` will be empty.\n\nUsage:\n- To guarantee the structured data is generated, set this value high. Note, this will delay the end of call report in cases where model is slow to respond.\n\n@default 5 seconds"}},"description":"Controls extraction of post-call structured data, including prompt messages, JSON schema, enablement, and request timeout.","title":"StructuredDataPlan"},"StructuredDataMultiPlan":{"type":"object","properties":{"key":{"type":"string","description":"This is the key of the structured data plan in the catalog."},"plan":{"$ref":"#/components/schemas/StructuredDataPlan","description":"This is an individual structured data plan in the catalog."}},"required":["key","plan"],"description":"Associates a catalog key with a structured data extraction plan.","title":"StructuredDataMultiPlan"},"SuccessEvaluationPlanRubric":{"type":"string","enum":["NumericScale","DescriptiveScale","Checklist","Matrix","PercentageScale","LikertScale","AutomaticRubric","PassFail"],"description":"This enforces the rubric of the evaluation. The output is stored in `call.analysis.successEvaluation`.\n\nOptions include:\n- 'NumericScale': A scale of 1 to 10.\n- 'DescriptiveScale': A scale of Excellent, Good, Fair, Poor.\n- 'Checklist': A checklist of criteria and their status.\n- 'Matrix': A grid that evaluates multiple criteria across different performance levels.\n- 'PercentageScale': A scale of 0% to 100%.\n- 'LikertScale': A scale of Strongly Agree, Agree, Neutral, Disagree, Strongly Disagree.\n- 'AutomaticRubric': Automatically break down evaluation into several criteria, each with its own score.\n- 'PassFail': A simple 'true' if call passed, 'false' if not.\n\nDefault is 'PassFail'.","title":"SuccessEvaluationPlanRubric"},"SuccessEvaluationPlanMessagesItems":{"type":"object","properties":{},"title":"SuccessEvaluationPlanMessagesItems"},"SuccessEvaluationPlan":{"type":"object","properties":{"rubric":{"$ref":"#/components/schemas/SuccessEvaluationPlanRubric","description":"This enforces the rubric of the evaluation. The output is stored in `call.analysis.successEvaluation`.\n\nOptions include:\n- 'NumericScale': A scale of 1 to 10.\n- 'DescriptiveScale': A scale of Excellent, Good, Fair, Poor.\n- 'Checklist': A checklist of criteria and their status.\n- 'Matrix': A grid that evaluates multiple criteria across different performance levels.\n- 'PercentageScale': A scale of 0% to 100%.\n- 'LikertScale': A scale of Strongly Agree, Agree, Neutral, Disagree, Strongly Disagree.\n- 'AutomaticRubric': Automatically break down evaluation into several criteria, each with its own score.\n- 'PassFail': A simple 'true' if call passed, 'false' if not.\n\nDefault is 'PassFail'."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/SuccessEvaluationPlanMessagesItems"},"description":"These are the messages used to generate the success evaluation.\n\n@default: ```\n[\n  {\n    \"role\": \"system\",\n    \"content\": \"You are an expert call evaluator. You will be given a transcript of a call and the system prompt of the AI participant. Determine if the call was successful based on the objectives inferred from the system prompt. DO NOT return anything except the result.\\n\\nRubric:\\\\n{{rubric}}\\n\\nOnly respond with the result.\"\n  },\n  {\n    \"role\": \"user\",\n    \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n\"\n  },\n  {\n    \"role\": \"user\",\n    \"content\": \"Here was the system prompt of the call:\\n\\n{{systemPrompt}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n  }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{transcript}}: the transcript of the call from `call.artifact.transcript`- {{systemPrompt}}: the system prompt of the call from `assistant.model.messages[type=system].content`- {{messages}}: the messages of the call from `assistant.model.messages`- {{rubric}}: the rubric of the success evaluation from `successEvaluationPlan.rubric`- {{endedReason}}: the ended reason of the call from `call.endedReason`"},"enabled":{"type":"boolean","description":"This determines whether a success evaluation is generated and stored in `call.analysis.successEvaluation`. Defaults to true.\n\nUsage:\n- If you want to disable the success evaluation, set this to false.\n\n@default true"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":60,"description":"This is how long the request is tried before giving up. When request times out, `call.analysis.successEvaluation` will be empty.\n\nUsage:\n- To guarantee the success evaluation is generated, set this value high. Note, this will delay the end of call report in cases where model is slow to respond.\n\n@default 5 seconds"}},"description":"Controls post-call success evaluation, including the rubric, prompt messages, enablement, and request timeout.","title":"SuccessEvaluationPlan"},"AnalysisPlan":{"type":"object","properties":{"minMessagesThreshold":{"type":"number","format":"double","minimum":0,"description":"The minimum number of messages required to run the analysis plan.\nIf the number of messages is less than this, analysis will be skipped.\n\n@default 2","deprecated":true},"summaryPlan":{"$ref":"#/components/schemas/SummaryPlan","description":"This is the plan for generating the summary of the call. This outputs to `call.analysis.summary`."},"structuredDataPlan":{"$ref":"#/components/schemas/StructuredDataPlan","description":"This is the plan for generating the structured data from the call. This outputs to `call.analysis.structuredData`."},"structuredDataMultiPlan":{"type":"array","items":{"$ref":"#/components/schemas/StructuredDataMultiPlan"},"description":"This is an array of structured data plan catalogs. Each entry includes a `key` and a `plan` for generating the structured data from the call. This outputs to `call.analysis.structuredDataMulti`.","deprecated":true},"successEvaluationPlan":{"$ref":"#/components/schemas/SuccessEvaluationPlan","description":"This is the plan for generating the success evaluation of the call. This outputs to `call.analysis.successEvaluation`."},"outcomeIds":{"type":"array","items":{"type":"string"},"description":"This is an array of outcome UUIDs to be calculated during analysis.\nThe outcomes will be calculated and stored in `call.analysis.outcomes`.","deprecated":true}},"description":"Configuration for post-call analysis of summaries, structured-data extraction, success evaluation, and outcomes.","title":"AnalysisPlan"},"ArtifactPlanRecordingFormat":{"type":"string","enum":["wav;l16","mp3"],"description":"This determines the format of the recording. Defaults to `wav;l16`.\n\n@default 'wav;l16'","title":"ArtifactPlanRecordingFormat"},"TranscriptPlan":{"type":"object","properties":{"enabled":{"type":"boolean","description":"This determines whether the transcript is stored in `call.artifact.transcript`. Defaults to true.\n\n@default true"},"assistantName":{"type":"string","description":"This is the name of the assistant in the transcript. Defaults to 'AI'.\n\nUsage:\n- If you want to change the name of the assistant in the transcript, set this. Example, here is what the transcript would look like with `assistantName` set to 'Buyer':\n```\nUser: Hello, how are you?\nBuyer: I'm fine.\nUser: Do you want to buy a car?\nBuyer: No.\n```\n\n@default 'AI'"},"userName":{"type":"string","description":"This is the name of the user in the transcript. Defaults to 'User'.\n\nUsage:\n- If you want to change the name of the user in the transcript, set this. Example, here is what the transcript would look like with `userName` set to 'Seller':\n```\nSeller: Hello, how are you?\nAI: I'm fine.\nSeller: Do you want to buy a car?\nAI: No.\n```\n\n@default 'User'"}},"description":"Controls whether the call transcript is stored and the speaker names used in the transcript.","title":"TranscriptPlan"},"CreateStructuredOutputDtoType":{"type":"string","enum":["ai","regex"],"default":"ai","description":"This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM.\n\nDefaults to 'ai' if not specified.","title":"CreateStructuredOutputDtoType"},"CreateStructuredOutputDtoModel":{"oneOf":[{"$ref":"#/components/schemas/WorkflowOpenAIModel"},{"$ref":"#/components/schemas/WorkflowAnthropicModel"},{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModel"},{"$ref":"#/components/schemas/WorkflowGoogleModel"},{"$ref":"#/components/schemas/WorkflowCustomModel"}],"description":"This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.","title":"CreateStructuredOutputDtoModel"},"ComplianceOverride":{"type":"object","properties":{"forceStoreOnHipaaEnabled":{"type":"boolean","description":"Force storage for this output under HIPAA. Only enable if output contains no sensitive data."}},"description":"Overrides storage behavior for an output when HIPAA compliance is enabled.","title":"ComplianceOverride"},"MinMessagesConditionType":{"type":"string","enum":["minMessages"],"description":"This is the type discriminator for the minMessages condition.","title":"MinMessagesConditionType"},"MinMessagesCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MinMessagesConditionType","description":"This is the type discriminator for the minMessages condition."},"count":{"type":"number","format":"double","minimum":0,"description":"This is the minimum number of conversation messages required for the\nstructured output to run.\n\nA count of 0 removes the runtime default minimum, so the structured output\nruns regardless of how few messages the conversation has."}},"required":["type","count"],"title":"MinMessagesCondition"},"MinCallDurationConditionType":{"type":"string","enum":["minCallDuration"],"description":"This is the type discriminator for the minCallDuration condition.","title":"MinCallDurationConditionType"},"MinCallDurationCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MinCallDurationConditionType","description":"This is the type discriminator for the minCallDuration condition."},"seconds":{"type":"number","format":"double","minimum":0,"description":"This is the minimum call duration in seconds required for the structured\noutput to run.\n\nWhen timestamps are unavailable (for example, chat sessions have no call\ntimestamps), this check passes and does not block the structured output."}},"required":["type","seconds"],"title":"MinCallDurationCondition"},"EndedReasonConditionType":{"type":"string","enum":["endedReason"],"description":"This is the type discriminator for the endedReason condition.","title":"EndedReasonConditionType"},"EndedReasonConditionOperator":{"type":"string","enum":["oneOf","notOneOf"],"description":"This is the membership operator applied against `values`.\n\n- 'oneOf': the structured output runs only if the call's ended reason is in `values`.\n- 'notOneOf': the structured output runs only if the call's ended reason is NOT in `values`.","title":"EndedReasonConditionOperator"},"EndedReasonCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/EndedReasonConditionType","description":"This is the type discriminator for the endedReason condition."},"operator":{"$ref":"#/components/schemas/EndedReasonConditionOperator","description":"This is the membership operator applied against `values`.\n\n- 'oneOf': the structured output runs only if the call's ended reason is in `values`.\n- 'notOneOf': the structured output runs only if the call's ended reason is NOT in `values`."},"values":{"type":"array","items":{"type":"string"},"description":"These are the ended reasons compared against the call's ended reason.\n\nAny string is accepted so configurations never break when new ended\nreasons are introduced. Must contain at least one value."}},"required":["type","operator","values"],"title":"EndedReasonCondition"},"CreateStructuredOutputDtoConditionsItems":{"oneOf":[{"$ref":"#/components/schemas/MinMessagesCondition"},{"$ref":"#/components/schemas/MinCallDurationCondition"},{"$ref":"#/components/schemas/EndedReasonCondition"}],"title":"CreateStructuredOutputDtoConditionsItems"},"CreateStructuredOutputDTO":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/CreateStructuredOutputDtoType","default":"ai","description":"This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM.\n\nDefaults to 'ai' if not specified."},"regex":{"type":"string","minLength":1,"maxLength":1000,"description":"This is the regex pattern to match against the transcript.\n\nOnly used when type is 'regex'. Supports both raw patterns (e.g. '\\d+') and\nregex literal format (e.g. '/\\d+/gi'). Uses RE2 syntax for safety.\n\nThe result depends on the schema type:\n- boolean: true if the pattern matches, false otherwise\n- string: the first match or first capture group\n- number/integer: the first match parsed as a number\n- array: all matches"},"model":{"$ref":"#/components/schemas/CreateStructuredOutputDtoModel","description":"This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used."},"compliancePlan":{"$ref":"#/components/schemas/ComplianceOverride","description":"Compliance configuration for this output. Only enable overrides if no sensitive data will be stored."},"conditions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/CreateStructuredOutputDtoConditionsItems"},"description":"These are the conditions that gate the execution of this structured output. Every condition must pass for the structured output to run (AND semantics). When omitted or empty, no user-defined conditions gate this output. Send null to clear a previously saved gate."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the structured output."},"schema":{"$ref":"#/components/schemas/JsonSchema","description":"This is the JSON Schema definition for the structured output.\n\nThis is required when creating a structured output. Defines the structure and validation rules for the data that will be extracted. Supports all JSON Schema features including:\n- Objects and nested properties\n- Arrays and array validation\n- String, number, boolean, and null types\n- Enums and const values\n- Validation constraints (min/max, patterns, etc.)\n- Composition with allOf, anyOf, oneOf"},"description":{"type":"string","description":"This is the description of what the structured output extracts.\n\nUse this to provide context about what data will be extracted and how it will be used."},"assistantIds":{"type":"array","items":{"type":"string"},"description":"These are the assistant IDs that this structured output is linked to.\n\nWhen linked to assistants, this structured output will be available for extraction during those assistant's calls."},"workflowIds":{"type":"array","items":{"type":"string"},"description":"These are the workflow IDs that this structured output is linked to.\n\nWhen linked to workflows, this structured output will be available for extraction during those workflow's execution."}},"required":["name","schema"],"description":"Configuration used to create a structured-output definition that extracts validated data from calls using an AI model or regular expression.","title":"CreateStructuredOutputDTO"},"NumberComparatorScorecardMetricConditionType":{"type":"string","enum":["comparator"],"description":"This is the type of the condition. Currently only 'comparator' is supported.","title":"NumberComparatorScorecardMetricConditionType"},"NumberComparatorScorecardMetricConditionComparator":{"type":"string","enum":["=","!=",">","<",">=","<="],"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.","title":"NumberComparatorScorecardMetricConditionComparator"},"NumberComparatorScorecardMetricCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/NumberComparatorScorecardMetricConditionType","description":"This is the type of the condition. Currently only 'comparator' is supported."},"comparator":{"$ref":"#/components/schemas/NumberComparatorScorecardMetricConditionComparator","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."},"value":{"type":"number","format":"double","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","format":"double","minimum":0,"maximum":100,"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."}},"required":["type","comparator","value","points"],"title":"NumberComparatorScorecardMetricCondition"},"BooleanComparatorScorecardMetricConditionType":{"type":"string","enum":["comparator"],"description":"This is the type of the condition. Currently only 'comparator' is supported.","title":"BooleanComparatorScorecardMetricConditionType"},"BooleanComparatorScorecardMetricConditionComparator":{"type":"string","enum":["="],"description":"The comparator can only be '=' for boolean conditions.","title":"BooleanComparatorScorecardMetricConditionComparator"},"BooleanComparatorScorecardMetricCondition":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BooleanComparatorScorecardMetricConditionType","description":"This is the type of the condition. Currently only 'comparator' is supported."},"comparator":{"$ref":"#/components/schemas/BooleanComparatorScorecardMetricConditionComparator","description":"The comparator can only be '=' for boolean conditions."},"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","format":"double","minimum":0,"maximum":100,"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."}},"required":["type","comparator","value","points"],"title":"BooleanComparatorScorecardMetricCondition"},"ScorecardMetricConditionsItems":{"oneOf":[{"$ref":"#/components/schemas/NumberComparatorScorecardMetricCondition"},{"$ref":"#/components/schemas/BooleanComparatorScorecardMetricCondition"}],"title":"ScorecardMetricConditionsItems"},"ScorecardMetric":{"type":"object","properties":{"conditions":{"type":"array","items":{"$ref":"#/components/schemas/ScorecardMetricConditionsItems"},"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."},"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":["conditions","structuredOutputId"],"description":"A scorecard metric that awards points when a structured output meets its configured conditions.","title":"ScorecardMetric"},"CreateScorecardDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"This is the name of the scorecard. It is only for user reference and will not be used for any evaluation."},"description":{"type":"string","maxLength":500,"description":"This is the description of the scorecard. It is only for user reference and will not be used for any evaluation."},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/ScorecardMetric"},"description":"These are the metrics that will be used to evaluate the scorecard.\nEach metric will have a set of conditions and points that will be used to generate the score."},"assistantIds":{"type":"array","items":{"type":"string"},"description":"These are the assistant IDs that this scorecard is linked to.\nWhen linked to assistants, this scorecard will be available for evaluation during those assistants' calls."}},"required":["metrics"],"description":"Configuration used to create a scorecard containing evaluation metrics, scoring conditions, and optional assistant associations.","title":"CreateScorecardDTO"},"ArtifactPlan":{"type":"object","properties":{"recordingEnabled":{"type":"boolean","description":"This determines whether assistant's calls are recorded. Defaults to true.\n\nUsage:\n- If you don't want to record the calls, set this to false.\n- If you want to record the calls when `assistant.hipaaEnabled` (deprecated) or `assistant.compliancePlan.hipaaEnabled` explicity set this to true and make sure to provide S3 or GCP credentials on the Provider Credentials page in the Dashboard.\n\nYou can find the recording at `call.artifact.recordingUrl` and `call.artifact.stereoRecordingUrl` after the call is ended.\n\n@default true"},"recordingFormat":{"$ref":"#/components/schemas/ArtifactPlanRecordingFormat","description":"This determines the format of the recording. Defaults to `wav;l16`.\n\n@default 'wav;l16'"},"recordingUseCustomStorageEnabled":{"type":"boolean","description":"This determines whether to use custom storage (S3 or GCP) for call recordings when storage credentials are configured.\n\nWhen set to false, recordings will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store recordings on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for recordings when available.\n\nIf your organization has ZDR (zero data retention) or PCI enabled, recordings are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\n\n@default true"},"videoRecordingEnabled":{"type":"boolean","description":"This determines whether the video is recorded during the call. Defaults to false. Only relevant for `webCall` type.\n\nYou can find the video recording at `call.artifact.videoRecordingUrl` after the call is ended.\n\n@default false"},"fullMessageHistoryEnabled":{"type":"boolean","description":"This determines whether the artifact contains the full message history, even after handoff context engineering. Defaults to false."},"pcapEnabled":{"type":"boolean","description":"This determines whether the SIP packet capture is enabled. Defaults to true. Only relevant for `phone` type calls where phone number's provider is `vapi` or `byo-phone-number`.\n\nYou can find the packet capture at `call.artifact.pcapUrl` after the call is ended.\n\n@default true"},"pcapS3PathPrefix":{"type":"string","description":"This is the path where the SIP packet capture will be uploaded. This is only used if you have provided S3 or GCP credentials on the Provider Credentials page in the Dashboard.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the packet capture to a specific path, set this to the path. Example: `/my-assistant-captures`.\n- If you want to upload the packet capture to the root of the bucket, set this to `/`.\n\n@default '/'"},"pcapUseCustomStorageEnabled":{"type":"boolean","description":"This determines whether to use custom storage (S3 or GCP) for SIP packet captures when storage credentials are configured.\n\nWhen set to false, packet captures will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store packet captures on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for packet captures when available.\n\nIf your organization has ZDR (zero data retention) or PCI enabled, packet captures are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\n\n@default true"},"loggingEnabled":{"type":"boolean","description":"This determines whether the call logs are enabled. Defaults to true.\n\n@default true"},"loggingUseCustomStorageEnabled":{"type":"boolean","description":"This determines whether to use custom storage (S3 or GCP) for call logs when storage credentials are configured.\n\nWhen set to false, logs will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store logs on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for logs when available.\n\nIf your organization has ZDR (zero data retention) or PCI enabled, logs are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\n\n@default true"},"transcriptPlan":{"$ref":"#/components/schemas/TranscriptPlan","description":"This is the plan for `call.artifact.transcript`. To disable, set `transcriptPlan.enabled` to false."},"recordingPath":{"type":"string","description":"This is the path where the recording will be uploaded. This is only used if you have provided S3 or GCP credentials on the Provider Credentials page in the Dashboard.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the recording to a specific path, set this to the path. Example: `/my-assistant-recordings`.\n- If you want to upload the recording to the root of the bucket, set this to `/`.\n\n@default '/'"},"structuredOutputIds":{"type":"array","items":{"type":"string"},"description":"This is an array of structured output IDs to be calculated during the call.\nThe outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended."},"structuredOutputs":{"type":"array","items":{"$ref":"#/components/schemas/CreateStructuredOutputDTO"},"description":"This is an array of transient structured outputs to be calculated during the call.\nThe outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.\nUse this to provide inline structured output configurations instead of referencing existing ones via structuredOutputIds."},"scorecardIds":{"type":"array","items":{"type":"string"},"description":"This is an array of scorecard IDs that will be evaluated based on the structured outputs extracted during the call.\nThe scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call has ended."},"scorecards":{"type":"array","items":{"$ref":"#/components/schemas/CreateScorecardDTO"},"description":"This is the array of scorecards that will be evaluated based on the structured outputs extracted during the call.\nThe scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call has ended."},"loggingPath":{"type":"string","description":"This is the path where the call logs will be uploaded. This is only used if you have provided S3 or GCP credentials on the Provider Credentials page in the Dashboard.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the call logs to a specific path, set this to the path. Example: `/my-assistant-logs`.\n- If you want to upload the call logs to the root of the bucket, set this to `/`.\n\n@default '/'"}},"description":"Controls artifacts generated and stored for calls, including recordings, packet captures, logs, transcripts, structured outputs, scorecards, and custom storage paths.","title":"ArtifactPlan"},"StartSpeakingPlanSmartEndpointingEnabled1":{"type":"string","enum":["livekit"],"title":"StartSpeakingPlanSmartEndpointingEnabled1"},"StartSpeakingPlanSmartEndpointingEnabled":{"oneOf":[{"type":"boolean"},{"$ref":"#/components/schemas/StartSpeakingPlanSmartEndpointingEnabled1"}],"title":"StartSpeakingPlanSmartEndpointingEnabled","deprecated":true},"VapiSmartEndpointingPlanProvider":{"type":"string","enum":["vapi","livekit","custom-endpointing-model"],"description":"This is the provider for the smart endpointing plan.","title":"VapiSmartEndpointingPlanProvider"},"VapiSmartEndpointingPlan":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/VapiSmartEndpointingPlanProvider","description":"This is the provider for the smart endpointing plan."}},"required":["provider"],"description":"Selects Vapi smart endpointing to determine when customer speech is complete.","title":"VapiSmartEndpointingPlan"},"LivekitSmartEndpointingPlanProvider":{"type":"string","enum":["vapi","livekit","custom-endpointing-model"],"description":"This is the provider for the smart endpointing plan.","title":"LivekitSmartEndpointingPlanProvider"},"LivekitSmartEndpointingPlan":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/LivekitSmartEndpointingPlanProvider","description":"This is the provider for the smart endpointing plan."},"waitFunction":{"type":"string","description":"This expression describes how long the bot will wait to start speaking based on the likelihood that the user has reached an endpoint.\n\nThis is a millisecond valued function. It maps probabilities (real numbers on [0,1]) to milliseconds that the bot should wait before speaking ([0, \\infty]). Any negative values that are returned are set to zero (the bot can't start talking in the past).\n\nA probability of zero represents very high confidence that the caller has stopped speaking, and would like the bot to speak to them. A probability of one represents very high confidence that the caller is still speaking.\n\nUnder the hood, this is parsed into a mathjs expression. Whatever you use to write your expression needs to be valid with respect to mathjs\n\n@default \"20 + 500 * sqrt(x) + 2500 * x^3\""}},"required":["provider"],"description":"Configuration for using LiveKit smart endpointing, including provider selection and wait-function behavior.","title":"LivekitSmartEndpointingPlan"},"CustomEndpointingModelSmartEndpointingPlanProvider":{"type":"string","enum":["vapi","livekit","custom-endpointing-model"],"description":"This is the provider for the smart endpointing plan. Use `custom-endpointing-model` for custom endpointing providers that are not natively supported.","title":"CustomEndpointingModelSmartEndpointingPlanProvider"},"CustomEndpointingModelSmartEndpointingPlan":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CustomEndpointingModelSmartEndpointingPlanProvider","description":"This is the provider for the smart endpointing plan. Use `custom-endpointing-model` for custom endpointing providers that are not natively supported."},"server":{"$ref":"#/components/schemas/Server","description":"This is where the endpointing request will be sent. If not provided, will be sent to `assistant.server`. If that does not exist either, will be sent to `org.server`.\n\nRequest Example:\n\nPOST https://{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\nResponse Expected:\n{\n  \"timeoutSeconds\": 0.5\n}\n\nThe timeout is the number of seconds to wait before considering the user's speech as finished. The endpointing timeout is automatically reset each time a new transcript is received (and another `call.endpointing.request` is sent)."}},"required":["provider"],"description":"Configuration for using a custom endpointing model, including its provider identifier and server connection.","title":"CustomEndpointingModelSmartEndpointingPlan"},"StartSpeakingPlanSmartEndpointingPlan":{"oneOf":[{"$ref":"#/components/schemas/VapiSmartEndpointingPlan"},{"$ref":"#/components/schemas/LivekitSmartEndpointingPlan"},{"$ref":"#/components/schemas/CustomEndpointingModelSmartEndpointingPlan"}],"description":"This is the plan for smart endpointing. Pick between Vapi smart endpointing, LiveKit, or custom endpointing model (or nothing). We strongly recommend using livekit endpointing when working in English. LiveKit endpointing is not supported in other languages, yet.\n\nIf this is set, it will override and take precedence over `transcriptionEndpointingPlan`.\nThis plan will still be overridden by any matching `customEndpointingRules`.\n\nIf this is not set, the system will automatically use the transcriber's built-in endpointing capabilities if available.","title":"StartSpeakingPlanSmartEndpointingPlan"},"AssistantCustomEndpointingRuleType":{"type":"string","enum":["assistant"],"description":"This endpointing rule is based on the last assistant message before customer started speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you have yes/no questions in your use case like \"are you interested in a loan?\", you can set a shorter timeout.\n- If you have questions where the customer may pause to look up information like \"what's my account number?\", you can set a longer timeout.","title":"AssistantCustomEndpointingRuleType"},"AssistantCustomEndpointingRule":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AssistantCustomEndpointingRuleType","description":"This endpointing rule is based on the last assistant message before customer started speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you have yes/no questions in your use case like \"are you interested in a loan?\", you can set a shorter timeout.\n- If you have questions where the customer may pause to look up information like \"what's my account number?\", you can set a longer timeout."},"regex":{"type":"string","description":"This is the regex pattern to match.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."},"regexOptions":{"type":"array","items":{"$ref":"#/components/schemas/RegexOption"},"description":"These are the options for the regex match. Defaults to all disabled.\n\n@default []"},"timeoutSeconds":{"type":"number","format":"double","minimum":0,"maximum":15,"description":"This is the endpointing timeout in seconds, if the rule is matched."}},"required":["type","regex","timeoutSeconds"],"description":"A custom endpointing rule that matches the assistant's last message and applies a configured timeout.","title":"AssistantCustomEndpointingRule"},"CustomerCustomEndpointingRuleType":{"type":"string","enum":["customer"],"description":"This endpointing rule is based on current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the current customer transcription\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout.","title":"CustomerCustomEndpointingRuleType"},"CustomerCustomEndpointingRule":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/CustomerCustomEndpointingRuleType","description":"This endpointing rule is based on current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the current customer transcription\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout."},"regex":{"type":"string","description":"This is the regex pattern to match.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."},"regexOptions":{"type":"array","items":{"$ref":"#/components/schemas/RegexOption"},"description":"These are the options for the regex match. Defaults to all disabled.\n\n@default []"},"timeoutSeconds":{"type":"number","format":"double","minimum":0,"maximum":15,"description":"This is the endpointing timeout in seconds, if the rule is matched."}},"required":["type","regex","timeoutSeconds"],"description":"A custom endpointing rule that matches the customer's current speech and applies a configured timeout.","title":"CustomerCustomEndpointingRule"},"BothCustomEndpointingRuleType":{"type":"string","enum":["both"],"description":"This endpointing rule is based on both the last assistant message and the current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message and the current customer transcription\n- If assistant message matches `assistantRegex` AND customer message matches `customerRegex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout.","title":"BothCustomEndpointingRuleType"},"BothCustomEndpointingRule":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BothCustomEndpointingRuleType","description":"This endpointing rule is based on both the last assistant message and the current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message and the current customer transcription\n- If assistant message matches `assistantRegex` AND customer message matches `customerRegex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout."},"assistantRegex":{"type":"string","description":"This is the regex pattern to match the assistant's message.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."},"assistantRegexOptions":{"type":"array","items":{"$ref":"#/components/schemas/RegexOption"},"description":"These are the options for the assistant's message regex match. Defaults to all disabled.\n\n@default []"},"customerRegex":{"type":"string","description":"The regular expression pattern matched against the customer's speech."},"customerRegexOptions":{"type":"array","items":{"$ref":"#/components/schemas/RegexOption"},"description":"These are the options for the customer's message regex match. Defaults to all disabled.\n\n@default []"},"timeoutSeconds":{"type":"number","format":"double","minimum":0,"maximum":15,"description":"This is the endpointing timeout in seconds, if the rule is matched."}},"required":["type","assistantRegex","customerRegex","timeoutSeconds"],"description":"A custom endpointing rule that matches both the assistant's last message and the customer's current speech before applying a configured timeout.","title":"BothCustomEndpointingRule"},"StartSpeakingPlanCustomEndpointingRulesItems":{"oneOf":[{"$ref":"#/components/schemas/AssistantCustomEndpointingRule"},{"$ref":"#/components/schemas/CustomerCustomEndpointingRule"},{"$ref":"#/components/schemas/BothCustomEndpointingRule"}],"title":"StartSpeakingPlanCustomEndpointingRulesItems"},"TranscriptionEndpointingPlan":{"type":"object","properties":{"onPunctuationSeconds":{"type":"number","format":"double","minimum":0,"maximum":3,"description":"The minimum number of seconds to wait after transcription ending with punctuation before sending a request to the model. Defaults to 0.1.\n\nThis setting exists because the transcriber punctuates the transcription when it's more confident that customer has completed a thought.\n\n@default 0.1"},"onNoPunctuationSeconds":{"type":"number","format":"double","minimum":0,"maximum":3,"description":"The minimum number of seconds to wait after transcription ending without punctuation before sending a request to the model. Defaults to 1.5.\n\nThis setting exists to catch the cases where the transcriber was not confident enough to punctuate the transcription, but the customer is done and has been silent for a long time.\n\n@default 1.5"},"onNumberSeconds":{"type":"number","format":"double","minimum":0,"maximum":3,"description":"The minimum number of seconds to wait after transcription ending with a number before sending a request to the model. Defaults to 0.4.\n\nThis setting exists because the transcriber will sometimes punctuate the transcription ending with a number, even though the customer hasn't uttered the full number. This happens commonly for long numbers when the customer reads the number in chunks.\n\n@default 0.5"}},"description":"Controls endpointing delays based on whether customer speech ends with punctuation, without punctuation, or with a number.","title":"TranscriptionEndpointingPlan"},"StartSpeakingPlan":{"type":"object","properties":{"waitSeconds":{"type":"number","format":"double","minimum":0,"maximum":5,"description":"This is how long assistant waits before speaking. Defaults to 0.4.\n\nThis is the minimum it will wait but if there is latency is the pipeline, this minimum will be exceeded. This is intended as a stopgap in case the pipeline is moving too fast.\n\nExample:\n- If model generates tokens and voice generates bytes within 100ms, the pipeline still waits 300ms before outputting speech.\n\nUsage:\n- If the customer is taking long pauses, set this to a higher value.\n- If the assistant is accidentally jumping in too much, set this to a higher value.\n\n@default 0.4"},"smartEndpointingEnabled":{"$ref":"#/components/schemas/StartSpeakingPlanSmartEndpointingEnabled","deprecated":true},"smartEndpointingPlan":{"$ref":"#/components/schemas/StartSpeakingPlanSmartEndpointingPlan","description":"This is the plan for smart endpointing. Pick between Vapi smart endpointing, LiveKit, or custom endpointing model (or nothing). We strongly recommend using livekit endpointing when working in English. LiveKit endpointing is not supported in other languages, yet.\n\nIf this is set, it will override and take precedence over `transcriptionEndpointingPlan`.\nThis plan will still be overridden by any matching `customEndpointingRules`.\n\nIf this is not set, the system will automatically use the transcriber's built-in endpointing capabilities if available."},"customEndpointingRules":{"type":"array","items":{"$ref":"#/components/schemas/StartSpeakingPlanCustomEndpointingRulesItems"},"description":"These are the custom endpointing rules to set an endpointing timeout based on a regex on the customer's speech or the assistant's last message.\n\nUsage:\n- If you have yes/no questions like \"are you interested in a loan?\", you can set a shorter timeout.\n- If you have questions where the customer may pause to look up information like \"what's my account number?\", you can set a longer timeout.\n- If you want to wait longer while customer is enumerating a list of numbers, you can set a longer timeout.\n\nThese rules have the highest precedence and will override both `smartEndpointingPlan` and `transcriptionEndpointingPlan` when a rule is matched.\n\nThe rules are evaluated in order and the first one that matches will be used.\n\nOrder of precedence for endpointing:\n1. customEndpointingRules (if any match)\n2. smartEndpointingPlan (if set)\n3. transcriptionEndpointingPlan\n\n@default []"},"transcriptionEndpointingPlan":{"$ref":"#/components/schemas/TranscriptionEndpointingPlan","description":"This determines how a customer speech is considered done (endpointing) using the transcription of customer's speech.\n\nOnce an endpoint is triggered, the request is sent to `assistant.model`.\n\nNote: This plan is only used if `smartEndpointingPlan` is not set and transcriber does not have built-in endpointing capabilities. If both are provided, `smartEndpointingPlan` takes precedence.\nThis plan will also be overridden by any matching `customEndpointingRules`."}},"description":"Controls when the assistant begins speaking after customer speech, including the minimum wait, endpointing strategy, and custom endpointing rules.","title":"StartSpeakingPlan"},"StopSpeakingPlan":{"type":"object","properties":{"numWords":{"type":"number","format":"double","minimum":0,"maximum":10,"description":"This is the number of words that the customer has to say before the assistant will stop talking.\n\nWords like \"stop\", \"actually\", \"no\", etc. will always interrupt immediately regardless of this value.\n\nWords like \"okay\", \"yeah\", \"right\" will never interrupt.\n\nWhen set to 0, `voiceSeconds` is used in addition to the transcriptions to determine the customer has started speaking.\n\nDefaults to 0.\n\n@default 0"},"voiceSeconds":{"type":"number","format":"double","minimum":0,"maximum":0.5,"description":"This is the seconds customer has to speak before the assistant stops talking. This uses the VAD (Voice Activity Detection) spike to determine if the customer has started speaking.\n\nConsiderations:\n- A lower value might be more responsive but could potentially pick up non-speech sounds.\n- A higher value reduces false positives but might slightly delay the detection of speech onset.\n\nThis is only used if `numWords` is set to 0.\n\nDefaults to 0.2\n\n@default 0.2"},"backoffSeconds":{"type":"number","format":"double","minimum":0,"maximum":10,"description":"This is the seconds to wait before the assistant will start talking again after being interrupted.\n\nDefaults to 1.\n\n@default 1"},"acknowledgementPhrases":{"type":"array","items":{"type":"string","maxLength":240},"default":["i understand","i see","i got it","i hear you","im listening","im with you","right","okay","ok","sure","alright","got it","understood","yeah","yes","uh-huh","mm-hmm","gotcha","mhmm","ah","yeah okay","yeah sure"],"description":"These are the phrases that will never interrupt the assistant, even if numWords threshold is met.\nThese are typically acknowledgement or backchanneling phrases."},"interruptionPhrases":{"type":"array","items":{"type":"string","maxLength":240},"default":["stop","shut","up","enough","quiet","silence","but","dont","not","no","hold","wait","cut","pause","nope","nah","nevermind","never","bad","actually"],"description":"These are the phrases that will always interrupt the assistant immediately, regardless of numWords.\nThese are typically phrases indicating disagreement or desire to stop."}},"description":"Controls when the assistant stops speaking after a customer interruption, including word and voice thresholds, restart delay, and phrase exceptions.","title":"StopSpeakingPlan"},"MonitorPlan":{"type":"object","properties":{"listenEnabled":{"type":"boolean","description":"This determines whether the assistant's calls allow live listening. Defaults to true.\n\nFetch `call.monitor.listenUrl` to get the live listening URL.\n\n@default true"},"listenAuthenticationEnabled":{"type":"boolean","description":"This enables authentication on the `call.monitor.listenUrl`.\n\nIf `listenAuthenticationEnabled` is `true`, the `call.monitor.listenUrl` will require an `Authorization: Bearer <vapi-public-api-key>` header.\n\n@default false"},"controlEnabled":{"type":"boolean","description":"This determines whether the assistant's calls allow live control. Defaults to true.\n\nFetch `call.monitor.controlUrl` to get the live control URL.\n\nTo use, send any control message via a POST request to `call.monitor.controlUrl`. Here are the types of controls supported: https://docs.vapi.ai/api-reference/messages/client-inbound-message\n\n@default true"},"controlAuthenticationEnabled":{"type":"boolean","description":"This enables authentication on the `call.monitor.controlUrl`.\n\nIf `controlAuthenticationEnabled` is `true`, the `call.monitor.controlUrl` will require an `Authorization: Bearer <vapi-public-api-key>` header.\n\n@default false"},"monitorIds":{"type":"array","items":{"type":"string"},"description":"IDs of the monitors attached to the assistant. Use this field for transient assistants or to update the monitors attached to an existing assistant. Defaults to an empty array."}},"description":"Controls real-time listening and control for assistant calls, authentication requirements for monitor URLs, and attached monitors.","title":"MonitorPlan"},"SmartDenoisingPlan":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Whether smart denoising using Krisp is enabled."}},"description":"Controls whether Krisp smart denoising filters background speech and noise.","title":"SmartDenoisingPlan"},"FourierDenoisingPlan":{"type":"object","properties":{"enabled":{"type":"boolean","default":false,"description":"Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected."},"mediaDetectionEnabled":{"type":"boolean","default":true,"description":"Whether automatic media detection is enabled. When enabled, the filter will automatically\ndetect consistent background TV/music/radio and switch to more aggressive filtering settings.\nOnly applies when enabled is true."},"staticThreshold":{"type":"number","format":"double","minimum":-80,"maximum":0,"default":-35,"description":"Static threshold in dB used as fallback when no baseline is established."},"baselineOffsetDb":{"type":"number","format":"double","minimum":-30,"maximum":-5,"default":-15,"description":"How far below the rolling baseline to filter audio, in dB.\nLower values (e.g., -10) are more aggressive, higher values (e.g., -20) are more conservative."},"windowSizeMs":{"type":"number","format":"double","minimum":1000,"maximum":30000,"default":3000,"description":"Rolling window size in milliseconds for calculating the audio baseline.\nLarger windows adapt more slowly but are more stable."},"baselinePercentile":{"type":"number","format":"double","minimum":1,"maximum":99,"default":85,"description":"Percentile to use for baseline calculation (1-99).\nHigher percentiles (e.g., 85) focus on louder speech, lower percentiles (e.g., 50) include quieter speech."}},"description":"Configuration for Fourier denoising, including media detection, thresholds, baseline calculation, and analysis window.","title":"FourierDenoisingPlan"},"BackgroundSpeechDenoisingPlan":{"type":"object","properties":{"smartDenoisingPlan":{"$ref":"#/components/schemas/SmartDenoisingPlan","description":"Whether smart denoising using Krisp is enabled."},"fourierDenoisingPlan":{"$ref":"#/components/schemas/FourierDenoisingPlan","description":"Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.\n\nThis can be combined with smart denoising, and will be run afterwards."}},"description":"Controls smart and Fourier denoising applied to customer audio before transcription.","title":"BackgroundSpeechDenoisingPlan"},"KeypadInputPlanDelimiters":{"type":"string","enum":["#","*",""],"description":"This is the delimiter(s) that will be used to process the input.\nCan be '#', '*', or an empty array.","title":"KeypadInputPlanDelimiters"},"KeypadInputPlan":{"type":"object","properties":{"enabled":{"type":"boolean","description":"This keeps track of whether the user has enabled keypad input.\nBy default, it is off.\n\n@default false"},"timeoutSeconds":{"type":"number","format":"double","minimum":0,"maximum":10,"description":"This is the time in seconds to wait before processing the input.\nIf the input is not received within this time, the input will be ignored.\nIf set to \"off\", the input will be processed when the user enters a delimiter or immediately if no delimiter is used.\n\n@default 2"},"delimiters":{"$ref":"#/components/schemas/KeypadInputPlanDelimiters","description":"This is the delimiter(s) that will be used to process the input.\nCan be '#', '*', or an empty array."}},"description":"Controls collection of dual-tone multi-frequency (DTMF) keypad input, including enablement, processing timeout, and delimiters.","title":"KeypadInputPlan"},"WorkflowUserEditable":{"type":"object","properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowUserEditableNodesItems"}},"model":{"$ref":"#/components/schemas/WorkflowUserEditableModel","description":"This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`."},"transcriber":{"$ref":"#/components/schemas/WorkflowUserEditableTranscriber","description":"This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`."},"voice":{"$ref":"#/components/schemas/WorkflowUserEditableVoice","description":"This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`."},"observabilityPlan":{"$ref":"#/components/schemas/LangfuseObservabilityPlan","description":"This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported."},"backgroundSound":{"$ref":"#/components/schemas/WorkflowUserEditableBackgroundSound","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowUserEditableHooksItems"},"description":"This is a set of actions that will be performed on certain events."},"credentials":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowUserEditableCredentialsItems"},"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."},"voicemailDetection":{"$ref":"#/components/schemas/WorkflowUserEditableVoicemailDetection","description":"This is the voicemail detection plan for the workflow."},"maxDurationSeconds":{"type":"number","format":"double","minimum":10,"maximum":43200,"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."},"name":{"type":"string","maxLength":80},"edges":{"type":"array","items":{"$ref":"#/components/schemas/Edge"}},"globalPrompt":{"type":"string","maxLength":5000},"server":{"$ref":"#/components/schemas/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"},"compliancePlan":{"$ref":"#/components/schemas/CompliancePlan","description":"This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings."},"analysisPlan":{"$ref":"#/components/schemas/AnalysisPlan","description":"This is the plan for analysis of workflow's calls. Stored in `call.analysis`."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`."},"startSpeakingPlan":{"$ref":"#/components/schemas/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."},"stopSpeakingPlan":{"$ref":"#/components/schemas/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."},"monitorPlan":{"$ref":"#/components/schemas/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`."},"backgroundSpeechDenoisingPlan":{"$ref":"#/components/schemas/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"},"credentialIds":{"type":"array","items":{"type":"string"},"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."},"keypadInputPlan":{"$ref":"#/components/schemas/KeypadInputPlan","description":"This is the plan for keypad input handling during workflow calls."},"voicemailMessage":{"type":"string","maxLength":1000,"description":"This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up."}},"required":["nodes","name","edges"],"title":"WorkflowUserEditable"},"VapiModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/VapiModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/VapiModelKnowledgeBase","description":"These are the options for the knowledge base."},"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":{"$ref":"#/components/schemas/VapiModelVersion","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`)."},"provider":{"$ref":"#/components/schemas/VapiModelProvider"},"workflowId":{"type":"string","description":"This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead."},"workflow":{"$ref":"#/components/schemas/WorkflowUserEditable","description":"This is the workflow that will be used for the call. To use an existing workflow, use `workflowId` instead."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["provider"],"title":"VapiModel"},"CreateAssistantDtoModel":{"oneOf":[{"$ref":"#/components/schemas/AnthropicModel"},{"$ref":"#/components/schemas/AnthropicBedrockModel"},{"$ref":"#/components/schemas/AnyscaleModel"},{"$ref":"#/components/schemas/CerebrasModel"},{"$ref":"#/components/schemas/CustomLLMModel"},{"$ref":"#/components/schemas/DeepInfraModel"},{"$ref":"#/components/schemas/DeepSeekModel"},{"$ref":"#/components/schemas/GoogleModel"},{"$ref":"#/components/schemas/GroqModel"},{"$ref":"#/components/schemas/InflectionAIModel"},{"$ref":"#/components/schemas/MinimaxLLMModel"},{"$ref":"#/components/schemas/OpenAIModel"},{"$ref":"#/components/schemas/OpenRouterModel"},{"$ref":"#/components/schemas/PerplexityAIModel"},{"$ref":"#/components/schemas/TogetherAIModel"},{"$ref":"#/components/schemas/XaiModel"},{"$ref":"#/components/schemas/VapiModel"}],"description":"These are the options for the assistant's LLM.","title":"CreateAssistantDtoModel"},"CreateAssistantDtoVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"These are the options for the assistant's voice.","title":"CreateAssistantDtoVoice"},"CreateAssistantDtoFirstMessageMode":{"type":"string","enum":["assistant-speaks-first","assistant-speaks-first-with-model-generated-message","assistant-waits-for-user"],"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'","title":"CreateAssistantDtoFirstMessageMode"},"CreateAssistantDtoVoicemailDetection0":{"type":"string","enum":["off"],"title":"CreateAssistantDtoVoicemailDetection0"},"CreateAssistantDtoVoicemailDetection":{"oneOf":[{"$ref":"#/components/schemas/CreateAssistantDtoVoicemailDetection0"},{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlan"},{"$ref":"#/components/schemas/OpenAIVoicemailDetectionPlan"},{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlan"},{"$ref":"#/components/schemas/VapiVoicemailDetectionPlan"}],"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.","title":"CreateAssistantDtoVoicemailDetection"},"CreateAssistantDtoClientMessages":{"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"],"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.","title":"CreateAssistantDtoClientMessages"},"CreateAssistantDtoServerMessages":{"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","call.artifact.upload"],"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.","title":"CreateAssistantDtoServerMessages"},"CreateAssistantDtoBackgroundSound0":{"type":"string","enum":["off","office"],"title":"CreateAssistantDtoBackgroundSound0"},"CreateAssistantDtoBackgroundSound":{"oneOf":[{"$ref":"#/components/schemas/CreateAssistantDtoBackgroundSound0"},{"type":"string","format":"uri"}],"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.","title":"CreateAssistantDtoBackgroundSound"},"TransportConfigurationTwilioProvider":{"type":"string","enum":["twilio"],"description":"Selects Twilio as the call transport provider.","title":"TransportConfigurationTwilioProvider"},"TransportConfigurationTwilioRecordingChannels":{"type":"string","enum":["mono","dual"],"description":"The number of channels in the final recording.\nCan be: `mono` or `dual`.\nThe default is `mono`.\n`mono` records both legs of the call in a single channel of the recording file.\n`dual` records each leg to a separate channel of the recording file.\nThe first channel of a dual-channel recording contains the parent call and the second channel contains the child call.\n\n@default 'mono'","title":"TransportConfigurationTwilioRecordingChannels"},"TransportConfigurationTwilio":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/TransportConfigurationTwilioProvider","description":"Selects Twilio as the call transport provider."},"timeout":{"type":"number","format":"double","minimum":1,"maximum":600,"description":"The integer number of seconds that we should allow the phone to ring before assuming there is no answer.\nThe default is `60` seconds and the maximum is `600` seconds.\nFor some call flows, we will add a 5-second buffer to the timeout value you provide.\nFor this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds.\nYou can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail.\n\n@default 60"},"record":{"type":"boolean","description":"Whether to record the call.\nCan be `true` to record the phone call, or `false` to not.\nThe default is `false`.\n\n@default false"},"recordingChannels":{"$ref":"#/components/schemas/TransportConfigurationTwilioRecordingChannels","description":"The number of channels in the final recording.\nCan be: `mono` or `dual`.\nThe default is `mono`.\n`mono` records both legs of the call in a single channel of the recording file.\n`dual` records each leg to a separate channel of the recording file.\nThe first channel of a dual-channel recording contains the parent call and the second channel contains the child call.\n\n@default 'mono'"}},"required":["provider"],"description":"Configuration passed to Twilio for assistant calls, including ring timeout and Twilio recording behavior.","title":"TransportConfigurationTwilio"},"CreateAssistantDtoTransportConfigurationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransportConfigurationTwilio"}],"title":"CreateAssistantDtoTransportConfigurationsItems"},"CreateAssistantDtoCredentialsItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["11labs"],"description":"Discriminator value: 11labs"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"apiUrl":{"oneOf":[{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},{"type":"null"}],"description":"ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with ElevenLabs."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"],"description":"Discriminator value: anthropic"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anthropic."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic-bedrock"],"description":"Discriminator value: anthropic-bedrock"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion","description":"AWS region where Bedrock is configured."},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan","description":"Authentication method - either direct IAM credentials or cross-account role assumption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","authenticationPlan"],"description":"Credentials for authenticating Anthropic model requests through Amazon Bedrock, including AWS region and authentication method."},{"type":"object","properties":{"provider":{"type":"string","enum":["anyscale"],"description":"Discriminator value: anyscale"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anyscale."},{"type":"object","properties":{"provider":{"type":"string","enum":["assembly-ai"],"description":"Discriminator value: assembly-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with AssemblyAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure-openai"],"description":"Discriminator value: azure-openai"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion","description":"Azure region that hosts the OpenAI resource."},"models":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels","description":"Azure OpenAI models available through this credential."},"openAIKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"ocpApimSubscriptionKey":{"type":"string","description":"This is not returned in the API."},"openAIEndpoint":{"type":"string","maxLength":10000,"description":"Endpoint URL for the Azure OpenAI resource."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","models","openAIKey","openAIEndpoint"],"description":"Credentials for authenticating assistant model requests with Azure OpenAI, including region, endpoint, and available models."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure"],"description":"Discriminator value: azure"},"service":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService","description":"This is the service being used in Azure."},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion","description":"This is the region of the Azure resource."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"fallbackIndex":{"type":"number","format":"double","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/AzureBlobStorageBucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","service"],"description":"Credentials for Azure Speech or Blob Storage, including service, region, and optional storage bucket settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["byo-sip-trunk"],"description":"Discriminator value: byo-sip-trunk"},"gateways":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunkGateway"},"description":"This is the list of SIP trunk's gateways."},"outboundAuthenticationPlan":{"$ref":"#/components/schemas/SipTrunkOutboundAuthenticationPlan","description":"This can be used to configure the outbound authentication if required by the SIP trunk."},"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","maxLength":10000,"description":"This can be used to configure the tech prefix on outbound calls. This is an advanced property."},"sipDiversionHeader":{"type":"string","maxLength":10000,"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gateways"],"description":"Configuration for connecting Vapi to a bring-your-own SIP trunk or carrier, including gateways, outbound authentication, number handling, and optional session border controller routing."},{"type":"object","properties":{"provider":{"type":"string","enum":["cartesia"],"description":"Discriminator value: cartesia"},"apiKey":{"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Cartesia."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCerebrasCredentialDtoProvider","description":"Selects Cerebras as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Cerebras."},{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare"],"description":"Discriminator value: 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","format":"double","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/CloudflareR2BucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in R2"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Cloudflare R2, including account details, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["custom-llm"],"description":"Discriminator value: custom-llm"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"authenticationPlan":{"$ref":"#/components/schemas/OAuth2AuthenticationPlan","description":"This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating requests to a custom language model with an API key or OAuth 2.0 authentication plan."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepgram"],"description":"Discriminator value: deepgram"},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiUrl":{"type":"string","description":"This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Deepgram, with an optional API URL for an on-premises instance."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepinfra"],"description":"Discriminator value: deepinfra"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepInfra."},{"type":"object","properties":{"provider":{"type":"string","enum":["deep-seek"],"description":"Discriminator value: deep-seek"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepSeek."},{"type":"object","properties":{"provider":{"type":"string","enum":["gcp"],"description":"Discriminator value: gcp"},"fallbackIndex":{"type":"number","format":"double","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."},"gcpKey":{"$ref":"#/components/schemas/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/<service-account-id>/keys.\n\nThe schema is identical to the JSON that GCP outputs."},"region":{"type":"string","maxLength":40,"description":"This is the region of the GCP resource."},"bucketPlan":{"$ref":"#/components/schemas/BucketPlan","description":"Bucket configuration used to store call artifacts in Google Cloud Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gcpKey"],"description":"Service-account credentials for Google Cloud resources and optional call-artifact storage, including region, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["gladia"],"description":"Discriminator value: gladia"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Gladia."},{"type":"object","properties":{"provider":{"type":"string","enum":["gohighlevel"],"description":"Discriminator value: gohighlevel"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating Vapi integrations with GoHighLevel."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoogleCredentialDtoProvider","description":"Selects Google AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Google AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["groq"],"description":"Discriminator value: groq"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Groq."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInflectionAiCredentialDtoProvider","description":"Selects Inflection AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Inflection AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["langfuse"],"description":"Discriminator value: langfuse"},"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"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","publicKey","apiKey","apiUrl"],"description":"Credentials for sending assistant call traces to a Langfuse project, including its public key, secret key, and host URL."},{"type":"object","properties":{"provider":{"type":"string","enum":["lmnt"],"description":"Discriminator value: lmnt"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with LMNT."},{"type":"object","properties":{"provider":{"type":"string","enum":["make"],"description":"Discriminator value: 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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","teamId","region","apiKey"],"description":"Credentials for authenticating Vapi integrations with Make, including team, region, and API key."},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"],"description":"Discriminator value: openai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model, transcription, and voice synthesis requests with OpenAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["openrouter"],"description":"Discriminator value: openrouter"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with OpenRouter."},{"type":"object","properties":{"provider":{"type":"string","enum":["perplexity-ai"],"description":"Discriminator value: perplexity-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Perplexity AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["playht"],"description":"Discriminator value: playht"},"apiKey":{"type":"string","description":"This is not returned in the API."},"userId":{"type":"string","description":"PlayHT user identifier associated with the API key."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","userId"],"description":"Credentials for authenticating voice synthesis requests with PlayHT, including the PlayHT user identifier."},{"type":"object","properties":{"provider":{"type":"string","enum":["rime-ai"],"description":"Discriminator value: rime-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Rime AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["runpod"],"description":"Discriminator value: runpod"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests through Runpod."},{"type":"object","properties":{"provider":{"type":"string","enum":["s3"],"description":"Discriminator value: 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","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","awsAccessKeyId","awsSecretAccessKey","region","s3BucketName","s3PathPrefix"],"description":"Credentials for storing call artifacts in Amazon S3, including access keys, region, bucket, path prefix, and upload fallback order."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateS3CompatibleCredentialDtoProvider","description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."},"bucketPlan":{"$ref":"#/components/schemas/S3CompatibleBucketPlan"},"fallbackIndex":{"type":"number","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","bucketPlan"],"description":"s3-compatible variant"},{"type":"object","properties":{"provider":{"type":"string","enum":["supabase"],"description":"Discriminator value: supabase"},"fallbackIndex":{"type":"number","format":"double","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/SupabaseBucketPlan","description":"Supabase S3-compatible bucket configuration used to store call artifacts."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Supabase's S3-compatible storage, including bucket configuration and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["smallest-ai"],"description":"Discriminator value: smallest-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Smallest AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["tavus"],"description":"Discriminator value: tavus"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Tavus."},{"type":"object","properties":{"provider":{"type":"string","enum":["together-ai"],"description":"Discriminator value: together-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Together AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"authToken":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiSecret":{"type":"string","description":"This is not returned in the API."},"accountSid":{"type":"string","description":"Twilio Account SID associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","accountSid"],"description":"Credentials for authenticating telephony requests with Twilio using an account SID and either an auth token or API key credentials."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"apiSecret":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"Vonage API key associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiSecret","apiKey"],"description":"Credentials for authenticating telephony requests with Vonage."},{"type":"object","properties":{"provider":{"type":"string","enum":["webhook"],"description":"Discriminator value: webhook"},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"CreateWebhookCredentialDTO variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomCredentialDtoProvider","description":"Selects a custom credential configuration."},"authenticationPlan":{"$ref":"#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"encryptionPlan":{"$ref":"#/components/schemas/PublicKeyEncryptionPlan","description":"This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"Reusable custom credentials for authenticating outbound requests, with optional public-key encryption for sensitive request data."},{"type":"object","properties":{"provider":{"type":"string","enum":["xai"],"description":"Discriminator value: xai"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with xAI."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMicrosoftCredentialDtoProvider"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"region":{"type":"string","maxLength":64,"description":"Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"microsoft variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateNeuphonicCredentialDtoProvider","description":"Selects Neuphonic as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Neuphonic."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateHumeCredentialDtoProvider","description":"Selects Hume as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Hume."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMistralCredentialDtoProvider","description":"Selects Mistral as the credential provider."},"apiKey":{"type":"string","maxLength":100,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Mistral."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSpeechmaticsCredentialDtoProvider","description":"Selects Speechmatics as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Speechmatics."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSonioxCredentialDtoProvider","description":"Selects Soniox as the credential provider."},"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Soniox."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-client"],"description":"Discriminator value: google.calendar.oauth2-client"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"OAuth 2.0 client credential for Google Calendar integrations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-authorization"],"description":"Discriminator value: google.calendar.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Calendar operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.sheets.oauth2-authorization"],"description":"Discriminator value: google.sheets.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Sheets operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["slack.oauth2-authorization"],"description":"Discriminator value: slack.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Slack operations."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider","description":"Selects GoHighLevel OAuth 2.0 authorization for MCP."},"authenticationSession":{"$ref":"#/components/schemas/Oauth2AuthenticationSession","description":"This is the authentication session for the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationSession"],"description":"OAuth 2.0 session credentials for authenticating GoHighLevel MCP requests."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInworldCredentialDtoProvider","description":"Selects Inworld as the credential provider."},"apiKey":{"type":"string","description":"This is the Inworld Basic (Base64) authentication token. This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Inworld."},{"type":"object","properties":{"provider":{"type":"string","enum":["minimax"],"description":"Discriminator value: minimax"},"apiKey":{"type":"string","description":"This is not returned in the API."},"groupId":{"type":"string","description":"This is the Minimax Group ID."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","groupId"],"description":"Credentials for authenticating assistant model and voice synthesis requests with MiniMax, including the MiniMax group identifier."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateWellSaidCredentialDtoProvider","description":"Selects WellSaid as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with WellSaid."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateEmailCredentialDtoProvider","description":"Selects email as the alert destination provider."},"email":{"type":"string","description":"The recipient email address for alerts"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","email"],"description":"Destination configuration for sending Vapi alerts to an email address."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSlackWebhookCredentialDtoProvider","description":"Selects a Slack incoming webhook as the credential provider."},"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","webhookUrl"],"description":"Credentials for sending Vapi alerts through a Slack incoming webhook."}],"discriminator":{"propertyName":"provider"},"title":"CreateAssistantDtoCredentialsItems"},"SessionCreatedHookOn":{"type":"string","enum":["session.created"],"description":"This is the event that triggers this hook","title":"SessionCreatedHookOn"},"SessionCreatedHookDoItems":{"oneOf":[{"$ref":"#/components/schemas/ToolCallHookAction"}],"title":"SessionCreatedHookDoItems"},"SessionCreatedHook":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/SessionCreatedHookOn","description":"This is the event that triggers this hook"},"do":{"type":"array","items":{"$ref":"#/components/schemas/SessionCreatedHookDoItems"},"description":"This is the set of actions to perform when the hook triggers."},"name":{"type":"string","maxLength":1000,"description":"Optional name for this hook instance.\nIf no name is provided, the hook will be auto generated as UUID.\n\n@default UUID"}},"required":["on","do"],"title":"SessionCreatedHook"},"CreateAssistantDtoHooksItems":{"oneOf":[{"$ref":"#/components/schemas/CallHookCallEnding"},{"$ref":"#/components/schemas/CallHookAssistantSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeout"},{"$ref":"#/components/schemas/SessionCreatedHook"}],"title":"CreateAssistantDtoHooksItems"},"CreateAssistantDtoMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the assistant.","title":"CreateAssistantDtoMetadata"},"CreateAssistantDTO":{"type":"object","properties":{"transcriber":{"$ref":"#/components/schemas/CreateAssistantDtoTranscriber","description":"These are the options for the assistant's transcriber."},"model":{"$ref":"#/components/schemas/CreateAssistantDtoModel","description":"These are the options for the assistant's LLM."},"voice":{"$ref":"#/components/schemas/CreateAssistantDtoVoice","description":"These are the options for the assistant's voice."},"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."},"firstMessageInterruptionsEnabled":{"type":"boolean","default":false,"description":"Set to `true` to allow the user to interrupt the assistant while it speaks the first message. Default is `false`."},"firstMessageMode":{"$ref":"#/components/schemas/CreateAssistantDtoFirstMessageMode","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'"},"voicemailDetection":{"$ref":"#/components/schemas/CreateAssistantDtoVoicemailDetection","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."},"clientMessages":{"$ref":"#/components/schemas/CreateAssistantDtoClientMessages","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."},"serverMessages":{"$ref":"#/components/schemas/CreateAssistantDtoServerMessages","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."},"maxDurationSeconds":{"type":"number","format":"double","minimum":10,"maximum":43200,"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)"},"backgroundSound":{"$ref":"#/components/schemas/CreateAssistantDtoBackgroundSound","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."},"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"},"transportConfigurations":{"type":"array","items":{"$ref":"#/components/schemas/CreateAssistantDtoTransportConfigurationsItems"},"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."},"observabilityPlan":{"$ref":"#/components/schemas/LangfuseObservabilityPlan","description":"This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported."},"credentials":{"type":"array","items":{"$ref":"#/components/schemas/CreateAssistantDtoCredentialsItems"},"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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/CreateAssistantDtoHooksItems"},"description":"This is a set of actions that will be performed on certain events."},"name":{"type":"string","maxLength":40,"description":"This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call."},"voicemailMessage":{"type":"string","maxLength":1000,"description":"This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up."},"endCallMessage":{"type":"string","maxLength":1000,"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."},"endCallPhrases":{"type":"array","items":{"type":"string","minLength":2,"maxLength":140},"description":"This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive."},"compliancePlan":{"$ref":"#/components/schemas/CompliancePlan","description":"Compliance settings for the assistant, including HIPAA and PCI behavior, security filtering, and recording consent."},"metadata":{"$ref":"#/components/schemas/CreateAssistantDtoMetadata","description":"This is for metadata you want to store on the assistant."},"backgroundSpeechDenoisingPlan":{"$ref":"#/components/schemas/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"},"analysisPlan":{"$ref":"#/components/schemas/AnalysisPlan","description":"This is the plan for analysis of assistant's calls. Stored in `call.analysis`."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`."},"startSpeakingPlan":{"$ref":"#/components/schemas/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."},"stopSpeakingPlan":{"$ref":"#/components/schemas/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."},"monitorPlan":{"$ref":"#/components/schemas/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."},"credentialIds":{"type":"array","items":{"type":"string"},"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."},"server":{"$ref":"#/components/schemas/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"},"keypadInputPlan":{"$ref":"#/components/schemas/KeypadInputPlan","description":"Configuration for collecting and processing DTMF keypad input during calls."}},"description":"Configuration used to create an assistant, including its model, voice, transcriber, prompts, tools, messaging, and conversation behavior.","title":"CreateAssistantDTO"},"AssistantOverridesTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"These are the options for the assistant's transcriber.","title":"AssistantOverridesTranscriber"},"AssistantOverridesModel":{"oneOf":[{"$ref":"#/components/schemas/AnthropicModel"},{"$ref":"#/components/schemas/AnthropicBedrockModel"},{"$ref":"#/components/schemas/AnyscaleModel"},{"$ref":"#/components/schemas/CerebrasModel"},{"$ref":"#/components/schemas/CustomLLMModel"},{"$ref":"#/components/schemas/DeepInfraModel"},{"$ref":"#/components/schemas/DeepSeekModel"},{"$ref":"#/components/schemas/GoogleModel"},{"$ref":"#/components/schemas/GroqModel"},{"$ref":"#/components/schemas/InflectionAIModel"},{"$ref":"#/components/schemas/MinimaxLLMModel"},{"$ref":"#/components/schemas/OpenAIModel"},{"$ref":"#/components/schemas/OpenRouterModel"},{"$ref":"#/components/schemas/PerplexityAIModel"},{"$ref":"#/components/schemas/TogetherAIModel"},{"$ref":"#/components/schemas/XaiModel"},{"$ref":"#/components/schemas/VapiModel"}],"description":"These are the options for the assistant's LLM.","title":"AssistantOverridesModel"},"AssistantOverridesVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"These are the options for the assistant's voice.","title":"AssistantOverridesVoice"},"AssistantOverridesFirstMessageMode":{"type":"string","enum":["assistant-speaks-first","assistant-speaks-first-with-model-generated-message","assistant-waits-for-user"],"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'","title":"AssistantOverridesFirstMessageMode"},"AssistantOverridesVoicemailDetection0":{"type":"string","enum":["off"],"title":"AssistantOverridesVoicemailDetection0"},"AssistantOverridesVoicemailDetection":{"oneOf":[{"$ref":"#/components/schemas/AssistantOverridesVoicemailDetection0"},{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlan"},{"$ref":"#/components/schemas/OpenAIVoicemailDetectionPlan"},{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlan"},{"$ref":"#/components/schemas/VapiVoicemailDetectionPlan"}],"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.","title":"AssistantOverridesVoicemailDetection"},"AssistantOverridesClientMessages":{"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"],"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.","title":"AssistantOverridesClientMessages"},"AssistantOverridesServerMessages":{"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","call.artifact.upload"],"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.","title":"AssistantOverridesServerMessages"},"AssistantOverridesBackgroundSound0":{"type":"string","enum":["off","office"],"title":"AssistantOverridesBackgroundSound0"},"AssistantOverridesBackgroundSound":{"oneOf":[{"$ref":"#/components/schemas/AssistantOverridesBackgroundSound0"},{"type":"string","format":"uri"}],"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.","title":"AssistantOverridesBackgroundSound"},"AssistantOverridesTransportConfigurationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransportConfigurationTwilio"}],"title":"AssistantOverridesTransportConfigurationsItems"},"AssistantOverridesCredentialsItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["11labs"],"description":"Discriminator value: 11labs"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"apiUrl":{"oneOf":[{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},{"type":"null"}],"description":"ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with ElevenLabs."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"],"description":"Discriminator value: anthropic"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anthropic."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic-bedrock"],"description":"Discriminator value: anthropic-bedrock"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion","description":"AWS region where Bedrock is configured."},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan","description":"Authentication method - either direct IAM credentials or cross-account role assumption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","authenticationPlan"],"description":"Credentials for authenticating Anthropic model requests through Amazon Bedrock, including AWS region and authentication method."},{"type":"object","properties":{"provider":{"type":"string","enum":["anyscale"],"description":"Discriminator value: anyscale"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anyscale."},{"type":"object","properties":{"provider":{"type":"string","enum":["assembly-ai"],"description":"Discriminator value: assembly-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with AssemblyAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure-openai"],"description":"Discriminator value: azure-openai"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion","description":"Azure region that hosts the OpenAI resource."},"models":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels","description":"Azure OpenAI models available through this credential."},"openAIKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"ocpApimSubscriptionKey":{"type":"string","description":"This is not returned in the API."},"openAIEndpoint":{"type":"string","maxLength":10000,"description":"Endpoint URL for the Azure OpenAI resource."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","models","openAIKey","openAIEndpoint"],"description":"Credentials for authenticating assistant model requests with Azure OpenAI, including region, endpoint, and available models."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure"],"description":"Discriminator value: azure"},"service":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService","description":"This is the service being used in Azure."},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion","description":"This is the region of the Azure resource."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"fallbackIndex":{"type":"number","format":"double","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/AzureBlobStorageBucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","service"],"description":"Credentials for Azure Speech or Blob Storage, including service, region, and optional storage bucket settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["byo-sip-trunk"],"description":"Discriminator value: byo-sip-trunk"},"gateways":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunkGateway"},"description":"This is the list of SIP trunk's gateways."},"outboundAuthenticationPlan":{"$ref":"#/components/schemas/SipTrunkOutboundAuthenticationPlan","description":"This can be used to configure the outbound authentication if required by the SIP trunk."},"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","maxLength":10000,"description":"This can be used to configure the tech prefix on outbound calls. This is an advanced property."},"sipDiversionHeader":{"type":"string","maxLength":10000,"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gateways"],"description":"Configuration for connecting Vapi to a bring-your-own SIP trunk or carrier, including gateways, outbound authentication, number handling, and optional session border controller routing."},{"type":"object","properties":{"provider":{"type":"string","enum":["cartesia"],"description":"Discriminator value: cartesia"},"apiKey":{"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Cartesia."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCerebrasCredentialDtoProvider","description":"Selects Cerebras as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Cerebras."},{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare"],"description":"Discriminator value: 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","format":"double","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/CloudflareR2BucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in R2"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Cloudflare R2, including account details, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["custom-llm"],"description":"Discriminator value: custom-llm"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"authenticationPlan":{"$ref":"#/components/schemas/OAuth2AuthenticationPlan","description":"This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating requests to a custom language model with an API key or OAuth 2.0 authentication plan."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepgram"],"description":"Discriminator value: deepgram"},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiUrl":{"type":"string","description":"This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Deepgram, with an optional API URL for an on-premises instance."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepinfra"],"description":"Discriminator value: deepinfra"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepInfra."},{"type":"object","properties":{"provider":{"type":"string","enum":["deep-seek"],"description":"Discriminator value: deep-seek"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepSeek."},{"type":"object","properties":{"provider":{"type":"string","enum":["gcp"],"description":"Discriminator value: gcp"},"fallbackIndex":{"type":"number","format":"double","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."},"gcpKey":{"$ref":"#/components/schemas/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/<service-account-id>/keys.\n\nThe schema is identical to the JSON that GCP outputs."},"region":{"type":"string","maxLength":40,"description":"This is the region of the GCP resource."},"bucketPlan":{"$ref":"#/components/schemas/BucketPlan","description":"Bucket configuration used to store call artifacts in Google Cloud Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gcpKey"],"description":"Service-account credentials for Google Cloud resources and optional call-artifact storage, including region, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["gladia"],"description":"Discriminator value: gladia"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Gladia."},{"type":"object","properties":{"provider":{"type":"string","enum":["gohighlevel"],"description":"Discriminator value: gohighlevel"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating Vapi integrations with GoHighLevel."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoogleCredentialDtoProvider","description":"Selects Google AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Google AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["groq"],"description":"Discriminator value: groq"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Groq."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInflectionAiCredentialDtoProvider","description":"Selects Inflection AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Inflection AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["langfuse"],"description":"Discriminator value: langfuse"},"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"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","publicKey","apiKey","apiUrl"],"description":"Credentials for sending assistant call traces to a Langfuse project, including its public key, secret key, and host URL."},{"type":"object","properties":{"provider":{"type":"string","enum":["lmnt"],"description":"Discriminator value: lmnt"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with LMNT."},{"type":"object","properties":{"provider":{"type":"string","enum":["make"],"description":"Discriminator value: 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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","teamId","region","apiKey"],"description":"Credentials for authenticating Vapi integrations with Make, including team, region, and API key."},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"],"description":"Discriminator value: openai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model, transcription, and voice synthesis requests with OpenAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["openrouter"],"description":"Discriminator value: openrouter"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with OpenRouter."},{"type":"object","properties":{"provider":{"type":"string","enum":["perplexity-ai"],"description":"Discriminator value: perplexity-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Perplexity AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["playht"],"description":"Discriminator value: playht"},"apiKey":{"type":"string","description":"This is not returned in the API."},"userId":{"type":"string","description":"PlayHT user identifier associated with the API key."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","userId"],"description":"Credentials for authenticating voice synthesis requests with PlayHT, including the PlayHT user identifier."},{"type":"object","properties":{"provider":{"type":"string","enum":["rime-ai"],"description":"Discriminator value: rime-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Rime AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["runpod"],"description":"Discriminator value: runpod"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests through Runpod."},{"type":"object","properties":{"provider":{"type":"string","enum":["s3"],"description":"Discriminator value: 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","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","awsAccessKeyId","awsSecretAccessKey","region","s3BucketName","s3PathPrefix"],"description":"Credentials for storing call artifacts in Amazon S3, including access keys, region, bucket, path prefix, and upload fallback order."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateS3CompatibleCredentialDtoProvider","description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."},"bucketPlan":{"$ref":"#/components/schemas/S3CompatibleBucketPlan"},"fallbackIndex":{"type":"number","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","bucketPlan"],"description":"s3-compatible variant"},{"type":"object","properties":{"provider":{"type":"string","enum":["supabase"],"description":"Discriminator value: supabase"},"fallbackIndex":{"type":"number","format":"double","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/SupabaseBucketPlan","description":"Supabase S3-compatible bucket configuration used to store call artifacts."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Supabase's S3-compatible storage, including bucket configuration and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["smallest-ai"],"description":"Discriminator value: smallest-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Smallest AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["tavus"],"description":"Discriminator value: tavus"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Tavus."},{"type":"object","properties":{"provider":{"type":"string","enum":["together-ai"],"description":"Discriminator value: together-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Together AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"authToken":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiSecret":{"type":"string","description":"This is not returned in the API."},"accountSid":{"type":"string","description":"Twilio Account SID associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","accountSid"],"description":"Credentials for authenticating telephony requests with Twilio using an account SID and either an auth token or API key credentials."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"apiSecret":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"Vonage API key associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiSecret","apiKey"],"description":"Credentials for authenticating telephony requests with Vonage."},{"type":"object","properties":{"provider":{"type":"string","enum":["webhook"],"description":"Discriminator value: webhook"},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"CreateWebhookCredentialDTO variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomCredentialDtoProvider","description":"Selects a custom credential configuration."},"authenticationPlan":{"$ref":"#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"encryptionPlan":{"$ref":"#/components/schemas/PublicKeyEncryptionPlan","description":"This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"Reusable custom credentials for authenticating outbound requests, with optional public-key encryption for sensitive request data."},{"type":"object","properties":{"provider":{"type":"string","enum":["xai"],"description":"Discriminator value: xai"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with xAI."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMicrosoftCredentialDtoProvider"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"region":{"type":"string","maxLength":64,"description":"Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"microsoft variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateNeuphonicCredentialDtoProvider","description":"Selects Neuphonic as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Neuphonic."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateHumeCredentialDtoProvider","description":"Selects Hume as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Hume."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMistralCredentialDtoProvider","description":"Selects Mistral as the credential provider."},"apiKey":{"type":"string","maxLength":100,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Mistral."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSpeechmaticsCredentialDtoProvider","description":"Selects Speechmatics as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Speechmatics."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSonioxCredentialDtoProvider","description":"Selects Soniox as the credential provider."},"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Soniox."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-client"],"description":"Discriminator value: google.calendar.oauth2-client"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"OAuth 2.0 client credential for Google Calendar integrations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-authorization"],"description":"Discriminator value: google.calendar.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Calendar operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.sheets.oauth2-authorization"],"description":"Discriminator value: google.sheets.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Sheets operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["slack.oauth2-authorization"],"description":"Discriminator value: slack.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Slack operations."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider","description":"Selects GoHighLevel OAuth 2.0 authorization for MCP."},"authenticationSession":{"$ref":"#/components/schemas/Oauth2AuthenticationSession","description":"This is the authentication session for the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationSession"],"description":"OAuth 2.0 session credentials for authenticating GoHighLevel MCP requests."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInworldCredentialDtoProvider","description":"Selects Inworld as the credential provider."},"apiKey":{"type":"string","description":"This is the Inworld Basic (Base64) authentication token. This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Inworld."},{"type":"object","properties":{"provider":{"type":"string","enum":["minimax"],"description":"Discriminator value: minimax"},"apiKey":{"type":"string","description":"This is not returned in the API."},"groupId":{"type":"string","description":"This is the Minimax Group ID."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","groupId"],"description":"Credentials for authenticating assistant model and voice synthesis requests with MiniMax, including the MiniMax group identifier."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateWellSaidCredentialDtoProvider","description":"Selects WellSaid as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with WellSaid."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateEmailCredentialDtoProvider","description":"Selects email as the alert destination provider."},"email":{"type":"string","description":"The recipient email address for alerts"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","email"],"description":"Destination configuration for sending Vapi alerts to an email address."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSlackWebhookCredentialDtoProvider","description":"Selects a Slack incoming webhook as the credential provider."},"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","webhookUrl"],"description":"Credentials for sending Vapi alerts through a Slack incoming webhook."}],"discriminator":{"propertyName":"provider"},"title":"AssistantOverridesCredentialsItems"},"AssistantOverridesHooksItems":{"oneOf":[{"$ref":"#/components/schemas/CallHookCallEnding"},{"$ref":"#/components/schemas/CallHookAssistantSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeout"},{"$ref":"#/components/schemas/SessionCreatedHook"}],"title":"AssistantOverridesHooksItems"},"AssistantOverridesToolsAppendItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"AssistantOverridesToolsAppendItems"},"AssistantOverridesVariableValues":{"type":"object","properties":{},"description":"These are values that will be used to replace the template variables in the assistant messages and other text-based fields.\nThis uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html\n\nSo for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.\n`{{\"now\" | date: \"%b %d, %Y, %I:%M %p\", \"America/New_York\"}}` will be replaced with the current date and time in New York.\n Some VAPI reserved defaults:\n - *customer* - the customer object","title":"AssistantOverridesVariableValues"},"AssistantOverridesMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the assistant.","title":"AssistantOverridesMetadata"},"AssistantOverrides":{"type":"object","properties":{"transcriber":{"$ref":"#/components/schemas/AssistantOverridesTranscriber","description":"These are the options for the assistant's transcriber."},"model":{"$ref":"#/components/schemas/AssistantOverridesModel","description":"These are the options for the assistant's LLM."},"voice":{"$ref":"#/components/schemas/AssistantOverridesVoice","description":"These are the options for the assistant's voice."},"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."},"firstMessageInterruptionsEnabled":{"type":"boolean","default":false,"description":"Set to `true` to allow the user to interrupt the assistant while it speaks the first message. Default is `false`."},"firstMessageMode":{"$ref":"#/components/schemas/AssistantOverridesFirstMessageMode","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'"},"voicemailDetection":{"$ref":"#/components/schemas/AssistantOverridesVoicemailDetection","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."},"clientMessages":{"$ref":"#/components/schemas/AssistantOverridesClientMessages","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."},"serverMessages":{"$ref":"#/components/schemas/AssistantOverridesServerMessages","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."},"maxDurationSeconds":{"type":"number","format":"double","minimum":10,"maximum":43200,"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)"},"backgroundSound":{"$ref":"#/components/schemas/AssistantOverridesBackgroundSound","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."},"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"},"transportConfigurations":{"type":"array","items":{"$ref":"#/components/schemas/AssistantOverridesTransportConfigurationsItems"},"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."},"observabilityPlan":{"$ref":"#/components/schemas/LangfuseObservabilityPlan","description":"This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported."},"credentials":{"type":"array","items":{"$ref":"#/components/schemas/AssistantOverridesCredentialsItems"},"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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/AssistantOverridesHooksItems"},"description":"This is a set of actions that will be performed on certain events."},"tools:append":{"type":"array","items":{"$ref":"#/components/schemas/AssistantOverridesToolsAppendItems"},"description":"Tools to append to the assistant's existing tool configuration."},"variableValues":{"$ref":"#/components/schemas/AssistantOverridesVariableValues","description":"These are values that will be used to replace the template variables in the assistant messages and other text-based fields.\nThis uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html\n\nSo for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.\n`{{\"now\" | date: \"%b %d, %Y, %I:%M %p\", \"America/New_York\"}}` will be replaced with the current date and time in New York.\n Some VAPI reserved defaults:\n - *customer* - the customer object"},"name":{"type":"string","maxLength":40,"description":"This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call."},"voicemailMessage":{"type":"string","maxLength":1000,"description":"This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up."},"endCallMessage":{"type":"string","maxLength":1000,"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."},"endCallPhrases":{"type":"array","items":{"type":"string","minLength":2,"maxLength":140},"description":"This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive."},"compliancePlan":{"$ref":"#/components/schemas/CompliancePlan","description":"Compliance settings to apply, including HIPAA and PCI behavior, security filtering, and recording consent."},"metadata":{"$ref":"#/components/schemas/AssistantOverridesMetadata","description":"This is for metadata you want to store on the assistant."},"backgroundSpeechDenoisingPlan":{"$ref":"#/components/schemas/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"},"analysisPlan":{"$ref":"#/components/schemas/AnalysisPlan","description":"This is the plan for analysis of assistant's calls. Stored in `call.analysis`."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`."},"startSpeakingPlan":{"$ref":"#/components/schemas/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."},"stopSpeakingPlan":{"$ref":"#/components/schemas/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."},"monitorPlan":{"$ref":"#/components/schemas/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."},"credentialIds":{"type":"array","items":{"type":"string"},"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."},"server":{"$ref":"#/components/schemas/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"},"keypadInputPlan":{"$ref":"#/components/schemas/KeypadInputPlan","description":"Configuration for collecting and processing DTMF keypad input."}},"description":"Per-call or handoff overrides for an assistant's providers, messages, tools, credentials, call behavior, and server configuration.","title":"AssistantOverrides"},"HandoffDestinationAssistant":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/HandoffDestinationAssistantType","description":"Selects an assistant as the handoff destination."},"contextEngineeringPlan":{"$ref":"#/components/schemas/HandoffDestinationAssistantContextEngineeringPlan","description":"This is the plan for manipulating the message context before handing off the call to the next assistant."},"assistantName":{"type":"string","description":"This is the assistant to transfer the call to. You must provide either assistantName or assistantId."},"assistantId":{"type":"string","description":"This is the assistant id to transfer the call to. You must provide either assistantName or assistantId."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is a transient assistant to transfer the call to. You may provide a transient assistant in the response  `handoff-destination-request` in a dynamic handoff."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the variable extraction plan for the handoff tool."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the assistant overrides to apply to the destination assistant."},"description":{"type":"string","description":"This is the description of the destination, used by the AI to choose when and how to transfer the call."}},"required":["type"],"description":"Routes a handoff to a saved or transient assistant, with optional context engineering, variable extraction, and assistant overrides.","title":"HandoffDestinationAssistant"},"HandoffDestinationDynamicType":{"type":"string","enum":["dynamic"],"description":"Selects a dynamically resolved handoff destination.","title":"HandoffDestinationDynamicType"},"HandoffDestinationDynamic":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/HandoffDestinationDynamicType","description":"Selects a dynamically resolved handoff destination."},"server":{"$ref":"#/components/schemas/Server","description":"This is where Vapi will send the handoff-destination-request webhook in a dynamic handoff.\n\nThe order of precedence is:\n\n1. tool.server.url\n2. assistant.server.url\n3. phoneNumber.server.url\n4. org.server.url"},"description":{"type":"string","description":"This is the description of the destination, used by the AI to choose when and how to transfer the call."}},"required":["type"],"description":"Uses a webhook response to select the handoff destination at runtime.","title":"HandoffDestinationDynamic"},"HandoffDestinationSquadType":{"type":"string","enum":["squad"],"description":"Selects a squad as the handoff destination.","title":"HandoffDestinationSquadType"},"HandoffDestinationSquadContextEngineeringPlan":{"oneOf":[{"$ref":"#/components/schemas/ContextEngineeringPlanLastNMessages"},{"$ref":"#/components/schemas/ContextEngineeringPlanNone"},{"$ref":"#/components/schemas/ContextEngineeringPlanAll"},{"$ref":"#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages"},{"$ref":"#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages"}],"description":"This is the plan for manipulating the message context before handing off the call to the squad.","title":"HandoffDestinationSquadContextEngineeringPlan"},"SquadMemberDtoAssistantDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationAssistant"},{"$ref":"#/components/schemas/HandoffDestinationAssistant"}],"title":"SquadMemberDtoAssistantDestinationsItems"},"SquadMemberDTO":{"type":"object","properties":{"assistantVersion":{"type":["string","null"],"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":{"$ref":"#/components/schemas/SquadMemberDtoAssistantDestinationsItems"},"description":"Assistants this squad member can route the conversation to through a transfer or handoff."},"assistantId":{"type":["string","null"],"description":"This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"This can be used to override the assistant's settings and provide values for it's template variables."}},"description":"An assistant member of a squad. Reference a saved assistant or provide a transient assistant, then configure member-specific overrides and destinations for transfers.","title":"SquadMemberDTO"},"CreateSquadDTO":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the squad."},"members":{"type":"array","items":{"$ref":"#/components/schemas/SquadMemberDTO"},"description":"This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list."},"membersOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."}},"required":["members"],"description":"Configuration used to create a squad. Provide an ordered list of assistant members and optional overrides that control how the squad handles a conversation and transfers between assistants.","title":"CreateSquadDTO"},"HandoffDestinationSquad":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/HandoffDestinationSquadType","description":"Selects a squad as the handoff destination."},"contextEngineeringPlan":{"$ref":"#/components/schemas/HandoffDestinationSquadContextEngineeringPlan","description":"This is the plan for manipulating the message context before handing off the call to the squad."},"squadId":{"type":"string","description":"This is the squad id to transfer the call to."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is a transient squad to transfer the call to."},"entryAssistantName":{"type":"string","description":"This is the name of the entry assistant to start with when handing off to the squad.\nIf not provided, the first member of the squad will be used."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the variable extraction plan for the handoff tool."},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the overrides to apply to the squad configuration.\nMaps to squad-level membersOverrides."},"description":{"type":"string","description":"This is the description of the destination, used by the AI to choose when and how to transfer the call."}},"required":["type"],"description":"Routes a handoff to a saved or transient squad, with optional entry assistant, context engineering, variable extraction, and overrides.","title":"HandoffDestinationSquad"},"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/HandoffDestinationAssistant"},{"$ref":"#/components/schemas/HandoffDestinationDynamic"},{"$ref":"#/components/schemas/HandoffDestinationSquad"}],"title":"ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"CreateHandoffToolDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"description":"Configuration used to create a tool that hands a conversation to another assistant, squad, or dynamically selected destination.","title":"CreateHandoffToolDTO"},"AnthropicModelToolsItems":{"oneOf":[{"$ref":"#/components/schemas/CreateApiRequestToolDTO"},{"$ref":"#/components/schemas/CreateBashToolDTO"},{"$ref":"#/components/schemas/CreateCodeToolDTO"},{"$ref":"#/components/schemas/CreateComputerToolDTO"},{"$ref":"#/components/schemas/CreateDtmfToolDTO"},{"$ref":"#/components/schemas/CreateEndCallToolDTO"},{"$ref":"#/components/schemas/CreateFunctionToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactCreateToolDTO"},{"$ref":"#/components/schemas/CreateGoHighLevelContactGetToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO"},{"$ref":"#/components/schemas/CreateGoogleCalendarCreateEventToolDTO"},{"$ref":"#/components/schemas/CreateGoogleSheetsRowAppendToolDTO"},{"$ref":"#/components/schemas/CreateHandoffToolDTO"},{"$ref":"#/components/schemas/CreateMcpToolDTO"},{"$ref":"#/components/schemas/CreateQueryToolDTO"},{"$ref":"#/components/schemas/CreateSlackSendMessageToolDTO"},{"$ref":"#/components/schemas/CreateSmsToolDTO"},{"$ref":"#/components/schemas/CreateTextEditorToolDTO"},{"$ref":"#/components/schemas/CreateTransferCallToolDTO"},{"$ref":"#/components/schemas/CreateSipRequestToolDTO"},{"$ref":"#/components/schemas/CreateVoicemailToolDTO"}],"title":"AnthropicModelToolsItems"},"AnthropicModelKnowledgeBase":{"oneOf":[{"$ref":"#/components/schemas/CreateCustomKnowledgeBaseDTO"}],"description":"These are the options for the knowledge base.","title":"AnthropicModelKnowledgeBase"},"AnthropicModelModel":{"type":"string","enum":["claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307","claude-3-5-sonnet-20240620","claude-3-5-sonnet-20241022","claude-3-5-haiku-20241022","claude-3-7-sonnet-20250219","claude-opus-4-20250514","claude-opus-4-5-20251101","claude-opus-4-6","claude-sonnet-4-20250514","claude-sonnet-4-5-20250929","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5-20251001"],"description":"The specific Anthropic/Claude model that will be used.","title":"AnthropicModelModel"},"AnthropicModelProvider":{"type":"string","enum":["anthropic"],"description":"The provider identifier for Anthropic.","title":"AnthropicModelProvider"},"AnthropicModel":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"This is the starting state for the conversation."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/AnthropicModelToolsItems"},"description":"These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together."},"toolIds":{"type":"array","items":{"type":"string"},"description":"These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together."},"toolRefs":{"type":"array","items":{"$ref":"#/components/schemas/ToolRef"},"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)."},"knowledgeBase":{"$ref":"#/components/schemas/AnthropicModelKnowledgeBase","description":"These are the options for the knowledge base."},"model":{"$ref":"#/components/schemas/AnthropicModelModel","description":"The specific Anthropic/Claude model that will be used."},"provider":{"$ref":"#/components/schemas/AnthropicModelProvider","description":"The provider identifier for Anthropic."},"thinking":{"$ref":"#/components/schemas/AnthropicThinkingConfig","description":"Optional configuration for Anthropic's thinking feature.\nOnly applicable for claude-3-7-sonnet-20250219 model.\nIf provided, maxTokens must be greater than thinking.budgetTokens."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature that will be used for calls. Default is 0.5."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"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."},"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"},"numFastTurns":{"type":"number","format":"double","minimum":0,"description":"This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0"}},"required":["model","provider"],"description":"Configuration for generating assistant responses with Anthropic, including model, prompts, tools, knowledge-base access, reasoning, and generation settings.","title":"AnthropicModel"},"AssistantModel":{"oneOf":[{"$ref":"#/components/schemas/AnthropicModel"},{"$ref":"#/components/schemas/AnthropicBedrockModel"},{"$ref":"#/components/schemas/AnyscaleModel"},{"$ref":"#/components/schemas/CerebrasModel"},{"$ref":"#/components/schemas/CustomLLMModel"},{"$ref":"#/components/schemas/DeepInfraModel"},{"$ref":"#/components/schemas/DeepSeekModel"},{"$ref":"#/components/schemas/GoogleModel"},{"$ref":"#/components/schemas/GroqModel"},{"$ref":"#/components/schemas/InflectionAIModel"},{"$ref":"#/components/schemas/MinimaxLLMModel"},{"$ref":"#/components/schemas/OpenAIModel"},{"$ref":"#/components/schemas/OpenRouterModel"},{"$ref":"#/components/schemas/PerplexityAIModel"},{"$ref":"#/components/schemas/TogetherAIModel"},{"$ref":"#/components/schemas/XaiModel"},{"$ref":"#/components/schemas/VapiModel"}],"description":"These are the options for the assistant's LLM.","title":"AssistantModel"},"AssistantVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"These are the options for the assistant's voice.","title":"AssistantVoice"},"AssistantFirstMessageMode":{"type":"string","enum":["assistant-speaks-first","assistant-speaks-first-with-model-generated-message","assistant-waits-for-user"],"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'","title":"AssistantFirstMessageMode"},"AssistantVoicemailDetection0":{"type":"string","enum":["off"],"title":"AssistantVoicemailDetection0"},"AssistantVoicemailDetection":{"oneOf":[{"$ref":"#/components/schemas/AssistantVoicemailDetection0"},{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlan"},{"$ref":"#/components/schemas/OpenAIVoicemailDetectionPlan"},{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlan"},{"$ref":"#/components/schemas/VapiVoicemailDetectionPlan"}],"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.","title":"AssistantVoicemailDetection"},"AssistantClientMessages":{"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"],"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.","title":"AssistantClientMessages"},"AssistantServerMessages":{"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","call.artifact.upload"],"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.","title":"AssistantServerMessages"},"AssistantBackgroundSound0":{"type":"string","enum":["off","office"],"title":"AssistantBackgroundSound0"},"AssistantBackgroundSound":{"oneOf":[{"$ref":"#/components/schemas/AssistantBackgroundSound0"},{"type":"string","format":"uri"}],"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.","title":"AssistantBackgroundSound"},"AssistantTransportConfigurationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransportConfigurationTwilio"}],"title":"AssistantTransportConfigurationsItems"},"AssistantCredentialsItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["11labs"],"description":"Discriminator value: 11labs"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"apiUrl":{"oneOf":[{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},{"type":"null"}],"description":"ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with ElevenLabs."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"],"description":"Discriminator value: anthropic"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anthropic."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic-bedrock"],"description":"Discriminator value: anthropic-bedrock"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion","description":"AWS region where Bedrock is configured."},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan","description":"Authentication method - either direct IAM credentials or cross-account role assumption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","authenticationPlan"],"description":"Credentials for authenticating Anthropic model requests through Amazon Bedrock, including AWS region and authentication method."},{"type":"object","properties":{"provider":{"type":"string","enum":["anyscale"],"description":"Discriminator value: anyscale"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anyscale."},{"type":"object","properties":{"provider":{"type":"string","enum":["assembly-ai"],"description":"Discriminator value: assembly-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with AssemblyAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure-openai"],"description":"Discriminator value: azure-openai"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion","description":"Azure region that hosts the OpenAI resource."},"models":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels","description":"Azure OpenAI models available through this credential."},"openAIKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"ocpApimSubscriptionKey":{"type":"string","description":"This is not returned in the API."},"openAIEndpoint":{"type":"string","maxLength":10000,"description":"Endpoint URL for the Azure OpenAI resource."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","models","openAIKey","openAIEndpoint"],"description":"Credentials for authenticating assistant model requests with Azure OpenAI, including region, endpoint, and available models."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure"],"description":"Discriminator value: azure"},"service":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService","description":"This is the service being used in Azure."},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion","description":"This is the region of the Azure resource."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"fallbackIndex":{"type":"number","format":"double","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/AzureBlobStorageBucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","service"],"description":"Credentials for Azure Speech or Blob Storage, including service, region, and optional storage bucket settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["byo-sip-trunk"],"description":"Discriminator value: byo-sip-trunk"},"gateways":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunkGateway"},"description":"This is the list of SIP trunk's gateways."},"outboundAuthenticationPlan":{"$ref":"#/components/schemas/SipTrunkOutboundAuthenticationPlan","description":"This can be used to configure the outbound authentication if required by the SIP trunk."},"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","maxLength":10000,"description":"This can be used to configure the tech prefix on outbound calls. This is an advanced property."},"sipDiversionHeader":{"type":"string","maxLength":10000,"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gateways"],"description":"Configuration for connecting Vapi to a bring-your-own SIP trunk or carrier, including gateways, outbound authentication, number handling, and optional session border controller routing."},{"type":"object","properties":{"provider":{"type":"string","enum":["cartesia"],"description":"Discriminator value: cartesia"},"apiKey":{"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Cartesia."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCerebrasCredentialDtoProvider","description":"Selects Cerebras as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Cerebras."},{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare"],"description":"Discriminator value: 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","format":"double","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/CloudflareR2BucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in R2"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Cloudflare R2, including account details, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["custom-llm"],"description":"Discriminator value: custom-llm"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"authenticationPlan":{"$ref":"#/components/schemas/OAuth2AuthenticationPlan","description":"This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating requests to a custom language model with an API key or OAuth 2.0 authentication plan."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepgram"],"description":"Discriminator value: deepgram"},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiUrl":{"type":"string","description":"This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Deepgram, with an optional API URL for an on-premises instance."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepinfra"],"description":"Discriminator value: deepinfra"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepInfra."},{"type":"object","properties":{"provider":{"type":"string","enum":["deep-seek"],"description":"Discriminator value: deep-seek"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepSeek."},{"type":"object","properties":{"provider":{"type":"string","enum":["gcp"],"description":"Discriminator value: gcp"},"fallbackIndex":{"type":"number","format":"double","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."},"gcpKey":{"$ref":"#/components/schemas/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/<service-account-id>/keys.\n\nThe schema is identical to the JSON that GCP outputs."},"region":{"type":"string","maxLength":40,"description":"This is the region of the GCP resource."},"bucketPlan":{"$ref":"#/components/schemas/BucketPlan","description":"Bucket configuration used to store call artifacts in Google Cloud Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gcpKey"],"description":"Service-account credentials for Google Cloud resources and optional call-artifact storage, including region, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["gladia"],"description":"Discriminator value: gladia"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Gladia."},{"type":"object","properties":{"provider":{"type":"string","enum":["gohighlevel"],"description":"Discriminator value: gohighlevel"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating Vapi integrations with GoHighLevel."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoogleCredentialDtoProvider","description":"Selects Google AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Google AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["groq"],"description":"Discriminator value: groq"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Groq."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInflectionAiCredentialDtoProvider","description":"Selects Inflection AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Inflection AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["langfuse"],"description":"Discriminator value: langfuse"},"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"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","publicKey","apiKey","apiUrl"],"description":"Credentials for sending assistant call traces to a Langfuse project, including its public key, secret key, and host URL."},{"type":"object","properties":{"provider":{"type":"string","enum":["lmnt"],"description":"Discriminator value: lmnt"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with LMNT."},{"type":"object","properties":{"provider":{"type":"string","enum":["make"],"description":"Discriminator value: 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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","teamId","region","apiKey"],"description":"Credentials for authenticating Vapi integrations with Make, including team, region, and API key."},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"],"description":"Discriminator value: openai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model, transcription, and voice synthesis requests with OpenAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["openrouter"],"description":"Discriminator value: openrouter"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with OpenRouter."},{"type":"object","properties":{"provider":{"type":"string","enum":["perplexity-ai"],"description":"Discriminator value: perplexity-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Perplexity AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["playht"],"description":"Discriminator value: playht"},"apiKey":{"type":"string","description":"This is not returned in the API."},"userId":{"type":"string","description":"PlayHT user identifier associated with the API key."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","userId"],"description":"Credentials for authenticating voice synthesis requests with PlayHT, including the PlayHT user identifier."},{"type":"object","properties":{"provider":{"type":"string","enum":["rime-ai"],"description":"Discriminator value: rime-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Rime AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["runpod"],"description":"Discriminator value: runpod"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests through Runpod."},{"type":"object","properties":{"provider":{"type":"string","enum":["s3"],"description":"Discriminator value: 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","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","awsAccessKeyId","awsSecretAccessKey","region","s3BucketName","s3PathPrefix"],"description":"Credentials for storing call artifacts in Amazon S3, including access keys, region, bucket, path prefix, and upload fallback order."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateS3CompatibleCredentialDtoProvider","description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."},"bucketPlan":{"$ref":"#/components/schemas/S3CompatibleBucketPlan"},"fallbackIndex":{"type":"number","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","bucketPlan"],"description":"s3-compatible variant"},{"type":"object","properties":{"provider":{"type":"string","enum":["supabase"],"description":"Discriminator value: supabase"},"fallbackIndex":{"type":"number","format":"double","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/SupabaseBucketPlan","description":"Supabase S3-compatible bucket configuration used to store call artifacts."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Supabase's S3-compatible storage, including bucket configuration and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["smallest-ai"],"description":"Discriminator value: smallest-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Smallest AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["tavus"],"description":"Discriminator value: tavus"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Tavus."},{"type":"object","properties":{"provider":{"type":"string","enum":["together-ai"],"description":"Discriminator value: together-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Together AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"authToken":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiSecret":{"type":"string","description":"This is not returned in the API."},"accountSid":{"type":"string","description":"Twilio Account SID associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","accountSid"],"description":"Credentials for authenticating telephony requests with Twilio using an account SID and either an auth token or API key credentials."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"apiSecret":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"Vonage API key associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiSecret","apiKey"],"description":"Credentials for authenticating telephony requests with Vonage."},{"type":"object","properties":{"provider":{"type":"string","enum":["webhook"],"description":"Discriminator value: webhook"},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"CreateWebhookCredentialDTO variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomCredentialDtoProvider","description":"Selects a custom credential configuration."},"authenticationPlan":{"$ref":"#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"encryptionPlan":{"$ref":"#/components/schemas/PublicKeyEncryptionPlan","description":"This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"Reusable custom credentials for authenticating outbound requests, with optional public-key encryption for sensitive request data."},{"type":"object","properties":{"provider":{"type":"string","enum":["xai"],"description":"Discriminator value: xai"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with xAI."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMicrosoftCredentialDtoProvider"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"region":{"type":"string","maxLength":64,"description":"Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"microsoft variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateNeuphonicCredentialDtoProvider","description":"Selects Neuphonic as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Neuphonic."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateHumeCredentialDtoProvider","description":"Selects Hume as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Hume."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMistralCredentialDtoProvider","description":"Selects Mistral as the credential provider."},"apiKey":{"type":"string","maxLength":100,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Mistral."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSpeechmaticsCredentialDtoProvider","description":"Selects Speechmatics as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Speechmatics."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSonioxCredentialDtoProvider","description":"Selects Soniox as the credential provider."},"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Soniox."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-client"],"description":"Discriminator value: google.calendar.oauth2-client"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"OAuth 2.0 client credential for Google Calendar integrations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-authorization"],"description":"Discriminator value: google.calendar.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Calendar operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.sheets.oauth2-authorization"],"description":"Discriminator value: google.sheets.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Sheets operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["slack.oauth2-authorization"],"description":"Discriminator value: slack.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Slack operations."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider","description":"Selects GoHighLevel OAuth 2.0 authorization for MCP."},"authenticationSession":{"$ref":"#/components/schemas/Oauth2AuthenticationSession","description":"This is the authentication session for the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationSession"],"description":"OAuth 2.0 session credentials for authenticating GoHighLevel MCP requests."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInworldCredentialDtoProvider","description":"Selects Inworld as the credential provider."},"apiKey":{"type":"string","description":"This is the Inworld Basic (Base64) authentication token. This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Inworld."},{"type":"object","properties":{"provider":{"type":"string","enum":["minimax"],"description":"Discriminator value: minimax"},"apiKey":{"type":"string","description":"This is not returned in the API."},"groupId":{"type":"string","description":"This is the Minimax Group ID."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","groupId"],"description":"Credentials for authenticating assistant model and voice synthesis requests with MiniMax, including the MiniMax group identifier."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateWellSaidCredentialDtoProvider","description":"Selects WellSaid as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with WellSaid."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateEmailCredentialDtoProvider","description":"Selects email as the alert destination provider."},"email":{"type":"string","description":"The recipient email address for alerts"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","email"],"description":"Destination configuration for sending Vapi alerts to an email address."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSlackWebhookCredentialDtoProvider","description":"Selects a Slack incoming webhook as the credential provider."},"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","webhookUrl"],"description":"Credentials for sending Vapi alerts through a Slack incoming webhook."}],"discriminator":{"propertyName":"provider"},"title":"AssistantCredentialsItems"},"AssistantHooksItems":{"oneOf":[{"$ref":"#/components/schemas/CallHookCallEnding"},{"$ref":"#/components/schemas/CallHookAssistantSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeout"},{"$ref":"#/components/schemas/SessionCreatedHook"}],"title":"AssistantHooksItems"},"AssistantMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the assistant.","title":"AssistantMetadata"},"Assistant":{"type":"object","properties":{"transcriber":{"$ref":"#/components/schemas/AssistantTranscriber","description":"These are the options for the assistant's transcriber."},"model":{"$ref":"#/components/schemas/AssistantModel","description":"These are the options for the assistant's LLM."},"voice":{"$ref":"#/components/schemas/AssistantVoice","description":"These are the options for the assistant's voice."},"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."},"firstMessageInterruptionsEnabled":{"type":"boolean","default":false,"description":"Set to `true` to allow the user to interrupt the assistant while it speaks the first message. Default is `false`."},"firstMessageMode":{"$ref":"#/components/schemas/AssistantFirstMessageMode","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'"},"voicemailDetection":{"$ref":"#/components/schemas/AssistantVoicemailDetection","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."},"clientMessages":{"$ref":"#/components/schemas/AssistantClientMessages","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."},"serverMessages":{"$ref":"#/components/schemas/AssistantServerMessages","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."},"maxDurationSeconds":{"type":"number","format":"double","minimum":10,"maximum":43200,"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)"},"backgroundSound":{"$ref":"#/components/schemas/AssistantBackgroundSound","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."},"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"},"transportConfigurations":{"type":"array","items":{"$ref":"#/components/schemas/AssistantTransportConfigurationsItems"},"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."},"observabilityPlan":{"$ref":"#/components/schemas/LangfuseObservabilityPlan","description":"This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported."},"credentials":{"type":"array","items":{"$ref":"#/components/schemas/AssistantCredentialsItems"},"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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/AssistantHooksItems"},"description":"This is a set of actions that will be performed on certain events."},"latestVersion":{"type":["string","null"],"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","maxLength":40,"description":"This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call."},"voicemailMessage":{"type":"string","maxLength":1000,"description":"This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up."},"endCallMessage":{"type":"string","maxLength":1000,"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."},"endCallPhrases":{"type":"array","items":{"type":"string","minLength":2,"maxLength":140},"description":"This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive."},"compliancePlan":{"$ref":"#/components/schemas/CompliancePlan","description":"Compliance settings for the assistant, including HIPAA and PCI behavior, security filtering, and recording consent."},"metadata":{"$ref":"#/components/schemas/AssistantMetadata","description":"This is for metadata you want to store on the assistant."},"backgroundSpeechDenoisingPlan":{"$ref":"#/components/schemas/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"},"analysisPlan":{"$ref":"#/components/schemas/AnalysisPlan","description":"This is the plan for analysis of assistant's calls. Stored in `call.analysis`."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`."},"startSpeakingPlan":{"$ref":"#/components/schemas/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."},"stopSpeakingPlan":{"$ref":"#/components/schemas/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."},"monitorPlan":{"$ref":"#/components/schemas/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."},"credentialIds":{"type":"array","items":{"type":"string"},"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."},"server":{"$ref":"#/components/schemas/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"},"keypadInputPlan":{"$ref":"#/components/schemas/KeypadInputPlan","description":"Configuration for collecting and processing DTMF keypad input during calls."},"id":{"type":"string","description":"This is the unique identifier for the assistant."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this assistant belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the assistant was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the assistant was last updated."}},"required":["id","orgId","createdAt","updatedAt"],"description":"A saved assistant configuration returned by the Vapi API. It defines how the assistant listens, reasons, speaks, handles conversations, sends events, and produces artifacts and analysis.","title":"Assistant"},"AssistantPinnedConflictResponseDtoError":{"type":"string","enum":["assistant_pinned"],"title":"AssistantPinnedConflictResponseDtoError"},"AssistantPinnedConflictResponseDTO":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/AssistantPinnedConflictResponseDtoError"},"message":{"type":"string","description":"Human-readable reason the parent-assistant delete was rejected."}},"required":["error","message"],"title":"AssistantPinnedConflictResponseDTO"},"UpdateAssistantDtoTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"These are the options for the assistant's transcriber.","title":"UpdateAssistantDtoTranscriber"},"UpdateAssistantDtoModel":{"oneOf":[{"$ref":"#/components/schemas/AnthropicModel"},{"$ref":"#/components/schemas/AnthropicBedrockModel"},{"$ref":"#/components/schemas/AnyscaleModel"},{"$ref":"#/components/schemas/CerebrasModel"},{"$ref":"#/components/schemas/CustomLLMModel"},{"$ref":"#/components/schemas/DeepInfraModel"},{"$ref":"#/components/schemas/DeepSeekModel"},{"$ref":"#/components/schemas/GoogleModel"},{"$ref":"#/components/schemas/GroqModel"},{"$ref":"#/components/schemas/InflectionAIModel"},{"$ref":"#/components/schemas/MinimaxLLMModel"},{"$ref":"#/components/schemas/OpenAIModel"},{"$ref":"#/components/schemas/OpenRouterModel"},{"$ref":"#/components/schemas/PerplexityAIModel"},{"$ref":"#/components/schemas/TogetherAIModel"},{"$ref":"#/components/schemas/XaiModel"},{"$ref":"#/components/schemas/VapiModel"}],"description":"These are the options for the assistant's LLM.","title":"UpdateAssistantDtoModel"},"UpdateAssistantDtoVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"These are the options for the assistant's voice.","title":"UpdateAssistantDtoVoice"},"UpdateAssistantDtoFirstMessageMode":{"type":"string","enum":["assistant-speaks-first","assistant-speaks-first-with-model-generated-message","assistant-waits-for-user"],"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'","title":"UpdateAssistantDtoFirstMessageMode"},"UpdateAssistantDtoVoicemailDetection0":{"type":"string","enum":["off"],"title":"UpdateAssistantDtoVoicemailDetection0"},"UpdateAssistantDtoVoicemailDetection":{"oneOf":[{"$ref":"#/components/schemas/UpdateAssistantDtoVoicemailDetection0"},{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlan"},{"$ref":"#/components/schemas/OpenAIVoicemailDetectionPlan"},{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlan"},{"$ref":"#/components/schemas/VapiVoicemailDetectionPlan"}],"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.","title":"UpdateAssistantDtoVoicemailDetection"},"UpdateAssistantDtoClientMessages":{"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"],"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.","title":"UpdateAssistantDtoClientMessages"},"UpdateAssistantDtoServerMessages":{"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","call.artifact.upload"],"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.","title":"UpdateAssistantDtoServerMessages"},"UpdateAssistantDtoBackgroundSound0":{"type":"string","enum":["off","office"],"title":"UpdateAssistantDtoBackgroundSound0"},"UpdateAssistantDtoBackgroundSound":{"oneOf":[{"$ref":"#/components/schemas/UpdateAssistantDtoBackgroundSound0"},{"type":"string","format":"uri"}],"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.","title":"UpdateAssistantDtoBackgroundSound"},"UpdateAssistantDtoTransportConfigurationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransportConfigurationTwilio"}],"title":"UpdateAssistantDtoTransportConfigurationsItems"},"UpdateAssistantDtoCredentialsItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["11labs"],"description":"Discriminator value: 11labs"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"apiUrl":{"oneOf":[{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},{"type":"null"}],"description":"ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with ElevenLabs."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"],"description":"Discriminator value: anthropic"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anthropic."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic-bedrock"],"description":"Discriminator value: anthropic-bedrock"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion","description":"AWS region where Bedrock is configured."},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan","description":"Authentication method - either direct IAM credentials or cross-account role assumption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","authenticationPlan"],"description":"Credentials for authenticating Anthropic model requests through Amazon Bedrock, including AWS region and authentication method."},{"type":"object","properties":{"provider":{"type":"string","enum":["anyscale"],"description":"Discriminator value: anyscale"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anyscale."},{"type":"object","properties":{"provider":{"type":"string","enum":["assembly-ai"],"description":"Discriminator value: assembly-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with AssemblyAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure-openai"],"description":"Discriminator value: azure-openai"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion","description":"Azure region that hosts the OpenAI resource."},"models":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels","description":"Azure OpenAI models available through this credential."},"openAIKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"ocpApimSubscriptionKey":{"type":"string","description":"This is not returned in the API."},"openAIEndpoint":{"type":"string","maxLength":10000,"description":"Endpoint URL for the Azure OpenAI resource."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","models","openAIKey","openAIEndpoint"],"description":"Credentials for authenticating assistant model requests with Azure OpenAI, including region, endpoint, and available models."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure"],"description":"Discriminator value: azure"},"service":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService","description":"This is the service being used in Azure."},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion","description":"This is the region of the Azure resource."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"fallbackIndex":{"type":"number","format":"double","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/AzureBlobStorageBucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","service"],"description":"Credentials for Azure Speech or Blob Storage, including service, region, and optional storage bucket settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["byo-sip-trunk"],"description":"Discriminator value: byo-sip-trunk"},"gateways":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunkGateway"},"description":"This is the list of SIP trunk's gateways."},"outboundAuthenticationPlan":{"$ref":"#/components/schemas/SipTrunkOutboundAuthenticationPlan","description":"This can be used to configure the outbound authentication if required by the SIP trunk."},"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","maxLength":10000,"description":"This can be used to configure the tech prefix on outbound calls. This is an advanced property."},"sipDiversionHeader":{"type":"string","maxLength":10000,"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gateways"],"description":"Configuration for connecting Vapi to a bring-your-own SIP trunk or carrier, including gateways, outbound authentication, number handling, and optional session border controller routing."},{"type":"object","properties":{"provider":{"type":"string","enum":["cartesia"],"description":"Discriminator value: cartesia"},"apiKey":{"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Cartesia."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCerebrasCredentialDtoProvider","description":"Selects Cerebras as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Cerebras."},{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare"],"description":"Discriminator value: 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","format":"double","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/CloudflareR2BucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in R2"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Cloudflare R2, including account details, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["custom-llm"],"description":"Discriminator value: custom-llm"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"authenticationPlan":{"$ref":"#/components/schemas/OAuth2AuthenticationPlan","description":"This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating requests to a custom language model with an API key or OAuth 2.0 authentication plan."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepgram"],"description":"Discriminator value: deepgram"},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiUrl":{"type":"string","description":"This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Deepgram, with an optional API URL for an on-premises instance."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepinfra"],"description":"Discriminator value: deepinfra"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepInfra."},{"type":"object","properties":{"provider":{"type":"string","enum":["deep-seek"],"description":"Discriminator value: deep-seek"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepSeek."},{"type":"object","properties":{"provider":{"type":"string","enum":["gcp"],"description":"Discriminator value: gcp"},"fallbackIndex":{"type":"number","format":"double","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."},"gcpKey":{"$ref":"#/components/schemas/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/<service-account-id>/keys.\n\nThe schema is identical to the JSON that GCP outputs."},"region":{"type":"string","maxLength":40,"description":"This is the region of the GCP resource."},"bucketPlan":{"$ref":"#/components/schemas/BucketPlan","description":"Bucket configuration used to store call artifacts in Google Cloud Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gcpKey"],"description":"Service-account credentials for Google Cloud resources and optional call-artifact storage, including region, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["gladia"],"description":"Discriminator value: gladia"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Gladia."},{"type":"object","properties":{"provider":{"type":"string","enum":["gohighlevel"],"description":"Discriminator value: gohighlevel"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating Vapi integrations with GoHighLevel."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoogleCredentialDtoProvider","description":"Selects Google AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Google AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["groq"],"description":"Discriminator value: groq"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Groq."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInflectionAiCredentialDtoProvider","description":"Selects Inflection AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Inflection AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["langfuse"],"description":"Discriminator value: langfuse"},"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"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","publicKey","apiKey","apiUrl"],"description":"Credentials for sending assistant call traces to a Langfuse project, including its public key, secret key, and host URL."},{"type":"object","properties":{"provider":{"type":"string","enum":["lmnt"],"description":"Discriminator value: lmnt"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with LMNT."},{"type":"object","properties":{"provider":{"type":"string","enum":["make"],"description":"Discriminator value: 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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","teamId","region","apiKey"],"description":"Credentials for authenticating Vapi integrations with Make, including team, region, and API key."},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"],"description":"Discriminator value: openai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model, transcription, and voice synthesis requests with OpenAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["openrouter"],"description":"Discriminator value: openrouter"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with OpenRouter."},{"type":"object","properties":{"provider":{"type":"string","enum":["perplexity-ai"],"description":"Discriminator value: perplexity-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Perplexity AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["playht"],"description":"Discriminator value: playht"},"apiKey":{"type":"string","description":"This is not returned in the API."},"userId":{"type":"string","description":"PlayHT user identifier associated with the API key."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","userId"],"description":"Credentials for authenticating voice synthesis requests with PlayHT, including the PlayHT user identifier."},{"type":"object","properties":{"provider":{"type":"string","enum":["rime-ai"],"description":"Discriminator value: rime-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Rime AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["runpod"],"description":"Discriminator value: runpod"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests through Runpod."},{"type":"object","properties":{"provider":{"type":"string","enum":["s3"],"description":"Discriminator value: 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","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","awsAccessKeyId","awsSecretAccessKey","region","s3BucketName","s3PathPrefix"],"description":"Credentials for storing call artifacts in Amazon S3, including access keys, region, bucket, path prefix, and upload fallback order."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateS3CompatibleCredentialDtoProvider","description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."},"bucketPlan":{"$ref":"#/components/schemas/S3CompatibleBucketPlan"},"fallbackIndex":{"type":"number","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","bucketPlan"],"description":"s3-compatible variant"},{"type":"object","properties":{"provider":{"type":"string","enum":["supabase"],"description":"Discriminator value: supabase"},"fallbackIndex":{"type":"number","format":"double","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/SupabaseBucketPlan","description":"Supabase S3-compatible bucket configuration used to store call artifacts."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Supabase's S3-compatible storage, including bucket configuration and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["smallest-ai"],"description":"Discriminator value: smallest-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Smallest AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["tavus"],"description":"Discriminator value: tavus"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Tavus."},{"type":"object","properties":{"provider":{"type":"string","enum":["together-ai"],"description":"Discriminator value: together-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Together AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"authToken":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiSecret":{"type":"string","description":"This is not returned in the API."},"accountSid":{"type":"string","description":"Twilio Account SID associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","accountSid"],"description":"Credentials for authenticating telephony requests with Twilio using an account SID and either an auth token or API key credentials."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"apiSecret":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"Vonage API key associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiSecret","apiKey"],"description":"Credentials for authenticating telephony requests with Vonage."},{"type":"object","properties":{"provider":{"type":"string","enum":["webhook"],"description":"Discriminator value: webhook"},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"CreateWebhookCredentialDTO variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomCredentialDtoProvider","description":"Selects a custom credential configuration."},"authenticationPlan":{"$ref":"#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"encryptionPlan":{"$ref":"#/components/schemas/PublicKeyEncryptionPlan","description":"This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"Reusable custom credentials for authenticating outbound requests, with optional public-key encryption for sensitive request data."},{"type":"object","properties":{"provider":{"type":"string","enum":["xai"],"description":"Discriminator value: xai"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with xAI."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMicrosoftCredentialDtoProvider"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"region":{"type":"string","maxLength":64,"description":"Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"microsoft variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateNeuphonicCredentialDtoProvider","description":"Selects Neuphonic as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Neuphonic."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateHumeCredentialDtoProvider","description":"Selects Hume as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Hume."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMistralCredentialDtoProvider","description":"Selects Mistral as the credential provider."},"apiKey":{"type":"string","maxLength":100,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Mistral."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSpeechmaticsCredentialDtoProvider","description":"Selects Speechmatics as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Speechmatics."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSonioxCredentialDtoProvider","description":"Selects Soniox as the credential provider."},"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Soniox."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-client"],"description":"Discriminator value: google.calendar.oauth2-client"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"OAuth 2.0 client credential for Google Calendar integrations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-authorization"],"description":"Discriminator value: google.calendar.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Calendar operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.sheets.oauth2-authorization"],"description":"Discriminator value: google.sheets.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Sheets operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["slack.oauth2-authorization"],"description":"Discriminator value: slack.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Slack operations."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider","description":"Selects GoHighLevel OAuth 2.0 authorization for MCP."},"authenticationSession":{"$ref":"#/components/schemas/Oauth2AuthenticationSession","description":"This is the authentication session for the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationSession"],"description":"OAuth 2.0 session credentials for authenticating GoHighLevel MCP requests."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInworldCredentialDtoProvider","description":"Selects Inworld as the credential provider."},"apiKey":{"type":"string","description":"This is the Inworld Basic (Base64) authentication token. This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Inworld."},{"type":"object","properties":{"provider":{"type":"string","enum":["minimax"],"description":"Discriminator value: minimax"},"apiKey":{"type":"string","description":"This is not returned in the API."},"groupId":{"type":"string","description":"This is the Minimax Group ID."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","groupId"],"description":"Credentials for authenticating assistant model and voice synthesis requests with MiniMax, including the MiniMax group identifier."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateWellSaidCredentialDtoProvider","description":"Selects WellSaid as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with WellSaid."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateEmailCredentialDtoProvider","description":"Selects email as the alert destination provider."},"email":{"type":"string","description":"The recipient email address for alerts"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","email"],"description":"Destination configuration for sending Vapi alerts to an email address."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSlackWebhookCredentialDtoProvider","description":"Selects a Slack incoming webhook as the credential provider."},"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","webhookUrl"],"description":"Credentials for sending Vapi alerts through a Slack incoming webhook."}],"discriminator":{"propertyName":"provider"},"title":"UpdateAssistantDtoCredentialsItems"},"UpdateAssistantDtoHooksItems":{"oneOf":[{"$ref":"#/components/schemas/CallHookCallEnding"},{"$ref":"#/components/schemas/CallHookAssistantSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeout"},{"$ref":"#/components/schemas/SessionCreatedHook"}],"title":"UpdateAssistantDtoHooksItems"},"UpdateAssistantDtoMetadata":{"type":"object","properties":{},"description":"This is for metadata you want to store on the assistant.","title":"UpdateAssistantDtoMetadata"},"UpdateAssistantDTO":{"type":"object","properties":{"transcriber":{"$ref":"#/components/schemas/UpdateAssistantDtoTranscriber","description":"These are the options for the assistant's transcriber."},"model":{"$ref":"#/components/schemas/UpdateAssistantDtoModel","description":"These are the options for the assistant's LLM."},"voice":{"$ref":"#/components/schemas/UpdateAssistantDtoVoice","description":"These are the options for the assistant's voice."},"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."},"firstMessageInterruptionsEnabled":{"type":"boolean","default":false,"description":"Set to `true` to allow the user to interrupt the assistant while it speaks the first message. Default is `false`."},"firstMessageMode":{"$ref":"#/components/schemas/UpdateAssistantDtoFirstMessageMode","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'"},"voicemailDetection":{"$ref":"#/components/schemas/UpdateAssistantDtoVoicemailDetection","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."},"clientMessages":{"$ref":"#/components/schemas/UpdateAssistantDtoClientMessages","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."},"serverMessages":{"$ref":"#/components/schemas/UpdateAssistantDtoServerMessages","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."},"maxDurationSeconds":{"type":"number","format":"double","minimum":10,"maximum":43200,"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)"},"backgroundSound":{"$ref":"#/components/schemas/UpdateAssistantDtoBackgroundSound","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."},"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"},"transportConfigurations":{"type":"array","items":{"$ref":"#/components/schemas/UpdateAssistantDtoTransportConfigurationsItems"},"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."},"observabilityPlan":{"$ref":"#/components/schemas/LangfuseObservabilityPlan","description":"This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported."},"credentials":{"type":"array","items":{"$ref":"#/components/schemas/UpdateAssistantDtoCredentialsItems"},"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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/UpdateAssistantDtoHooksItems"},"description":"This is a set of actions that will be performed on certain events."},"name":{"type":"string","maxLength":40,"description":"This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call."},"voicemailMessage":{"type":"string","maxLength":1000,"description":"This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up."},"endCallMessage":{"type":"string","maxLength":1000,"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."},"endCallPhrases":{"type":"array","items":{"type":"string","minLength":2,"maxLength":140},"description":"This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive."},"compliancePlan":{"$ref":"#/components/schemas/CompliancePlan","description":"Compliance settings for the assistant, including HIPAA and PCI behavior, security filtering, and recording consent."},"metadata":{"$ref":"#/components/schemas/UpdateAssistantDtoMetadata","description":"This is for metadata you want to store on the assistant."},"backgroundSpeechDenoisingPlan":{"$ref":"#/components/schemas/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"},"analysisPlan":{"$ref":"#/components/schemas/AnalysisPlan","description":"This is the plan for analysis of assistant's calls. Stored in `call.analysis`."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`."},"startSpeakingPlan":{"$ref":"#/components/schemas/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."},"stopSpeakingPlan":{"$ref":"#/components/schemas/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."},"monitorPlan":{"$ref":"#/components/schemas/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."},"credentialIds":{"type":"array","items":{"type":"string"},"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."},"server":{"$ref":"#/components/schemas/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"},"keypadInputPlan":{"$ref":"#/components/schemas/KeypadInputPlan","description":"Configuration for collecting and processing DTMF keypad input during calls."}},"description":"Fields used to update an existing assistant. Include only the settings you want to change; omitted fields retain their current values.","title":"UpdateAssistantDTO"},"Squad":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the squad."},"members":{"type":"array","items":{"$ref":"#/components/schemas/SquadMemberDTO"},"description":"This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list."},"membersOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"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":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the squad was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the squad was last updated."}},"required":["members","id","orgId","createdAt","updatedAt"],"description":"A saved squad configuration that coordinates a group of assistants during a conversation. The first member starts the call, and member destinations control transfers between assistants.","title":"Squad"},"UpdateSquadDTO":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the squad."},"members":{"type":"array","items":{"$ref":"#/components/schemas/SquadMemberDTO"},"description":"This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list."},"membersOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."}},"required":["members"],"description":"Configuration used to update an existing squad, including its name, ordered members, and shared assistant overrides.","title":"UpdateSquadDTO"},"CallType":{"type":"string","enum":["inboundPhoneCall","outboundPhoneCall","webCall","vapi.websocketCall"],"description":"This is the type of call.","title":"CallType"},"TransportCostType":{"type":"string","enum":["transport"],"description":"This is the type of cost, always 'transport' for this class.","title":"TransportCostType"},"TransportCostProvider":{"type":"string","enum":["daily","vapi.websocket","twilio","vonage","telnyx","vapi.sip"],"description":"Telephony or transport provider that generated the cost.","title":"TransportCostProvider"},"TransportCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/TransportCostType","description":"This is the type of cost, always 'transport' for this class."},"provider":{"$ref":"#/components/schemas/TransportCostProvider","description":"Telephony or transport provider that generated the cost."},"minutes":{"type":"number","format":"double","description":"This is the minutes of `transport` usage. This should match `call.endedAt` - `call.startedAt`."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","minutes","cost"],"description":"Telephony transport cost for a call, including provider, billable minutes, and amount.","title":"TransportCost"},"TranscriberCostType":{"type":"string","enum":["transcriber"],"description":"This is the type of cost, always 'transcriber' for this class.","title":"TranscriberCostType"},"TranscriberCostTranscriber":{"type":"object","properties":{},"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`.","title":"TranscriberCostTranscriber"},"TranscriberCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/TranscriberCostType","description":"This is the type of cost, always 'transcriber' for this class."},"transcriber":{"$ref":"#/components/schemas/TranscriberCostTranscriber","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","format":"double","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","format":"double","description":"This is the cost of the component in USD."}},"required":["type","transcriber","minutes","cost"],"description":"Speech-to-text cost for a call, including transcriber, billable minutes, and amount.","title":"TranscriberCost"},"ModelCostType":{"type":"string","enum":["model"],"description":"This is the type of cost, always 'model' for this class.","title":"ModelCostType"},"ModelCostModel":{"type":"object","properties":{},"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`.","title":"ModelCostModel"},"ModelCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ModelCostType","description":"This is the type of cost, always 'model' for this class."},"model":{"$ref":"#/components/schemas/ModelCostModel","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","format":"double","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","format":"double","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","format":"double","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."},"reasoningTokens":{"type":"number","format":"double","description":"This is the number of reasoning tokens generated in the call. This is only applicable to reasoning models (e.g., OpenAI o-series, GPT-5) on providers that report them.\n\nThis is a **subset of `completionTokens`**, not an addition to it: reasoning tokens are already counted in `completionTokens` and are already billed at the output-token rate. It is reported separately for visibility only and does not affect `cost`."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","model","promptTokens","completionTokens","cost"],"description":"Language-model cost for a call, including model, token usage, and amount.","title":"ModelCost"},"VoiceCostType":{"type":"string","enum":["voice"],"description":"This is the type of cost, always 'voice' for this class.","title":"VoiceCostType"},"VoiceCostVoice":{"type":"object","properties":{},"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`.","title":"VoiceCostVoice"},"VoiceCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/VoiceCostType","description":"This is the type of cost, always 'voice' for this class."},"voice":{"$ref":"#/components/schemas/VoiceCostVoice","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","format":"double","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","format":"double","description":"This is the cost of the component in USD."}},"required":["type","voice","characters","cost"],"description":"Voice-synthesis cost for a call, including voice, character usage, and amount.","title":"VoiceCost"},"VapiCostType":{"type":"string","enum":["vapi"],"description":"This is the type of cost, always 'vapi' for this class.","title":"VapiCostType"},"VapiCostSubType":{"type":"string","enum":["normal","overage"],"description":"This is the sub type of the cost.","title":"VapiCostSubType"},"VapiCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/VapiCostType","description":"This is the type of cost, always 'vapi' for this class."},"subType":{"$ref":"#/components/schemas/VapiCostSubType","description":"This is the sub type of the cost."},"minutes":{"type":"number","format":"double","description":"This is the minutes of Vapi usage. This should match `call.endedAt` - `call.startedAt`."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","subType","minutes","cost"],"description":"Vapi platform cost for a call, including cost subtype, billable minutes, and amount.","title":"VapiCost"},"VoicemailDetectionCostType":{"type":"string","enum":["voicemail-detection"],"description":"This is the type of cost, always 'voicemail-detection' for this class.","title":"VoicemailDetectionCostType"},"VoicemailDetectionCostModel":{"type":"object","properties":{},"description":"This is the model that was used to perform the analysis.","title":"VoicemailDetectionCostModel"},"VoicemailDetectionCostProvider":{"type":"string","enum":["twilio","google","openai","vapi"],"description":"This is the provider that was used to detect the voicemail.","title":"VoicemailDetectionCostProvider"},"VoicemailDetectionCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/VoicemailDetectionCostType","description":"This is the type of cost, always 'voicemail-detection' for this class."},"model":{"$ref":"#/components/schemas/VoicemailDetectionCostModel","description":"This is the model that was used to perform the analysis."},"provider":{"$ref":"#/components/schemas/VoicemailDetectionCostProvider","description":"This is the provider that was used to detect the voicemail."},"promptTextTokens":{"type":"number","format":"double","description":"This is the number of prompt text tokens used in the voicemail detection."},"promptAudioTokens":{"type":"number","format":"double","description":"This is the number of prompt audio tokens used in the voicemail detection."},"completionTextTokens":{"type":"number","format":"double","description":"This is the number of completion text tokens used in the voicemail detection."},"completionAudioTokens":{"type":"number","format":"double","description":"This is the number of completion audio tokens used in the voicemail detection."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","model","provider","promptTextTokens","promptAudioTokens","completionTextTokens","completionAudioTokens","cost"],"description":"Voicemail-detection model cost, including provider, model, multimodal token usage, and amount.","title":"VoicemailDetectionCost"},"AnalysisCostType":{"type":"string","enum":["analysis"],"description":"This is the type of cost, always 'analysis' for this class.","title":"AnalysisCostType"},"AnalysisCostAnalysisType":{"type":"string","enum":["summary","structuredData","successEvaluation","structuredOutput"],"description":"This is the type of analysis performed.","title":"AnalysisCostAnalysisType"},"AnalysisCostModel":{"type":"object","properties":{},"description":"This is the model that was used to perform the analysis.","title":"AnalysisCostModel"},"StructuredOutputCostBreakdown":{"type":"object","properties":{"structuredOutputId":{"type":"string","description":"This is the unique identifier of the structured output that produced this cost."},"name":{"type":"string","description":"This is the name of the structured output, so this breakdown is readable without looking the id up."},"cost":{"type":"number","format":"double","description":"This is the cost in USD of evaluating this structured output."},"promptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used to evaluate this structured output."},"completionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens generated for this structured output."},"cachedPromptTokens":{"type":"number","format":"double","description":"This is the number of cached prompt tokens used to evaluate this structured output. This is a subset of `promptTokens`, not an addition to it."}},"required":["structuredOutputId","name","cost","promptTokens","completionTokens"],"title":"StructuredOutputCostBreakdown"},"AnalysisCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AnalysisCostType","description":"This is the type of cost, always 'analysis' for this class."},"analysisType":{"$ref":"#/components/schemas/AnalysisCostAnalysisType","description":"This is the type of analysis performed."},"model":{"$ref":"#/components/schemas/AnalysisCostModel","description":"This is the model that was used to perform the analysis."},"promptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used in the analysis."},"completionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens generated in the analysis."},"cachedPromptTokens":{"type":"number","format":"double","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."},"structuredOutputBreakdown":{"type":"array","items":{"$ref":"#/components/schemas/StructuredOutputCostBreakdown"},"description":"This is the per-structured-output breakdown of this cost. The `cost`, `promptTokens`, `completionTokens` and `cachedPromptTokens` above are the sums of these rows.\n\nThis is only set when `analysisType` is `structuredOutput`, and it is omitted entirely rather than partially populated, so when it is present the rows always reconcile to the totals above.\n\nA structured output that was skipped, or that extracts via regex, makes no LLM call and so has no row here — this is not a complete list of the call's configured structured outputs. There is one row per evaluation, so a `structuredOutputId` can appear more than once if it was evaluated more than once; sum the rows rather than indexing them by id."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","analysisType","model","promptTokens","completionTokens","cost"],"description":"Cost for an individual analysis request, including analysis type, model, token usage, and amount.","title":"AnalysisCost"},"KnowledgeBaseCostType":{"type":"string","enum":["knowledge-base"],"description":"This is the type of cost, always 'knowledge-base' for this class.","title":"KnowledgeBaseCostType"},"KnowledgeBaseCostModel":{"type":"object","properties":{},"description":"This is the model that was used for processing the knowledge base.","title":"KnowledgeBaseCostModel"},"KnowledgeBaseCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/KnowledgeBaseCostType","description":"This is the type of cost, always 'knowledge-base' for this class."},"model":{"$ref":"#/components/schemas/KnowledgeBaseCostModel","description":"This is the model that was used for processing the knowledge base."},"promptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used in the knowledge base query."},"completionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens generated in the knowledge base query."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","model","promptTokens","completionTokens","cost"],"description":"Knowledge-base model cost, including model, token usage, and amount.","title":"KnowledgeBaseCost"},"CallCostsItems":{"oneOf":[{"$ref":"#/components/schemas/TransportCost"},{"$ref":"#/components/schemas/TranscriberCost"},{"$ref":"#/components/schemas/ModelCost"},{"$ref":"#/components/schemas/VoiceCost"},{"$ref":"#/components/schemas/VapiCost"},{"$ref":"#/components/schemas/VoicemailDetectionCost"},{"$ref":"#/components/schemas/AnalysisCost"},{"$ref":"#/components/schemas/KnowledgeBaseCost"}],"title":"CallCostsItems"},"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","format":"double","description":"The timestamp when the message was sent."},"endTime":{"type":"number","format":"double","description":"The timestamp when the message ended."},"secondsFromStart":{"type":"number","format":"double","description":"The number of seconds from the start of the conversation."},"source":{"type":"string","description":"The source of the message."},"duration":{"type":"number","format":"double","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"],"description":"An assistant-authored entry in the call message history, including content, timing, source, and duration.","title":"BotMessage"},"ToolCallMessageToolCallsItems":{"type":"object","properties":{},"title":"ToolCallMessageToolCallsItems"},"ToolCallMessage":{"type":"object","properties":{"role":{"type":"string","description":"The role of the tool call in the conversation."},"toolCalls":{"type":"array","items":{"$ref":"#/components/schemas/ToolCallMessageToolCallsItems"},"description":"The list of tool calls made during the conversation."},"message":{"type":"string","description":"The message content for the tool call."},"time":{"type":"number","format":"double","description":"The timestamp when the message was sent."},"secondsFromStart":{"type":"number","format":"double","description":"The number of seconds from the start of the conversation."}},"required":["role","toolCalls","message","time","secondsFromStart"],"description":"An entry in the call message history that records one or more tool calls requested during the conversation.","title":"ToolCallMessage"},"ToolCallResultMessage":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"}],"description":"This is the message that will be spoken to the user.\n\nIf this is not returned, assistant will speak:\n1. a `request-complete` or `request-failed` message from `tool.messages`, if it exists\n2. a response generated by the model, if not","title":"ToolCallResultMessage"},"CallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/BotMessage"},{"$ref":"#/components/schemas/ToolCallMessage"},{"$ref":"#/components/schemas/ToolCallResultMessage"}],"title":"CallMessagesItems"},"CallPhoneCallProvider":{"type":"string","enum":["twilio","vonage","vapi","telnyx"],"description":"This is the provider of the call.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.","title":"CallPhoneCallProvider","deprecated":true},"CallPhoneCallTransport":{"type":"string","enum":["sip","pstn"],"description":"This is the transport of the phone call.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.","title":"CallPhoneCallTransport"},"CallStatus":{"type":"string","enum":["scheduled","queued","ringing","in-progress","forwarding","ended","not-found","deletion-failed"],"description":"This is the status of the call.","title":"CallStatus"},"CallEndedReason":{"type":"string","enum":["call-start-error-neither-assistant-nor-server-set","assistant-request-failed","assistant-request-returned-error","assistant-request-returned-unspeakable-error","assistant-request-returned-invalid-assistant","assistant-request-returned-no-assistant","assistant-request-returned-forwarding-phone-number","scheduled-call-deleted","call.start.error-vapifault-get-org","call.start.error-vapifault-get-subscription","call.start.error-get-assistant","call.start.error-get-phone-number","call.start.error-get-customer","call.start.error-get-resources-validation","call.start.error-vapi-number-international","call.start.error-vapi-number-outbound-daily-limit","call.start.error-get-transport","call.start.error-subscription-wallet-does-not-exist","call.start.error-fraud-check-failed","call.start.error-subscription-frozen","call.start.error-subscription-insufficient-credits","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","pipeline-error-openai-voice-failed","pipeline-error-cartesia-voice-failed","pipeline-error-deepgram-voice-failed","pipeline-error-eleven-labs-voice-failed","pipeline-error-playht-voice-failed","pipeline-error-lmnt-voice-failed","pipeline-error-azure-voice-failed","pipeline-error-rime-ai-voice-failed","pipeline-error-smallest-ai-voice-failed","pipeline-error-vapi-voice-failed","pipeline-error-neuphonic-voice-failed","pipeline-error-hume-voice-failed","pipeline-error-sesame-voice-failed","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","call.in-progress.error-vapifault-deepgram-voice-failed","call.in-progress.error-vapifault-eleven-labs-voice-failed","call.in-progress.error-vapifault-playht-voice-failed","call.in-progress.error-vapifault-lmnt-voice-failed","call.in-progress.error-vapifault-azure-voice-failed","call.in-progress.error-vapifault-rime-ai-voice-failed","call.in-progress.error-vapifault-smallest-ai-voice-failed","call.in-progress.error-vapifault-vapi-voice-failed","call.in-progress.error-vapifault-neuphonic-voice-failed","call.in-progress.error-vapifault-hume-voice-failed","call.in-progress.error-vapifault-sesame-voice-failed","call.in-progress.error-vapifault-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","pipeline-error-vapi-401-unauthorized","pipeline-error-vapi-403-model-access-denied","pipeline-error-vapi-429-exceeded-quota","pipeline-error-vapi-500-server-error","pipeline-error-vapi-503-server-overloaded-error","call.in-progress.error-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","pipeline-error-gladia-transcriber-failed","call.in-progress.error-vapifault-gladia-transcriber-failed","pipeline-error-speechmatics-transcriber-failed","call.in-progress.error-vapifault-speechmatics-transcriber-failed","pipeline-error-assembly-ai-transcriber-failed","pipeline-error-assembly-ai-returning-400-insufficent-funds","pipeline-error-assembly-ai-returning-400-paid-only-feature","pipeline-error-assembly-ai-returning-401-invalid-credentials","pipeline-error-assembly-ai-returning-500-invalid-schema","pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed","call.in-progress.error-vapifault-assembly-ai-transcriber-failed","call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds","call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature","call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials","call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema","call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed","pipeline-error-talkscriber-transcriber-failed","call.in-progress.error-vapifault-talkscriber-transcriber-failed","pipeline-error-azure-speech-transcriber-failed","call.in-progress.error-vapifault-azure-speech-transcriber-failed","pipeline-error-eleven-labs-transcriber-failed","call.in-progress.error-vapifault-eleven-labs-transcriber-failed","pipeline-error-google-transcriber-failed","call.in-progress.error-vapifault-google-transcriber-failed","pipeline-error-openai-transcriber-failed","call.in-progress.error-vapifault-openai-transcriber-failed","pipeline-error-soniox-transcriber-auth-failed","pipeline-error-soniox-transcriber-rate-limited","pipeline-error-soniox-transcriber-invalid-config","pipeline-error-soniox-transcriber-server-error","pipeline-error-soniox-transcriber-failed","call.in-progress.error-vapifault-soniox-transcriber-auth-failed","call.in-progress.error-vapifault-soniox-transcriber-rate-limited","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","vonage-failed-to-connect-call","vonage-completed","phone-call-provider-bypass-enabled-but-no-call-received","call.in-progress.error-providerfault-transport-never-connected","call.in-progress.error-vapifault-worker-not-available","call.in-progress.error-vapifault-transport-never-connected","call.in-progress.error-vapifault-transport-connected-but-call-not-active","call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing","call.in-progress.error-vapifault-worker-died","call.in-progress.twilio-completed-call","call.in-progress.sip-completed-call","call.in-progress.error-sip-inbound-call-failed-to-connect","call.in-progress.error-providerfault-outbound-sip-503-service-unavailable","call.in-progress.error-sip-outbound-call-failed-to-connect","call.ringing.error-sip-inbound-call-failed-to-connect","call.in-progress.error-providerfault-openai-llm-failed","call.in-progress.error-providerfault-azure-openai-llm-failed","call.in-progress.error-providerfault-groq-llm-failed","call.in-progress.error-providerfault-google-llm-failed","call.in-progress.error-providerfault-xai-llm-failed","call.in-progress.error-providerfault-mistral-llm-failed","call.in-progress.error-providerfault-minimax-llm-failed","call.in-progress.error-providerfault-inflection-ai-llm-failed","call.in-progress.error-providerfault-cerebras-llm-failed","call.in-progress.error-providerfault-deep-seek-llm-failed","call.in-progress.error-providerfault-baseten-llm-failed","call.in-progress.error-vapifault-chat-pipeline-failed-to-start","pipeline-error-openai-400-bad-request-validation-failed","pipeline-error-openai-401-unauthorized","pipeline-error-openai-401-incorrect-api-key","pipeline-error-openai-401-account-not-in-organization","pipeline-error-openai-403-model-access-denied","pipeline-error-openai-429-exceeded-quota","pipeline-error-openai-429-rate-limit-reached","pipeline-error-openai-500-server-error","pipeline-error-openai-503-server-overloaded-error","pipeline-error-openai-llm-failed","call.in-progress.error-vapifault-openai-400-bad-request-validation-failed","call.in-progress.error-vapifault-openai-401-unauthorized","call.in-progress.error-vapifault-openai-401-incorrect-api-key","call.in-progress.error-vapifault-openai-401-account-not-in-organization","call.in-progress.error-vapifault-openai-403-model-access-denied","call.in-progress.error-vapifault-openai-429-exceeded-quota","call.in-progress.error-vapifault-openai-429-rate-limit-reached","call.in-progress.error-providerfault-openai-500-server-error","call.in-progress.error-providerfault-openai-503-server-overloaded-error","pipeline-error-azure-openai-400-bad-request-validation-failed","pipeline-error-azure-openai-401-unauthorized","pipeline-error-azure-openai-403-model-access-denied","pipeline-error-azure-openai-429-exceeded-quota","pipeline-error-azure-openai-500-server-error","pipeline-error-azure-openai-503-server-overloaded-error","pipeline-error-azure-openai-llm-failed","call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed","call.in-progress.error-vapifault-azure-openai-401-unauthorized","call.in-progress.error-vapifault-azure-openai-403-model-access-denied","call.in-progress.error-vapifault-azure-openai-429-exceeded-quota","call.in-progress.error-providerfault-azure-openai-500-server-error","call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error","pipeline-error-google-400-bad-request-validation-failed","pipeline-error-google-401-unauthorized","pipeline-error-google-403-model-access-denied","pipeline-error-google-429-exceeded-quota","pipeline-error-google-500-server-error","pipeline-error-google-503-server-overloaded-error","pipeline-error-google-llm-failed","call.in-progress.error-vapifault-google-400-bad-request-validation-failed","call.in-progress.error-vapifault-google-401-unauthorized","call.in-progress.error-vapifault-google-403-model-access-denied","call.in-progress.error-vapifault-google-429-exceeded-quota","call.in-progress.error-providerfault-google-500-server-error","call.in-progress.error-providerfault-google-503-server-overloaded-error","pipeline-error-xai-400-bad-request-validation-failed","pipeline-error-xai-401-unauthorized","pipeline-error-xai-403-model-access-denied","pipeline-error-xai-429-exceeded-quota","pipeline-error-xai-500-server-error","pipeline-error-xai-503-server-overloaded-error","pipeline-error-xai-llm-failed","call.in-progress.error-vapifault-xai-400-bad-request-validation-failed","call.in-progress.error-vapifault-xai-401-unauthorized","call.in-progress.error-vapifault-xai-403-model-access-denied","call.in-progress.error-vapifault-xai-429-exceeded-quota","call.in-progress.error-providerfault-xai-500-server-error","call.in-progress.error-providerfault-xai-503-server-overloaded-error","pipeline-error-baseten-400-bad-request-validation-failed","pipeline-error-baseten-401-unauthorized","pipeline-error-baseten-403-model-access-denied","pipeline-error-baseten-429-exceeded-quota","pipeline-error-baseten-500-server-error","pipeline-error-baseten-503-server-overloaded-error","pipeline-error-baseten-llm-failed","call.in-progress.error-vapifault-baseten-400-bad-request-validation-failed","call.in-progress.error-vapifault-baseten-401-unauthorized","call.in-progress.error-vapifault-baseten-403-model-access-denied","call.in-progress.error-vapifault-baseten-429-exceeded-quota","call.in-progress.error-providerfault-baseten-500-server-error","call.in-progress.error-providerfault-baseten-503-server-overloaded-error","pipeline-error-mistral-400-bad-request-validation-failed","pipeline-error-mistral-401-unauthorized","pipeline-error-mistral-403-model-access-denied","pipeline-error-mistral-429-exceeded-quota","pipeline-error-mistral-500-server-error","pipeline-error-mistral-503-server-overloaded-error","pipeline-error-mistral-llm-failed","call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed","call.in-progress.error-vapifault-mistral-401-unauthorized","call.in-progress.error-vapifault-mistral-403-model-access-denied","call.in-progress.error-vapifault-mistral-429-exceeded-quota","call.in-progress.error-providerfault-mistral-500-server-error","call.in-progress.error-providerfault-mistral-503-server-overloaded-error","pipeline-error-minimax-400-bad-request-validation-failed","pipeline-error-minimax-401-unauthorized","pipeline-error-minimax-403-model-access-denied","pipeline-error-minimax-429-exceeded-quota","pipeline-error-minimax-500-server-error","pipeline-error-minimax-503-server-overloaded-error","pipeline-error-minimax-llm-failed","call.in-progress.error-vapifault-minimax-400-bad-request-validation-failed","call.in-progress.error-vapifault-minimax-401-unauthorized","call.in-progress.error-vapifault-minimax-403-model-access-denied","call.in-progress.error-vapifault-minimax-429-exceeded-quota","call.in-progress.error-providerfault-minimax-500-server-error","call.in-progress.error-providerfault-minimax-503-server-overloaded-error","pipeline-error-inflection-ai-400-bad-request-validation-failed","pipeline-error-inflection-ai-401-unauthorized","pipeline-error-inflection-ai-403-model-access-denied","pipeline-error-inflection-ai-429-exceeded-quota","pipeline-error-inflection-ai-500-server-error","pipeline-error-inflection-ai-503-server-overloaded-error","pipeline-error-inflection-ai-llm-failed","call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed","call.in-progress.error-vapifault-inflection-ai-401-unauthorized","call.in-progress.error-vapifault-inflection-ai-403-model-access-denied","call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota","call.in-progress.error-providerfault-inflection-ai-500-server-error","call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error","pipeline-error-deep-seek-400-bad-request-validation-failed","pipeline-error-deep-seek-401-unauthorized","pipeline-error-deep-seek-403-model-access-denied","pipeline-error-deep-seek-429-exceeded-quota","pipeline-error-deep-seek-500-server-error","pipeline-error-deep-seek-503-server-overloaded-error","pipeline-error-deep-seek-llm-failed","call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed","call.in-progress.error-vapifault-deep-seek-401-unauthorized","call.in-progress.error-vapifault-deep-seek-403-model-access-denied","call.in-progress.error-vapifault-deep-seek-429-exceeded-quota","call.in-progress.error-providerfault-deep-seek-500-server-error","call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error","pipeline-error-groq-400-bad-request-validation-failed","pipeline-error-groq-401-unauthorized","pipeline-error-groq-403-model-access-denied","pipeline-error-groq-429-exceeded-quota","pipeline-error-groq-500-server-error","pipeline-error-groq-503-server-overloaded-error","pipeline-error-groq-llm-failed","call.in-progress.error-vapifault-groq-400-bad-request-validation-failed","call.in-progress.error-vapifault-groq-401-unauthorized","call.in-progress.error-vapifault-groq-403-model-access-denied","call.in-progress.error-vapifault-groq-429-exceeded-quota","call.in-progress.error-providerfault-groq-500-server-error","call.in-progress.error-providerfault-groq-503-server-overloaded-error","pipeline-error-cerebras-400-bad-request-validation-failed","pipeline-error-cerebras-401-unauthorized","pipeline-error-cerebras-403-model-access-denied","pipeline-error-cerebras-429-exceeded-quota","pipeline-error-cerebras-500-server-error","pipeline-error-cerebras-503-server-overloaded-error","pipeline-error-cerebras-llm-failed","call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed","call.in-progress.error-vapifault-cerebras-401-unauthorized","call.in-progress.error-vapifault-cerebras-403-model-access-denied","call.in-progress.error-vapifault-cerebras-429-exceeded-quota","call.in-progress.error-providerfault-cerebras-500-server-error","call.in-progress.error-providerfault-cerebras-503-server-overloaded-error","pipeline-error-anthropic-400-bad-request-validation-failed","pipeline-error-anthropic-401-unauthorized","pipeline-error-anthropic-403-model-access-denied","pipeline-error-anthropic-429-exceeded-quota","pipeline-error-anthropic-500-server-error","pipeline-error-anthropic-503-server-overloaded-error","pipeline-error-anthropic-llm-failed","call.in-progress.error-providerfault-anthropic-llm-failed","call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed","call.in-progress.error-vapifault-anthropic-401-unauthorized","call.in-progress.error-vapifault-anthropic-403-model-access-denied","call.in-progress.error-vapifault-anthropic-429-exceeded-quota","call.in-progress.error-providerfault-anthropic-500-server-error","call.in-progress.error-providerfault-anthropic-503-server-overloaded-error","pipeline-error-anthropic-bedrock-400-bad-request-validation-failed","pipeline-error-anthropic-bedrock-401-unauthorized","pipeline-error-anthropic-bedrock-403-model-access-denied","pipeline-error-anthropic-bedrock-429-exceeded-quota","pipeline-error-anthropic-bedrock-500-server-error","pipeline-error-anthropic-bedrock-503-server-overloaded-error","pipeline-error-anthropic-bedrock-llm-failed","call.in-progress.error-providerfault-anthropic-bedrock-llm-failed","call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed","call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized","call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied","call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota","call.in-progress.error-providerfault-anthropic-bedrock-500-server-error","call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error","pipeline-error-anthropic-vertex-400-bad-request-validation-failed","pipeline-error-anthropic-vertex-401-unauthorized","pipeline-error-anthropic-vertex-403-model-access-denied","pipeline-error-anthropic-vertex-429-exceeded-quota","pipeline-error-anthropic-vertex-500-server-error","pipeline-error-anthropic-vertex-503-server-overloaded-error","pipeline-error-anthropic-vertex-llm-failed","call.in-progress.error-providerfault-anthropic-vertex-llm-failed","call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed","call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized","call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied","call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota","call.in-progress.error-providerfault-anthropic-vertex-500-server-error","call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error","pipeline-error-together-ai-400-bad-request-validation-failed","pipeline-error-together-ai-401-unauthorized","pipeline-error-together-ai-403-model-access-denied","pipeline-error-together-ai-429-exceeded-quota","pipeline-error-together-ai-500-server-error","pipeline-error-together-ai-503-server-overloaded-error","pipeline-error-together-ai-llm-failed","call.in-progress.error-providerfault-together-ai-llm-failed","call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed","call.in-progress.error-vapifault-together-ai-401-unauthorized","call.in-progress.error-vapifault-together-ai-403-model-access-denied","call.in-progress.error-vapifault-together-ai-429-exceeded-quota","call.in-progress.error-providerfault-together-ai-500-server-error","call.in-progress.error-providerfault-together-ai-503-server-overloaded-error","pipeline-error-anyscale-400-bad-request-validation-failed","pipeline-error-anyscale-401-unauthorized","pipeline-error-anyscale-403-model-access-denied","pipeline-error-anyscale-429-exceeded-quota","pipeline-error-anyscale-500-server-error","pipeline-error-anyscale-503-server-overloaded-error","pipeline-error-anyscale-llm-failed","call.in-progress.error-providerfault-anyscale-llm-failed","call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed","call.in-progress.error-vapifault-anyscale-401-unauthorized","call.in-progress.error-vapifault-anyscale-403-model-access-denied","call.in-progress.error-vapifault-anyscale-429-exceeded-quota","call.in-progress.error-providerfault-anyscale-500-server-error","call.in-progress.error-providerfault-anyscale-503-server-overloaded-error","pipeline-error-openrouter-400-bad-request-validation-failed","pipeline-error-openrouter-401-unauthorized","pipeline-error-openrouter-403-model-access-denied","pipeline-error-openrouter-429-exceeded-quota","pipeline-error-openrouter-500-server-error","pipeline-error-openrouter-503-server-overloaded-error","pipeline-error-openrouter-llm-failed","call.in-progress.error-providerfault-openrouter-llm-failed","call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed","call.in-progress.error-vapifault-openrouter-401-unauthorized","call.in-progress.error-vapifault-openrouter-403-model-access-denied","call.in-progress.error-vapifault-openrouter-429-exceeded-quota","call.in-progress.error-providerfault-openrouter-500-server-error","call.in-progress.error-providerfault-openrouter-503-server-overloaded-error","pipeline-error-perplexity-ai-400-bad-request-validation-failed","pipeline-error-perplexity-ai-401-unauthorized","pipeline-error-perplexity-ai-403-model-access-denied","pipeline-error-perplexity-ai-429-exceeded-quota","pipeline-error-perplexity-ai-500-server-error","pipeline-error-perplexity-ai-503-server-overloaded-error","pipeline-error-perplexity-ai-llm-failed","call.in-progress.error-providerfault-perplexity-ai-llm-failed","call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed","call.in-progress.error-vapifault-perplexity-ai-401-unauthorized","call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied","call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota","call.in-progress.error-providerfault-perplexity-ai-500-server-error","call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error","pipeline-error-deepinfra-400-bad-request-validation-failed","pipeline-error-deepinfra-401-unauthorized","pipeline-error-deepinfra-403-model-access-denied","pipeline-error-deepinfra-429-exceeded-quota","pipeline-error-deepinfra-500-server-error","pipeline-error-deepinfra-503-server-overloaded-error","pipeline-error-deepinfra-llm-failed","call.in-progress.error-providerfault-deepinfra-llm-failed","call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed","call.in-progress.error-vapifault-deepinfra-401-unauthorized","call.in-progress.error-vapifault-deepinfra-403-model-access-denied","call.in-progress.error-vapifault-deepinfra-429-exceeded-quota","call.in-progress.error-providerfault-deepinfra-500-server-error","call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error","pipeline-error-runpod-400-bad-request-validation-failed","pipeline-error-runpod-401-unauthorized","pipeline-error-runpod-403-model-access-denied","pipeline-error-runpod-429-exceeded-quota","pipeline-error-runpod-500-server-error","pipeline-error-runpod-503-server-overloaded-error","pipeline-error-runpod-llm-failed","call.in-progress.error-providerfault-runpod-llm-failed","call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed","call.in-progress.error-vapifault-runpod-401-unauthorized","call.in-progress.error-vapifault-runpod-403-model-access-denied","call.in-progress.error-vapifault-runpod-429-exceeded-quota","call.in-progress.error-providerfault-runpod-500-server-error","call.in-progress.error-providerfault-runpod-503-server-overloaded-error","pipeline-error-custom-llm-400-bad-request-validation-failed","pipeline-error-custom-llm-401-unauthorized","pipeline-error-custom-llm-403-model-access-denied","pipeline-error-custom-llm-429-exceeded-quota","pipeline-error-custom-llm-500-server-error","pipeline-error-custom-llm-503-server-overloaded-error","pipeline-error-custom-llm-llm-failed","call.in-progress.error-providerfault-custom-llm-llm-failed","call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed","call.in-progress.error-vapifault-custom-llm-401-unauthorized","call.in-progress.error-vapifault-custom-llm-403-model-access-denied","call.in-progress.error-vapifault-custom-llm-429-exceeded-quota","call.in-progress.error-providerfault-custom-llm-500-server-error","call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error","call.in-progress.error-pipeline-ws-model-connection-failed","pipeline-error-custom-voice-failed","pipeline-error-cartesia-socket-hang-up","pipeline-error-cartesia-requested-payment","pipeline-error-cartesia-500-server-error","pipeline-error-cartesia-502-server-error","pipeline-error-cartesia-503-server-error","pipeline-error-cartesia-522-server-error","call.in-progress.error-vapifault-cartesia-socket-hang-up","call.in-progress.error-vapifault-cartesia-requested-payment","call.in-progress.error-providerfault-cartesia-500-server-error","call.in-progress.error-providerfault-cartesia-503-server-error","call.in-progress.error-providerfault-cartesia-522-server-error","pipeline-error-eleven-labs-voice-not-found","pipeline-error-eleven-labs-quota-exceeded","pipeline-error-eleven-labs-unauthorized-access","pipeline-error-eleven-labs-unauthorized-to-access-model","pipeline-error-eleven-labs-professional-voices-only-for-creator-plus","pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade","pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade","pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade","pipeline-error-eleven-labs-system-busy-and-requested-upgrade","pipeline-error-eleven-labs-voice-not-fine-tuned","pipeline-error-eleven-labs-invalid-api-key","pipeline-error-eleven-labs-invalid-voice-samples","pipeline-error-eleven-labs-voice-disabled-by-owner","pipeline-error-eleven-labs-vapi-voice-disabled-by-owner","pipeline-error-eleven-labs-blocked-account-in-probation","pipeline-error-eleven-labs-blocked-content-against-their-policy","pipeline-error-eleven-labs-missing-samples-for-voice-clone","pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used","pipeline-error-eleven-labs-voice-not-allowed-for-free-users","pipeline-error-eleven-labs-max-character-limit-exceeded","pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification","pipeline-error-eleven-labs-500-server-error","pipeline-error-eleven-labs-503-server-error","call.in-progress.error-vapifault-eleven-labs-voice-not-found","call.in-progress.error-vapifault-eleven-labs-quota-exceeded","call.in-progress.error-vapifault-eleven-labs-unauthorized-access","call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model","call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus","call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade","call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade","call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade","call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade","call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned","call.in-progress.error-vapifault-eleven-labs-invalid-api-key","call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples","call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner","call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation","call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy","call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone","call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used","call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users","call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded","call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification","call.in-progress.error-providerfault-eleven-labs-system-busy-and-requested-upgrade","call.in-progress.error-providerfault-eleven-labs-500-server-error","call.in-progress.error-providerfault-eleven-labs-503-server-error","pipeline-error-playht-request-timed-out","pipeline-error-playht-invalid-voice","pipeline-error-playht-unexpected-error","pipeline-error-playht-out-of-credits","pipeline-error-playht-invalid-emotion","pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri","pipeline-error-playht-401-unauthorized","pipeline-error-playht-403-forbidden-out-of-characters","pipeline-error-playht-403-forbidden-api-access-not-available","pipeline-error-playht-429-exceeded-quota","pipeline-error-playht-502-gateway-error","pipeline-error-playht-504-gateway-error","call.in-progress.error-vapifault-playht-request-timed-out","call.in-progress.error-vapifault-playht-invalid-voice","call.in-progress.error-vapifault-playht-unexpected-error","call.in-progress.error-vapifault-playht-out-of-credits","call.in-progress.error-vapifault-playht-invalid-emotion","call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri","call.in-progress.error-vapifault-playht-401-unauthorized","call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters","call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available","call.in-progress.error-vapifault-playht-429-exceeded-quota","call.in-progress.error-providerfault-playht-502-gateway-error","call.in-progress.error-providerfault-playht-504-gateway-error","pipeline-error-custom-transcriber-failed","call.in-progress.error-vapifault-custom-transcriber-failed","pipeline-error-eleven-labs-transcriber-failed","call.in-progress.error-vapifault-eleven-labs-transcriber-failed","pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination","pipeline-error-deepgram-returning-401-invalid-credentials","pipeline-error-deepgram-returning-403-model-access-denied","pipeline-error-deepgram-returning-404-not-found","pipeline-error-deepgram-returning-500-invalid-json","pipeline-error-deepgram-returning-502-network-error","pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach","pipeline-error-deepgram-returning-econnreset","call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination","call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials","call.in-progress.error-vapifault-deepgram-returning-404-not-found","call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied","call.in-progress.error-providerfault-deepgram-returning-500-invalid-json","call.in-progress.error-providerfault-deepgram-returning-502-network-error","call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach","pipeline-error-google-transcriber-failed","call.in-progress.error-vapifault-google-transcriber-failed","pipeline-error-openai-transcriber-failed","call.in-progress.error-vapifault-openai-transcriber-failed","pipeline-error-soniox-transcriber-auth-failed","pipeline-error-soniox-transcriber-rate-limited","pipeline-error-soniox-transcriber-invalid-config","pipeline-error-soniox-transcriber-server-error","pipeline-error-soniox-transcriber-failed","call.in-progress.error-vapifault-soniox-transcriber-auth-failed","call.in-progress.error-vapifault-soniox-transcriber-rate-limited","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","call.in-progress.error-warm-transfer-microphone-timeout","assistant-ended-call","assistant-said-end-call-phrase","assistant-ended-call-with-hangup-task","assistant-ended-call-after-message-spoken","assistant-forwarded-call","assistant-join-timed-out","call.in-progress.error-assistant-did-not-receive-customer-audio","call.in-progress.error-transfer-failed","customer-busy","customer-ended-call","customer-ended-call-before-warm-transfer","customer-ended-call-after-warm-transfer-attempt","customer-ended-call-during-transfer","customer-did-not-answer","customer-did-not-give-microphone-permission","exceeded-max-duration","manually-canceled","phone-call-provider-closed-websocket","call.forwarding.operator-busy","call.forwarding.no-answer","silence-timed-out","call.in-progress.error-sip-inbound-call-failed-to-connect","call.in-progress.error-providerfault-outbound-sip-403-forbidden","call.in-progress.error-providerfault-outbound-sip-407-proxy-authentication-required","call.in-progress.error-providerfault-outbound-sip-408-request-timeout","call.in-progress.error-providerfault-outbound-sip-503-service-unavailable","call.in-progress.error-providerfault-outbound-sip-480-temporarily-unavailable","call.in-progress.error-sip-outbound-call-failed-to-connect","call.ringing.hook-executed-say","call.ringing.hook-executed-transfer","call.ending.hook-executed-say","call.ending.hook-executed-transfer","call.ringing.sip-inbound-caller-hungup-before-call-connect","call.ringing.error-sip-inbound-call-failed-to-connect","twilio-failed-to-connect-call","twilio-reported-customer-misdialed","vonage-rejected","voicemail","call-deleted"],"description":"This is the explanation for how the call ended.","title":"CallEndedReason"},"CallDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"description":"This is the destination where the call ended up being transferred to. If the call was not transferred, this will be empty.","title":"CallDestination"},"VapiWebsocketTransportConversationType":{"type":"string","enum":["voice"],"default":"voice","description":"This is the conversation type of the call (ie, voice or chat).","title":"VapiWebsocketTransportConversationType"},"VapiWebsocketTransportProvider":{"type":"string","enum":["vapi.websocket"],"description":"Vapi websocket transport provider","title":"VapiWebsocketTransportProvider"},"AudioFormatFormat":{"type":"string","enum":["pcm_s16le","mulaw"],"description":"This is the audio format of the call.\n\n@default 'pcm_s16le'","title":"AudioFormatFormat"},"AudioFormatContainer":{"type":"string","enum":["raw"],"description":"This is the container format of the call.\n\n@default 'raw'","title":"AudioFormatContainer"},"AudioFormat":{"type":"object","properties":{"sampleRate":{"type":"number","format":"double","minimum":0,"maximum":192000,"description":"This is the sample rate of the call.\n\n@default 16000"},"format":{"$ref":"#/components/schemas/AudioFormatFormat","description":"This is the audio format of the call.\n\n@default 'pcm_s16le'"},"container":{"$ref":"#/components/schemas/AudioFormatContainer","description":"This is the container format of the call.\n\n@default 'raw'"}},"required":["sampleRate","format"],"title":"AudioFormat"},"VapiWebsocketTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/VapiWebsocketTransportConversationType","default":"voice","description":"This is the conversation type of the call (ie, voice or chat)."},"provider":{"$ref":"#/components/schemas/VapiWebsocketTransportProvider","description":"Vapi websocket transport provider"},"audioFormat":{"$ref":"#/components/schemas/AudioFormat","description":"This is the audio format of the call. Defaults to 16KHz raw pcm_s16le"}},"required":["provider"],"title":"VapiWebsocketTransport"},"VonageTransportConversationType":{"type":"string","enum":["voice"],"default":"voice","description":"This is the conversation type of the call (ie, voice or chat).","title":"VonageTransportConversationType"},"VonageTransportProvider":{"type":"string","enum":["vonage"],"description":"Vonage transport provider","title":"VonageTransportProvider"},"VonageTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/VonageTransportConversationType","default":"voice","description":"This is the conversation type of the call (ie, voice or chat)."},"provider":{"$ref":"#/components/schemas/VonageTransportProvider","description":"Vonage transport provider"},"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"],"title":"VonageTransport"},"TwilioTransportConversationType":{"type":"string","enum":["voice"],"default":"voice","description":"This is the conversation type of the call (ie, voice or chat).","title":"TwilioTransportConversationType"},"TwilioTransportProvider":{"type":"string","enum":["twilio"],"description":"Twilio transport provider","title":"TwilioTransportProvider"},"TwilioTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/TwilioTransportConversationType","default":"voice","description":"This is the conversation type of the call (ie, voice or chat)."},"provider":{"$ref":"#/components/schemas/TwilioTransportProvider","description":"Twilio transport provider"},"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"],"title":"TwilioTransport"},"VapiSipTransportConversationType":{"type":"string","enum":["voice"],"default":"voice","description":"This is the conversation type of the call (ie, voice or chat).","title":"VapiSipTransportConversationType"},"VapiSipTransportProvider":{"type":"string","enum":["vapi.sip"],"description":"Vapi SIP transport provider","title":"VapiSipTransportProvider"},"VapiSipTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/VapiSipTransportConversationType","default":"voice","description":"This is the conversation type of the call (ie, voice or chat)."},"provider":{"$ref":"#/components/schemas/VapiSipTransportProvider","description":"Vapi SIP transport provider"},"dialTimeout":{"type":"number","format":"double","minimum":1,"maximum":600,"default":60,"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"},"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"],"title":"VapiSipTransport"},"TelnyxTransportConversationType":{"type":"string","enum":["voice"],"default":"voice","description":"This is the conversation type of the call (ie, voice or chat).","title":"TelnyxTransportConversationType"},"TelnyxTransportProvider":{"type":"string","enum":["telnyx"],"description":"Telnyx transport provider","title":"TelnyxTransportProvider"},"TelnyxTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/TelnyxTransportConversationType","default":"voice","description":"This is the conversation type of the call (ie, voice or chat)."},"provider":{"$ref":"#/components/schemas/TelnyxTransportProvider","description":"Telnyx transport provider"},"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"],"title":"TelnyxTransport"},"VapiWebCallTransportConversationType":{"type":"string","enum":["voice"],"default":"voice","description":"This is the conversation type of the call (ie, voice or chat).","title":"VapiWebCallTransportConversationType"},"VapiWebCallTransportProvider":{"type":"string","enum":["daily"],"description":"Vapi web call transport provider","title":"VapiWebCallTransportProvider"},"VapiWebCallTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/VapiWebCallTransportConversationType","default":"voice","description":"This is the conversation type of the call (ie, voice or chat)."},"provider":{"$ref":"#/components/schemas/VapiWebCallTransportProvider","description":"Vapi web call transport provider"},"roomDeleteOnUserLeaveEnabled":{"type":"boolean","default":true,"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`."},"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"],"title":"VapiWebCallTransport"},"CallTransport":{"oneOf":[{"$ref":"#/components/schemas/VapiWebsocketTransport"},{"$ref":"#/components/schemas/VonageTransport"},{"$ref":"#/components/schemas/TwilioTransport"},{"$ref":"#/components/schemas/VapiSipTransport"},{"$ref":"#/components/schemas/TelnyxTransport"},{"$ref":"#/components/schemas/VapiWebCallTransport"}],"description":"This is the transport of the call.","title":"CallTransport"},"AnalysisCostBreakdown":{"type":"object","properties":{"summary":{"type":"number","format":"double","description":"This is the cost to summarize the call."},"summaryPromptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used to summarize the call."},"summaryCompletionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens used to summarize the call."},"summaryCachedPromptTokens":{"type":"number","format":"double","description":"This is the number of cached prompt tokens used to summarize the call."},"structuredData":{"type":"number","format":"double","description":"This is the cost to extract structured data from the call."},"structuredDataPromptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used to extract structured data from the call."},"structuredDataCompletionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens used to extract structured data from the call."},"structuredDataCachedPromptTokens":{"type":"number","format":"double","description":"This is the number of cached prompt tokens used to extract structured data from the call."},"successEvaluation":{"type":"number","format":"double","description":"This is the cost to evaluate if the call was successful."},"successEvaluationPromptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used to evaluate if the call was successful."},"successEvaluationCompletionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens used to evaluate if the call was successful."},"successEvaluationCachedPromptTokens":{"type":"number","format":"double","description":"This is the number of cached prompt tokens used to evaluate if the call was successful."},"structuredOutput":{"type":"number","format":"double","description":"This is the cost to evaluate structuredOutputs from the call."},"structuredOutputPromptTokens":{"type":"number","format":"double","description":"This is the number of prompt tokens used to evaluate structuredOutputs from the call."},"structuredOutputCompletionTokens":{"type":"number","format":"double","description":"This is the number of completion tokens used to evaluate structuredOutputs from the call."},"structuredOutputCachedPromptTokens":{"type":"number","format":"double","description":"This is the number of cached prompt tokens used to evaluate structuredOutputs from the call."}},"description":"Analysis costs and token usage grouped by summary, structured data, success evaluation, and structured-output generation.","title":"AnalysisCostBreakdown"},"CostBreakdown":{"type":"object","properties":{"transport":{"type":"number","format":"double","description":"This is the cost of the transport provider, like Twilio or Vonage."},"stt":{"type":"number","format":"double","description":"This is the cost of the speech-to-text service."},"llm":{"type":"number","format":"double","description":"This is the cost of the language model."},"tts":{"type":"number","format":"double","description":"This is the cost of the text-to-speech service."},"vapi":{"type":"number","format":"double","description":"This is the cost of Vapi."},"chat":{"type":"number","format":"double","description":"This is the cost of chat interactions."},"total":{"type":"number","format":"double","description":"This is the total cost of the call."},"llmPromptTokens":{"type":"number","format":"double","description":"This is the LLM prompt tokens used for the call."},"llmCompletionTokens":{"type":"number","format":"double","description":"This is the LLM completion tokens used for the call."},"llmCachedPromptTokens":{"type":"number","format":"double","description":"This is the LLM cached prompt tokens used for the call."},"ttsCharacters":{"type":"number","format":"double","description":"This is the TTS characters used for the call."},"analysisCostBreakdown":{"$ref":"#/components/schemas/AnalysisCostBreakdown","description":"This is the cost of the analysis."}},"description":"Aggregated call costs and usage, including transport, transcription, model, voice, Vapi, analysis, token, and character totals.","title":"CostBreakdown"},"AnalysisStructuredData":{"type":"object","properties":{},"description":"This is the structured data extracted from the call. Customize by setting `assistant.analysisPlan.structuredDataPrompt` and/or `assistant.analysisPlan.structuredDataSchema`.","title":"AnalysisStructuredData"},"AnalysisStructuredDataMultiItems":{"type":"object","properties":{},"title":"AnalysisStructuredDataMultiItems"},"Analysis":{"type":"object","properties":{"summary":{"type":"string","description":"This is the summary of the call. Customize by setting `assistant.analysisPlan.summaryPrompt`."},"structuredData":{"$ref":"#/components/schemas/AnalysisStructuredData","description":"This is the structured data extracted from the call. Customize by setting `assistant.analysisPlan.structuredDataPrompt` and/or `assistant.analysisPlan.structuredDataSchema`."},"structuredDataMulti":{"type":"array","items":{"$ref":"#/components/schemas/AnalysisStructuredDataMultiItems"},"description":"This is the structured data catalog of the call. Customize by setting `assistant.analysisPlan.structuredDataMultiPlan`."},"successEvaluation":{"type":"string","description":"This is the evaluation of the call. Customize by setting `assistant.analysisPlan.successEvaluationPrompt` and/or `assistant.analysisPlan.successEvaluationRubric`."}},"description":"Post-call analysis results, including summary, structured data, and success evaluation outputs.","title":"Analysis"},"MonitorResult":{"type":"object","properties":{"monitorId":{"type":"string","description":"Unique identifier of the monitor that produced this result."},"filterPassed":{"type":"boolean","description":"Whether the monitor's filter matched the call."}},"required":["monitorId","filterPassed"],"description":"Result of evaluating an attached monitor's filter for a call.","title":"MonitorResult"},"Monitor":{"type":"object","properties":{"monitors":{"type":"array","items":{"$ref":"#/components/schemas/MonitorResult"},"description":"Results produced by monitors attached to the call."},"listenUrl":{"type":"string","description":"This is the URL where the assistant's calls can be listened to in real-time. To enable, set `assistant.monitorPlan.listenEnabled` to `true`."},"controlUrl":{"type":"string","description":"This is the URL where the assistant's calls can be controlled in real-time. To enable, set `assistant.monitorPlan.controlEnabled` to `true`."}},"description":"Live monitoring data for a call, including attached monitor results and listening and control URLs.","title":"Monitor"},"ArtifactMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/BotMessage"},{"$ref":"#/components/schemas/ToolCallMessage"},{"$ref":"#/components/schemas/ToolCallResultMessage"}],"title":"ArtifactMessagesItems"},"SkippedStructuredOutputUnmetCondition":{"oneOf":[{"$ref":"#/components/schemas/MinMessagesCondition"},{"$ref":"#/components/schemas/MinCallDurationCondition"},{"$ref":"#/components/schemas/EndedReasonCondition"}],"description":"This is the first condition that was not met. Conditions use AND semantics, so\nevaluation stops as soon as one condition does not pass.","title":"SkippedStructuredOutputUnmetCondition"},"SkippedStructuredOutput":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the structured output that was skipped."},"unmetCondition":{"$ref":"#/components/schemas/SkippedStructuredOutputUnmetCondition","description":"This is the first condition that was not met. Conditions use AND semantics, so\nevaluation stops as soon as one condition does not pass."}},"required":["name","unmetCondition"],"title":"SkippedStructuredOutput"},"TransferArtifactDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"description":"The transfer destination (phone number or SIP URI).","title":"TransferArtifactDestination"},"TransferArtifactMode":{"type":"string","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"],"description":"The transfer mode (e.g. warm-transfer-experimental, blind-transfer).","title":"TransferArtifactMode"},"TransferArtifactStatus":{"type":"string","enum":["connected","no-answer","busy","voicemail","failed","completed","cancelled"],"description":"The terminal status of the transfer, rendered as the status line.","title":"TransferArtifactStatus"},"TransferArtifactMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/BotMessage"},{"$ref":"#/components/schemas/ToolCallMessage"},{"$ref":"#/components/schemas/ToolCallResultMessage"}],"title":"TransferArtifactMessagesItems"},"TransferArtifact":{"type":"object","properties":{"destination":{"$ref":"#/components/schemas/TransferArtifactDestination","description":"The transfer destination (phone number or SIP URI)."},"mode":{"$ref":"#/components/schemas/TransferArtifactMode","description":"The transfer mode (e.g. warm-transfer-experimental, blind-transfer)."},"transcript":{"type":"string","description":"Flat-text transcript / announcement preview of the transfer."},"status":{"$ref":"#/components/schemas/TransferArtifactStatus","description":"The terminal status of the transfer, rendered as the status line."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/TransferArtifactMessagesItems"},"description":"The agent↔operator conversation captured during a\nwarm-transfer-experimental, rendered as bubbles."}},"required":["destination"],"title":"TransferArtifact"},"Mono":{"type":"object","properties":{"combinedUrl":{"type":"string","description":"This is the combined recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`."},"assistantUrl":{"type":"string","description":"This is the mono recording url for the assistant. To enable, set `assistant.artifactPlan.recordingEnabled`."},"customerUrl":{"type":"string","description":"This is the mono recording url for the customer. To enable, set `assistant.artifactPlan.recordingEnabled`."}},"description":"Mono recording URLs for the combined call and isolated assistant and customer audio.","title":"Mono"},"Recording":{"type":"object","properties":{"stereoUrl":{"type":"string","description":"This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`."},"videoUrl":{"type":"string","description":"This is the video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`."},"videoRecordingStartDelaySeconds":{"type":"number","format":"double","description":"This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. This can be used to align the playback of the recording with artifact.messages timestamps."},"mono":{"$ref":"#/components/schemas/Mono","description":"This is the mono recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`."}},"description":"Call recording locations, including stereo, video, and separated mono recording URLs.","title":"Recording"},"NodeArtifactMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/BotMessage"},{"$ref":"#/components/schemas/ToolCallMessage"},{"$ref":"#/components/schemas/ToolCallResultMessage"}],"title":"NodeArtifactMessagesItems"},"NodeArtifactVariableValues":{"type":"object","properties":{},"description":"These are the variable values that were extracted from the node.","title":"NodeArtifactVariableValues"},"NodeArtifact":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/NodeArtifactMessagesItems"},"description":"These are the messages that were spoken during the node."},"nodeName":{"type":"string","description":"This is the node name."},"variableValues":{"$ref":"#/components/schemas/NodeArtifactVariableValues","description":"These are the variable values that were extracted from the node."}},"description":"Messages and variable values captured while a workflow node was active.","title":"NodeArtifact"},"AssistantActivation":{"type":"object","properties":{"assistantVersion":{"type":["string","null"],"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."},"assistantId":{"type":"string","description":"This is the ID of the assistant that was active during the call."}},"required":["assistantName"],"description":"Identifies an assistant that became active during a call.","title":"AssistantActivation"},"ArtifactVariableValues":{"type":"object","properties":{},"description":"These are the variable values at the end of the workflow execution.","title":"ArtifactVariableValues"},"TurnLatency":{"type":"object","properties":{"modelLatency":{"type":"number","format":"double","description":"This is the model latency for the first token."},"voiceLatency":{"type":"number","format":"double","description":"This is the voice latency from the model output."},"transcriberLatency":{"type":"number","format":"double","description":"This is the transcriber latency from the user speech."},"endpointingLatency":{"type":"number","format":"double","description":"This is the endpointing latency."},"turnLatency":{"type":"number","format":"double","description":"This is the latency for the whole turn."}},"description":"Model, voice, transcription, endpointing, and total latency measurements for a conversation turn.","title":"TurnLatency"},"PerformanceMetrics":{"type":"object","properties":{"turnLatencies":{"type":"array","items":{"$ref":"#/components/schemas/TurnLatency"},"description":"These are the individual latencies for each turn."},"modelLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for the model to output the first token."},"voiceLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for the text to speech."},"transcriberLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for the transcriber."},"endpointingLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for the endpointing."},"turnLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for complete turns."},"fromTransportLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for packets received from the transport provider in milliseconds."},"toTransportLatencyAverage":{"type":"number","format":"double","description":"This is the average latency for packets sent to the transport provider in milliseconds."},"numUserInterrupted":{"type":"number","format":"double","description":"This is the number of times the user was interrupted by the assistant during the call."},"numAssistantInterrupted":{"type":"number","format":"double","description":"This is the number of times the assistant was interrupted by the user during the call."}},"description":"Call performance measurements, including per-turn and average provider, endpointing, transport, and interruption metrics.","title":"PerformanceMetrics"},"ArtifactStructuredOutputs":{"type":"object","properties":{},"description":"These are the structured outputs that will be extracted from the call.\nTo enable, set `assistant.artifactPlan.structuredOutputIds` with the IDs of the structured outputs you want to extract.","title":"ArtifactStructuredOutputs"},"ArtifactScorecards":{"type":"object","properties":{},"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.","title":"ArtifactScorecards"},"Artifact":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/ArtifactMessagesItems"},"description":"These are the messages that were spoken during the call."},"messagesOpenAIFormatted":{"type":"array","items":{"$ref":"#/components/schemas/OpenAIMessage"},"description":"These are the messages that were spoken during the call, formatted for OpenAI."},"skippedStructuredOutputs":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SkippedStructuredOutput"},"description":"Structured outputs skipped because their conditions were not met, keyed by saved or runtime output ID."},"transfers":{"type":"array","items":{"$ref":"#/components/schemas/TransferArtifact"},"description":"These are the transfer records for the call's transfer attempts (warm and blind), including\ndestination, mode, and status. Warm transfer records also include transcripts and messages."},"recordingUrl":{"type":"string","description":"This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.","deprecated":true},"stereoRecordingUrl":{"type":"string","description":"This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.","deprecated":true},"videoRecordingUrl":{"type":"string","description":"This is video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`.","deprecated":true},"videoRecordingStartDelaySeconds":{"type":"number","format":"double","description":"This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`. This can be used to align the playback of the recording with artifact.messages timestamps.","deprecated":true},"recording":{"$ref":"#/components/schemas/Recording","description":"This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`."},"transcript":{"type":"string","description":"This is the transcript of the call. This is derived from `artifact.messages` but provided for convenience."},"pcapUrl":{"type":"string","description":"This is the packet capture url for the call. This is only available for `phone` type calls where phone number's provider is `vapi` or `byo-phone-number`."},"logUrl":{"type":"string","description":"This is the url for the call logs. This includes all logging output during the call for debugging purposes."},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeArtifact"},"description":"This is the history of workflow nodes that were executed during the call."},"assistantActivations":{"type":"array","items":{"$ref":"#/components/schemas/AssistantActivation"},"description":"Ordered list of assistants that were active during the call, including after transfers and handoffs."},"variableValues":{"$ref":"#/components/schemas/ArtifactVariableValues","description":"These are the variable values at the end of the workflow execution."},"performanceMetrics":{"$ref":"#/components/schemas/PerformanceMetrics","description":"This is the performance metrics for the call. It contains the turn latency, broken down by component."},"structuredOutputs":{"$ref":"#/components/schemas/ArtifactStructuredOutputs","description":"These are the structured outputs that will be extracted from the call.\nTo enable, set `assistant.artifactPlan.structuredOutputIds` with the IDs of the structured outputs you want to extract."},"scorecards":{"$ref":"#/components/schemas/ArtifactScorecards","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."},"structuredOutputsLastUpdatedAt":{"type":"string","format":"date-time","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."}},"description":"Artifacts generated during a call, including messages, recordings, transcript, logs, packet capture, workflow-node data, variables, performance metrics, structured outputs, scorecards, and transfers.","title":"Artifact"},"RecordingConsentType":{"type":"string","enum":["stay-on-line","verbal"],"description":"This is the type of recording consent.","title":"RecordingConsentType"},"RecordingConsent":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/RecordingConsentType","description":"This is the type of recording consent."},"grantedAt":{"type":"string","format":"date-time","description":"This is the date and time the recording consent was granted.\nIf not specified, it means the recording consent was not granted."}},"required":["type"],"description":"Result of the recording-consent flow, including consent type and the time consent was granted.","title":"RecordingConsent"},"Compliance":{"type":"object","properties":{"recordingConsent":{"$ref":"#/components/schemas/RecordingConsent","description":"This is the recording consent of the call. Configure in `assistant.compliancePlan.recordingConsentPlan`."}},"description":"Compliance information captured for a call, including recording consent.","title":"Compliance"},"CreateWorkflowDtoNodesItems":{"oneOf":[{"$ref":"#/components/schemas/ConversationNode"},{"$ref":"#/components/schemas/ToolNode"}],"title":"CreateWorkflowDtoNodesItems"},"CreateWorkflowDtoModel":{"oneOf":[{"$ref":"#/components/schemas/WorkflowOpenAIModel"},{"$ref":"#/components/schemas/WorkflowAnthropicModel"},{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModel"},{"$ref":"#/components/schemas/WorkflowGoogleModel"},{"$ref":"#/components/schemas/WorkflowCustomModel"}],"description":"This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.","title":"CreateWorkflowDtoModel"},"CreateWorkflowDtoTranscriber":{"oneOf":[{"$ref":"#/components/schemas/AssemblyAITranscriber"},{"$ref":"#/components/schemas/AzureSpeechTranscriber"},{"$ref":"#/components/schemas/CustomTranscriber"},{"$ref":"#/components/schemas/DeepgramTranscriber"},{"$ref":"#/components/schemas/ElevenLabsTranscriber"},{"$ref":"#/components/schemas/GladiaTranscriber"},{"$ref":"#/components/schemas/GoogleTranscriber"},{"$ref":"#/components/schemas/SpeechmaticsTranscriber"},{"$ref":"#/components/schemas/TalkscriberTranscriber"},{"$ref":"#/components/schemas/OpenAITranscriber"},{"$ref":"#/components/schemas/CartesiaTranscriber"},{"$ref":"#/components/schemas/SonioxTranscriber"},{"$ref":"#/components/schemas/XaiTranscriber"},{"$ref":"#/components/schemas/VapiTranscriber"}],"description":"This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.","title":"CreateWorkflowDtoTranscriber"},"CreateWorkflowDtoVoice":{"oneOf":[{"$ref":"#/components/schemas/AzureVoice"},{"$ref":"#/components/schemas/CartesiaVoice"},{"$ref":"#/components/schemas/CustomVoice"},{"$ref":"#/components/schemas/DeepgramVoice"},{"$ref":"#/components/schemas/ElevenLabsVoice"},{"$ref":"#/components/schemas/HumeVoice"},{"$ref":"#/components/schemas/LMNTVoice"},{"$ref":"#/components/schemas/NeuphonicVoice"},{"$ref":"#/components/schemas/OpenAIVoice"},{"$ref":"#/components/schemas/PlayHTVoice"},{"$ref":"#/components/schemas/WellSaidVoice"},{"$ref":"#/components/schemas/RimeAIVoice"},{"$ref":"#/components/schemas/SmallestAIVoice"},{"$ref":"#/components/schemas/TavusVoice"},{"$ref":"#/components/schemas/VapiVoice"},{"$ref":"#/components/schemas/SesameVoice"},{"$ref":"#/components/schemas/InworldVoice"},{"$ref":"#/components/schemas/MinimaxVoice"},{"$ref":"#/components/schemas/XaiVoice"},{"$ref":"#/components/schemas/MicrosoftVoice"}],"description":"This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.","title":"CreateWorkflowDtoVoice"},"CreateWorkflowDtoBackgroundSound0":{"type":"string","enum":["off","office"],"title":"CreateWorkflowDtoBackgroundSound0"},"CreateWorkflowDtoBackgroundSound":{"oneOf":[{"$ref":"#/components/schemas/CreateWorkflowDtoBackgroundSound0"},{"type":"string","format":"uri"}],"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.","title":"CreateWorkflowDtoBackgroundSound"},"CreateWorkflowDtoHooksItems":{"oneOf":[{"$ref":"#/components/schemas/CallHookCallEnding"},{"$ref":"#/components/schemas/CallHookAssistantSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechInterrupted"},{"$ref":"#/components/schemas/CallHookCustomerSpeechTimeout"},{"$ref":"#/components/schemas/CallHookModelResponseTimeout"}],"title":"CreateWorkflowDtoHooksItems"},"CreateWorkflowDtoCredentialsItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["11labs"],"description":"Discriminator value: 11labs"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"apiUrl":{"oneOf":[{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMapping11LabsApiUrl"},{"type":"null"}],"description":"ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with ElevenLabs."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"],"description":"Discriminator value: anthropic"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anthropic."},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic-bedrock"],"description":"Discriminator value: anthropic-bedrock"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion","description":"AWS region where Bedrock is configured."},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan","description":"Authentication method - either direct IAM credentials or cross-account role assumption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","authenticationPlan"],"description":"Credentials for authenticating Anthropic model requests through Amazon Bedrock, including AWS region and authentication method."},{"type":"object","properties":{"provider":{"type":"string","enum":["anyscale"],"description":"Discriminator value: anyscale"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Anyscale."},{"type":"object","properties":{"provider":{"type":"string","enum":["assembly-ai"],"description":"Discriminator value: assembly-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with AssemblyAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure-openai"],"description":"Discriminator value: azure-openai"},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion","description":"Azure region that hosts the OpenAI resource."},"models":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels","description":"Azure OpenAI models available through this credential."},"openAIKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"ocpApimSubscriptionKey":{"type":"string","description":"This is not returned in the API."},"openAIEndpoint":{"type":"string","maxLength":10000,"description":"Endpoint URL for the Azure OpenAI resource."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","region","models","openAIKey","openAIEndpoint"],"description":"Credentials for authenticating assistant model requests with Azure OpenAI, including region, endpoint, and available models."},{"type":"object","properties":{"provider":{"type":"string","enum":["azure"],"description":"Discriminator value: azure"},"service":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService","description":"This is the service being used in Azure."},"region":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion","description":"This is the region of the Azure resource."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"fallbackIndex":{"type":"number","format":"double","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/AzureBlobStorageBucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","service"],"description":"Credentials for Azure Speech or Blob Storage, including service, region, and optional storage bucket settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["byo-sip-trunk"],"description":"Discriminator value: byo-sip-trunk"},"gateways":{"type":"array","items":{"$ref":"#/components/schemas/SipTrunkGateway"},"description":"This is the list of SIP trunk's gateways."},"outboundAuthenticationPlan":{"$ref":"#/components/schemas/SipTrunkOutboundAuthenticationPlan","description":"This can be used to configure the outbound authentication if required by the SIP trunk."},"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","maxLength":10000,"description":"This can be used to configure the tech prefix on outbound calls. This is an advanced property."},"sipDiversionHeader":{"type":"string","maxLength":10000,"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gateways"],"description":"Configuration for connecting Vapi to a bring-your-own SIP trunk or carrier, including gateways, outbound authentication, number handling, and optional session border controller routing."},{"type":"object","properties":{"provider":{"type":"string","enum":["cartesia"],"description":"Discriminator value: cartesia"},"apiKey":{"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Cartesia."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCerebrasCredentialDtoProvider","description":"Selects Cerebras as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Cerebras."},{"type":"object","properties":{"provider":{"type":"string","enum":["cloudflare"],"description":"Discriminator value: 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","format":"double","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/CloudflareR2BucketPlan","description":"This is the bucket plan that can be provided to store call artifacts in R2"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Cloudflare R2, including account details, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["custom-llm"],"description":"Discriminator value: custom-llm"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"authenticationPlan":{"$ref":"#/components/schemas/OAuth2AuthenticationPlan","description":"This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating requests to a custom language model with an API key or OAuth 2.0 authentication plan."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepgram"],"description":"Discriminator value: deepgram"},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiUrl":{"type":"string","description":"This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating speech recognition and voice synthesis requests with Deepgram, with an optional API URL for an on-premises instance."},{"type":"object","properties":{"provider":{"type":"string","enum":["deepinfra"],"description":"Discriminator value: deepinfra"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepInfra."},{"type":"object","properties":{"provider":{"type":"string","enum":["deep-seek"],"description":"Discriminator value: deep-seek"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with DeepSeek."},{"type":"object","properties":{"provider":{"type":"string","enum":["gcp"],"description":"Discriminator value: gcp"},"fallbackIndex":{"type":"number","format":"double","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."},"gcpKey":{"$ref":"#/components/schemas/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/<service-account-id>/keys.\n\nThe schema is identical to the JSON that GCP outputs."},"region":{"type":"string","maxLength":40,"description":"This is the region of the GCP resource."},"bucketPlan":{"$ref":"#/components/schemas/BucketPlan","description":"Bucket configuration used to store call artifacts in Google Cloud Storage."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","gcpKey"],"description":"Service-account credentials for Google Cloud resources and optional call-artifact storage, including region, bucket configuration, and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["gladia"],"description":"Discriminator value: gladia"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Gladia."},{"type":"object","properties":{"provider":{"type":"string","enum":["gohighlevel"],"description":"Discriminator value: gohighlevel"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating Vapi integrations with GoHighLevel."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoogleCredentialDtoProvider","description":"Selects Google AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Google AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["groq"],"description":"Discriminator value: groq"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Groq."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInflectionAiCredentialDtoProvider","description":"Selects Inflection AI as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Inflection AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["langfuse"],"description":"Discriminator value: langfuse"},"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"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","publicKey","apiKey","apiUrl"],"description":"Credentials for sending assistant call traces to a Langfuse project, including its public key, secret key, and host URL."},{"type":"object","properties":{"provider":{"type":"string","enum":["lmnt"],"description":"Discriminator value: lmnt"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with LMNT."},{"type":"object","properties":{"provider":{"type":"string","enum":["make"],"description":"Discriminator value: 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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","teamId","region","apiKey"],"description":"Credentials for authenticating Vapi integrations with Make, including team, region, and API key."},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"],"description":"Discriminator value: openai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model, transcription, and voice synthesis requests with OpenAI."},{"type":"object","properties":{"provider":{"type":"string","enum":["openrouter"],"description":"Discriminator value: openrouter"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with OpenRouter."},{"type":"object","properties":{"provider":{"type":"string","enum":["perplexity-ai"],"description":"Discriminator value: perplexity-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Perplexity AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["playht"],"description":"Discriminator value: playht"},"apiKey":{"type":"string","description":"This is not returned in the API."},"userId":{"type":"string","description":"PlayHT user identifier associated with the API key."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","userId"],"description":"Credentials for authenticating voice synthesis requests with PlayHT, including the PlayHT user identifier."},{"type":"object","properties":{"provider":{"type":"string","enum":["rime-ai"],"description":"Discriminator value: rime-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Rime AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["runpod"],"description":"Discriminator value: runpod"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests through Runpod."},{"type":"object","properties":{"provider":{"type":"string","enum":["s3"],"description":"Discriminator value: 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","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","awsAccessKeyId","awsSecretAccessKey","region","s3BucketName","s3PathPrefix"],"description":"Credentials for storing call artifacts in Amazon S3, including access keys, region, bucket, path prefix, and upload fallback order."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateS3CompatibleCredentialDtoProvider","description":"This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."},"bucketPlan":{"$ref":"#/components/schemas/S3CompatibleBucketPlan"},"fallbackIndex":{"type":"number","format":"double","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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","bucketPlan"],"description":"s3-compatible variant"},{"type":"object","properties":{"provider":{"type":"string","enum":["supabase"],"description":"Discriminator value: supabase"},"fallbackIndex":{"type":"number","format":"double","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/SupabaseBucketPlan","description":"Supabase S3-compatible bucket configuration used to store call artifacts."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"Credentials for storing call artifacts in Supabase's S3-compatible storage, including bucket configuration and upload fallback order."},{"type":"object","properties":{"provider":{"type":"string","enum":["smallest-ai"],"description":"Discriminator value: smallest-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Smallest AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["tavus"],"description":"Discriminator value: tavus"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Tavus."},{"type":"object","properties":{"provider":{"type":"string","enum":["together-ai"],"description":"Discriminator value: together-ai"},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Together AI."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"authToken":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"This is not returned in the API."},"apiSecret":{"type":"string","description":"This is not returned in the API."},"accountSid":{"type":"string","description":"Twilio Account SID associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","accountSid"],"description":"Credentials for authenticating telephony requests with Twilio using an account SID and either an auth token or API key credentials."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"apiSecret":{"type":"string","description":"This is not returned in the API."},"apiKey":{"type":"string","description":"Vonage API key associated with the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiSecret","apiKey"],"description":"Credentials for authenticating telephony requests with Vonage."},{"type":"object","properties":{"provider":{"type":"string","enum":["webhook"],"description":"Discriminator value: webhook"},"authenticationPlan":{"$ref":"#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"CreateWebhookCredentialDTO variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateCustomCredentialDtoProvider","description":"Selects a custom credential configuration."},"authenticationPlan":{"$ref":"#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan","description":"This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication."},"encryptionPlan":{"$ref":"#/components/schemas/PublicKeyEncryptionPlan","description":"This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationPlan"],"description":"Reusable custom credentials for authenticating outbound requests, with optional public-key encryption for sensitive request data."},{"type":"object","properties":{"provider":{"type":"string","enum":["xai"],"description":"Discriminator value: xai"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with xAI."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMicrosoftCredentialDtoProvider"},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"region":{"type":"string","maxLength":64,"description":"Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"microsoft variant"},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateNeuphonicCredentialDtoProvider","description":"Selects Neuphonic as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Neuphonic."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateHumeCredentialDtoProvider","description":"Selects Hume as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Hume."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateMistralCredentialDtoProvider","description":"Selects Mistral as the credential provider."},"apiKey":{"type":"string","maxLength":100,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating assistant model requests with Mistral."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSpeechmaticsCredentialDtoProvider","description":"Selects Speechmatics as the credential provider."},"apiKey":{"type":"string","description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Speechmatics."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSonioxCredentialDtoProvider","description":"Selects Soniox as the credential provider."},"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","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating transcription requests with Soniox."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-client"],"description":"Discriminator value: google.calendar.oauth2-client"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider"],"description":"OAuth 2.0 client credential for Google Calendar integrations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.calendar.oauth2-authorization"],"description":"Discriminator value: google.calendar.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Calendar operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["google.sheets.oauth2-authorization"],"description":"Discriminator value: google.sheets.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Google Sheets operations."},{"type":"object","properties":{"provider":{"type":"string","enum":["slack.oauth2-authorization"],"description":"Discriminator value: slack.oauth2-authorization"},"authorizationId":{"type":"string","description":"The authorization ID for the OAuth2 authorization"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authorizationId"],"description":"Stored OAuth 2.0 authorization for Slack operations."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider","description":"Selects GoHighLevel OAuth 2.0 authorization for MCP."},"authenticationSession":{"$ref":"#/components/schemas/Oauth2AuthenticationSession","description":"This is the authentication session for the credential."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","authenticationSession"],"description":"OAuth 2.0 session credentials for authenticating GoHighLevel MCP requests."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateInworldCredentialDtoProvider","description":"Selects Inworld as the credential provider."},"apiKey":{"type":"string","description":"This is the Inworld Basic (Base64) authentication token. This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with Inworld."},{"type":"object","properties":{"provider":{"type":"string","enum":["minimax"],"description":"Discriminator value: minimax"},"apiKey":{"type":"string","description":"This is not returned in the API."},"groupId":{"type":"string","description":"This is the Minimax Group ID."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey","groupId"],"description":"Credentials for authenticating assistant model and voice synthesis requests with MiniMax, including the MiniMax group identifier."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateWellSaidCredentialDtoProvider","description":"Selects WellSaid as the credential provider."},"apiKey":{"type":"string","maxLength":10000,"description":"This is not returned in the API."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","apiKey"],"description":"Credentials for authenticating voice synthesis requests with WellSaid."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateEmailCredentialDtoProvider","description":"Selects email as the alert destination provider."},"email":{"type":"string","description":"The recipient email address for alerts"},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","email"],"description":"Destination configuration for sending Vapi alerts to an email address."},{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/CreateSlackWebhookCredentialDtoProvider","description":"Selects a Slack incoming webhook as the credential provider."},"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."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of credential. This is just for your reference."}},"required":["provider","webhookUrl"],"description":"Credentials for sending Vapi alerts through a Slack incoming webhook."}],"discriminator":{"propertyName":"provider"},"title":"CreateWorkflowDtoCredentialsItems"},"CreateWorkflowDtoVoicemailDetection0":{"type":"string","enum":["off"],"title":"CreateWorkflowDtoVoicemailDetection0"},"CreateWorkflowDtoVoicemailDetection":{"oneOf":[{"$ref":"#/components/schemas/CreateWorkflowDtoVoicemailDetection0"},{"$ref":"#/components/schemas/GoogleVoicemailDetectionPlan"},{"$ref":"#/components/schemas/OpenAIVoicemailDetectionPlan"},{"$ref":"#/components/schemas/TwilioVoicemailDetectionPlan"},{"$ref":"#/components/schemas/VapiVoicemailDetectionPlan"}],"description":"This is the voicemail detection plan for the workflow.","title":"CreateWorkflowDtoVoicemailDetection"},"CreateWorkflowDTO":{"type":"object","properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/CreateWorkflowDtoNodesItems"},"description":"Nodes that make up the workflow graph. Conversation nodes interact with the customer, while tool nodes invoke configured tools."},"model":{"$ref":"#/components/schemas/CreateWorkflowDtoModel","description":"This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`."},"transcriber":{"$ref":"#/components/schemas/CreateWorkflowDtoTranscriber","description":"This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`."},"voice":{"$ref":"#/components/schemas/CreateWorkflowDtoVoice","description":"This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`."},"observabilityPlan":{"$ref":"#/components/schemas/LangfuseObservabilityPlan","description":"This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported."},"backgroundSound":{"$ref":"#/components/schemas/CreateWorkflowDtoBackgroundSound","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/CreateWorkflowDtoHooksItems"},"description":"This is a set of actions that will be performed on certain events."},"credentials":{"type":"array","items":{"$ref":"#/components/schemas/CreateWorkflowDtoCredentialsItems"},"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."},"voicemailDetection":{"$ref":"#/components/schemas/CreateWorkflowDtoVoicemailDetection","description":"This is the voicemail detection plan for the workflow."},"maxDurationSeconds":{"type":"number","format":"double","minimum":10,"maximum":43200,"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."},"name":{"type":"string","maxLength":80,"description":"Name used to identify the workflow."},"edges":{"type":"array","items":{"$ref":"#/components/schemas/Edge"},"description":"Directed connections that determine transitions between nodes."},"globalPrompt":{"type":"string","maxLength":5000,"description":"Prompt applied across the workflow's conversation nodes."},"server":{"$ref":"#/components/schemas/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"},"compliancePlan":{"$ref":"#/components/schemas/CompliancePlan","description":"This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings."},"analysisPlan":{"$ref":"#/components/schemas/AnalysisPlan","description":"This is the plan for analysis of workflow's calls. Stored in `call.analysis`."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`."},"startSpeakingPlan":{"$ref":"#/components/schemas/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."},"stopSpeakingPlan":{"$ref":"#/components/schemas/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."},"monitorPlan":{"$ref":"#/components/schemas/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`."},"backgroundSpeechDenoisingPlan":{"$ref":"#/components/schemas/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"},"credentialIds":{"type":"array","items":{"type":"string"},"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."},"keypadInputPlan":{"$ref":"#/components/schemas/KeypadInputPlan","description":"This is the plan for keypad input handling during workflow calls."},"voicemailMessage":{"type":"string","maxLength":1000,"description":"This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up."}},"required":["nodes","name","edges"],"description":"Configuration for creating a graph-based workflow, including conversation and tool nodes, directed edges, global prompts, shared providers, hooks, credentials, and call behavior.","title":"CreateWorkflowDTO"},"WorkflowOverridesVariableValues":{"type":"object","properties":{},"description":"These are values that will be used to replace the template variables in the workflow messages and other text-based fields.\nThis uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html\n\nSo for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.\n`{{\"now\" | date: \"%b %d, %Y, %I:%M %p\", \"America/New_York\"}}` will be replaced with the current date and time in New York.\n Some VAPI reserved defaults:\n - *customer* - the customer object","title":"WorkflowOverridesVariableValues"},"WorkflowOverrides":{"type":"object","properties":{"variableValues":{"$ref":"#/components/schemas/WorkflowOverridesVariableValues","description":"These are values that will be used to replace the template variables in the workflow messages and other text-based fields.\nThis uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html\n\nSo for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.\n`{{\"now\" | date: \"%b %d, %Y, %I:%M %p\", \"America/New_York\"}}` will be replaced with the current date and time in New York.\n Some VAPI reserved defaults:\n - *customer* - the customer object"}},"description":"Per-call overrides for values used in workflow template variables.","title":"WorkflowOverrides"},"ImportTwilioPhoneNumberDtoFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"ImportTwilioPhoneNumberDtoFallbackDestination"},"PhoneNumberHookCallRingingOn":{"type":"string","enum":["call.ringing"],"description":"This is the event to trigger the hook on","title":"PhoneNumberHookCallRingingOn"},"PhoneNumberCallRingingHookFilterType":{"type":"string","enum":["startsWith"],"description":"This is the type of filter - matches when the specified field starts with any of the given prefixes","title":"PhoneNumberCallRingingHookFilterType"},"PhoneNumberCallRingingHookFilterKey":{"type":"string","enum":["number"],"description":"The field to check. Currently only \"number\" (the caller's phone number) is supported.","title":"PhoneNumberCallRingingHookFilterKey"},"PhoneNumberCallRingingHookFilter":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/PhoneNumberCallRingingHookFilterType","description":"This is the type of filter - matches when the specified field starts with any of the given prefixes"},"key":{"$ref":"#/components/schemas/PhoneNumberCallRingingHookFilterKey","description":"The field to check. Currently only \"number\" (the caller's phone number) is supported."},"startsWith":{"type":"array","items":{"type":"string","maxLength":20},"description":"Array of prefixes to match. Do not include the + prefix. Inbound calls from numbers starting with any of these prefixes will trigger the hook actions."}},"required":["type","key","startsWith"],"description":"Matches an incoming caller's phone number against one or more prefixes before a ringing hook runs.","title":"PhoneNumberCallRingingHookFilter"},"TransferPhoneNumberHookActionType":{"type":"string","enum":["transfer"],"description":"This is the type of action - must be \"transfer\"","title":"TransferPhoneNumberHookActionType"},"TransferPhoneNumberHookActionDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"description":"This is the destination details for the transfer - can be a phone number or SIP URI","title":"TransferPhoneNumberHookActionDestination"},"TransferPhoneNumberHookAction":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/TransferPhoneNumberHookActionType","description":"This is the type of action - must be \"transfer\""},"destination":{"$ref":"#/components/schemas/TransferPhoneNumberHookActionDestination","description":"This is the destination details for the transfer - can be a phone number or SIP URI"}},"required":["type"],"description":"A phone-number hook action that transfers the call to a phone number or SIP destination.","title":"TransferPhoneNumberHookAction"},"SayPhoneNumberHookActionType":{"type":"string","enum":["say"],"description":"This is the type of action - must be \"say\"","title":"SayPhoneNumberHookActionType"},"SayPhoneNumberHookAction":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SayPhoneNumberHookActionType","description":"This is the type of action - must be \"say\""},"exact":{"type":"string","maxLength":4000,"description":"This is the message to say"}},"required":["type","exact"],"description":"A phone-number hook action that speaks an exact message to the caller.","title":"SayPhoneNumberHookAction"},"PhoneNumberHookCallRingingDoItems":{"oneOf":[{"$ref":"#/components/schemas/TransferPhoneNumberHookAction"},{"$ref":"#/components/schemas/SayPhoneNumberHookAction"}],"title":"PhoneNumberHookCallRingingDoItems"},"PhoneNumberHookCallRinging":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/PhoneNumberHookCallRingingOn","description":"This is the event to trigger the hook on"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberCallRingingHookFilter"},"description":"Optional filters to decide when to trigger the hook. Currently supports filtering by caller country code."},"do":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberHookCallRingingDoItems"},"description":"Only the first action will be executed. Additional actions will be ignored."}},"required":["on","do"],"description":"Runs configured transfer or message actions when an incoming call rings and its caller-number prefix filters match.","title":"PhoneNumberHookCallRinging"},"PhoneNumberHookCallEndingOn":{"type":"string","enum":["call.ending"],"description":"This is the event to trigger the hook on","title":"PhoneNumberHookCallEndingOn"},"PhoneNumberCallEndingHookFilterType":{"type":"string","enum":["oneOf"],"description":"This is the type of filter - currently only \"oneOf\" is supported","title":"PhoneNumberCallEndingHookFilterType"},"PhoneNumberCallEndingHookFilterKey":{"type":"string","enum":["call.endedReason"],"description":"This is the key to filter on - only \"call.endedReason\" is allowed for phone number call ending hooks","title":"PhoneNumberCallEndingHookFilterKey"},"PhoneNumberCallEndingHookFilterOneOf":{"type":"string","enum":["assistant-request-failed","assistant-request-returned-error","assistant-request-returned-unspeakable-error","assistant-request-returned-invalid-assistant","assistant-request-returned-no-assistant","assistant-request-returned-forwarding-phone-number"],"description":"This is the array of assistant-request related ended reasons to match against","title":"PhoneNumberCallEndingHookFilterOneOf"},"PhoneNumberCallEndingHookFilter":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/PhoneNumberCallEndingHookFilterType","description":"This is the type of filter - currently only \"oneOf\" is supported"},"key":{"$ref":"#/components/schemas/PhoneNumberCallEndingHookFilterKey","description":"This is the key to filter on - only \"call.endedReason\" is allowed for phone number call ending hooks"},"oneOf":{"$ref":"#/components/schemas/PhoneNumberCallEndingHookFilterOneOf","description":"This is the array of assistant-request related ended reasons to match against"}},"required":["type","key","oneOf"],"description":"Matches the call's ended reason against configured assistant-request failure reasons before an ending hook runs.","title":"PhoneNumberCallEndingHookFilter"},"PhoneNumberHookCallEndingDo":{"oneOf":[{"$ref":"#/components/schemas/TransferPhoneNumberHookAction"},{"$ref":"#/components/schemas/SayPhoneNumberHookAction"}],"description":"This is the action to perform when the hook triggers","title":"PhoneNumberHookCallEndingDo"},"PhoneNumberHookCallEnding":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/PhoneNumberHookCallEndingOn","description":"This is the event to trigger the hook on"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberCallEndingHookFilter"},"description":"Optional filters to decide when to trigger - restricted to assistant-request related ended reasons"},"do":{"$ref":"#/components/schemas/PhoneNumberHookCallEndingDo","description":"This is the action to perform when the hook triggers"}},"required":["on"],"description":"Runs configured transfer or message actions when a call ends with a matching assistant-request failure reason.","title":"PhoneNumberHookCallEnding"},"ImportTwilioPhoneNumberDtoHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"ImportTwilioPhoneNumberDtoHooksItems"},"ImportTwilioPhoneNumberDTO":{"type":"object","properties":{"fallbackDestination":{"$ref":"#/components/schemas/ImportTwilioPhoneNumberDtoFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/ImportTwilioPhoneNumberDtoHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"twilioPhoneNumber":{"type":"string","description":"These are the digits of the phone number you own on your Twilio.","deprecated":true},"twilioAccountSid":{"type":"string","description":"This is your Twilio Account SID that will be used to handle this phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token that will be used to handle this phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key that will be used to handle this phone number. If AuthToken is provided, this will be ignored."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret that will be used to handle this phone number. If AuthToken is provided, this will be ignored."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"}},"required":["twilioPhoneNumber","twilioAccountSid"],"description":"Configuration for importing a Twilio phone number into Vapi, including Twilio credentials, routing target, fallback destination, hooks, SMS, and server settings.","title":"ImportTwilioPhoneNumberDTO"},"CreateCustomerDTO":{"type":"object","properties":{"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"extension":{"type":"string","maxLength":10,"description":"This is the extension that will be dialed after the call is answered."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the overrides for the assistant's settings and template variables specific to this customer.\nThis allows customization of the assistant's behavior for individual customers in batch calls."},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"sipUri":{"type":"string","description":"This is the SIP URI of the customer."},"name":{"type":"string","maxLength":40,"description":"This is the name of the customer. This is just for your own reference.\n\nFor SIP inbound calls, this is extracted from the `From` SIP header with format `\"Display Name\" <sip:username@domain>`."},"email":{"type":"string","maxLength":40,"description":"This is the email of the customer."},"externalId":{"type":"string","maxLength":40,"description":"This is the external ID of the customer."}},"description":"Customer details used for call delivery and assistant personalization, including phone or SIP destination, contact identifiers, extension, and assistant overrides.","title":"CreateCustomerDTO"},"SchedulePlan":{"type":"object","properties":{"earliestAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of the earliest time the call can be scheduled."},"latestAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of the latest time the call can be scheduled."}},"required":["earliestAt"],"description":"Time window that controls the earliest and latest time a call may begin.","title":"SchedulePlan"},"Call":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/CallType","description":"This is the type of call."},"costs":{"type":"array","items":{"$ref":"#/components/schemas/CallCostsItems"},"description":"These are the costs of individual components of the call in USD."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/CallMessagesItems"},"description":"Messages exchanged during the call, including user, assistant, system, tool-call, and tool-result messages."},"phoneCallProvider":{"$ref":"#/components/schemas/CallPhoneCallProvider","description":"This is the provider of the call.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.","deprecated":true},"phoneCallTransport":{"$ref":"#/components/schemas/CallPhoneCallTransport","description":"This is the transport of the phone call.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type."},"status":{"$ref":"#/components/schemas/CallStatus","description":"This is the status of the call."},"endedReason":{"$ref":"#/components/schemas/CallEndedReason","description":"This is the explanation for how the call ended."},"endedMessage":{"type":"string","description":"This is the message that adds more context to the ended reason. It can be used to provide potential error messages or warnings."},"destination":{"$ref":"#/components/schemas/CallDestination","description":"This is the destination where the call ended up being transferred to. If the call was not transferred, this will be empty."},"assistantVersion":{"type":["string","null"],"description":"This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version."},"transport":{"$ref":"#/components/schemas/CallTransport","description":"This is the transport of the call."},"id":{"type":"string","description":"This is the unique identifier for the call."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this call belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the call was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the call was last updated."},"startedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the call was started."},"endedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the call was ended."},"cost":{"type":"number","format":"double","description":"This is the cost of the call in USD."},"costBreakdown":{"$ref":"#/components/schemas/CostBreakdown","description":"This is the cost of the call in USD."},"artifactPlan":{"$ref":"#/components/schemas/ArtifactPlan","description":"This is a copy of assistant artifact plan. This isn't actually stored on the call but rather just returned in POST /call/web to enable artifact creation client side."},"analysis":{"$ref":"#/components/schemas/Analysis","description":"This is the analysis of the call. Configure in `assistant.analysisPlan`."},"monitor":{"$ref":"#/components/schemas/Monitor","description":"This is to real-time monitor the call. Configure in `assistant.monitorPlan`."},"artifact":{"$ref":"#/components/schemas/Artifact","description":"These are the artifacts created from the call. Configure in `assistant.artifactPlan`."},"compliance":{"$ref":"#/components/schemas/Compliance","description":"This is the compliance of the call. Configure in `assistant.compliancePlan`."},"phoneCallProviderId":{"type":"string","description":"The ID of the call as provided by the phone number service. callSid in Twilio. conversationUuid in Vonage. callControlId in Telnyx.\n\nOnly relevant for `outboundPhoneCall` and `inboundPhoneCall` type.","deprecated":true},"campaignId":{"type":"string","description":"This is the campaign ID that the call belongs to."},"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":{"$ref":"#/components/schemas/CreateAssistantDTO","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`"},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the overrides for the `assistant` or `assistantId`'s settings and template variables."},"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":{"$ref":"#/components/schemas/CreateSquadDTO","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`"},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"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":{"$ref":"#/components/schemas/CreateWorkflowDTO","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`"},"workflowOverrides":{"$ref":"#/components/schemas/WorkflowOverrides","description":"These are the overrides for the `workflow` or `workflowId`'s settings and template variables."},"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":{"$ref":"#/components/schemas/ImportTwilioPhoneNumberDTO","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."},"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":{"$ref":"#/components/schemas/CreateCustomerDTO","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."},"name":{"type":"string","maxLength":40,"description":"This is the name of the call. This is just for your own reference."},"schedulePlan":{"$ref":"#/components/schemas/SchedulePlan","description":"This is the schedule plan of the call."}},"required":["id","orgId","createdAt","updatedAt"],"description":"A call record returned by Vapi. It contains the configuration and resources used for the call, its lifecycle status and timestamps, conversation messages, artifacts, analysis, and costs.","title":"Call"},"CreateCallDtoTransport":{"oneOf":[{"$ref":"#/components/schemas/VapiWebsocketTransport"},{"$ref":"#/components/schemas/VonageTransport"},{"$ref":"#/components/schemas/TwilioTransport"},{"$ref":"#/components/schemas/VapiSipTransport"},{"$ref":"#/components/schemas/TelnyxTransport"},{"$ref":"#/components/schemas/VapiWebCallTransport"}],"description":"This is the transport of the call.","title":"CreateCallDtoTransport"},"CreateCallDTO":{"type":"object","properties":{"assistantVersion":{"type":["string","null"],"description":"This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version."},"transport":{"$ref":"#/components/schemas/CreateCallDtoTransport","description":"This is the transport of the call."},"customers":{"type":"array","items":{"$ref":"#/components/schemas/CreateCustomerDTO"},"description":"This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead."},"name":{"type":"string","maxLength":40,"description":"This is the name of the call. This is just for your own reference."},"schedulePlan":{"$ref":"#/components/schemas/SchedulePlan","description":"This is the schedule plan 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`"},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","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`"},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the overrides for the `assistant` or `assistantId`'s settings and template variables."},"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":{"$ref":"#/components/schemas/CreateSquadDTO","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`"},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"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":{"$ref":"#/components/schemas/CreateWorkflowDTO","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`"},"workflowOverrides":{"$ref":"#/components/schemas/WorkflowOverrides","description":"These are the overrides for the `workflow` or `workflowId`'s settings and template variables."},"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":{"$ref":"#/components/schemas/ImportTwilioPhoneNumberDTO","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."},"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":{"$ref":"#/components/schemas/CreateCustomerDTO","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."}},"description":"Configuration used to create a single call or a batch of outbound calls. Choose a saved or transient assistant, squad, or workflow, then provide the customer, phone-number, scheduling, and transport settings that apply.","title":"CreateCallDTO"},"SubscriptionLimits":{"type":"object","properties":{"concurrencyBlocked":{"type":"boolean","default":false,"description":"True if this call was blocked by the Call Concurrency limit"},"concurrencyLimit":{"type":"number","format":"double","description":"Account Call Concurrency limit"},"remainingConcurrentCalls":{"type":"number","format":"double","description":"Incremental number of concurrent calls that will be allowed, including this call"}},"description":"Organization concurrency limits and remaining concurrent call capacity.","title":"SubscriptionLimits"},"CallBatchError":{"type":"object","properties":{"customer":{"$ref":"#/components/schemas/CreateCustomerDTO","description":"Customer configuration associated with the failed call."},"error":{"type":"string","description":"Error message explaining why the call could not be created."}},"required":["customer","error"],"description":"Error returned for one customer entry in a batch call request.","title":"CallBatchError"},"CallBatchResponse":{"type":"object","properties":{"subscriptionLimits":{"$ref":"#/components/schemas/SubscriptionLimits","description":"Subscription limits at the end of this batch"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Call"},"description":"This is the list of calls that were created."},"errors":{"type":"array","items":{"$ref":"#/components/schemas/CallBatchError"},"description":"This is the list of calls that failed to be created."}},"required":["results","errors"],"description":"The result of a batch call creation request, containing successfully created calls, per-call failures, and subscription limits recorded at the end of the batch.","title":"CallBatchResponse"},"calls_create_Response_201":{"oneOf":[{"$ref":"#/components/schemas/Call"},{"$ref":"#/components/schemas/CallBatchResponse"}],"title":"calls_create_Response_201"},"DeleteCallDTO":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"These are the Call IDs to be bulk deleted.\nIf provided, the call ID if any in the request query will be ignored\nWhen requesting a bulk delete, updates when a call is deleted will be sent as a webhook to the server URL configured in the Org settings.\nIt may take up to a few hours to complete the bulk delete, and will be asynchronous."}},"description":"Configuration for deleting stored call data, including optional call IDs for asynchronous bulk deletion.","title":"DeleteCallDTO"},"UpdateCallDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":40,"description":"This is the name of the call. This is just for your own reference."}},"description":"Fields used to update an existing call. Currently, the call name can be changed.","title":"UpdateCallDTO"},"Calls_CallArtifactController_monoRecordingDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_monoRecordingDownload_Response_200"},"Calls_CallArtifactController_stereoRecordingDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_stereoRecordingDownload_Response_200"},"Calls_CallArtifactController_videoRecordingDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_videoRecordingDownload_Response_200"},"Calls_CallArtifactController_customerRecordingDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_customerRecordingDownload_Response_200"},"Calls_CallArtifactController_assistantRecordingDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_assistantRecordingDownload_Response_200"},"Calls_CallArtifactController_pcapDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_pcapDownload_Response_200"},"Calls_CallArtifactController_callLogsDownload_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Calls_CallArtifactController_callLogsDownload_Response_200"},"ChatGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"ChatGetParametersSortOrder"},"ChatGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"ChatGetParametersSortBy"},"ChatInputOneOf1Items":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"ChatInputOneOf1Items"},"ChatInput1":{"type":"array","items":{"$ref":"#/components/schemas/ChatInputOneOf1Items"},"title":"ChatInput1"},"ChatInput":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/ChatInput1"}],"description":"This is the input text for the chat.\nCan be a string or an array of chat messages.","title":"ChatInput"},"ChatMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"ChatMessagesItems"},"ChatOutputItems":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"ChatOutputItems"},"ChatCostType":{"type":"string","enum":["chat"],"description":"This is the type of cost, always 'chat' for this class.","title":"ChatCostType"},"ChatCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ChatCostType","description":"This is the type of cost, always 'chat' for this class."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","cost"],"title":"ChatCost"},"ChatCostsItems":{"oneOf":[{"$ref":"#/components/schemas/ModelCost"},{"$ref":"#/components/schemas/ChatCost"}],"title":"ChatCostsItems"},"Chat":{"type":"object","properties":{"assistantId":{"type":"string","description":"This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the variable values that will be used to replace template variables in the assistant messages.\nOnly variable substitution is supported in chat contexts - other assistant properties cannot be overridden."},"squadId":{"type":"string","description":"This is the squad that will be used for the chat. To use a transient squad, use `squad` instead."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is the squad that will be used for the chat. To use an existing squad, use `squadId` instead."},"name":{"type":"string","maxLength":40,"description":"This is the name of the chat. This is just for your own reference."},"sessionId":{"type":"string","description":"This is the ID of the session that will be used for the chat.\nMutually exclusive with previousChatId."},"input":{"$ref":"#/components/schemas/ChatInput","description":"This is the input text for the chat.\nCan be a string or an array of chat messages."},"stream":{"type":"boolean","default":false,"description":"This is a flag that determines whether the response should be streamed.\nWhen true, the response will be sent as chunks of text."},"previousChatId":{"type":"string","description":"This is the ID of the chat that will be used as context for the new chat.\nThe messages from the previous chat will be used as context.\nMutually exclusive with sessionId."},"id":{"type":"string","description":"This is the unique identifier for the chat."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this chat belongs to."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ChatMessagesItems"},"description":"This is an array of messages used as context for the chat.\nUsed to provide message history for multi-turn conversations."},"output":{"type":"array","items":{"$ref":"#/components/schemas/ChatOutputItems"},"description":"This is the output messages generated by the system in response to the input."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the chat was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the chat was last updated."},"costs":{"type":"array","items":{"$ref":"#/components/schemas/ChatCostsItems"},"description":"These are the costs of individual components of the chat in USD."},"cost":{"type":"number","format":"double","description":"This is the cost of the chat in USD."}},"required":["id","orgId","createdAt","updatedAt"],"title":"Chat"},"PaginationMetaSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"PaginationMetaSortOrder"},"PaginationMeta":{"type":"object","properties":{"itemsPerPage":{"type":"number","format":"double","description":"The number of phone numbers returned per page."},"totalItems":{"type":"number","format":"double","description":"The total number of phone numbers matching the request."},"currentPage":{"type":"number","format":"double","description":"The current page number."},"totalPages":{"type":"number","format":"double"},"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":{"$ref":"#/components/schemas/PaginationMetaSortOrder"},"itemsBeyondRetention":{"type":"boolean","description":"Whether additional matching phone numbers exist beyond the organization's data-retention window."},"createdAtLe":{"type":"string","format":"date-time","description":"The inclusive upper creation-time boundary applied to the result set."},"createdAtGe":{"type":"string","format":"date-time","description":"The inclusive lower creation-time boundary applied to the result set."}},"required":["itemsPerPage","totalItems","currentPage"],"description":"Pagination and retention metadata returned with a paginated list of phone numbers.","title":"PaginationMeta"},"ChatPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Chat"}},"metadata":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["results","metadata"],"title":"ChatPaginatedResponse"},"CreateChatDtoInputOneOf1Items":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"CreateChatDtoInputOneOf1Items"},"CreateChatDtoInput1":{"type":"array","items":{"$ref":"#/components/schemas/CreateChatDtoInputOneOf1Items"},"title":"CreateChatDtoInput1"},"CreateChatDtoInput":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/CreateChatDtoInput1"}],"description":"This is the input text for the chat.\nCan be a string or an array of chat messages.\nThis field is REQUIRED for chat creation.","title":"CreateChatDtoInput"},"TwilioSmsChatTransportConversationType":{"type":"string","enum":["chat"],"default":"chat","description":"This is the conversation type of the call (ie, voice or chat).","title":"TwilioSmsChatTransportConversationType"},"TwilioSmsChatTransportType":{"type":"string","enum":["twilio.sms"],"description":"The type of transport to use for sending the chat response.\nCurrently supports 'twilio.sms' for SMS delivery via Twilio.","title":"TwilioSmsChatTransportType"},"TwilioSMSChatTransport":{"type":"object","properties":{"conversationType":{"$ref":"#/components/schemas/TwilioSmsChatTransportConversationType","default":"chat","description":"This is the conversation type of the call (ie, voice or chat)."},"phoneNumberId":{"type":"string","description":"This is the phone number that will be used to send the SMS.\nIf provided, will create a new session. If not provided, uses existing session's phoneNumberId.\nThe phone number must have SMS enabled and belong to your organization."},"customer":{"$ref":"#/components/schemas/CreateCustomerDTO","description":"This is the customer who will receive the SMS.\nIf provided, will create a new session. If not provided, uses existing session's customer."},"customerId":{"type":"string","description":"This is the customerId of the customer who will receive the SMS."},"useLLMGeneratedMessageForOutbound":{"type":"boolean","default":true,"description":"Whether to use LLM-generated messages for outbound SMS.\nWhen true (default), input is processed by the assistant for a response.\nWhen false, the input text is forwarded directly as the SMS message without LLM processing.\nUseful for sending pre-defined messages or notifications."},"type":{"$ref":"#/components/schemas/TwilioSmsChatTransportType","description":"The type of transport to use for sending the chat response.\nCurrently supports 'twilio.sms' for SMS delivery via Twilio."}},"required":["type"],"title":"TwilioSMSChatTransport"},"CreateChatDTO":{"type":"object","properties":{"assistantId":{"type":"string","description":"This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the variable values that will be used to replace template variables in the assistant messages.\nOnly variable substitution is supported in chat contexts - other assistant properties cannot be overridden."},"squadId":{"type":"string","description":"This is the squad that will be used for the chat. To use a transient squad, use `squad` instead."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is the squad that will be used for the chat. To use an existing squad, use `squadId` instead."},"name":{"type":"string","maxLength":40,"description":"This is the name of the chat. This is just for your own reference."},"sessionId":{"type":"string","description":"This is the ID of the session that will be used for the chat.\nMutually exclusive with previousChatId."},"input":{"$ref":"#/components/schemas/CreateChatDtoInput","description":"This is the input text for the chat.\nCan be a string or an array of chat messages.\nThis field is REQUIRED for chat creation."},"stream":{"type":"boolean","default":false,"description":"This is a flag that determines whether the response should be streamed.\nWhen true, the response will be sent as chunks of text."},"previousChatId":{"type":"string","description":"This is the ID of the chat that will be used as context for the new chat.\nThe messages from the previous chat will be used as context.\nMutually exclusive with sessionId."},"transport":{"$ref":"#/components/schemas/TwilioSMSChatTransport","description":"This is used to send the chat through a transport like SMS.\nIf transport.phoneNumberId and transport.customer are provided, creates a new session.\nIf sessionId is provided without transport fields, uses existing session data.\nCannot specify both sessionId and transport fields (phoneNumberId/customer) together."}},"required":["input"],"title":"CreateChatDTO"},"CreateChatStreamResponse":{"type":"object","properties":{"id":{"type":"string","description":"This is the unique identifier for the streaming response."},"sessionId":{"type":"string","description":"This is the ID of the session that will be used for the chat.\nHelps track conversation context across multiple messages."},"path":{"type":"string","description":"This is the path to the content being updated.\nFormat: `chat.output[{contentIndex}].content` where contentIndex identifies the specific content item."},"delta":{"type":"string","description":"This is the incremental content chunk being streamed."}},"required":["id","path","delta"],"title":"CreateChatStreamResponse"},"chats_create_Response_200":{"oneOf":[{"$ref":"#/components/schemas/Chat"},{"$ref":"#/components/schemas/CreateChatStreamResponse"}],"title":"chats_create_Response_200"},"OpenAiResponsesRequestInputOneOf1Items":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"OpenAiResponsesRequestInputOneOf1Items"},"OpenAiResponsesRequestInput1":{"type":"array","items":{"$ref":"#/components/schemas/OpenAiResponsesRequestInputOneOf1Items"},"title":"OpenAiResponsesRequestInput1"},"OpenAiResponsesRequestInput":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/OpenAiResponsesRequestInput1"}],"description":"This is the input text for the chat.\nCan be a string or an array of chat messages.\nThis field is REQUIRED for chat creation.","title":"OpenAiResponsesRequestInput"},"OpenAIResponsesRequest":{"type":"object","properties":{"assistantId":{"type":"string","description":"This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the variable values that will be used to replace template variables in the assistant messages.\nOnly variable substitution is supported in chat contexts - other assistant properties cannot be overridden."},"squadId":{"type":"string","description":"This is the squad that will be used for the chat. To use a transient squad, use `squad` instead."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is the squad that will be used for the chat. To use an existing squad, use `squadId` instead."},"name":{"type":"string","maxLength":40,"description":"This is the name of the chat. This is just for your own reference."},"sessionId":{"type":"string","description":"This is the ID of the session that will be used for the chat.\nMutually exclusive with previousChatId."},"input":{"$ref":"#/components/schemas/OpenAiResponsesRequestInput","description":"This is the input text for the chat.\nCan be a string or an array of chat messages.\nThis field is REQUIRED for chat creation."},"stream":{"type":"boolean","default":true,"description":"Whether to stream the response or not."},"previousChatId":{"type":"string","description":"This is the ID of the chat that will be used as context for the new chat.\nThe messages from the previous chat will be used as context.\nMutually exclusive with sessionId."},"transport":{"$ref":"#/components/schemas/TwilioSMSChatTransport","description":"This is used to send the chat through a transport like SMS.\nIf transport.phoneNumberId and transport.customer are provided, creates a new session.\nIf sessionId is provided without transport fields, uses existing session data.\nCannot specify both sessionId and transport fields (phoneNumberId/customer) together."}},"required":["input"],"title":"OpenAIResponsesRequest"},"ResponseObjectObject":{"type":"string","enum":["response"],"default":"response","description":"The object type","title":"ResponseObjectObject"},"ResponseObjectStatus":{"type":"string","enum":["completed","failed","in_progress","incomplete"],"description":"Status of the response","title":"ResponseObjectStatus"},"ResponseOutputTextAnnotationsItems":{"type":"object","properties":{},"title":"ResponseOutputTextAnnotationsItems"},"ResponseOutputTextType":{"type":"string","enum":["output_text"],"default":"output_text","description":"The type of the output text","title":"ResponseOutputTextType"},"ResponseOutputText":{"type":"object","properties":{"annotations":{"type":"array","items":{"$ref":"#/components/schemas/ResponseOutputTextAnnotationsItems"},"description":"Annotations in the text output"},"text":{"type":"string","description":"The text output from the model"},"type":{"$ref":"#/components/schemas/ResponseOutputTextType","description":"The type of the output text"}},"required":["annotations","text","type"],"title":"ResponseOutputText"},"ResponseOutputMessageRole":{"type":"string","enum":["assistant"],"default":"assistant","description":"The role of the output message","title":"ResponseOutputMessageRole"},"ResponseOutputMessageStatus":{"type":"string","enum":["in_progress","completed","incomplete"],"description":"The status of the message","title":"ResponseOutputMessageStatus"},"ResponseOutputMessageType":{"type":"string","enum":["message"],"default":"message","description":"The type of the output message","title":"ResponseOutputMessageType"},"ResponseOutputMessage":{"type":"object","properties":{"id":{"type":"string","description":"The unique ID of the output message"},"content":{"type":"array","items":{"$ref":"#/components/schemas/ResponseOutputText"},"description":"Content of the output message"},"role":{"$ref":"#/components/schemas/ResponseOutputMessageRole","description":"The role of the output message"},"status":{"$ref":"#/components/schemas/ResponseOutputMessageStatus","description":"The status of the message"},"type":{"$ref":"#/components/schemas/ResponseOutputMessageType","description":"The type of the output message"}},"required":["id","content","role","status","type"],"title":"ResponseOutputMessage"},"ResponseObject":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for this Response"},"object":{"$ref":"#/components/schemas/ResponseObjectObject","description":"The object type"},"created_at":{"type":"number","format":"double","description":"Unix timestamp (in seconds) of when this Response was created"},"status":{"$ref":"#/components/schemas/ResponseObjectStatus","description":"Status of the response"},"error":{"type":["string","null"],"description":"Error message if the response failed"},"output":{"type":"array","items":{"$ref":"#/components/schemas/ResponseOutputMessage"},"description":"Output messages from the model"}},"required":["id","object","created_at","status","output"],"title":"ResponseObject"},"ResponseTextDeltaEventType":{"type":"string","enum":["response.output_text.delta"],"default":"response.output_text.delta","description":"Event type","title":"ResponseTextDeltaEventType"},"ResponseTextDeltaEvent":{"type":"object","properties":{"content_index":{"type":"number","format":"double","description":"Index of the content part"},"delta":{"type":"string","description":"Text delta being added"},"item_id":{"type":"string","description":"ID of the output item"},"output_index":{"type":"number","format":"double","description":"Index of the output item"},"type":{"$ref":"#/components/schemas/ResponseTextDeltaEventType","description":"Event type"}},"required":["content_index","delta","item_id","output_index","type"],"title":"ResponseTextDeltaEvent"},"ResponseTextDoneEventType":{"type":"string","enum":["response.output_text.done"],"default":"response.output_text.done","description":"Event type","title":"ResponseTextDoneEventType"},"ResponseTextDoneEvent":{"type":"object","properties":{"content_index":{"type":"number","format":"double","description":"Index of the content part"},"item_id":{"type":"string","description":"ID of the output item"},"output_index":{"type":"number","format":"double","description":"Index of the output item"},"text":{"type":"string","description":"Complete text content"},"type":{"$ref":"#/components/schemas/ResponseTextDoneEventType","description":"Event type"}},"required":["content_index","item_id","output_index","text","type"],"title":"ResponseTextDoneEvent"},"ResponseCompletedEventType":{"type":"string","enum":["response.completed"],"default":"response.completed","description":"Event type","title":"ResponseCompletedEventType"},"ResponseCompletedEvent":{"type":"object","properties":{"response":{"$ref":"#/components/schemas/ResponseObject","description":"The completed response"},"type":{"$ref":"#/components/schemas/ResponseCompletedEventType","description":"Event type"}},"required":["response","type"],"title":"ResponseCompletedEvent"},"ResponseErrorEventType":{"type":"string","enum":["error"],"default":"error","description":"Event type","title":"ResponseErrorEventType"},"ResponseErrorEvent":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ResponseErrorEventType","description":"Event type"},"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"},"param":{"type":["string","null"],"description":"Parameter that caused the error"},"sequence_number":{"type":"number","format":"double","description":"Sequence number of the event"}},"required":["type","code","message","sequence_number"],"title":"ResponseErrorEvent"},"chats_createResponse_Response_200":{"oneOf":[{"$ref":"#/components/schemas/ResponseObject"},{"$ref":"#/components/schemas/ResponseTextDeltaEvent"},{"$ref":"#/components/schemas/ResponseTextDoneEvent"},{"$ref":"#/components/schemas/ResponseCompletedEvent"},{"$ref":"#/components/schemas/ResponseErrorEvent"}],"title":"chats_createResponse_Response_200"},"CampaignGetParametersStatus":{"type":"string","enum":["scheduled","in-progress","ended","cancelled","archived"],"title":"CampaignGetParametersStatus"},"CampaignGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"CampaignGetParametersSortOrder"},"CampaignGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"CampaignGetParametersSortBy"},"CampaignStatus":{"type":"string","enum":["scheduled","in-progress","ended","cancelled","archived"],"description":"This is the status of the campaign.","title":"CampaignStatus"},"CampaignEndedReason":{"type":"string","enum":["campaign.scheduled.ended-by-user","campaign.in-progress.ended-by-user","campaign.ended.success"],"description":"This is the explanation for how the campaign ended.","title":"CampaignEndedReason"},"DialPlanEntry":{"type":"object","properties":{"phoneNumberId":{"type":"string","description":"The phone number ID to use for calling the customers in this entry."},"customers":{"type":"array","items":{"$ref":"#/components/schemas/CreateCustomerDTO"},"description":"The list of customers to call using this phone number."}},"required":["phoneNumberId","customers"],"description":"Associates a phone number with the customers to dial through that number in a batch call plan.","title":"DialPlanEntry"},"CampaignServerMessages":{"type":"string","enum":["campaign.started","campaign.cancelled","campaign.ended","campaign.archived","campaign.unarchived","contact.dispatched","contact.completed","contact.failed","contact.skipped","contact.predial-failed","campaign.job.continued"],"description":"These are the messages that will be sent to your Server URL.","title":"CampaignServerMessages"},"CampaignPredialPlan":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether the pre-dial eligibility webhook is active. Defaults to true when `predialPlan` is set. Set to false to keep the plan without running the webhook (useful when duplicating a campaign)."}},"title":"CampaignPredialPlan"},"CampaignCalls":{"type":"object","properties":{},"description":"This is a map of call IDs to campaign call details.","title":"CampaignCalls"},"Campaign":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/CampaignStatus","description":"This is the status of the campaign."},"endedReason":{"$ref":"#/components/schemas/CampaignEndedReason","description":"This is the explanation for how the campaign ended."},"name":{"type":"string","description":"This is the name of the campaign. This is just for your own reference."},"assistantId":{"type":"string","description":"This is the assistant ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"workflowId":{"type":"string","description":"This is the workflow ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"squadId":{"type":"string","description":"This is the squad ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"phoneNumberId":{"type":"string","description":"This is the phone number ID that will be used for the campaign calls. Required if dialPlan is not provided. Note: phoneNumberId and dialPlan are mutually exclusive."},"dialPlan":{"type":"array","items":{"$ref":"#/components/schemas/DialPlanEntry"},"description":"This is a list of dial entries, each specifying a phone number and the customers to call using that number. Use this when you want different phone numbers to call different sets of customers. Note: phoneNumberId and dialPlan are mutually exclusive."},"schedulePlan":{"$ref":"#/components/schemas/SchedulePlan","description":"This is the schedule plan for the campaign. Calls will start at startedAt and continue until your organization’s concurrency limit is reached. Any remaining calls will be retried for up to one hour as capacity becomes available. After that hour or after latestAt, whichever comes first, any calls that couldn’t be placed won’t be retried."},"customers":{"type":"array","items":{"$ref":"#/components/schemas/CreateCustomerDTO"},"description":"These are the customers that will be called in the campaign. Required if dialPlan is not provided. Maximum of 10000 customers per campaign."},"maxConcurrency":{"type":"number","format":"double","minimum":1,"description":"This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10."},"assistantOverrides":{"$ref":"#/components/schemas/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`."},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"server":{"$ref":"#/components/schemas/Server","description":"This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks."},"serverMessages":{"$ref":"#/components/schemas/CampaignServerMessages","description":"These are the messages that will be sent to your Server URL."},"predialPlan":{"$ref":"#/components/schemas/CampaignPredialPlan","description":"This opts the campaign into the blocking `campaign.predial` eligibility webhook. When set, every contact triggers a `campaign.predial` POST to the Server URL before dialing, and the response `{ eligible: boolean }` decides whether the call is placed. Requires `server`. When unset, no pre-dial webhook is sent."},"id":{"type":"string","description":"This is the unique identifier for the campaign."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this campaign belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the campaign was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the campaign was last updated."},"calls":{"$ref":"#/components/schemas/CampaignCalls","description":"This is a map of call IDs to campaign call details."},"callsCounterScheduled":{"type":"number","format":"double","description":"This is the number of calls that have been scheduled."},"callsCounterQueued":{"type":"number","format":"double","description":"This is the number of calls that have been queued."},"callsCounterInProgress":{"type":"number","format":"double","description":"This is the number of calls that have been in progress."},"callsCounterEndedVoicemail":{"type":"number","format":"double","description":"This is the number of calls whose ended reason is 'voicemail'."},"callsCounterEnded":{"type":"number","format":"double","description":"This is the number of calls that have ended."}},"required":["status","name","id","orgId","createdAt","updatedAt","calls","callsCounterScheduled","callsCounterQueued","callsCounterInProgress","callsCounterEndedVoicemail","callsCounterEnded"],"description":"A saved outbound calling campaign, including its calling configuration, schedule, status, customers, calls, and call-progress counters.","title":"Campaign"},"CampaignPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Campaign"},"description":"The campaigns returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the campaign result set."}},"required":["results","metadata"],"description":"A paginated collection of outbound calling campaigns and metadata describing the result set.","title":"CampaignPaginatedResponse"},"CreateCampaignDtoServerMessages":{"type":"string","enum":["campaign.started","campaign.cancelled","campaign.ended","campaign.archived","campaign.unarchived","contact.dispatched","contact.completed","contact.failed","contact.skipped","contact.predial-failed","campaign.job.continued"],"description":"These are the messages that will be sent to your Server URL.","title":"CreateCampaignDtoServerMessages"},"CreateCampaignDTO":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the campaign. This is just for your own reference."},"assistantId":{"type":"string","description":"This is the assistant ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"workflowId":{"type":"string","description":"This is the workflow ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"squadId":{"type":"string","description":"This is the squad ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"phoneNumberId":{"type":"string","description":"This is the phone number ID that will be used for the campaign calls. Required if dialPlan is not provided. Note: phoneNumberId and dialPlan are mutually exclusive."},"dialPlan":{"type":"array","items":{"$ref":"#/components/schemas/DialPlanEntry"},"description":"This is a list of dial entries, each specifying a phone number and the customers to call using that number. Use this when you want different phone numbers to call different sets of customers. Note: phoneNumberId and dialPlan are mutually exclusive."},"schedulePlan":{"$ref":"#/components/schemas/SchedulePlan","description":"This is the schedule plan for the campaign. Calls will start at startedAt and continue until your organization’s concurrency limit is reached. Any remaining calls will be retried for up to one hour as capacity becomes available. After that hour or after latestAt, whichever comes first, any calls that couldn’t be placed won’t be retried."},"customers":{"type":"array","items":{"$ref":"#/components/schemas/CreateCustomerDTO"},"description":"These are the customers that will be called in the campaign. Required if dialPlan is not provided. Maximum of 10000 customers per campaign."},"maxConcurrency":{"type":"number","format":"double","minimum":1,"description":"This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10."},"assistantOverrides":{"$ref":"#/components/schemas/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`."},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"server":{"$ref":"#/components/schemas/Server","description":"This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks."},"serverMessages":{"$ref":"#/components/schemas/CreateCampaignDtoServerMessages","description":"These are the messages that will be sent to your Server URL."},"predialPlan":{"$ref":"#/components/schemas/CampaignPredialPlan","description":"This opts the campaign into the blocking `campaign.predial` eligibility webhook. When set, every contact triggers a `campaign.predial` POST to the Server URL before dialing, and the response `{ eligible: boolean }` decides whether the call is placed. Requires `server`. When unset, no pre-dial webhook is sent."},"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":["name"],"description":"Configuration used to create an outbound calling campaign. Choose an assistant, squad, or workflow, then provide customers, phone-number or dial-plan settings, and an optional schedule.","title":"CreateCampaignDTO"},"V2CampaignGetParametersStatus":{"type":"string","enum":["scheduled","in-progress","ended","cancelled","archived"],"title":"V2CampaignGetParametersStatus"},"V2CampaignGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"V2CampaignGetParametersSortOrder"},"V2CampaignGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"V2CampaignGetParametersSortBy"},"CampaignSummaryStatus":{"type":"string","enum":["scheduled","in-progress","ended","cancelled","archived"],"description":"This is the status of the campaign.","title":"CampaignSummaryStatus"},"CampaignSummaryEndedReason":{"type":"string","enum":["campaign.scheduled.ended-by-user","campaign.in-progress.ended-by-user","campaign.ended.success"],"description":"This is the explanation for how the campaign ended.","title":"CampaignSummaryEndedReason"},"CampaignSummaryServerMessages":{"type":"string","enum":["campaign.started","campaign.cancelled","campaign.ended","campaign.archived","campaign.unarchived","contact.dispatched","contact.completed","contact.failed","contact.skipped","contact.predial-failed","campaign.job.continued"],"description":"These are the messages that will be sent to your Server URL.","title":"CampaignSummaryServerMessages"},"CampaignContactCounters":{"type":"object","properties":{"pending":{"type":"number","format":"double"},"dispatched":{"type":"number","format":"double"},"completed":{"type":"number","format":"double"},"failed":{"type":"number","format":"double"},"skipped":{"type":"number","format":"double"},"predialFailed":{"type":"number","format":"double"}},"required":["pending","dispatched","completed","failed","skipped","predialFailed"],"title":"CampaignContactCounters"},"CampaignCallMetrics":{"type":"object","properties":{"dialed":{"type":"number","format":"double","description":"This is the number of contacts a call was actually placed for. Contacts\nthat were skipped, rejected before dialing, or failed to dispatch are not\ncounted — no call existed, so there was nothing to answer."},"connected":{"type":"number","format":"double","description":"This is the number of those calls a human picked up. Voicemail does not\ncount. Divide by `dialed` for the pick-up rate."}},"required":["dialed","connected"],"title":"CampaignCallMetrics"},"CampaignSummary":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/CampaignSummaryStatus","description":"This is the status of the campaign."},"endedReason":{"$ref":"#/components/schemas/CampaignSummaryEndedReason","description":"This is the explanation for how the campaign ended."},"name":{"type":"string","description":"This is the name of the campaign. This is just for your own reference."},"assistantId":{"type":"string","description":"This is the assistant ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"squadId":{"type":"string","description":"This is the squad ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or squadId can be used."},"phoneNumberId":{"type":"string","description":"This is the phone number ID that will be used for the campaign calls. Required if dialPlan is not provided. Note: phoneNumberId and dialPlan are mutually exclusive."},"schedulePlan":{"$ref":"#/components/schemas/SchedulePlan","description":"This is the schedule plan for the campaign. Calls will start at startedAt and continue until your organization’s concurrency limit is reached. Any remaining calls will be retried for up to one hour as capacity becomes available. After that hour or after latestAt, whichever comes first, any calls that couldn’t be placed won’t be retried."},"maxConcurrency":{"type":"number","format":"double","minimum":1,"description":"This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10."},"assistantOverrides":{"$ref":"#/components/schemas/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`."},"squadOverrides":{"$ref":"#/components/schemas/AssistantOverrides","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."},"server":{"$ref":"#/components/schemas/Server","description":"This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks."},"serverMessages":{"$ref":"#/components/schemas/CampaignSummaryServerMessages","description":"These are the messages that will be sent to your Server URL."},"predialPlan":{"$ref":"#/components/schemas/CampaignPredialPlan","description":"This opts the campaign into the blocking `campaign.predial` eligibility webhook. When set, every contact triggers a `campaign.predial` POST to the Server URL before dialing, and the response `{ eligible: boolean }` decides whether the call is placed. Requires `server`. When unset, no pre-dial webhook is sent."},"contactCounters":{"$ref":"#/components/schemas/CampaignContactCounters","description":"These are the per-status contact counts for this campaign. Sum them for the\ncampaign's total audience; `pending` plus `dispatched` is what is left to\ncomplete."},"callMetrics":{"$ref":"#/components/schemas/CampaignCallMetrics","description":"These are the call-level outcomes for this campaign — how many contacts\nwere actually dialed, and how many of those a human picked up."},"id":{"type":"string","description":"This is the unique identifier for the campaign."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this campaign belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the campaign was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the campaign was last updated."}},"required":["status","name","id","orgId","createdAt","updatedAt"],"title":"CampaignSummary"},"CampaignSummaryPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/CampaignSummary"}},"metadata":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["results","metadata"],"title":"CampaignSummaryPaginatedResponse"},"UpdateCampaignDtoStatus":{"type":"string","enum":["ended","cancelled"],"description":"Set to 'cancelled' to stop the campaign ('ended' is a V1 alias). Scheduled\ncalls are deleted; in-progress calls are allowed to finish.","title":"UpdateCampaignDtoStatus"},"UpdateCampaignDTO":{"type":"object","properties":{"name":{"type":"string","description":"This is the name of the campaign. This is just for your own reference."},"assistantId":{"type":"string","description":"This is the assistant ID that will be used for the campaign calls.\nCan only be updated if campaign is not in progress or has ended."},"workflowId":{"type":"string","description":"This is the workflow ID that will be used for the campaign calls.\nCan only be updated if campaign is not in progress or has ended."},"squadId":{"type":"string","description":"This is the squad ID that will be used for the campaign calls.\nCan only be updated if campaign is not in progress or has ended."},"phoneNumberId":{"type":"string","description":"This is the phone number ID that will be used for the campaign calls.\nCan only be updated if campaign is not in progress or has ended.\nNote: `phoneNumberId` and `dialPlan` are mutually exclusive."},"dialPlan":{"type":"array","items":{"$ref":"#/components/schemas/DialPlanEntry"},"description":"This is a list of dial entries, each specifying a phone number and the customers to call using that number. Can only be updated if campaign is not in progress or has ended. Note: phoneNumberId and dialPlan are mutually exclusive."},"schedulePlan":{"$ref":"#/components/schemas/SchedulePlan","description":"This is the schedule plan for the campaign.\nCan only be updated if campaign is not in progress or has ended."},"status":{"$ref":"#/components/schemas/UpdateCampaignDtoStatus","description":"Set to 'cancelled' to stop the campaign ('ended' is a V1 alias). Scheduled\ncalls are deleted; in-progress calls are allowed to finish."}},"description":"Fields used to update an outbound calling campaign, including its name, status, calling resource, phone-number or dial-plan settings, and schedule.","title":"UpdateCampaignDTO"},"V2CampaignIdContactsGetParametersStatusSchemaItems":{"type":"string","enum":["contact.pending","contact.dispatched","contact.completed","contact.failed","contact.skipped","contact.predial-failed"],"title":"V2CampaignIdContactsGetParametersStatusSchemaItems"},"V2CampaignIdContactsGetParametersSortBy":{"type":"string","enum":["position","status"],"title":"V2CampaignIdContactsGetParametersSortBy"},"CampaignContactWithOutcomeStatus":{"type":"string","enum":["contact.pending","contact.dispatched","contact.completed","contact.failed","contact.skipped","contact.predial-failed"],"title":"CampaignContactWithOutcomeStatus"},"CampaignContactWithOutcome":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string"},"name":{"type":"string"},"status":{"$ref":"#/components/schemas/CampaignContactWithOutcomeStatus"},"callId":{"type":"string"},"dispatchedAt":{"type":"string","format":"date-time"},"endedReason":{"type":"string"}},"required":["id","number","status"],"title":"CampaignContactWithOutcome"},"CampaignContactPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/CampaignContactWithOutcome"}},"metadata":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["results","metadata"],"title":"CampaignContactPaginatedResponse"},"SessionGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"SessionGetParametersSortOrder"},"SessionGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"SessionGetParametersSortBy"},"SessionCostType":{"type":"string","enum":["session"],"description":"This is the type of cost, always 'session' for this class.","title":"SessionCostType"},"SessionCost":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SessionCostType","description":"This is the type of cost, always 'session' for this class."},"cost":{"type":"number","format":"double","description":"This is the cost of the component in USD."}},"required":["type","cost"],"title":"SessionCost"},"SessionCostsItems":{"oneOf":[{"$ref":"#/components/schemas/ModelCost"},{"$ref":"#/components/schemas/AnalysisCost"},{"$ref":"#/components/schemas/SessionCost"}],"title":"SessionCostsItems"},"SessionStatus":{"type":"string","enum":["active","completed"],"description":"This is the current status of the session. Can be either 'active' or 'completed'.","title":"SessionStatus"},"SessionMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"SessionMessagesItems"},"Session":{"type":"object","properties":{"id":{"type":"string","description":"This is the unique identifier for the session."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that owns this session."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 timestamp indicating when the session was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 timestamp indicating when the session was last updated."},"cost":{"type":"number","format":"double","description":"This is the cost of the session in USD."},"costs":{"type":"array","items":{"$ref":"#/components/schemas/SessionCostsItems"},"description":"These are the costs of individual components of the session in USD."},"name":{"type":"string","maxLength":40,"description":"This is a user-defined name for the session. Maximum length is 40 characters."},"status":{"$ref":"#/components/schemas/SessionStatus","description":"This is the current status of the session. Can be either 'active' or 'completed'."},"expirationSeconds":{"type":"number","format":"double","minimum":60,"maximum":2592000,"description":"Session expiration time in seconds. Defaults to 24 hours (86400 seconds) if not set."},"assistantId":{"type":"string","description":"This is the ID of the assistant associated with this session. Use this when referencing an existing assistant."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the assistant configuration for this session. Use this when creating a new assistant configuration.\nIf assistantId is provided, this will be ignored."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the overrides for the assistant configuration.\nUse this to provide variable values and other overrides when using assistantId.\nVariable substitution will be applied to the assistant's messages and other text-based fields."},"squadId":{"type":"string","description":"This is the squad ID associated with this session. Use this when referencing an existing squad."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is the squad configuration for this session. Use this when creating a new squad configuration.\nIf squadId is provided, this will be ignored."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/SessionMessagesItems"},"description":"This is an array of chat messages in the session."},"customer":{"$ref":"#/components/schemas/CreateCustomerDTO","description":"This is the customer information associated with this session."},"customerId":{"type":"string","description":"This is the customerId of the customer associated with this session."},"phoneNumberId":{"type":"string","description":"This is the ID of the phone number associated with this session."},"phoneNumber":{"$ref":"#/components/schemas/ImportTwilioPhoneNumberDTO","description":"This is the phone number configuration for this session."},"artifact":{"$ref":"#/components/schemas/Artifact","description":"These are the artifacts that were extracted from the session messages.\nThey are only available after the session has completed.\nThe artifact plan from the assistant or active assistant of squad is used to generate the artifact.\nCurrently the only supported fields of assistant artifact plan are:\n- structuredOutputIds"}},"required":["id","orgId","createdAt","updatedAt"],"title":"Session"},"SessionPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Session"}},"metadata":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["results","metadata"],"title":"SessionPaginatedResponse"},"CreateSessionDtoStatus":{"type":"string","enum":["active","completed"],"description":"This is the current status of the session. Can be either 'active' or 'completed'.","title":"CreateSessionDtoStatus"},"CreateSessionDtoMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"CreateSessionDtoMessagesItems"},"CreateSessionDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":40,"description":"This is a user-defined name for the session. Maximum length is 40 characters."},"status":{"$ref":"#/components/schemas/CreateSessionDtoStatus","description":"This is the current status of the session. Can be either 'active' or 'completed'."},"expirationSeconds":{"type":"number","format":"double","minimum":60,"maximum":2592000,"description":"Session expiration time in seconds. Defaults to 24 hours (86400 seconds) if not set."},"assistantId":{"type":"string","description":"This is the ID of the assistant associated with this session. Use this when referencing an existing assistant."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the assistant configuration for this session. Use this when creating a new assistant configuration.\nIf assistantId is provided, this will be ignored."},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"These are the overrides for the assistant configuration.\nUse this to provide variable values and other overrides when using assistantId.\nVariable substitution will be applied to the assistant's messages and other text-based fields."},"squadId":{"type":"string","description":"This is the squad ID associated with this session. Use this when referencing an existing squad."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is the squad configuration for this session. Use this when creating a new squad configuration.\nIf squadId is provided, this will be ignored."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/CreateSessionDtoMessagesItems"},"description":"This is an array of chat messages in the session."},"customer":{"$ref":"#/components/schemas/CreateCustomerDTO","description":"This is the customer information associated with this session."},"customerId":{"type":"string","description":"This is the customerId of the customer associated with this session."},"phoneNumberId":{"type":"string","description":"This is the ID of the phone number associated with this session."},"phoneNumber":{"$ref":"#/components/schemas/ImportTwilioPhoneNumberDTO","description":"This is the phone number configuration for this session."}},"title":"CreateSessionDTO"},"UpdateSessionDtoStatus":{"type":"string","enum":["active","completed"],"description":"This is the new status for the session.","title":"UpdateSessionDtoStatus"},"UpdateSessionDtoMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/SystemMessage"},{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"},{"$ref":"#/components/schemas/ToolMessage"},{"$ref":"#/components/schemas/DeveloperMessage"}],"title":"UpdateSessionDtoMessagesItems"},"UpdateSessionDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":40,"description":"This is the new name for the session. Maximum length is 40 characters."},"status":{"$ref":"#/components/schemas/UpdateSessionDtoStatus","description":"This is the new status for the session."},"expirationSeconds":{"type":"number","format":"double","minimum":60,"maximum":2592000,"description":"Session expiration time in seconds. Defaults to 24 hours (86400 seconds) if not set."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSessionDtoMessagesItems"},"description":"This is the updated array of chat messages."}},"title":"UpdateSessionDTO"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus":{"type":"string","enum":["active","activating","blocked"],"description":"This is the status of the phone number.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus":{"type":"string","enum":["active","activating","blocked"],"description":"This is the status of the phone number.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus":{"type":"string","enum":["active","activating","blocked"],"description":"This is the status of the phone number.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus":{"type":"string","enum":["active","activating","blocked"],"description":"This is the status of the phone number.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus"},"SipAuthentication":{"type":"object","properties":{"realm":{"type":"string","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","minLength":20,"maxLength":40,"description":"This will be expected in the `username` field of the `authorization` header of the SIP INVITE."},"password":{"type":"string","minLength":20,"maxLength":40,"description":"This will be expected to generate the `response` field of the `authorization` header of the SIP INVITE, through digest authentication."}},"required":["username","password"],"description":"Realm, username, and password used to authenticate SIP requests.","title":"SipAuthentication"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus":{"type":"string","enum":["active","activating","blocked"],"description":"This is the status of the phone number.","title":"PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus"},"PhoneNumberGetResponsesContentApplicationJsonSchemaItems":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["provider","id","orgId","createdAt","updatedAt","credentialId"],"description":"A phone number connected to Vapi through a bring-your-own telephony provider, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus","description":"This is the status of the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."}},"required":["provider","id","orgId","createdAt","updatedAt","number","twilioAccountSid"],"description":"A Twilio phone number connected to Vapi, including its Twilio account details, SMS configuration, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Vonage phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus","description":"This is the status of the phone number."},"number":{"type":"string","description":"These are the digits of the phone number you purchased from Vapi."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["provider","id","orgId","createdAt","updatedAt"],"description":"A Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Telnyx phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."}],"discriminator":{"propertyName":"provider"},"title":"PhoneNumberGetResponsesContentApplicationJsonSchemaItems"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination"},"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"phoneNumbers_create_Request":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"}},"required":["provider","credentialId"],"description":"Configuration used to connect a bring-your-own phone number to Vapi with a stored telephony credential and routing settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"}},"required":["provider","number","twilioAccountSid"],"description":"Configuration used to import a Twilio phone number into Vapi with its account credentials and routing settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"}},"required":["provider","number","credentialId"],"description":"Configuration used to import a Vonage phone number into Vapi with a stored credential and routing settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"}},"required":["provider"],"description":"Configuration used to provision a Vapi-managed phone number or connect a SIP URI, with optional routing and authentication settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"}},"required":["provider","number","credentialId"],"description":"Configuration used to import a Telnyx phone number into Vapi with a stored credential and routing settings."}],"discriminator":{"propertyName":"provider"},"title":"phoneNumbers_create_Request"},"phoneNumbers_create_Response_201":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["provider","id","orgId","createdAt","updatedAt","credentialId"],"description":"A phone number connected to Vapi through a bring-your-own telephony provider, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus","description":"This is the status of the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."}},"required":["provider","id","orgId","createdAt","updatedAt","number","twilioAccountSid"],"description":"A Twilio phone number connected to Vapi, including its Twilio account details, SMS configuration, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Vonage phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus","description":"This is the status of the phone number."},"number":{"type":"string","description":"These are the digits of the phone number you purchased from Vapi."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["provider","id","orgId","createdAt","updatedAt"],"description":"A Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Telnyx phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."}],"discriminator":{"propertyName":"provider"},"title":"phoneNumbers_create_Response_201"},"V2PhoneNumberGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"V2PhoneNumberGetParametersSortOrder"},"V2PhoneNumberGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"V2PhoneNumberGetParametersSortBy"},"ByoPhoneNumber":{"type":"object","properties":{"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["id","orgId","createdAt","updatedAt","credentialId"],"description":"A phone number connected to Vapi through a bring-your-own telephony provider, including its credential, routing, hooks, server settings, and lifecycle metadata.","title":"ByoPhoneNumber"},"TwilioPhoneNumber":{"type":"object","properties":{"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus","description":"This is the status of the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."}},"required":["id","orgId","createdAt","updatedAt","number","twilioAccountSid"],"description":"A Twilio phone number connected to Vapi, including its Twilio account details, SMS configuration, routing, hooks, server settings, and lifecycle metadata.","title":"TwilioPhoneNumber"},"VonagePhoneNumber":{"type":"object","properties":{"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Vonage phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata.","title":"VonagePhoneNumber"},"VapiPhoneNumber":{"type":"object","properties":{"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus","description":"This is the status of the phone number."},"number":{"type":"string","description":"These are the digits of the phone number you purchased from Vapi."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["id","orgId","createdAt","updatedAt"],"description":"A Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, server settings, and lifecycle metadata.","title":"VapiPhoneNumber"},"TelnyxPhoneNumber":{"type":"object","properties":{"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Telnyx phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata.","title":"TelnyxPhoneNumber"},"PhoneNumberPaginatedResponseResultsItems":{"oneOf":[{"$ref":"#/components/schemas/ByoPhoneNumber"},{"$ref":"#/components/schemas/TwilioPhoneNumber"},{"$ref":"#/components/schemas/VonagePhoneNumber"},{"$ref":"#/components/schemas/VapiPhoneNumber"},{"$ref":"#/components/schemas/TelnyxPhoneNumber"}],"title":"PhoneNumberPaginatedResponseResultsItems"},"PhoneNumberPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberPaginatedResponseResultsItems"},"description":"A list of phone numbers, which can be of any provider type."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Metadata about the pagination."}},"required":["results","metadata"],"description":"A paginated collection of phone numbers and metadata describing the result set.","title":"PhoneNumberPaginatedResponse"},"phoneNumbers_get_Response_200":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["provider","id","orgId","createdAt","updatedAt","credentialId"],"description":"A phone number connected to Vapi through a bring-your-own telephony provider, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus","description":"This is the status of the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."}},"required":["provider","id","orgId","createdAt","updatedAt","number","twilioAccountSid"],"description":"A Twilio phone number connected to Vapi, including its Twilio account details, SMS configuration, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Vonage phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus","description":"This is the status of the phone number."},"number":{"type":"string","description":"These are the digits of the phone number you purchased from Vapi."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["provider","id","orgId","createdAt","updatedAt"],"description":"A Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Telnyx phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."}],"discriminator":{"propertyName":"provider"},"title":"phoneNumbers_get_Response_200"},"phoneNumbers_delete_Response_200":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["provider","id","orgId","createdAt","updatedAt","credentialId"],"description":"A phone number connected to Vapi through a bring-your-own telephony provider, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus","description":"This is the status of the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."}},"required":["provider","id","orgId","createdAt","updatedAt","number","twilioAccountSid"],"description":"A Twilio phone number connected to Vapi, including its Twilio account details, SMS configuration, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Vonage phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus","description":"This is the status of the phone number."},"number":{"type":"string","description":"These are the digits of the phone number you purchased from Vapi."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["provider","id","orgId","createdAt","updatedAt"],"description":"A Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Telnyx phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."}],"discriminator":{"propertyName":"provider"},"title":"phoneNumbers_delete_Response_200"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"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.","title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination"},"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems":{"oneOf":[{"$ref":"#/components/schemas/PhoneNumberHookCallRinging"},{"$ref":"#/components/schemas/PhoneNumberHookCallEnding"}],"title":"PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"phoneNumbers_update_Request":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["provider"],"description":"Fields used to update a bring-your-own phone number, including its credential, number, routing, hooks, and server settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."}},"required":["provider"],"description":"Fields used to update a Twilio phone number, including its account credentials, SMS configuration, routing, hooks, and server settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider"],"description":"Fields used to update a Vonage phone number, including its credential, number, routing, hooks, and server settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["provider"],"description":"Fields used to update a Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, and server settings."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider"],"description":"Fields used to update a Telnyx phone number, including its credential, number, routing, hooks, and server settings."}],"discriminator":{"propertyName":"provider"},"title":"phoneNumbers_update_Request"},"phoneNumbers_update_Response_200":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["byo-phone-number"],"description":"Discriminator value: byo-phone-number"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"numberE164CheckEnabled":{"type":"boolean","default":true,"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)"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","minLength":3,"maxLength":40,"description":"This is the number of the customer."},"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."}},"required":["provider","id","orgId","createdAt","updatedAt","credentialId"],"description":"A phone number connected to Vapi through a bring-your-own telephony provider, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["twilio"],"description":"Discriminator value: twilio"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"smsEnabled":{"type":"boolean","default":true,"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"},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus","description":"This is the status of the phone number."},"twilioAuthToken":{"type":"string","description":"This is the Twilio Auth Token for the phone number."},"twilioApiKey":{"type":"string","description":"This is the Twilio API Key for the phone number."},"twilioApiSecret":{"type":"string","description":"This is the Twilio API Secret for the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Twilio."},"twilioAccountSid":{"type":"string","description":"This is the Twilio Account SID for the phone number."}},"required":["provider","id","orgId","createdAt","updatedAt","number","twilioAccountSid"],"description":"A Twilio phone number connected to Vapi, including its Twilio account details, SMS configuration, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vonage"],"description":"Discriminator value: vonage"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Vonage."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Vonage phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["vapi"],"description":"Discriminator value: vapi"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus","description":"This is the status of the phone number."},"number":{"type":"string","description":"These are the digits of the phone number you purchased from Vapi."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"numberDesiredAreaCode":{"type":"string","minLength":3,"maxLength":3,"description":"This is the area code of the phone number to purchase."},"sipUri":{"type":"string","description":"This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will answer.\n\nThis is case-insensitive."},"authentication":{"$ref":"#/components/schemas/SipAuthentication","description":"This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted."}},"required":["provider","id","orgId","createdAt","updatedAt"],"description":"A Vapi-managed phone number or SIP URI, including its authentication, routing, hooks, server settings, and lifecycle metadata."},{"type":"object","properties":{"provider":{"type":"string","enum":["telnyx"],"description":"Discriminator value: telnyx"},"fallbackDestination":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination","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."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems"},"description":"This is the hooks that will be used for incoming calls to this phone number."},"id":{"type":"string","description":"This is the unique identifier for the phone number."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this phone number belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the phone number was last updated."},"status":{"$ref":"#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus","description":"This is the status of the phone number."},"name":{"type":"string","maxLength":40,"description":"This is the name of the phone number. This is just for your own reference."},"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":{"$ref":"#/components/schemas/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"},"number":{"type":"string","description":"These are the digits of the phone number you own on your Telnyx."},"credentialId":{"type":"string","description":"This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups."}},"required":["provider","id","orgId","createdAt","updatedAt","number","credentialId"],"description":"A Telnyx phone number connected to Vapi, including its credential, routing, hooks, server settings, and lifecycle metadata."}],"discriminator":{"propertyName":"provider"},"title":"phoneNumbers_update_Response_200"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod":{"type":"string","enum":["POST","GET","PUT","PATCH","DELETE"],"description":"The HTTP method used for the API request.","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"KnowledgeBaseToolFunction":{"type":"object","properties":{"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,64}$/","maxLength":64,"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."},"strict":{"type":"boolean","default":false,"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"},"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."},"parameters":{"$ref":"#/components/schemas/OpenAIFunctionParameters","description":"These are the parameters the functions accepts, described as a JSON Schema object.\n\nSee the [OpenAI guide](https://platform.openai.com/docs/guides/function-calling) for examples, and the [JSON Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format.\n\nOmitting parameters defines a function with an empty parameter list."}},"required":["name","description","parameters"],"title":"KnowledgeBaseToolFunction"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationAssistant"},{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/HandoffDestinationAssistant"},{"$ref":"#/components/schemas/HandoffDestinationDynamic"},{"$ref":"#/components/schemas/HandoffDestinationSquad"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType":{"type":"string","enum":["bash_20241022"],"description":"The sub type of tool.","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName":{"type":"string","enum":["bash"],"default":"bash","description":"The name of the tool, fixed to 'bash'","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType":{"type":"string","enum":["computer_20241022"],"description":"The sub type of tool.","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName":{"type":"string","enum":["computer"],"default":"computer","description":"The name of the tool, fixed to 'computer'","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType":{"type":"string","enum":["text_editor_20241022"],"description":"The sub type of tool.","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName":{"type":"string","enum":["str_replace_editor"],"default":"str_replace_editor","description":"The name of the tool, fixed to 'str_replace_editor'","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb":{"type":"string","enum":["INFO","MESSAGE","NOTIFY"],"description":"The SIP method to send.","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/JsonSchema"}],"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.","title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody"},"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"ToolGetResponsesContentApplicationJsonSchemaItems":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."}},"required":["type","method","id","orgId","createdAt","updatedAt","url"],"description":"A reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses."},{"type":"object","properties":{"type":{"type":"string","enum":["code"],"description":"Discriminator value: code"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"code":{"type":"string","maxLength":50000,"description":"TypeScript code to execute when the tool is called"},"environmentVariables":{"type":"array","items":{"$ref":"#/components/schemas/CodeToolEnvironmentVariable"},"description":"Environment variables available in code via `env` object"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10"},"credentialId":{"type":"string","description":"Credential ID containing the Val Town API key"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool."}},"required":["type","code","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that executes TypeScript code with configured credentials, environment variables, and timeout."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send DTMF keypad tones during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant end the active call."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable custom function tool that sends model-generated arguments to a configured server and returns the result to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["knowledgeBase"],"description":"Discriminator value: knowledgeBase"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"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."},"knowledgeBaseId":{"type":["string","null"],"format":"uuid","description":"The knowledge base this tool searches. At most one search tool references a knowledge base. Deleting the base also deletes its generated tool; null references are retained only for backward compatibility and are inert."},"function":{"$ref":"#/components/schemas/KnowledgeBaseToolFunction"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","knowledgeBaseId","function","id","orgId","createdAt","updatedAt"],"description":"knowledgeBase variant"},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that transfers the active call to one of its configured destinations."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that hands a conversation to another assistant, squad, or dynamically selected destination."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that executes shell commands in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name","displayWidthPx","displayHeightPx"],"description":"A reusable tool that lets the model interact with a computer display through screen, pointer, and keyboard actions."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that reads and edits text files in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that searches configured knowledge bases and returns relevant content to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds events to a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that appends rows to a connected Google Sheet."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks availability in a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send a message to Slack."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send an SMS message during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that connects an assistant to a Model Context Protocol server and exposes its available tools."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks calendar availability in a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds calendar events to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds contacts to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that retrieves contacts from a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","verb","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable voicemail-detection tool with optional beep detection for supported calls."}],"discriminator":{"propertyName":"type"},"title":"ToolGetResponsesContentApplicationJsonSchemaItems"},"tools_create_Request":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","method","url"],"description":"Configuration used to create a reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that lets an assistant send DTMF keypad tones during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that lets an assistant end the active call."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a custom function tool that sends model-generated arguments to a server and returns the result to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that transfers the active call to one of its configured destinations."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that hands a conversation to another assistant, squad, or dynamically selected destination."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"name":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","subType","name"],"description":"Configuration used to create a tool that executes shell commands in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"name":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","subType","name","displayWidthPx","displayHeightPx"],"description":"Configuration used to create a tool that lets the model interact with a computer display through screen, pointer, and keyboard actions."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"name":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","subType","name"],"description":"Configuration used to create a tool that reads and edits text files in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that searches configured knowledge bases and returns relevant content to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that adds events to a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that appends rows to a connected Google Sheet."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that checks availability in a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that lets an assistant send a message to Slack."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that lets an assistant send an SMS message during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that connects an assistant to a Model Context Protocol server and exposes its available tools."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that checks calendar availability in a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that adds calendar events to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that adds contacts to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a tool that retrieves contacts from a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","verb"],"description":"Configuration used to create a tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Configuration used to create a voicemail-detection tool with optional beep detection for supported calls."}],"discriminator":{"propertyName":"type"},"title":"tools_create_Request"},"tools_create_Response_201":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."}},"required":["type","method","id","orgId","createdAt","updatedAt","url"],"description":"A reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses."},{"type":"object","properties":{"type":{"type":"string","enum":["code"],"description":"Discriminator value: code"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"code":{"type":"string","maxLength":50000,"description":"TypeScript code to execute when the tool is called"},"environmentVariables":{"type":"array","items":{"$ref":"#/components/schemas/CodeToolEnvironmentVariable"},"description":"Environment variables available in code via `env` object"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10"},"credentialId":{"type":"string","description":"Credential ID containing the Val Town API key"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool."}},"required":["type","code","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that executes TypeScript code with configured credentials, environment variables, and timeout."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send DTMF keypad tones during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant end the active call."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable custom function tool that sends model-generated arguments to a configured server and returns the result to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["knowledgeBase"],"description":"Discriminator value: knowledgeBase"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"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."},"knowledgeBaseId":{"type":["string","null"],"format":"uuid","description":"The knowledge base this tool searches. At most one search tool references a knowledge base. Deleting the base also deletes its generated tool; null references are retained only for backward compatibility and are inert."},"function":{"$ref":"#/components/schemas/KnowledgeBaseToolFunction"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","knowledgeBaseId","function","id","orgId","createdAt","updatedAt"],"description":"knowledgeBase variant"},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that transfers the active call to one of its configured destinations."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that hands a conversation to another assistant, squad, or dynamically selected destination."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that executes shell commands in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name","displayWidthPx","displayHeightPx"],"description":"A reusable tool that lets the model interact with a computer display through screen, pointer, and keyboard actions."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that reads and edits text files in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that searches configured knowledge bases and returns relevant content to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds events to a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that appends rows to a connected Google Sheet."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks availability in a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send a message to Slack."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send an SMS message during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that connects an assistant to a Model Context Protocol server and exposes its available tools."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks calendar availability in a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds calendar events to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds contacts to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that retrieves contacts from a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","verb","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable voicemail-detection tool with optional beep detection for supported calls."}],"discriminator":{"propertyName":"type"},"title":"tools_create_Response_201"},"tools_get_Response_200":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."}},"required":["type","method","id","orgId","createdAt","updatedAt","url"],"description":"A reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses."},{"type":"object","properties":{"type":{"type":"string","enum":["code"],"description":"Discriminator value: code"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"code":{"type":"string","maxLength":50000,"description":"TypeScript code to execute when the tool is called"},"environmentVariables":{"type":"array","items":{"$ref":"#/components/schemas/CodeToolEnvironmentVariable"},"description":"Environment variables available in code via `env` object"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10"},"credentialId":{"type":"string","description":"Credential ID containing the Val Town API key"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool."}},"required":["type","code","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that executes TypeScript code with configured credentials, environment variables, and timeout."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send DTMF keypad tones during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant end the active call."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable custom function tool that sends model-generated arguments to a configured server and returns the result to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["knowledgeBase"],"description":"Discriminator value: knowledgeBase"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"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."},"knowledgeBaseId":{"type":["string","null"],"format":"uuid","description":"The knowledge base this tool searches. At most one search tool references a knowledge base. Deleting the base also deletes its generated tool; null references are retained only for backward compatibility and are inert."},"function":{"$ref":"#/components/schemas/KnowledgeBaseToolFunction"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","knowledgeBaseId","function","id","orgId","createdAt","updatedAt"],"description":"knowledgeBase variant"},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that transfers the active call to one of its configured destinations."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that hands a conversation to another assistant, squad, or dynamically selected destination."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that executes shell commands in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name","displayWidthPx","displayHeightPx"],"description":"A reusable tool that lets the model interact with a computer display through screen, pointer, and keyboard actions."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that reads and edits text files in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that searches configured knowledge bases and returns relevant content to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds events to a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that appends rows to a connected Google Sheet."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks availability in a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send a message to Slack."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send an SMS message during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that connects an assistant to a Model Context Protocol server and exposes its available tools."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks calendar availability in a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds calendar events to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds contacts to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that retrieves contacts from a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","verb","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable voicemail-detection tool with optional beep detection for supported calls."}],"discriminator":{"propertyName":"type"},"title":"tools_get_Response_200"},"tools_delete_Response_200":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."}},"required":["type","method","id","orgId","createdAt","updatedAt","url"],"description":"A reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses."},{"type":"object","properties":{"type":{"type":"string","enum":["code"],"description":"Discriminator value: code"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"code":{"type":"string","maxLength":50000,"description":"TypeScript code to execute when the tool is called"},"environmentVariables":{"type":"array","items":{"$ref":"#/components/schemas/CodeToolEnvironmentVariable"},"description":"Environment variables available in code via `env` object"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10"},"credentialId":{"type":"string","description":"Credential ID containing the Val Town API key"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool."}},"required":["type","code","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that executes TypeScript code with configured credentials, environment variables, and timeout."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send DTMF keypad tones during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant end the active call."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable custom function tool that sends model-generated arguments to a configured server and returns the result to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["knowledgeBase"],"description":"Discriminator value: knowledgeBase"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"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."},"knowledgeBaseId":{"type":["string","null"],"format":"uuid","description":"The knowledge base this tool searches. At most one search tool references a knowledge base. Deleting the base also deletes its generated tool; null references are retained only for backward compatibility and are inert."},"function":{"$ref":"#/components/schemas/KnowledgeBaseToolFunction"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","knowledgeBaseId","function","id","orgId","createdAt","updatedAt"],"description":"knowledgeBase variant"},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that transfers the active call to one of its configured destinations."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that hands a conversation to another assistant, squad, or dynamically selected destination."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that executes shell commands in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name","displayWidthPx","displayHeightPx"],"description":"A reusable tool that lets the model interact with a computer display through screen, pointer, and keyboard actions."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that reads and edits text files in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that searches configured knowledge bases and returns relevant content to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds events to a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that appends rows to a connected Google Sheet."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks availability in a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send a message to Slack."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send an SMS message during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that connects an assistant to a Model Context Protocol server and exposes its available tools."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks calendar availability in a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds calendar events to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds contacts to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that retrieves contacts from a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","verb","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable voicemail-detection tool with optional beep detection for supported calls."}],"discriminator":{"propertyName":"type"},"title":"tools_delete_Response_200"},"ToolPinnedConflictResponseDtoError":{"type":"string","enum":["tool_pinned"],"title":"ToolPinnedConflictResponseDtoError"},"ToolPinnedConflictResponseDTO":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/ToolPinnedConflictResponseDtoError"},"message":{"type":"string","description":"Human-readable reason the parent-tool delete was rejected."}},"required":["error","message"],"title":"ToolPinnedConflictResponseDTO"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod":{"type":"string","enum":["POST","GET","PUT","PATCH","DELETE"],"description":"The HTTP method used for the API request.","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/TransferDestinationAssistant"},{"$ref":"#/components/schemas/TransferDestinationNumber"},{"$ref":"#/components/schemas/TransferDestinationSip"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems":{"oneOf":[{"$ref":"#/components/schemas/HandoffDestinationAssistant"},{"$ref":"#/components/schemas/HandoffDestinationDynamic"},{"$ref":"#/components/schemas/HandoffDestinationSquad"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType":{"type":"string","enum":["bash_20241022"],"description":"The sub type of tool.","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName":{"type":"string","enum":["bash"],"default":"bash","description":"The name of the tool, fixed to 'bash'","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType":{"type":"string","enum":["computer_20241022"],"description":"The sub type of tool.","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName":{"type":"string","enum":["computer"],"default":"computer","description":"The name of the tool, fixed to 'computer'","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType":{"type":"string","enum":["text_editor_20241022"],"description":"The sub type of tool.","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName":{"type":"string","enum":["str_replace_editor"],"default":"str_replace_editor","description":"The name of the tool, fixed to 'str_replace_editor'","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb":{"type":"string","enum":["INFO","MESSAGE","NOTIFY"],"description":"The SIP method to send.","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody":{"oneOf":[{"type":"string"},{"$ref":"#/components/schemas/JsonSchema"}],"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.","title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody"},"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ToolMessageStart"},{"$ref":"#/components/schemas/ToolMessageComplete"},{"$ref":"#/components/schemas/ToolMessageFailed"},{"$ref":"#/components/schemas/ToolMessageDelayed"}],"title":"ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"tools_update_Request":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."}},"required":["type"],"description":"Fields used to update an API-request tool, including its URL, HTTP method, authentication, request data, retries, and response handling."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a DTMF tool, including its spoken messages, rejection plan, and SIP INFO behavior."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update an end-call tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."}},"required":["type"],"description":"Fields used to update a custom function tool, including its function definition, server, parameters, messages, and execution behavior."},{"type":"object","properties":{"type":{"type":"string","enum":["knowledgeBase"],"description":"Discriminator value: knowledgeBase"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"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."},"knowledgeBaseId":{"type":["string","null"],"format":"uuid","description":"The knowledge base this tool searches. At most one search tool references a knowledge base. Deleting the base also deletes its generated tool; null references are retained only for backward compatibility and are inert."},"function":{"$ref":"#/components/schemas/KnowledgeBaseToolFunction"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"knowledgeBase variant"},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a call-transfer tool, including its destinations, spoken messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"}},"required":["type"],"description":"Fields used to update a handoff tool, including its destinations, function definition, default result, messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName","default":"bash","description":"The name of the tool, fixed to 'bash'"}},"required":["type"],"description":"Fields used to update a Bash tool, including its name, environment subtype, server, messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName","default":"computer","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"}},"required":["type"],"description":"Fields used to update a computer tool, including its display settings, environment subtype, server, messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","default":"str_replace_editor","description":"The name of the tool, fixed to 'str_replace_editor'"}},"required":["type"],"description":"Fields used to update a text-editor tool, including its name, environment subtype, server, messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a query tool, including its knowledge bases, spoken messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a Google Calendar event-creation tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a Google Sheets row-append tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a Google Calendar availability tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a Slack message tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update an SMS tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."}},"required":["type"],"description":"Fields used to update an MCP tool, including its server, connection metadata, exposed tool messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a GoHighLevel calendar-availability tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a GoHighLevel calendar-event tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a GoHighLevel contact-creation tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a GoHighLevel contact-retrieval tool, including its spoken messages and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a SIP-request tool, including its method, headers, body, spoken messages, and rejection plan."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type"],"description":"Fields used to update a voicemail-detection tool, including beep detection, spoken messages, and rejection plan."}],"discriminator":{"propertyName":"type"},"title":"tools_update_Request"},"tools_update_Response_200":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["apiRequest"],"description":"Discriminator value: apiRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems"},"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."},"name":{"type":"string","pattern":"/^[a-zA-Z0-9_-]{1,40}$/","maxLength":40,"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."},"method":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod","description":"The HTTP method used for the API request."},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":300,"description":"This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20"},"credentialId":{"type":"string","description":"The credential ID for API request authentication"},"encryptedPaths":{"type":"array","items":{"type":"string"},"description":"This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined."},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"description":{"type":"string","description":"This is the description of the tool. This will be passed to the model."},"url":{"type":"string","description":"This is where the request will be sent."},"body":{"$ref":"#/components/schemas/JsonSchema","description":"This is the body of the request."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"These are the headers to send with the request."},"backoffPlan":{"$ref":"#/components/schemas/BackoffPlan","description":"This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"This is the plan to extract variables from the tool's response. These will be accessible during the call and stored in `call.artifact.variableValues` after the call.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{customer.name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{customer.age}}\"\n    }\n  ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{$[0].name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{$[0].age}}\"\n    }\n  ]\n}\n```\n\n$ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item in the array. Note, $ is available regardless of the response body type (both object and array).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n  \"aliases\": [\n    {\n      \"key\": \"customerName\",\n      \"value\": \"{{tool.response.headers.customer-name}}\"\n    },\n    {\n      \"key\": \"customerAge\",\n      \"value\": \"{{tool.response.headers.customer-age}}\"\n    }\n  ]\n}\n```\n\n`tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type (both object and array).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"string\"\n      },\n      \"age\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\"\n          },\n          \"last\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"zipCodes\",\n    \"items\": {\n      \"type\": \"string\"\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.4. If you hit example.com and it returns `[{\"name\": \"John\", \"age\": 30, \"zipCodes\": [\"94123\", \"94124\"]}, {\"name\": \"Jane\", \"age\": 25, \"zipCodes\": [\"94125\", \"94126\"]}]`, then you can specify the schema as:\n\n```json\n{\n  \"schema\": {\n    \"type\": \"array\",\n    \"title\": \"people\",\n    \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\"\n        },\n        \"age\": {\n          \"type\": \"number\"\n        },\n        \"zipCodes\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nThis will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1] }}`.\n\nNote: Both `aliases` and `schema` can be used together."}},"required":["type","method","id","orgId","createdAt","updatedAt","url"],"description":"A reusable tool that sends HTTP requests to a configured API and can authenticate, retry failures, and extract variables from responses."},{"type":"object","properties":{"type":{"type":"string","enum":["code"],"description":"Discriminator value: code"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"code":{"type":"string","maxLength":50000,"description":"TypeScript code to execute when the tool is called"},"environmentVariables":{"type":"array","items":{"$ref":"#/components/schemas/CodeToolEnvironmentVariable"},"description":"Environment variables available in code via `env` object"},"timeoutSeconds":{"type":"number","format":"double","minimum":1,"maximum":30,"description":"This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10"},"credentialId":{"type":"string","description":"Credential ID containing the Val Town API key"},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool."}},"required":["type","code","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that executes TypeScript code with configured credentials, environment variables, and timeout."},{"type":"object","properties":{"type":{"type":"string","enum":["dtmf"],"description":"Discriminator value: dtmf"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems"},"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."},"sipInfoDtmfEnabled":{"type":"boolean","default":false,"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send DTMF keypad tones during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["endCall"],"description":"Discriminator value: endCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant end the active call."},{"type":"object","properties":{"type":{"type":"string","enum":["function"],"description":"Discriminator value: function"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems"},"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."},"async":{"type":"boolean","description":"This determines if the tool is async.\n\n  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.\n\n  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.\n\n  Defaults to synchronous (`false`)."},"server":{"$ref":"#/components/schemas/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."},"variableExtractionPlan":{"$ref":"#/components/schemas/VariableExtractionPlan","description":"Plan to extract variables from the tool response"},"parameters":{"type":"array","items":{"$ref":"#/components/schemas/ToolParameter"},"description":"Static key-value pairs merged into the request body. Values support Liquid templates."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","description":"This is the function definition of the tool."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable custom function tool that sends model-generated arguments to a configured server and returns the result to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["knowledgeBase"],"description":"Discriminator value: knowledgeBase"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingKnowledgeBaseMessagesItems"},"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."},"knowledgeBaseId":{"type":["string","null"],"format":"uuid","description":"The knowledge base this tool searches. At most one search tool references a knowledge base. Deleting the base also deletes its generated tool; null references are retained only for backward compatibility and are inert."},"function":{"$ref":"#/components/schemas/KnowledgeBaseToolFunction"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","knowledgeBaseId","function","id","orgId","createdAt","updatedAt"],"description":"knowledgeBase variant"},{"type":"object","properties":{"type":{"type":"string","enum":["transferCall"],"description":"Discriminator value: transferCall"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems"},"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."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that transfers the active call to one of its configured destinations."},{"type":"object","properties":{"type":{"type":"string","enum":["handoff"],"description":"Discriminator value: handoff"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems"},"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."},"defaultResult":{"type":"string","description":"This is the default local tool result message used when no runtime handoff result override is returned."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"function":{"$ref":"#/components/schemas/OpenAIFunction","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that hands a conversation to another assistant, squad, or dynamically selected destination."},{"type":"object","properties":{"type":{"type":"string","enum":["bash"],"description":"Discriminator value: bash"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName","description":"The name of the tool, fixed to 'bash'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that executes shell commands in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["computer"],"description":"Discriminator value: computer"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName","description":"The name of the tool, fixed to 'computer'"},"displayWidthPx":{"type":"number","format":"double","description":"The display width in pixels"},"displayHeightPx":{"type":"number","format":"double","description":"The display height in pixels"},"displayNumber":{"type":"number","format":"double","description":"Optional display number"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name","displayWidthPx","displayHeightPx"],"description":"A reusable tool that lets the model interact with a computer display through screen, pointer, and keyboard actions."},{"type":"object","properties":{"type":{"type":"string","enum":["textEditor"],"description":"Discriminator value: textEditor"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems"},"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."},"subType":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType","description":"The sub type of tool."},"server":{"$ref":"#/components/schemas/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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"name":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName","description":"The name of the tool, fixed to 'str_replace_editor'"}},"required":["type","subType","id","orgId","createdAt","updatedAt","name"],"description":"A reusable tool that reads and edits text files in a configured environment."},{"type":"object","properties":{"type":{"type":"string","enum":["query"],"description":"Discriminator value: query"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems"},"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."},"knowledgeBases":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBase"},"description":"The knowledge bases to query"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that searches configured knowledge bases and returns relevant content to the assistant."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.event.create"],"description":"Discriminator value: google.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds events to a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["google.sheets.row.append"],"description":"Discriminator value: google.sheets.row.append"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that appends rows to a connected Google Sheet."},{"type":"object","properties":{"type":{"type":"string","enum":["google.calendar.availability.check"],"description":"Discriminator value: google.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks availability in a connected Google Calendar."},{"type":"object","properties":{"type":{"type":"string","enum":["slack.message.send"],"description":"Discriminator value: slack.message.send"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send a message to Slack."},{"type":"object","properties":{"type":{"type":"string","enum":["sms"],"description":"Discriminator value: sms"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that lets an assistant send an SMS message during a call."},{"type":"object","properties":{"type":{"type":"string","enum":["mcp"],"description":"Discriminator value: mcp"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems"},"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."},"server":{"$ref":"#/components/schemas/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."},"toolMessages":{"type":"array","items":{"$ref":"#/components/schemas/McpToolMessages"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"},"metadata":{"$ref":"#/components/schemas/McpToolMetadata","description":"Connection metadata for the MCP server, including its communication protocol."}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that connects an assistant to a Model Context Protocol server and exposes its available tools."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.availability.check"],"description":"Discriminator value: gohighlevel.calendar.availability.check"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that checks calendar availability in a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.calendar.event.create"],"description":"Discriminator value: gohighlevel.calendar.event.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds calendar events to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.create"],"description":"Discriminator value: gohighlevel.contact.create"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that adds contacts to a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["gohighlevel.contact.get"],"description":"Discriminator value: gohighlevel.contact.get"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems"},"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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that retrieves contacts from a connected GoHighLevel account."},{"type":"object","properties":{"type":{"type":"string","enum":["sipRequest"],"description":"Discriminator value: sipRequest"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems"},"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."},"verb":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb","description":"The SIP method to send."},"headers":{"$ref":"#/components/schemas/JsonSchema","description":"JSON schema for headers the model should populate when sending the SIP request."},"body":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody","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."},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","verb","id","orgId","createdAt","updatedAt"],"description":"A reusable tool that sends SIP `INFO`, `MESSAGE`, or `NOTIFY` requests with configured headers and body."},{"type":"object","properties":{"type":{"type":"string","enum":["voicemail"],"description":"Discriminator value: voicemail"},"latestVersion":{"type":["string","null"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems"},"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."},"beepDetectionEnabled":{"type":"boolean","default":false,"description":"This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false"},"id":{"type":"string","description":"This is the unique identifier for the tool."},"orgId":{"type":"string","description":"This is the unique identifier for the organization that this tool belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the tool was last updated."},"rejectionPlan":{"$ref":"#/components/schemas/ToolRejectionPlan","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```"}},"required":["type","id","orgId","createdAt","updatedAt"],"description":"A reusable voicemail-detection tool with optional beep detection for supported calls."}],"discriminator":{"propertyName":"type"},"title":"tools_update_Response_200"},"FileObject":{"type":"string","enum":["file"],"description":"The object type. This is always `file`.","title":"FileObject"},"FileStatus":{"type":"string","enum":["processing","done","failed"],"description":"The current processing status of the uploaded file.","title":"FileStatus"},"FileMetadata":{"type":"object","properties":{},"description":"Additional metadata associated with the uploaded file.","title":"FileMetadata"},"File":{"type":"object","properties":{"object":{"$ref":"#/components/schemas/FileObject","description":"The object type. This is always `file`."},"status":{"$ref":"#/components/schemas/FileStatus","description":"The current processing status of the uploaded file."},"name":{"type":"string","maxLength":40,"description":"This is the name of the file. This is just for your own reference."},"originalName":{"type":"string","description":"The original name of the uploaded file."},"bytes":{"type":"number","format":"double","description":"The size of the uploaded file in bytes."},"purpose":{"type":"string","description":"The intended use assigned to the uploaded file."},"mimetype":{"type":"string","description":"The MIME type of the uploaded file."},"key":{"type":"string","description":"The object-storage key for the uploaded file."},"path":{"type":"string","description":"The object-storage path for the uploaded file."},"bucket":{"type":"string","description":"The object-storage bucket containing the uploaded file."},"url":{"type":"string","description":"The URL used to access the uploaded file."},"parsedTextUrl":{"type":"string","description":"The URL used to access text extracted from the file."},"parsedTextBytes":{"type":"number","format":"double","description":"The size of the extracted text in bytes."},"metadata":{"$ref":"#/components/schemas/FileMetadata","description":"Additional metadata associated with the uploaded file."},"id":{"type":"string","description":"This is the unique identifier for the file."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this file belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the file was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the file was last updated."}},"required":["id","orgId","createdAt","updatedAt"],"description":"An uploaded file record, including its processing status, storage details, extracted-text location, metadata, and lifecycle timestamps.","title":"File"},"FilePostRequestBodyContentMultipartFormDataSchemaPurpose":{"type":"string","enum":["assistant","composer-attachment","knowledge-base-v2"],"description":"Optional product flow that owns the uploaded file.","title":"FilePostRequestBodyContentMultipartFormDataSchemaPurpose"},"UpdateFileDTO":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the file. This is just for your own reference."}},"description":"Fields used to update an uploaded file. Currently, the file name can be changed.","title":"UpdateFileDTO"},"KnowledgeBaseV2":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":["string","null"],"maxLength":1000},"id":{"type":"string"},"orgId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["name","id","orgId","createdAt","updatedAt"],"title":"KnowledgeBaseV2"},"CreateKnowledgeBaseV2DTO":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":["string","null"],"maxLength":1000}},"required":["name"],"title":"CreateKnowledgeBaseV2DTO"},"KnowledgeBaseV2FileStatus":{"type":"string","enum":["indexing","ready","failed"],"title":"KnowledgeBaseV2FileStatus"},"KnowledgeBaseV2File":{"type":"object","properties":{"id":{"type":"string"},"knowledgeBaseV2Id":{"type":"string"},"fileId":{"type":"string"},"fileName":{"type":"string"},"mimetype":{"type":"string"},"bytes":{"type":"number","format":"double"},"status":{"$ref":"#/components/schemas/KnowledgeBaseV2FileStatus"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","knowledgeBaseV2Id","fileId","status","createdAt","updatedAt"],"title":"KnowledgeBaseV2File"},"AttachKnowledgeBaseV2FileDTO":{"type":"object","properties":{"fileId":{"type":"string"}},"required":["fileId"],"title":"AttachKnowledgeBaseV2FileDTO"},"KnowledgeBaseV2WithFiles":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":["string","null"],"maxLength":1000},"id":{"type":"string"},"orgId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"files":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeBaseV2File"}},"toolId":{"type":["string","null"],"description":"Id of the tool that searches this knowledge base (at most one per base; provisioned on creation). Attach it to an assistant via model.toolIds. Null when the base has no search tool yet."}},"required":["name","id","orgId","createdAt","updatedAt","files","toolId"],"title":"KnowledgeBaseV2WithFiles"},"UpdateKnowledgeBaseV2DTO":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":["string","null"],"maxLength":1000}},"title":"UpdateKnowledgeBaseV2DTO"},"StructuredOutputGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"StructuredOutputGetParametersSortOrder"},"StructuredOutputGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"StructuredOutputGetParametersSortBy"},"StructuredOutputType":{"type":"string","enum":["ai","regex"],"description":"This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM.","title":"StructuredOutputType"},"StructuredOutputModel":{"oneOf":[{"$ref":"#/components/schemas/WorkflowOpenAIModel"},{"$ref":"#/components/schemas/WorkflowAnthropicModel"},{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModel"},{"$ref":"#/components/schemas/WorkflowGoogleModel"},{"$ref":"#/components/schemas/WorkflowCustomModel"}],"description":"This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.","title":"StructuredOutputModel"},"StructuredOutputConditionsItems":{"oneOf":[{"$ref":"#/components/schemas/MinMessagesCondition"},{"$ref":"#/components/schemas/MinCallDurationCondition"},{"$ref":"#/components/schemas/EndedReasonCondition"}],"title":"StructuredOutputConditionsItems"},"StructuredOutput":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/StructuredOutputType","description":"This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM."},"regex":{"type":"string","minLength":1,"maxLength":1000,"description":"This is the regex pattern to match against the transcript.\n\nOnly used when type is 'regex'. Supports both raw patterns (e.g. '\\d+') and\nregex literal format (e.g. '/\\d+/gi'). Uses RE2 syntax for safety.\n\nThe result depends on the schema type:\n- boolean: true if the pattern matches, false otherwise\n- string: the first match or first capture group\n- number/integer: the first match parsed as a number\n- array: all matches"},"model":{"$ref":"#/components/schemas/StructuredOutputModel","description":"This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used."},"compliancePlan":{"$ref":"#/components/schemas/ComplianceOverride","description":"Compliance configuration for this output. Only enable overrides if no sensitive data will be stored."},"conditions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/StructuredOutputConditionsItems"},"description":"These are the conditions that gate the execution of this structured output. Every condition must pass for the structured output to run (AND semantics). When omitted or empty, no user-defined conditions gate this output. Send null to clear a previously saved gate."},"id":{"type":"string","description":"This is the unique identifier for the structured output."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this structured output belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the structured output was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the structured output was last updated."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the structured output."},"description":{"type":"string","description":"This is the description of what the structured output extracts.\n\nUse this to provide context about what data will be extracted and how it will be used."},"assistantIds":{"type":"array","items":{"type":"string"},"description":"These are the assistant IDs that this structured output is linked to.\n\nWhen linked to assistants, this structured output will be available for extraction during those assistant's calls."},"workflowIds":{"type":"array","items":{"type":"string"},"description":"These are the workflow IDs that this structured output is linked to.\n\nWhen linked to workflows, this structured output will be available for extraction during those workflow's execution."},"schema":{"$ref":"#/components/schemas/JsonSchema","description":"This is the JSON Schema definition for the structured output.\n\nDefines the structure and validation rules for the data that will be extracted. Supports all JSON Schema features including:\n- Objects and nested properties\n- Arrays and array validation\n- String, number, boolean, and null types\n- Enums and const values\n- Validation constraints (min/max, patterns, etc.)\n- Composition with allOf, anyOf, oneOf"}},"required":["id","orgId","createdAt","updatedAt","name","schema"],"description":"A saved structured-output definition containing its extraction schema, execution method, model or regular expression, linked resources, and lifecycle metadata.","title":"StructuredOutput"},"StructuredOutputPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/StructuredOutput"},"description":"The structured-output definitions returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the structured-output result set."}},"required":["results","metadata"],"description":"A paginated collection of structured-output definitions and metadata describing the result set.","title":"StructuredOutputPaginatedResponse"},"UpdateStructuredOutputDtoType":{"type":"string","enum":["ai","regex"],"description":"This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM.","title":"UpdateStructuredOutputDtoType"},"UpdateStructuredOutputDtoModel":{"oneOf":[{"$ref":"#/components/schemas/WorkflowOpenAIModel"},{"$ref":"#/components/schemas/WorkflowAnthropicModel"},{"$ref":"#/components/schemas/WorkflowAnthropicBedrockModel"},{"$ref":"#/components/schemas/WorkflowGoogleModel"},{"$ref":"#/components/schemas/WorkflowCustomModel"}],"description":"This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.","title":"UpdateStructuredOutputDtoModel"},"UpdateStructuredOutputDtoConditionsItems":{"oneOf":[{"$ref":"#/components/schemas/MinMessagesCondition"},{"$ref":"#/components/schemas/MinCallDurationCondition"},{"$ref":"#/components/schemas/EndedReasonCondition"}],"title":"UpdateStructuredOutputDtoConditionsItems"},"UpdateStructuredOutputDTO":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/UpdateStructuredOutputDtoType","description":"This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM."},"regex":{"type":"string","minLength":1,"maxLength":1000,"description":"This is the regex pattern to match against the transcript.\n\nOnly used when type is 'regex'. Supports both raw patterns (e.g. '\\d+') and\nregex literal format (e.g. '/\\d+/gi'). Uses RE2 syntax for safety.\n\nThe result depends on the schema type:\n- boolean: true if the pattern matches, false otherwise\n- string: the first match or first capture group\n- number/integer: the first match parsed as a number\n- array: all matches"},"model":{"$ref":"#/components/schemas/UpdateStructuredOutputDtoModel","description":"This is the model that will be used to extract the structured output.\n\nTo provide your own custom system and user prompts for structured output extraction, populate the messages array with your system and user messages. You can specify liquid templating in your system and user messages.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used."},"compliancePlan":{"$ref":"#/components/schemas/ComplianceOverride","description":"Compliance configuration for this output. Only enable overrides if no sensitive data will be stored."},"conditions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/UpdateStructuredOutputDtoConditionsItems"},"description":"These are the conditions that gate the execution of this structured output. Every condition must pass for the structured output to run (AND semantics). When omitted or empty, no user-defined conditions gate this output. Send null to clear a previously saved gate."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the structured output."},"description":{"type":"string","description":"This is the description of what the structured output extracts.\n\nUse this to provide context about what data will be extracted and how it will be used."},"assistantIds":{"type":"array","items":{"type":"string"},"description":"These are the assistant IDs that this structured output is linked to.\n\nWhen linked to assistants, this structured output will be available for extraction during those assistant's calls."},"workflowIds":{"type":"array","items":{"type":"string"},"description":"These are the workflow IDs that this structured output is linked to.\n\nWhen linked to workflows, this structured output will be available for extraction during those workflow's execution."},"schema":{"$ref":"#/components/schemas/JsonSchema","description":"This is the JSON Schema definition for the structured output.\n\nDefines the structure and validation rules for the data that will be extracted. Supports all JSON Schema features including:\n- Objects and nested properties\n- Arrays and array validation\n- String, number, boolean, and null types\n- Enums and const values\n- Validation constraints (min/max, patterns, etc.)\n- Composition with allOf, anyOf, oneOf"}},"description":"Fields used to update a structured-output definition, including its name, extraction schema, execution method, model or regular expression, compliance settings, and linked resources.","title":"UpdateStructuredOutputDTO"},"StructuredOutputRunDTO":{"type":"object","properties":{"previewEnabled":{"type":"boolean","default":false,"description":"This is the preview flag for the re-run. If true, the re-run will be executed and the response will be returned immediately and the call artifact will NOT be updated.\nIf false (default), the re-run will be executed and the response will be updated in the call artifact."},"structuredOutputId":{"type":"string","description":"This is the ID of the structured output that will be run. This must be provided unless a transient structured output is provided.\nWhen the re-run is executed, only the value of this structured output will be replaced with the new value, or added if not present."},"structuredOutput":{"$ref":"#/components/schemas/CreateStructuredOutputDTO","description":"This is the transient structured output that will be run. This must be provided if a structured output ID is not provided.\nWhen the re-run is executed, the structured output value will be added to the existing artifact."},"callIds":{"type":"array","items":{"type":"string"},"description":"This is the array of callIds that will be updated with the new structured output value. If preview is true, this array must be provided and contain exactly 1 callId.\nIf preview is false, up to 100 callIds may be provided."}},"required":["callIds"],"description":"A request to run a saved or transient structured-output definition against one or more calls, either as a preview or as an artifact update.","title":"StructuredOutputRunDTO"},"StructuredOutputsStructuredOutputControllerRunResponse2000":{"type":"object","properties":{"skipped":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SkippedStructuredOutput"},"description":"These are the structured outputs whose conditions gated them, keyed by\nstructured output id. Absent when nothing was skipped. An entry here means\nno extraction ran and no cost was incurred for that output."}},"title":"StructuredOutputsStructuredOutputControllerRunResponse2000"},"StructuredOutputRerunResponse":{"type":"object","properties":{"workflowId":{"type":"string","description":"This is the id of the workflow processing the rerun."},"message":{"type":"string"}},"required":["message"],"title":"StructuredOutputRerunResponse"},"Structured Outputs_StructuredOutputController_run_Response_200":{"oneOf":[{"$ref":"#/components/schemas/StructuredOutputsStructuredOutputControllerRunResponse2000"},{"$ref":"#/components/schemas/StructuredOutputRerunResponse"}],"title":"Structured Outputs_StructuredOutputController_run_Response_200"},"EvalSimulationPersonalityGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalSimulationPersonalityGetParametersSortOrder"},"EvalSimulationPersonalityGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalSimulationPersonalityGetParametersSortBy"},"Personality":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"This is the unique identifier for the personality."},"orgId":{"type":["string","null"],"format":"uuid","description":"This is the unique identifier for the organization this personality belongs to.\nIf null, this is a Vapi-provided default personality available to all organizations."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the personality was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the personality was last updated."},"name":{"type":"string","maxLength":80,"description":"This is the name of the personality (e.g., \"Confused Carl\", \"Rude Rob\")."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the full assistant configuration for this personality.\nIt defines the tester's voice, model, behavior via system prompt, and other settings."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing personalities.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["id","orgId","createdAt","updatedAt","name","assistant"],"title":"Personality"},"CreatePersonalityDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"The display name of the personality, for example `Impatient customer`."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"The assistant configuration for the AI tester: the model, voice, and system prompt that determine how the AI tester behaves during the conversation."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing personalities.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["name","assistant"],"title":"CreatePersonalityDTO"},"UpdatePersonalityDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"This is the name of the personality."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the full assistant configuration for this personality."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing personalities.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nSet to null to remove from folder."}},"title":"UpdatePersonalityDTO"},"EvalSimulationScenarioGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalSimulationScenarioGetParametersSortOrder"},"EvalSimulationScenarioGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalSimulationScenarioGetParametersSortBy"},"EvaluationPlanItemComparator":{"type":"string","enum":["=","!=",">","<",">=","<="],"description":"How the structured output value is compared against `value`. Available operators depend on the output type. Boolean and string support `=` and `!=`; number and integer support `=`, `!=`, `>`, `<`, `>=`, `<=`.","title":"EvaluationPlanItemComparator"},"EvaluationPlanItemValue":{"oneOf":[{"type":"number","format":"double"},{"type":"string"},{"type":"boolean"}],"description":"The expected value the structured output is compared against. Its type should match the structured output's type, for example `true` for a boolean.","title":"EvaluationPlanItemValue"},"EvaluationPlanItem":{"type":"object","properties":{"structuredOutputId":{"type":"string","format":"uuid","description":"The ID of an existing structured output to evaluate. Use this to reuse a structured output across scenarios. Provide either `structuredOutputId` or an inline `structuredOutput`."},"structuredOutput":{"$ref":"#/components/schemas/CreateStructuredOutputDTO","description":"An inline structured output to evaluate, defined by its name and schema. Only primitive types (string, number, integer, boolean) are allowed. Provide either this or `structuredOutputId`."},"path":{"type":"string","description":"Optional dot-notation path to a primitive leaf when evaluating an object structured output."},"comparator":{"$ref":"#/components/schemas/EvaluationPlanItemComparator","description":"How the structured output value is compared against `value`. Available operators depend on the output type. Boolean and string support `=` and `!=`; number and integer support `=`, `!=`, `>`, `<`, `>=`, `<=`."},"value":{"$ref":"#/components/schemas/EvaluationPlanItemValue","description":"The expected value the structured output is compared against. Its type should match the structured output's type, for example `true` for a boolean."},"required":{"type":"boolean","default":true,"description":"Set to `false` to record this evaluation's result without requiring it to pass. Default is `true`."}},"required":["comparator","value"],"title":"EvaluationPlanItem"},"SimulationHookCallStartedOn":{"type":"string","enum":["simulation.run.started"],"title":"SimulationHookCallStartedOn"},"SimulationHookWebhookActionType":{"type":"string","enum":["webhook"],"title":"SimulationHookWebhookActionType"},"SimulationHookInclude":{"type":"object","properties":{"transcript":{"type":"boolean","default":false,"description":"Include transcript in the hook payload"},"messages":{"type":"boolean","default":false,"description":"Include messages in the hook payload"},"recordingUrl":{"type":"boolean","default":false,"description":"Include recordingUrl in the hook payload"}},"title":"SimulationHookInclude"},"SimulationHookWebhookAction":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SimulationHookWebhookActionType"},"server":{"$ref":"#/components/schemas/Server","description":"Optional server override for this hook action.\nIf omitted, runtime defaults may apply (e.g. org server)."},"include":{"$ref":"#/components/schemas/SimulationHookInclude","description":"Optional payload include controls."}},"required":["type"],"title":"SimulationHookWebhookAction"},"SimulationHookCallStartedDoItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationHookWebhookAction"}],"title":"SimulationHookCallStartedDoItems"},"SimulationHookCallStarted":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/SimulationHookCallStartedOn"},"do":{"type":"array","items":{"$ref":"#/components/schemas/SimulationHookCallStartedDoItems"}}},"required":["on","do"],"title":"SimulationHookCallStarted"},"SimulationHookCallEndedOn":{"type":"string","enum":["simulation.run.ended"],"title":"SimulationHookCallEndedOn"},"SimulationHookCallEndedDoItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationHookWebhookAction"}],"title":"SimulationHookCallEndedDoItems"},"SimulationHookCallEnded":{"type":"object","properties":{"on":{"$ref":"#/components/schemas/SimulationHookCallEndedOn"},"do":{"type":"array","items":{"$ref":"#/components/schemas/SimulationHookCallEndedDoItems"}}},"required":["on","do"],"title":"SimulationHookCallEnded"},"ScenarioHooksItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationHookCallStarted"},{"$ref":"#/components/schemas/SimulationHookCallEnded"}],"title":"ScenarioHooksItems"},"ScenarioToolMock":{"type":"object","properties":{"toolName":{"type":"string","description":"The name of the assistant or squad's tool to mock. Must match the tool's name exactly."},"result":{"type":"string","description":"The result string returned to the assistant or squad in place of calling the real tool."},"enabled":{"type":"boolean","default":true,"description":"Set to `true` to apply this mock during the simulation. Defaults to `true`."}},"required":["toolName"],"title":"ScenarioToolMock"},"Scenario":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"This is the unique identifier for the scenario."},"orgId":{"type":"string","format":"uuid","description":"This is the unique identifier for the organization this scenario belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the scenario was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the scenario was last updated."},"name":{"type":"string","maxLength":80,"description":"This is the name of the scenario."},"instructions":{"type":"string","maxLength":10000,"description":"This is the script/instructions for the tester to follow during the simulation."},"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/EvaluationPlanItem"},"description":"This is the structured output-based evaluation plan for the simulation.\nEach item defines a structured output to extract and evaluate against an expected value."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioHooksItems"},"description":"Hooks to run on simulation lifecycle events"},"targetOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"Overrides to inject into the simulated target assistant or squad"},"toolMocks":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioToolMock"},"description":"Scenario-level tool call mocks to use during simulations."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing scenarios.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["id","orgId","createdAt","updatedAt","name","instructions","evaluations"],"title":"Scenario"},"CreateScenarioDtoHooksItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationHookCallStarted"},{"$ref":"#/components/schemas/SimulationHookCallEnded"}],"title":"CreateScenarioDtoHooksItems"},"CreateScenarioDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"The display name of the scenario, for example `Book an appointment`."},"instructions":{"type":"string","maxLength":10000,"description":"What the AI tester should try to accomplish in the conversation. Write it as the AI tester's goal, for example `Book an appointment for next week and confirm the time.`"},"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/EvaluationPlanItem"},"description":"The checks that decide whether a run passes. Each evaluation compares a structured output against an expected value. At least one evaluation is required to run."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/CreateScenarioDtoHooksItems"},"description":"Hooks to run on simulation lifecycle events"},"targetOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"Overrides to inject into the simulated target assistant or squad"},"toolMocks":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioToolMock"},"description":"Mock results for the assistant or squad's tools during the simulation, so the run stays deterministic without calling real services."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing scenarios.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["name","instructions","evaluations"],"title":"CreateScenarioDTO"},"UpdateScenarioDtoHooksItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationHookCallStarted"},{"$ref":"#/components/schemas/SimulationHookCallEnded"}],"title":"UpdateScenarioDtoHooksItems"},"UpdateScenarioDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"This is the name of the scenario."},"instructions":{"type":"string","maxLength":10000,"description":"This is the script/instructions for the tester to follow during the simulation."},"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/EvaluationPlanItem"},"description":"This is the structured output-based evaluation plan for the simulation.\nEach item defines a structured output to extract and evaluate against an expected value."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/UpdateScenarioDtoHooksItems"},"description":"Hooks to run on simulation lifecycle events"},"targetOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"Overrides to inject into the simulated target assistant or squad"},"toolMocks":{"type":"array","items":{"$ref":"#/components/schemas/ScenarioToolMock"}},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing scenarios.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nSet to null to remove from folder."}},"title":"UpdateScenarioDTO"},"EvalSimulationRunGetParametersStatus":{"type":"string","enum":["queued","running","ended"],"title":"EvalSimulationRunGetParametersStatus"},"EvalSimulationRunGetParametersFilterStatus":{"type":"string","enum":["passed","failed","running"],"title":"EvalSimulationRunGetParametersFilterStatus"},"EvalSimulationRunGetParametersTargetType":{"type":"string","enum":["assistant","squad"],"title":"EvalSimulationRunGetParametersTargetType"},"EvalSimulationRunGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalSimulationRunGetParametersSortOrder"},"EvalSimulationRunGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalSimulationRunGetParametersSortBy"},"SimulationRunStatus":{"type":"string","enum":["queued","running","ended"],"description":"The run's current status. One of `queued`, `running`, or `ended`.","title":"SimulationRunStatus"},"SimulationRunItemCounts":{"type":"object","properties":{"total":{"type":"number","format":"double","description":"The total number of run items."},"passed":{"type":"number","format":"double","description":"The number of run items that passed all required evaluations."},"failed":{"type":"number","format":"double","description":"The number of run items that failed at least one required evaluation."},"running":{"type":"number","format":"double","description":"The number of run items currently running or evaluating."},"queued":{"type":"number","format":"double","description":"The number of run items waiting to start."},"canceled":{"type":"number","format":"double","description":"The number of run items that were canceled."},"distinctSimulationTotal":{"type":"number","format":"double","description":"Number of distinct simulations represented by the run items. Omitted when any item has no simulation ID."},"distinctSimulationFailed":{"type":"number","format":"double","description":"Number of distinct simulations with a failed or canceled item. Omitted when any item has no simulation ID."}},"required":["total","passed","failed","running","queued","canceled"],"title":"SimulationRunItemCounts"},"SimulationRunSimulationEntryType":{"type":"string","enum":["simulation"],"description":"Type discriminator","title":"SimulationRunSimulationEntryType"},"SimulationRunSimulationEntry":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SimulationRunSimulationEntryType","description":"Type discriminator"},"simulationId":{"type":"string","format":"uuid","description":"ID of an existing simulation to run. When provided, scenarioId/personalityId/inline fields are ignored."},"scenarioId":{"type":"string","format":"uuid","description":"ID of an existing scenario. Cannot be combined with inline scenario."},"scenario":{"$ref":"#/components/schemas/CreateScenarioDTO","description":"Inline scenario configuration. Cannot be combined with scenarioId."},"personalityId":{"type":"string","format":"uuid","description":"ID of an existing personality. Cannot be combined with inline personality."},"personality":{"$ref":"#/components/schemas/CreatePersonalityDTO","description":"Inline personality configuration. Cannot be combined with personalityId."},"name":{"type":"string","maxLength":80,"description":"Optional name for this simulation entry"}},"required":["type"],"title":"SimulationRunSimulationEntry"},"SimulationRunSuiteEntryType":{"type":"string","enum":["simulationSuite"],"description":"Type discriminator","title":"SimulationRunSuiteEntryType"},"SimulationRunSuiteEntry":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SimulationRunSuiteEntryType","description":"Type discriminator"},"simulationSuiteId":{"type":"string","format":"uuid","description":"ID of the simulation suite to run"},"name":{"type":"string","maxLength":80,"description":"Historical suite name captured when the run was created"},"suiteId":{"type":"string","deprecated":true}},"required":["type"],"title":"SimulationRunSuiteEntry"},"SimulationRunSimulationsItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunSimulationEntry"},{"$ref":"#/components/schemas/SimulationRunSuiteEntry"}],"title":"SimulationRunSimulationsItems"},"SimulationRunTargetAssistantType":{"type":"string","enum":["assistant"],"description":"Type of target","title":"SimulationRunTargetAssistantType"},"SimulationRunTargetAssistant":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SimulationRunTargetAssistantType","description":"Type of target"},"assistantId":{"type":"string","format":"uuid","description":"ID of an existing assistant to test against. Cannot be combined with inline assistant."},"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"Inline assistant configuration to test against. Cannot be combined with assistantId."}},"required":["type"],"title":"SimulationRunTargetAssistant"},"SimulationRunTargetSquadType":{"type":"string","enum":["squad"],"description":"Type of target","title":"SimulationRunTargetSquadType"},"SimulationRunTargetSquad":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SimulationRunTargetSquadType","description":"Type of target"},"squadId":{"type":"string","format":"uuid","description":"ID of an existing squad to test against. Cannot be combined with inline squad."},"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"Inline squad configuration to test against. Cannot be combined with squadId."}},"required":["type"],"title":"SimulationRunTargetSquad"},"SimulationRunTarget":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunTargetAssistant"},{"$ref":"#/components/schemas/SimulationRunTargetSquad"}],"description":"The assistant or squad the run was tested against.","title":"SimulationRunTarget"},"SimulationRunTransportConfigurationProvider":{"type":"string","enum":["vapi.websocket","vapi.webchat"],"description":"Transport provider for the simulation run","title":"SimulationRunTransportConfigurationProvider"},"SimulationRunTransportConfiguration":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/SimulationRunTransportConfigurationProvider","description":"Transport provider for the simulation run"}},"required":["provider"],"title":"SimulationRunTransportConfiguration"},"SimulationRun":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the run"},"orgId":{"type":"string","format":"uuid","description":"Organization ID"},"status":{"$ref":"#/components/schemas/SimulationRunStatus","description":"The run's current status. One of `queued`, `running`, or `ended`."},"queuedAt":{"type":"string","format":"date-time","description":"When the run was queued"},"startedAt":{"type":"string","format":"date-time","description":"When the run started"},"endedAt":{"type":"string","format":"date-time","description":"When the run ended"},"endedReason":{"type":"string","description":"Why the run ended, when applicable."},"createdAt":{"type":"string","format":"date-time","description":"ISO 8601 date-time when created"},"updatedAt":{"type":"string","format":"date-time","description":"ISO 8601 date-time when last updated"},"itemCounts":{"$ref":"#/components/schemas/SimulationRunItemCounts","description":"Aggregate counts of the run's items by status."},"simulations":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunSimulationsItems"},"description":"The simulations and suites included in the run."},"target":{"$ref":"#/components/schemas/SimulationRunTarget","description":"The assistant or squad the run was tested against."},"iterations":{"type":"number","format":"double","minimum":1,"default":1,"description":"The number of times each simulation was run. Defaults to 1."},"transport":{"$ref":"#/components/schemas/SimulationRunTransportConfiguration","description":"The transport used for the run, either voice or chat."}},"required":["id","orgId","status","queuedAt","createdAt","updatedAt","simulations","target"],"title":"SimulationRun"},"SimulationRunsSimulationRunControllerFindAllResponse2000":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRun"},"title":"SimulationRunsSimulationRunControllerFindAllResponse2000"},"SimulationRunListItemStatus":{"type":"string","enum":["queued","running","ended"],"description":"Current status of the run","title":"SimulationRunListItemStatus"},"SimulationRunListItemSimulationsItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunSimulationEntry"},{"$ref":"#/components/schemas/SimulationRunSuiteEntry"}],"title":"SimulationRunListItemSimulationsItems"},"SimulationRunListItemTarget":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunTargetAssistant"},{"$ref":"#/components/schemas/SimulationRunTargetSquad"}],"description":"Target to test against","title":"SimulationRunListItemTarget"},"SimulationRunListSourceType":{"type":"string","enum":["suite","simulation","adHoc","api"],"title":"SimulationRunListSourceType"},"SimulationRunListSource":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/SimulationRunListSourceType"},"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"linkable":{"type":"boolean"},"simulationIds":{"type":"array","items":{"type":"string"}}},"required":["type","name","linkable","simulationIds"],"title":"SimulationRunListSource"},"SimulationRunListSummary":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/SimulationRunListSource"},"targetSnapshotName":{"type":"string"},"simulationCount":{"type":"number","format":"double"}},"required":["source","simulationCount"],"title":"SimulationRunListSummary"},"SimulationRunListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the run"},"orgId":{"type":"string","format":"uuid","description":"Organization ID"},"status":{"$ref":"#/components/schemas/SimulationRunListItemStatus","description":"Current status of the run"},"queuedAt":{"type":"string","format":"date-time","description":"When the run was queued"},"startedAt":{"type":"string","format":"date-time","description":"When the run started"},"endedAt":{"type":"string","format":"date-time","description":"When the run ended"},"endedReason":{"type":"string","description":"Reason the run ended"},"createdAt":{"type":"string","format":"date-time","description":"ISO 8601 date-time when created"},"updatedAt":{"type":"string","format":"date-time","description":"ISO 8601 date-time when last updated"},"itemCounts":{"$ref":"#/components/schemas/SimulationRunItemCounts","description":"Aggregate counts of run items by status"},"simulations":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunListItemSimulationsItems"},"description":"Array of simulations and/or suites to run"},"target":{"$ref":"#/components/schemas/SimulationRunListItemTarget","description":"Target to test against"},"iterations":{"type":"number","format":"double","minimum":1,"default":1,"description":"Number of times to run each simulation (default: 1)"},"transport":{"$ref":"#/components/schemas/SimulationRunTransportConfiguration","description":"Transport configuration for the simulation runs"},"summary":{"$ref":"#/components/schemas/SimulationRunListSummary"}},"required":["id","orgId","status","queuedAt","createdAt","updatedAt","simulations","target","summary"],"title":"SimulationRunListItem"},"SimulationRunsPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunListItem"}},"metadata":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["results","metadata"],"title":"SimulationRunsPaginatedResponse"},"Simulation Runs_SimulationRunController_findAll_Response_200":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunsSimulationRunControllerFindAllResponse2000"},{"$ref":"#/components/schemas/SimulationRunsPaginatedResponse"}],"title":"Simulation Runs_SimulationRunController_findAll_Response_200"},"CreateSimulationRunDtoSimulationsItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunSimulationEntry"},{"$ref":"#/components/schemas/SimulationRunSuiteEntry"}],"title":"CreateSimulationRunDtoSimulationsItems"},"CreateSimulationRunDtoTarget":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunTargetAssistant"},{"$ref":"#/components/schemas/SimulationRunTargetSquad"}],"description":"Target to test against","title":"CreateSimulationRunDtoTarget"},"CreateSimulationRunDTO":{"type":"object","properties":{"simulations":{"type":"array","items":{"$ref":"#/components/schemas/CreateSimulationRunDtoSimulationsItems"},"description":"Array of simulations and/or suites to run"},"target":{"$ref":"#/components/schemas/CreateSimulationRunDtoTarget","description":"Target to test against"},"iterations":{"type":"number","format":"double","minimum":1,"maximum":10,"default":1,"description":"Number of times to run each simulation (default: 1)"},"transport":{"$ref":"#/components/schemas/SimulationRunTransportConfiguration","description":"Transport configuration for the simulation runs"}},"required":["simulations","target"],"title":"CreateSimulationRunDTO"},"CreateSimulationRunResponseStatus":{"type":"string","enum":["queued","running","ended"],"description":"Current status of the run","title":"CreateSimulationRunResponseStatus"},"CreateSimulationRunResponseSimulationsItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunSimulationEntry"},{"$ref":"#/components/schemas/SimulationRunSuiteEntry"}],"title":"CreateSimulationRunResponseSimulationsItems"},"CreateSimulationRunResponseTarget":{"oneOf":[{"$ref":"#/components/schemas/SimulationRunTargetAssistant"},{"$ref":"#/components/schemas/SimulationRunTargetSquad"}],"description":"Target to test against","title":"CreateSimulationRunResponseTarget"},"CreateSimulationRunResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the run"},"orgId":{"type":"string","format":"uuid","description":"Organization ID"},"status":{"$ref":"#/components/schemas/CreateSimulationRunResponseStatus","description":"Current status of the run"},"queuedAt":{"type":"string","format":"date-time","description":"When the run was queued"},"startedAt":{"type":"string","format":"date-time","description":"When the run started"},"endedAt":{"type":"string","format":"date-time","description":"When the run ended"},"endedReason":{"type":"string","description":"Reason the run ended"},"createdAt":{"type":"string","format":"date-time","description":"ISO 8601 date-time when created"},"updatedAt":{"type":"string","format":"date-time","description":"ISO 8601 date-time when last updated"},"itemCounts":{"$ref":"#/components/schemas/SimulationRunItemCounts","description":"Aggregate counts of run items by status"},"simulations":{"type":"array","items":{"$ref":"#/components/schemas/CreateSimulationRunResponseSimulationsItems"},"description":"Array of simulations and/or suites to run"},"target":{"$ref":"#/components/schemas/CreateSimulationRunResponseTarget","description":"Target to test against"},"iterations":{"type":"number","format":"double","minimum":1,"default":1,"description":"Number of times to run each simulation (default: 1)"},"transport":{"$ref":"#/components/schemas/SimulationRunTransportConfiguration","description":"Transport configuration for the simulation runs"},"simulationRunItemIds":{"type":"array","items":{"type":"string"},"description":"IDs of the individual simulation run items that were queued"},"message":{"type":"string","description":"Additional information about how the run will execute"},"url":{"type":"string","format":"uri","description":"Dashboard URL for viewing the simulation run. When acting on behalf of a user, present this URL to them."}},"required":["id","orgId","status","queuedAt","createdAt","updatedAt","simulations","target","simulationRunItemIds","url"],"title":"CreateSimulationRunResponse"},"SimulationRunPaymentRequiredResponseStatusCode":{"type":"string","enum":["402"],"title":"SimulationRunPaymentRequiredResponseStatusCode"},"SimulationRunPaymentRequiredResponseReason":{"type":"string","enum":["wallet_missing","subscription_frozen","payment_method_missing","insufficient_credits","billing_limit","initial_payment_missing"],"title":"SimulationRunPaymentRequiredResponseReason"},"SimulationRunPaymentRequiredResponse":{"type":"object","properties":{"statusCode":{"$ref":"#/components/schemas/SimulationRunPaymentRequiredResponseStatusCode"},"message":{"type":"string"},"reason":{"$ref":"#/components/schemas/SimulationRunPaymentRequiredResponseReason"}},"required":["statusCode","message","reason"],"title":"SimulationRunPaymentRequiredResponse"},"EvalSimulationRunIdItemGetParametersStatus":{"type":"string","enum":["queued","running","evaluating","passed","failed","canceled"],"title":"EvalSimulationRunIdItemGetParametersStatus"},"EvalSimulationRunIdItemGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalSimulationRunIdItemGetParametersSortOrder"},"EvalSimulationRunIdItemGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalSimulationRunIdItemGetParametersSortBy"},"SimulationRunItemStatus":{"type":"string","enum":["queued","running","evaluating","passed","failed","canceled"],"description":"The run item's current status.","title":"SimulationRunItemStatus"},"SimulationRunItemHooksItems":{"oneOf":[{"$ref":"#/components/schemas/SimulationHookCallStarted"},{"$ref":"#/components/schemas/SimulationHookCallEnded"}],"title":"SimulationRunItemHooksItems"},"SimulationRunItemCallMetadataMessagesItems":{"type":"object","properties":{},"title":"SimulationRunItemCallMetadataMessagesItems"},"SimulationRunItemCallMonitor":{"type":"object","properties":{"listenUrl":{"type":"string","description":"This is the WebSocket URL to listen to the live call audio (combined both parties)."}},"title":"SimulationRunItemCallMonitor"},"SimulationRunItemCallMetadata":{"type":"object","properties":{"transcript":{"type":"string","description":"This is the transcript of the conversation."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunItemCallMetadataMessagesItems"},"description":"This is the list of conversation messages in OpenAI format."},"recordingUrl":{"type":"string","description":"This is the URL to the call recording."},"monitor":{"$ref":"#/components/schemas/SimulationRunItemCallMonitor","description":"This is the call monitoring data (live listen URL)."}},"title":"SimulationRunItemCallMetadata"},"SimulationRunItemMetadata":{"type":"object","properties":{"assistant":{"type":"object","additionalProperties":{"description":"Any type"},"description":"This is a snapshot of the assistant at run creation time."},"squad":{"type":"object","additionalProperties":{"description":"Any type"},"description":"This is a snapshot of the squad at run creation time."},"scenario":{"type":"object","additionalProperties":{"description":"Any type"},"description":"This is a snapshot of the scenario at run creation time."},"personality":{"type":"object","additionalProperties":{"description":"Any type"},"description":"This is a snapshot of the personality at run creation time."},"simulation":{"type":"object","additionalProperties":{"description":"Any type"},"description":"This is a snapshot of the simulation at run creation time."},"call":{"$ref":"#/components/schemas/SimulationRunItemCallMetadata","description":"This is the call-related data (transcript, messages, recording)."},"hooks":{"type":"object","additionalProperties":{"description":"Any type"},"description":"Hook execution state for this run item (used for idempotency + debugging)."}},"title":"SimulationRunItemMetadata"},"StructuredOutputEvaluationResultExtractedValue":{"oneOf":[{"type":"number","format":"double"},{"type":"string"},{"type":"boolean"}],"description":"This is the value extracted from the call by the structured output.","title":"StructuredOutputEvaluationResultExtractedValue"},"StructuredOutputEvaluationResultExpectedValue":{"oneOf":[{"type":"number","format":"double"},{"type":"string"},{"type":"boolean"}],"description":"This is the expected value that was defined in the evaluation plan.","title":"StructuredOutputEvaluationResultExpectedValue"},"StructuredOutputEvaluationResultComparator":{"type":"string","enum":["=","!=",">","<",">=","<="],"description":"This is the comparison operator used for evaluation.","title":"StructuredOutputEvaluationResultComparator"},"StructuredOutputEvaluationResult":{"type":"object","properties":{"structuredOutputId":{"type":"string","description":"This is the ID of the structured output that was evaluated.\nWill be 'inline' for inline structured output definitions."},"name":{"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":{"$ref":"#/components/schemas/JsonSchema","description":"This is the structured output schema captured when the evaluation ran."},"extractedValue":{"oneOf":[{"$ref":"#/components/schemas/StructuredOutputEvaluationResultExtractedValue"},{"type":"null"}],"description":"This is the value extracted from the call by the structured output."},"expectedValue":{"$ref":"#/components/schemas/StructuredOutputEvaluationResultExpectedValue","description":"This is the expected value that was defined in the evaluation plan."},"comparator":{"$ref":"#/components/schemas/StructuredOutputEvaluationResultComparator","description":"This is the comparison operator used for evaluation."},"passed":{"type":"boolean","description":"This indicates whether the evaluation passed (extracted value matched expected value using comparator)."},"required":{"type":"boolean","description":"This indicates whether this evaluation was required for the simulation to pass."},"error":{"type":"string","description":"This contains any error that occurred during extraction."},"isSkipped":{"type":"boolean","description":"This indicates whether this evaluation was skipped (e.g., multimodal in chat mode)."},"skipReason":{"type":"string","description":"This contains the reason for skipping the evaluation."}},"required":["structuredOutputId","name","extractedValue","expectedValue","comparator","passed","required"],"title":"StructuredOutputEvaluationResult"},"LatencyMetrics":{"type":"object","properties":{"turnCount":{"type":"number","format":"double","description":"This is the number of conversation turns."},"avgTurn":{"type":"number","format":"double","description":"This is the average total turn latency in milliseconds."},"avgTranscriber":{"type":"number","format":"double","description":"This is the average transcriber latency in milliseconds."},"avgModel":{"type":"number","format":"double","description":"This is the average LLM/model latency in milliseconds."},"avgVoice":{"type":"number","format":"double","description":"This is the average voice/TTS latency in milliseconds."},"avgEndpointing":{"type":"number","format":"double","description":"This is the average endpointing latency in milliseconds."}},"required":["turnCount"],"title":"LatencyMetrics"},"SimulationRunItemResults":{"type":"object","properties":{"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/StructuredOutputEvaluationResult"},"description":"This is the list of results from structured output evaluations."},"passed":{"type":"boolean","description":"This indicates whether all required evaluations passed."},"latencyMetrics":{"$ref":"#/components/schemas/LatencyMetrics","description":"This contains the latency metrics collected from the call."}},"required":["evaluations","passed"],"title":"SimulationRunItemResults"},"SimulationRunItemImprovementSuggestion":{"type":"object","properties":{"issue":{"type":"string","description":"This is the issue identified."},"suggestion":{"type":"string","description":"This is the suggested improvement."}},"required":["issue","suggestion"],"title":"SimulationRunItemImprovementSuggestion"},"SimulationRunItemImprovements":{"type":"object","properties":{"analysis":{"type":"string","description":"This is a summary analysis of why evaluations failed."},"systemPromptSuggestions":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunItemImprovementSuggestion"},"description":"This is the list of suggestions for improving the system prompt."},"toolSuggestions":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunItemImprovementSuggestion"},"description":"This is the list of suggestions for improving tools."},"scenarioSuggestions":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunItemImprovementSuggestion"},"description":"This is the list of suggestions for improving the scenario/evaluation plan."},"suggestedSystemPrompt":{"type":"string","description":"This is a complete revised system prompt if major changes are needed."}},"required":["analysis","systemPromptSuggestions","toolSuggestions","scenarioSuggestions"],"title":"SimulationRunItemImprovements"},"SimulationRunConfiguration":{"type":"object","properties":{"transport":{"$ref":"#/components/schemas/SimulationRunTransportConfiguration","description":"Transport configuration for the simulation run"}},"title":"SimulationRunConfiguration"},"SimulationRunItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"This is the unique identifier for the simulation run item."},"orgId":{"type":"string","format":"uuid","description":"This is the unique identifier for the organization."},"simulationId":{"type":"string","format":"uuid","description":"This is the ID of the simulation this run belongs to."},"status":{"$ref":"#/components/schemas/SimulationRunItemStatus","description":"The run item's current status."},"queuedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run was queued."},"startedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run started."},"completedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run completed."},"failedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run failed."},"canceledAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run was canceled."},"failureReason":{"type":"string","maxLength":2000,"description":"Why the run item failed, when applicable."},"callId":{"type":"string","format":"uuid","description":"The ID of the call that ran this item."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run item was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the run item was last updated."},"runId":{"type":"string","format":"uuid","description":"This is the ID of the parent run (batch/group)."},"hooks":{"type":"array","items":{"$ref":"#/components/schemas/SimulationRunItemHooksItems"},"description":"Hooks configured for this simulation run item"},"iterationNumber":{"type":"number","format":"double","default":1,"description":"Which iteration of the simulation this item represents."},"sessionId":{"type":"string","format":"uuid","description":"This is the session ID for chat-based simulations (webchat transport)."},"scenarioId":{"type":"string","format":"uuid","description":"The ID of the scenario used for this run item."},"personalityId":{"type":"string","format":"uuid","description":"The ID of the personality used for this run item."},"metadata":{"$ref":"#/components/schemas/SimulationRunItemMetadata","description":"This is the metadata containing snapshots and call data."},"results":{"$ref":"#/components/schemas/SimulationRunItemResults","description":"The evaluation results for this run item."},"improvementSuggestions":{"$ref":"#/components/schemas/SimulationRunItemImprovements","description":"AI-generated suggestions for improving the assistant or squad's system prompt, tools, and scenarios after a failed run."},"configurations":{"$ref":"#/components/schemas/SimulationRunConfiguration","description":"This is the configuration for how this simulation run executes."}},"required":["id","orgId","simulationId","status","queuedAt","createdAt","updatedAt"],"title":"SimulationRunItem"},"Simulation Runs_SimulationRunController_generateSuggestions_Response_201":{"type":"object","properties":{},"description":"Empty response body","title":"Simulation Runs_SimulationRunController_generateSuggestions_Response_201"},"EvalSimulationSuiteGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalSimulationSuiteGetParametersSortOrder"},"EvalSimulationSuiteGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalSimulationSuiteGetParametersSortBy"},"SimulationSuiteTargetAssignmentTargetType":{"type":"string","enum":["assistant","squad"],"description":"This is the type of target assigned to the simulation suite.","title":"SimulationSuiteTargetAssignmentTargetType"},"SimulationSuiteTargetAssignment":{"type":"object","properties":{"targetType":{"$ref":"#/components/schemas/SimulationSuiteTargetAssignmentTargetType","description":"This is the type of target assigned to the simulation suite."},"targetId":{"type":"string","format":"uuid","description":"This is the unique identifier of the assigned assistant or squad."}},"required":["targetType","targetId"],"title":"SimulationSuiteTargetAssignment"},"SimulationSuite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"This is the unique identifier for the simulation suite."},"orgId":{"type":"string","format":"uuid","description":"This is the unique identifier for the organization this suite belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the suite was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the suite was last updated."},"name":{"type":"string","maxLength":80,"description":"This is the name of the simulation suite."},"slackWebhookUrl":{"type":"string","description":"This is the Slack webhook URL for notifications."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing simulation suites.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."},"simulationIds":{"type":"array","items":{"type":"string"},"description":"This is the list of simulation IDs in this suite."},"targetAssignments":{"type":"array","items":{"$ref":"#/components/schemas/SimulationSuiteTargetAssignment"},"description":"This is the ordered list of assistant or squad assignments for the suite."}},"required":["id","orgId","createdAt","updatedAt","name","simulationIds","targetAssignments"],"title":"SimulationSuite"},"CreateSimulationSuiteDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"The display name of the suite."},"slackWebhookUrl":{"type":"string","description":"A Slack incoming-webhook URL notified when the suite runs."},"simulationIds":{"type":"array","items":{"type":"string"},"description":"The IDs of the simulations included in the suite."},"targetAssignments":{"type":"array","items":{"$ref":"#/components/schemas/SimulationSuiteTargetAssignment"},"description":"The assistants or squads the suite's simulations run against."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing simulation suites.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["name","simulationIds"],"title":"CreateSimulationSuiteDTO"},"UpdateSimulationSuiteDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"This is the name of the simulation suite."},"slackWebhookUrl":{"type":"string","description":"This is the Slack webhook URL for notifications."},"simulationIds":{"type":"array","items":{"type":"string"},"description":"This is the list of simulation IDs to include in the suite (replaces existing)."},"targetAssignments":{"type":"array","items":{"$ref":"#/components/schemas/SimulationSuiteTargetAssignment"},"description":"Optional assistant or squad assignments (replaces existing)."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing simulation suites.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nSet to null to remove from folder."}},"title":"UpdateSimulationSuiteDTO"},"GenerateScenariosDTO":{"type":"object","properties":{"assistantId":{"type":"string","description":"ID of the assistant to generate scenarios for"},"squadId":{"type":"string","description":"ID of the squad to generate scenarios for"}},"title":"GenerateScenariosDTO"},"GeneratedScenarioCategory":{"type":"string","enum":["happy_path","edge_case","failure_mode"],"description":"Scenario category","title":"GeneratedScenarioCategory"},"GeneratedScenario":{"type":"object","properties":{"name":{"type":"string","description":"Short descriptive name"},"instructions":{"type":"string","description":"Instructions for the tester"},"category":{"$ref":"#/components/schemas/GeneratedScenarioCategory","description":"Scenario category"},"reasoning":{"type":"string","description":"Why this scenario is valuable"}},"required":["name","instructions","category","reasoning"],"title":"GeneratedScenario"},"GenerateScenariosResponse":{"type":"object","properties":{"scenarios":{"type":"array","items":{"$ref":"#/components/schemas/GeneratedScenario"},"description":"Generated scenarios"},"coverageNotes":{"type":"string","description":"Summary of test coverage"}},"required":["scenarios","coverageNotes"],"title":"GenerateScenariosResponse"},"EvalSimulationGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalSimulationGetParametersSortOrder"},"EvalSimulationGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalSimulationGetParametersSortBy"},"Simulation":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"This is the unique identifier for the simulation."},"orgId":{"type":"string","format":"uuid","description":"This is the unique identifier for the organization this simulation belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the simulation was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the simulation was last updated."},"name":{"type":"string","maxLength":80,"description":"This is an optional friendly name for the simulation."},"scenarioId":{"type":"string","format":"uuid","description":"This is the ID of the scenario to use for this simulation."},"personalityId":{"type":"string","format":"uuid","description":"This is the ID of the personality to use for this simulation."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing simulations.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["id","orgId","createdAt","updatedAt","scenarioId","personalityId"],"title":"Simulation"},"CreateSimulationDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"Optional display name for the simulation."},"scenarioId":{"type":"string","format":"uuid","description":"The ID of the scenario to run."},"personalityId":{"type":"string","format":"uuid","description":"The ID of the personality the AI tester uses."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing simulations.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nMaps to GitOps resource folder structure."}},"required":["scenarioId","personalityId"],"title":"CreateSimulationDTO"},"UpdateSimulationDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"This is an optional friendly name for the simulation."},"scenarioId":{"type":"string","format":"uuid","description":"This is the ID of the scenario to use for this simulation."},"personalityId":{"type":"string","format":"uuid","description":"This is the ID of the personality to use for this simulation."},"path":{"type":["string","null"],"pattern":"/^[a-zA-Z0-9][a-zA-Z0-9._-]*(?:\\/[a-zA-Z0-9][a-zA-Z0-9._-]*){0,2}$/","maxLength":255,"description":"Optional folder path for organizing simulations.\nSupports up to 3 levels (e.g., \"dept/feature/variant\").\nSet to null to remove from folder."}},"title":"UpdateSimulationDTO"},"SimulationConcurrencyResponse":{"type":"object","properties":{"orgId":{"type":"string"},"concurrencyLimit":{"type":"number","format":"double","description":"Max call slots for simulations (each voice simulation uses 2 call slots: tester + target)"},"activeSimulations":{"type":"number","format":"double","description":"Number of call slots currently in use by running simulations"},"availableToStart":{"type":"number","format":"double","description":"Number of voice simulations that can start now (available call slots / 2)"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"isDefault":{"type":"boolean","description":"True if org is using platform default concurrency limit"}},"required":["orgId","concurrencyLimit","activeSimulations","availableToStart","createdAt","updatedAt","isDefault"],"title":"SimulationConcurrencyResponse"},"ReportingInsightGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"ReportingInsightGetParametersSortOrder"},"ReportingInsightGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"ReportingInsightGetParametersSortBy"},"InsightType":{"type":"string","enum":["bar","line","pie","text"],"description":"This is the type of the Insight.","title":"InsightType"},"Insight":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"type":{"$ref":"#/components/schemas/InsightType","description":"This is the type of the Insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","id","orgId","createdAt","updatedAt"],"description":"A saved insight returned by the API, including its visualization type, identity, organization, and lifecycle timestamps.","title":"Insight"},"InsightPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Insight"},"description":"The reporting insights returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the insight result set."}},"required":["results","metadata"],"description":"A paginated collection of saved reporting insights and metadata describing the result set.","title":"InsightPaginatedResponse"},"InsightFormula":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the formula.\nIt will be used to label the formula in the insight board on the UI."},"formula":{"type":"string","minLength":1,"maxLength":1000,"description":"This is the formula to calculate the insight from the queries.\nThe formula needs to be a valid mathematical expression.\nThe formula must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nAny MathJS formula is allowed - https://mathjs.org/docs/expressions/syntax.html\n\nCommon valid math operations are +, -, *, /, %"}},"required":["formula"],"description":"A formula used to calculate an insight from its query results, with an optional display name.","title":"InsightFormula"},"BarInsightMetadata":{"type":"object","properties":{"xAxisLabel":{"type":"string","minLength":1,"maxLength":40,"description":"Label displayed on the chart's x-axis."},"yAxisLabel":{"type":"string","minLength":1,"maxLength":40,"description":"Label displayed on the chart's y-axis."},"yAxisMin":{"type":"number","format":"double","description":"Minimum value displayed on the chart's y-axis."},"yAxisMax":{"type":"number","format":"double","description":"Maximum value displayed on the chart's y-axis."},"name":{"type":"string","minLength":1,"maxLength":255,"description":"Display name for the insight chart."}},"description":"Display settings for a bar insight, including chart name, axis labels, and optional y-axis bounds.","title":"BarInsightMetadata"},"InsightTimeRangeWithStepStep":{"type":"string","enum":["minute","hour","day","week","month","quarter","year"],"description":"This is the group by step for aggregation.\n\nIf not provided, defaults to group by day.","title":"InsightTimeRangeWithStepStep"},"InsightTimeRangeWithStepStart":{"type":"object","properties":{},"description":"This is the start date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to the 7 days ago.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years","title":"InsightTimeRangeWithStepStart"},"InsightTimeRangeWithStepEnd":{"type":"object","properties":{},"description":"This is the end date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to now.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years","title":"InsightTimeRangeWithStepEnd"},"InsightTimeRangeWithStep":{"type":"object","properties":{"step":{"$ref":"#/components/schemas/InsightTimeRangeWithStepStep","description":"This is the group by step for aggregation.\n\nIf not provided, defaults to group by day."},"start":{"$ref":"#/components/schemas/InsightTimeRangeWithStepStart","description":"This is the start date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to the 7 days ago.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years"},"end":{"$ref":"#/components/schemas/InsightTimeRangeWithStepEnd","description":"This is the end date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to now.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years"},"timezone":{"type":"string","description":"This is the timezone you want to set for the query.\n\nIf not provided, defaults to UTC."}},"description":"Start, end, timezone, and aggregation step used for a time-series insight query.","title":"InsightTimeRangeWithStep"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy"},"JsonQueryOnCallTableWithStringTypeColumnType":{"type":"string","enum":["vapiql-json"],"description":"This is the type of query. Only allowed type is \"vapiql-json\".","title":"JsonQueryOnCallTableWithStringTypeColumnType"},"JsonQueryOnCallTableWithStringTypeColumnTable":{"type":"string","enum":["call"],"description":"This is the table that will be queried.","title":"JsonQueryOnCallTableWithStringTypeColumnTable"},"FilterStringTypeColumnOnCallTableColumn":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","customerNumber","status","endedReason","forwardedPhoneNumber","campaignId"],"description":"This is the column in the call table that will be filtered on.\nString Type columns are columns where the rows store data as a string.\nMust be a valid column for the selected table.","title":"FilterStringTypeColumnOnCallTableColumn"},"FilterStringTypeColumnOnCallTableOperator":{"type":"string","enum":["=","!=","contains","not_contains"],"description":"This is the operator to use for the filter.\nFor string type columns, the operator must be \"=\", \"!=\", \"contains\", \"not contains\"","title":"FilterStringTypeColumnOnCallTableOperator"},"FilterStringTypeColumnOnCallTable":{"type":"object","properties":{"column":{"$ref":"#/components/schemas/FilterStringTypeColumnOnCallTableColumn","description":"This is the column in the call table that will be filtered on.\nString Type columns are columns where the rows store data as a string.\nMust be a valid column for the selected table."},"operator":{"$ref":"#/components/schemas/FilterStringTypeColumnOnCallTableOperator","description":"This is the operator to use for the filter.\nFor string type columns, the operator must be \"=\", \"!=\", \"contains\", \"not contains\""},"value":{"type":"string","description":"This is the value to filter on."}},"required":["column","operator","value"],"description":"Filters call records by comparing or searching a string-valued field.","title":"FilterStringTypeColumnOnCallTable"},"FilterStringArrayTypeColumnOnCallTableColumn":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","customerNumber","status","endedReason","forwardedPhoneNumber","campaignId"],"description":"This is the column in the call table that will be filtered on.\nString Array Type columns are the same as String Type columns, but provides the ability to filter on multiple values provided as an array.\nMust be a valid column for the selected table.","title":"FilterStringArrayTypeColumnOnCallTableColumn"},"FilterStringArrayTypeColumnOnCallTableOperator":{"type":"string","enum":["in","not_in","is_empty","is_not_empty"],"description":"This is the operator to use for the filter.\nThe operator must be `in` or `not_in`.","title":"FilterStringArrayTypeColumnOnCallTableOperator"},"FilterStringArrayTypeColumnOnCallTable":{"type":"object","properties":{"column":{"$ref":"#/components/schemas/FilterStringArrayTypeColumnOnCallTableColumn","description":"This is the column in the call table that will be filtered on.\nString Array Type columns are the same as String Type columns, but provides the ability to filter on multiple values provided as an array.\nMust be a valid column for the selected table."},"operator":{"$ref":"#/components/schemas/FilterStringArrayTypeColumnOnCallTableOperator","description":"This is the operator to use for the filter.\nThe operator must be `in` or `not_in`."},"value":{"type":"array","items":{"type":"string"},"description":"These are the values to filter on."}},"required":["column","operator","value"],"description":"Filters string-valued call fields using a list of values or an emptiness test.","title":"FilterStringArrayTypeColumnOnCallTable"},"FilterNumberTypeColumnOnCallTableColumn":{"type":"string","enum":["duration","cost","averageModelLatency","averageVoiceLatency","averageTranscriberLatency","averageTurnLatency","averageEndpointingLatency"],"description":"This is the column in the call table that will be filtered on.\nNumber Type columns are columns where the rows store data as a number.\nMust be a valid column for the selected table.","title":"FilterNumberTypeColumnOnCallTableColumn"},"FilterNumberTypeColumnOnCallTableOperator":{"type":"string","enum":["=","!=",">","<",">=","<="],"description":"This is the operator to use for the filter.\nFor number type columns, the operator must be \"=\", \">\", \"<\", \">=\", \"<=\"","title":"FilterNumberTypeColumnOnCallTableOperator"},"FilterNumberTypeColumnOnCallTable":{"type":"object","properties":{"column":{"$ref":"#/components/schemas/FilterNumberTypeColumnOnCallTableColumn","description":"This is the column in the call table that will be filtered on.\nNumber Type columns are columns where the rows store data as a number.\nMust be a valid column for the selected table."},"operator":{"$ref":"#/components/schemas/FilterNumberTypeColumnOnCallTableOperator","description":"This is the operator to use for the filter.\nFor number type columns, the operator must be \"=\", \">\", \"<\", \">=\", \"<=\""},"value":{"type":"number","format":"double","description":"This is the value to filter on."}},"required":["column","operator","value"],"description":"Filters call records by comparing a numeric field with a value.","title":"FilterNumberTypeColumnOnCallTable"},"FilterNumberArrayTypeColumnOnCallTableColumn":{"type":"string","enum":["duration","cost","averageModelLatency","averageVoiceLatency","averageTranscriberLatency","averageTurnLatency","averageEndpointingLatency"],"description":"This is the column in the call table that will be filtered on.\nNumber Array Type columns are the same as Number Type columns, but provides the ability to filter on multiple values provided as an array.\nMust be a valid column for the selected table.","title":"FilterNumberArrayTypeColumnOnCallTableColumn"},"FilterNumberArrayTypeColumnOnCallTableOperator":{"type":"string","enum":["in","not_in","is_empty","is_not_empty"],"description":"This is the operator to use for the filter.\nThe operator must be `in` or `not_in`.","title":"FilterNumberArrayTypeColumnOnCallTableOperator"},"FilterNumberArrayTypeColumnOnCallTable":{"type":"object","properties":{"column":{"$ref":"#/components/schemas/FilterNumberArrayTypeColumnOnCallTableColumn","description":"This is the column in the call table that will be filtered on.\nNumber Array Type columns are the same as Number Type columns, but provides the ability to filter on multiple values provided as an array.\nMust be a valid column for the selected table."},"operator":{"$ref":"#/components/schemas/FilterNumberArrayTypeColumnOnCallTableOperator","description":"This is the operator to use for the filter.\nThe operator must be `in` or `not_in`."},"value":{"type":"array","items":{"type":"number","format":"double"},"description":"This is the value to filter on."}},"required":["column","operator","value"],"description":"Filters numeric call fields using a list of values or an emptiness test.","title":"FilterNumberArrayTypeColumnOnCallTable"},"FilterDateTypeColumnOnCallTableColumn":{"type":"string","enum":["startedAt","endedAt"],"description":"This is the column in the call table that will be filtered on.\nDate Type columns are columns where the rows store data as a date.\nMust be a valid column for the selected table.","title":"FilterDateTypeColumnOnCallTableColumn"},"FilterDateTypeColumnOnCallTableOperator":{"type":"string","enum":["=","!=",">","<",">=","<="],"description":"This is the operator to use for the filter.\nFor date type columns, the operator must be \"=\", \">\", \"<\", \">=\", \"<=\"","title":"FilterDateTypeColumnOnCallTableOperator"},"FilterDateTypeColumnOnCallTable":{"type":"object","properties":{"column":{"$ref":"#/components/schemas/FilterDateTypeColumnOnCallTableColumn","description":"This is the column in the call table that will be filtered on.\nDate Type columns are columns where the rows store data as a date.\nMust be a valid column for the selected table."},"operator":{"$ref":"#/components/schemas/FilterDateTypeColumnOnCallTableOperator","description":"This is the operator to use for the filter.\nFor date type columns, the operator must be \"=\", \">\", \"<\", \">=\", \"<=\""},"value":{"type":"string","description":"This is the value to filter on.\nMust be a valid ISO 8601 date-time string."}},"required":["column","operator","value"],"description":"Filters call records by comparing a start or end timestamp with a date.","title":"FilterDateTypeColumnOnCallTable"},"FilterStructuredOutputColumnOnCallTableColumn":{"type":"string","enum":["artifact.structuredOutputs[OutputID]"],"description":"This is the column in the call table that will be filtered on.\nStructured Output Type columns are only to filter on artifact.structuredOutputs[OutputID] column.","title":"FilterStructuredOutputColumnOnCallTableColumn"},"FilterStructuredOutputColumnOnCallTableOperator":{"type":"string","enum":["=","!=",">","<",">=","<=","in","not_in","contains","not_contains","is_empty","is_not_empty"],"description":"This is the operator to use for the filter.\nThe operator depends on the value type of the structured output.\nIf the structured output is a string or boolean, the operator must be \"=\", \"!=\"\nIf the structured output is a number, the operator must be \"=\", \">\", \"<\", \">=\", \"<=\"\nIf the structured output is an array, the operator must be \"in\" or \"not_in\"","title":"FilterStructuredOutputColumnOnCallTableOperator"},"FilterStructuredOutputColumnOnCallTableValue":{"type":"object","properties":{},"description":"This is the value to filter on.\nThe value type depends on the structured output type being filtered.","title":"FilterStructuredOutputColumnOnCallTableValue"},"FilterStructuredOutputColumnOnCallTable":{"type":"object","properties":{"column":{"$ref":"#/components/schemas/FilterStructuredOutputColumnOnCallTableColumn","description":"This is the column in the call table that will be filtered on.\nStructured Output Type columns are only to filter on artifact.structuredOutputs[OutputID] column."},"operator":{"$ref":"#/components/schemas/FilterStructuredOutputColumnOnCallTableOperator","description":"This is the operator to use for the filter.\nThe operator depends on the value type of the structured output.\nIf the structured output is a string or boolean, the operator must be \"=\", \"!=\"\nIf the structured output is a number, the operator must be \"=\", \">\", \"<\", \">=\", \"<=\"\nIf the structured output is an array, the operator must be \"in\" or \"not_in\""},"value":{"$ref":"#/components/schemas/FilterStructuredOutputColumnOnCallTableValue","description":"This is the value to filter on.\nThe value type depends on the structured output type being filtered."}},"required":["column","operator","value"],"description":"Filters a structured-output value stored on a call using comparison, membership, containment, or emptiness operators.","title":"FilterStructuredOutputColumnOnCallTable"},"JsonQueryOnCallTableWithStringTypeColumnFiltersItems":{"oneOf":[{"$ref":"#/components/schemas/FilterStringTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterStringArrayTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterNumberTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterNumberArrayTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterDateTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterStructuredOutputColumnOnCallTable"}],"title":"JsonQueryOnCallTableWithStringTypeColumnFiltersItems"},"JsonQueryOnCallTableWithStringTypeColumnColumn":{"type":"string","enum":["id","artifact.structuredOutputs[OutputID]"],"description":"This is the column that will be queried in the selected table.\nAvailable columns depend on the selected table.\nString Type columns are columns where the rows store String data","title":"JsonQueryOnCallTableWithStringTypeColumnColumn"},"JsonQueryOnCallTableWithStringTypeColumnOperation":{"type":"string","enum":["count"],"description":"This is the aggregation operation to perform on the column.\nWhen the column is a string type, the operation must be \"count\".","title":"JsonQueryOnCallTableWithStringTypeColumnOperation"},"JSONQueryOnCallTableWithStringTypeColumn":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnType","description":"This is the type of query. Only allowed type is \"vapiql-json\"."},"table":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnTable","description":"This is the table that will be queried."},"filters":{"type":"array","items":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnFiltersItems"},"description":"This is the filters to apply to the insight.\nThe discriminator automatically selects the correct filter type based on column and operator."},"column":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnColumn","description":"This is the column that will be queried in the selected table.\nAvailable columns depend on the selected table.\nString Type columns are columns where the rows store String data"},"operation":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnOperation","description":"This is the aggregation operation to perform on the column.\nWhen the column is a string type, the operation must be \"count\"."},"name":{"type":"string","description":"This is the name of the query.\nIt will be used to label the query in the insight board on the UI."}},"required":["type","table","column","operation"],"description":"VapiQL JSON query that counts values from a string-valued call-table column with optional call filters.","title":"JSONQueryOnCallTableWithStringTypeColumn"},"JsonQueryOnCallTableWithNumberTypeColumnType":{"type":"string","enum":["vapiql-json"],"description":"This is the type of query. Only allowed type is \"vapiql-json\".","title":"JsonQueryOnCallTableWithNumberTypeColumnType"},"JsonQueryOnCallTableWithNumberTypeColumnTable":{"type":"string","enum":["call"],"description":"This is the table that will be queried.","title":"JsonQueryOnCallTableWithNumberTypeColumnTable"},"JsonQueryOnCallTableWithNumberTypeColumnFiltersItems":{"oneOf":[{"$ref":"#/components/schemas/FilterStringTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterStringArrayTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterNumberTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterNumberArrayTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterDateTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterStructuredOutputColumnOnCallTable"}],"title":"JsonQueryOnCallTableWithNumberTypeColumnFiltersItems"},"JsonQueryOnCallTableWithNumberTypeColumnColumn":{"type":"string","enum":["cost","duration","averageModelLatency","averageVoiceLatency","averageTranscriberLatency","averageTurnLatency","averageEndpointingLatency","artifact.structuredOutputs[OutputID]"],"description":"This is the column that will be queried in the selected table.\nAvailable columns depend on the selected table.\nNumber Type columns are columns where the rows store Number data","title":"JsonQueryOnCallTableWithNumberTypeColumnColumn"},"JsonQueryOnCallTableWithNumberTypeColumnOperation":{"type":"string","enum":["average","sum","min","max"],"description":"This is the aggregation operation to perform on the column.\nWhen the column is a number type, the operation must be one of the following:\n- average\n- sum\n- min\n- max","title":"JsonQueryOnCallTableWithNumberTypeColumnOperation"},"JSONQueryOnCallTableWithNumberTypeColumn":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnType","description":"This is the type of query. Only allowed type is \"vapiql-json\"."},"table":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnTable","description":"This is the table that will be queried."},"filters":{"type":"array","items":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnFiltersItems"},"description":"This is the filters to apply to the insight.\nThe discriminator automatically selects the correct filter type based on column and operator."},"column":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnColumn","description":"This is the column that will be queried in the selected table.\nAvailable columns depend on the selected table.\nNumber Type columns are columns where the rows store Number data"},"operation":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnOperation","description":"This is the aggregation operation to perform on the column.\nWhen the column is a number type, the operation must be one of the following:\n- average\n- sum\n- min\n- max"},"name":{"type":"string","description":"This is the name of the query.\nIt will be used to label the query in the insight board on the UI."}},"required":["type","table","column","operation"],"description":"VapiQL JSON query that aggregates a numeric call-table column with optional call filters.","title":"JSONQueryOnCallTableWithNumberTypeColumn"},"JsonQueryOnCallTableWithStructuredOutputColumnType":{"type":"string","enum":["vapiql-json"],"description":"This is the type of query. Only allowed type is \"vapiql-json\".","title":"JsonQueryOnCallTableWithStructuredOutputColumnType"},"JsonQueryOnCallTableWithStructuredOutputColumnTable":{"type":"string","enum":["call"],"description":"This is the table that will be queried.","title":"JsonQueryOnCallTableWithStructuredOutputColumnTable"},"JsonQueryOnCallTableWithStructuredOutputColumnFiltersItems":{"oneOf":[{"$ref":"#/components/schemas/FilterStringTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterStringArrayTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterNumberTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterNumberArrayTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterDateTypeColumnOnCallTable"},{"$ref":"#/components/schemas/FilterStructuredOutputColumnOnCallTable"}],"title":"JsonQueryOnCallTableWithStructuredOutputColumnFiltersItems"},"JsonQueryOnCallTableWithStructuredOutputColumnColumn":{"type":"string","enum":["artifact.structuredOutputs[OutputID]"],"description":"This is the column that will be queried in the call table.\nStructured Output Type columns are only to query on artifact.structuredOutputs[OutputID] column.","title":"JsonQueryOnCallTableWithStructuredOutputColumnColumn"},"JsonQueryOnCallTableWithStructuredOutputColumnOperation":{"type":"string","enum":["average","count","sum","min","max"],"description":"This is the aggregation operation to perform on the column.\nWhen the column is a structured output type, the operation depends on the value of the structured output.\nIf the structured output is a string or boolean, the operation must be \"count\".\nIf the structured output is a number, the operation can be \"average\", \"sum\", \"min\", or \"max\".","title":"JsonQueryOnCallTableWithStructuredOutputColumnOperation"},"JSONQueryOnCallTableWithStructuredOutputColumn":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnType","description":"This is the type of query. Only allowed type is \"vapiql-json\"."},"table":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnTable","description":"This is the table that will be queried."},"filters":{"type":"array","items":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnFiltersItems"},"description":"This is the filters to apply to the insight.\nThe discriminator automatically selects the correct filter type based on column and operator."},"column":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnColumn","description":"This is the column that will be queried in the call table.\nStructured Output Type columns are only to query on artifact.structuredOutputs[OutputID] column."},"operation":{"$ref":"#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnOperation","description":"This is the aggregation operation to perform on the column.\nWhen the column is a structured output type, the operation depends on the value of the structured output.\nIf the structured output is a string or boolean, the operation must be \"count\".\nIf the structured output is a number, the operation can be \"average\", \"sum\", \"min\", or \"max\"."},"name":{"type":"string","description":"This is the name of the query.\nIt will be used to label the query in the insight board on the UI."}},"required":["type","table","column","operation"],"description":"VapiQL JSON query that aggregates or counts a structured-output value stored on call records.","title":"JSONQueryOnCallTableWithStructuredOutputColumn"},"JsonQueryOnEventsTableType":{"type":"string","enum":["vapiql-json"],"description":"This is the type of query. Only allowed type is \"vapiql-json\".","title":"JsonQueryOnEventsTableType"},"JsonQueryOnEventsTableTable":{"type":"string","enum":["events"],"description":"This is the table that will be queried.\nMust be \"events\" for event-based insights.","title":"JsonQueryOnEventsTableTable"},"JsonQueryOnEventsTableOn":{"type":"string","enum":["call.started","call.ended","call.inProgress","call.queued","call.transportConnected","call.transportDisconnected","call.transportReconnected","call.transferInitiated","call.transferCompleted","call.transferFailed","call.transferCancelled","call.handoffInitiated","call.handoffCompleted","call.handoffFailed","call.assistantSwapped","call.assistantStarted","call.customerJoined","call.customerLeft","call.controlReceived","call.listenStarted","call.recordingStarted","call.recordingPaused","call.recordingResumed","call.voicemailDetected","call.voicemailNotDetected","call.dtmfReceived","call.dtmfSent","call.amdDetected","call.hookTriggered","call.hookSucceeded","call.hookFailed","call.statusReceived","call.silenceTimeout","call.microphoneTimeout","call.maxDurationReached","assistant.voice.requestStarted","assistant.voice.requestSucceeded","assistant.voice.requestFailed","assistant.voice.connectionOpened","assistant.voice.connectionClosed","assistant.voice.firstAudioReceived","assistant.voice.audioChunkReceived","assistant.voice.generationSucceeded","assistant.voice.generationFailed","assistant.voice.textPushed","assistant.voice.reconnecting","assistant.voice.cleanup","assistant.voice.clearing","assistant.voice.voiceSwitched","assistant.model.requestStarted","assistant.model.requestSucceeded","assistant.model.requestFailed","assistant.model.requestAttemptStarted","assistant.model.requestAttemptSucceeded","assistant.model.requestAttemptFailed","assistant.model.connectionOpened","assistant.model.connectionClosed","assistant.model.firstTokenReceived","assistant.model.tokenReceived","assistant.model.responseSucceeded","assistant.model.responseFailed","assistant.model.toolCallsReceived","assistant.model.reconnecting","assistant.model.cleanup","assistant.model.clearing","assistant.tool.started","assistant.tool.completed","assistant.tool.failed","assistant.tool.delayedMessageSent","assistant.tool.timeout","assistant.tool.asyncCallbackReceived","assistant.transcriber.requestStarted","assistant.transcriber.requestSucceeded","assistant.transcriber.requestFailed","assistant.transcriber.connectionOpened","assistant.transcriber.connectionClosed","assistant.transcriber.partialTranscript","assistant.transcriber.finalTranscript","assistant.transcriber.keepAlive","assistant.transcriber.reconnecting","assistant.transcriber.cleanup","assistant.transcriber.clearing","assistant.transcriber.transcriptIgnored","assistant.transcriber.languageSwitched","assistant.analysis.structuredOutputRequest","assistant.analysis.structuredOutputResponse","assistant.analysis.structuredOutputError","assistant.analysis.structuredOutputGenerated","assistant.analysis.structuredOutputSkipped","pipeline.turnStarted","pipeline.cleared","pipeline.botSpeechStarted","pipeline.botSpeechStopped","pipeline.userSpeechStarted","pipeline.userSpeechStopped","pipeline.endpointingTriggered","pipeline.firstMessageStarted","pipeline.firstMessageCompleted"],"description":"The event type to query","title":"JsonQueryOnEventsTableOn"},"JsonQueryOnEventsTableOperation":{"type":"string","enum":["count","percentage"],"description":"This is the operation to perform on matching events.\n- \"count\": Returns the raw count of matching events\n- \"percentage\": Returns (count of matching events / total calls) * 100","title":"JsonQueryOnEventsTableOperation"},"EventsTableStringConditionOperator":{"type":"string","enum":["=","!=","contains","notContains"],"description":"String comparison operator","title":"EventsTableStringConditionOperator"},"EventsTableStringCondition":{"type":"object","properties":{"column":{"type":"string","description":"The string field name from the event data"},"operator":{"$ref":"#/components/schemas/EventsTableStringConditionOperator","description":"String comparison operator"},"value":{"type":"string","description":"The string value to compare"}},"required":["column","operator","value"],"description":"Filters event data by comparing or searching a string field.","title":"EventsTableStringCondition"},"EventsTableNumberConditionOperator":{"type":"string","enum":["=","!=",">",">=","<","<="],"description":"Number comparison operator","title":"EventsTableNumberConditionOperator"},"EventsTableNumberCondition":{"type":"object","properties":{"column":{"type":"string","description":"The number field name from the event data"},"operator":{"$ref":"#/components/schemas/EventsTableNumberConditionOperator","description":"Number comparison operator"},"value":{"type":"number","format":"double","description":"The number value to compare"}},"required":["column","operator","value"],"description":"Filters event data by comparing a numeric field with a value.","title":"EventsTableNumberCondition"},"EventsTableBooleanConditionOperator":{"type":"string","enum":["="],"description":"Boolean comparison operator","title":"EventsTableBooleanConditionOperator"},"EventsTableBooleanCondition":{"type":"object","properties":{"column":{"type":"string","description":"The boolean field name from the event data"},"operator":{"$ref":"#/components/schemas/EventsTableBooleanConditionOperator","description":"Boolean comparison operator"},"value":{"type":"boolean","description":"The boolean value to compare"}},"required":["column","operator","value"],"description":"Filters event data by comparing a boolean field with an expected value.","title":"EventsTableBooleanCondition"},"JsonQueryOnEventsTableFiltersItems":{"oneOf":[{"$ref":"#/components/schemas/EventsTableStringCondition"},{"$ref":"#/components/schemas/EventsTableNumberCondition"},{"$ref":"#/components/schemas/EventsTableBooleanCondition"}],"title":"JsonQueryOnEventsTableFiltersItems"},"JSONQueryOnEventsTable":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/JsonQueryOnEventsTableType","description":"This is the type of query. Only allowed type is \"vapiql-json\"."},"table":{"$ref":"#/components/schemas/JsonQueryOnEventsTableTable","description":"This is the table that will be queried.\nMust be \"events\" for event-based insights."},"on":{"$ref":"#/components/schemas/JsonQueryOnEventsTableOn","description":"The event type to query"},"operation":{"$ref":"#/components/schemas/JsonQueryOnEventsTableOperation","description":"This is the operation to perform on matching events.\n- \"count\": Returns the raw count of matching events\n- \"percentage\": Returns (count of matching events / total calls) * 100"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/JsonQueryOnEventsTableFiltersItems"},"description":"These are the filters to apply to the events query.\nEach filter filters on a field specific to the event type."},"name":{"type":"string","description":"This is the name of the query.\nIt will be used to label the query in the insight board on the UI."}},"required":["type","table","on","operation"],"description":"VapiQL JSON query that counts or calculates the percentage of matching events using optional typed event-data filters.","title":"JSONQueryOnEventsTable"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"},{"$ref":"#/components/schemas/JSONQueryOnEventsTable"}],"title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"InsightTimeRangeStart":{"type":"object","properties":{},"description":"This is the start date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to the 7 days ago.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years","title":"InsightTimeRangeStart"},"InsightTimeRangeEnd":{"type":"object","properties":{},"description":"This is the end date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to now.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years","title":"InsightTimeRangeEnd"},"InsightTimeRange":{"type":"object","properties":{"start":{"$ref":"#/components/schemas/InsightTimeRangeStart","description":"This is the start date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to the 7 days ago.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years"},"end":{"$ref":"#/components/schemas/InsightTimeRangeEnd","description":"This is the end date for the time range.\n\nShould be a valid ISO 8601 date-time string or relative time string.\nIf not provided, defaults to now.\n\nRelative time strings of the format \"-{number}{unit}\" are allowed.\n\nValid units are:\n- d: days\n- h: hours\n- w: weeks\n- m: months\n- y: years"},"timezone":{"type":"string","description":"This is the timezone you want to set for the query.\n\nIf not provided, defaults to UTC."}},"description":"Start, end, and timezone used to limit an insight query by time.","title":"InsightTimeRange"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"LineInsightMetadata":{"type":"object","properties":{"xAxisLabel":{"type":"string","minLength":1,"maxLength":40,"description":"Label displayed on the chart's x-axis."},"yAxisLabel":{"type":"string","minLength":1,"maxLength":40,"description":"Label displayed on the chart's y-axis."},"yAxisMin":{"type":"number","format":"double","description":"Minimum value displayed on the chart's y-axis."},"yAxisMax":{"type":"number","format":"double","description":"Maximum value displayed on the chart's y-axis."},"name":{"type":"string","minLength":1,"maxLength":255,"description":"Display name for the insight chart."}},"description":"Display settings for a line insight, including chart name, axis labels, and optional y-axis bounds.","title":"LineInsightMetadata"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula":{"type":"object","properties":{},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula.","title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula"},"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"Insight_InsightController_create_Request":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type","queries"],"description":"Configuration used to create a bar-chart insight from call data using metric queries, formulas, grouping, and a stepped time range."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type","queries"],"description":"Configuration used to create a pie-chart insight from call data using metric queries, formulas, grouping, and a time range."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type","queries"],"description":"Configuration used to create a line-chart insight from call data using metric queries, formulas, grouping, and a stepped time range."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"}},"required":["type","queries"],"description":"Configuration used to create a text-value insight from call data using metric queries, a formula, and a time range."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_create_Request"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"},{"$ref":"#/components/schemas/JSONQueryOnEventsTable"}],"title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula":{"type":"object","properties":{},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula.","title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula"},"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"Insight_InsightController_create_Response_201":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved bar-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved pie-chart insight containing its call-data queries, formulas, grouping, time range, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved line-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved text-value insight containing its call-data queries, formula, time range, and lifecycle information."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_create_Response_201"},"Insight_InsightController_findOne_Response_200":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved bar-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved pie-chart insight containing its call-data queries, formulas, grouping, time range, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved line-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved text-value insight containing its call-data queries, formula, time range, and lifecycle information."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_findOne_Response_200"},"Insight_InsightController_remove_Response_200":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved bar-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved pie-chart insight containing its call-data queries, formulas, grouping, time range, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved line-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved text-value insight containing its call-data queries, formula, time range, and lifecycle information."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_remove_Response_200"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"},{"$ref":"#/components/schemas/JSONQueryOnEventsTable"}],"title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy":{"type":"string","enum":["assistantId","workflowId","squadId","phoneNumberId","type","endedReason","customerNumber","campaignId","artifact.structuredOutputs[OutputID]"],"description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default.","title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula":{"type":"object","properties":{},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula.","title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula"},"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems":{"oneOf":[{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn"},{"$ref":"#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn"}],"title":"ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"Insight_InsightController_update_Request":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type"],"description":"Fields used to update a bar-chart insight, including its queries, formulas, grouping, time range, metadata, and name."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type"],"description":"Fields used to update a pie-chart insight, including its queries, formulas, grouping, time range, and name."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type"],"description":"Fields used to update a line-chart insight, including its queries, formulas, grouping, time range, metadata, and name."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"}},"required":["type"],"description":"Fields used to update a text-value insight, including its queries, formula, time range, and name."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_update_Request"},"Insight_InsightController_update_Response_200":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved bar-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved pie-chart insight containing its call-data queries, formulas, grouping, time range, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved line-chart insight containing its call-data queries, formulas, grouping, stepped time range, metadata, and lifecycle information."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"},"id":{"type":"string","description":"This is the unique identifier for the Insight."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Insight belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Insight was created."},"updatedAt":{"type":"string","format":"date-time","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":["type","queries","id","orgId","createdAt","updatedAt"],"description":"A saved text-value insight containing its call-data queries, formula, time range, and lifecycle information."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_update_Response_200"},"InsightRunFormatPlanFormat":{"type":"string","enum":["raw","recharts"],"description":"This is the format of the data to return.\nIf not provided, defaults to \"raw\".\nRaw provides the data as fetched from the database, with formulas evaluated.\nRecharts provides the data in a format that can is ready to be used by recharts.js to render charts.","title":"InsightRunFormatPlanFormat"},"InsightRunFormatPlan":{"type":"object","properties":{"format":{"$ref":"#/components/schemas/InsightRunFormatPlanFormat","description":"This is the format of the data to return.\nIf not provided, defaults to \"raw\".\nRaw provides the data as fetched from the database, with formulas evaluated.\nRecharts provides the data in a format that can is ready to be used by recharts.js to render charts."}},"description":"Selects whether an insight run returns raw data or Recharts-formatted data.","title":"InsightRunFormatPlan"},"InsightRunDTO":{"type":"object","properties":{"formatPlan":{"$ref":"#/components/schemas/InsightRunFormatPlan","description":"Output-formatting instructions applied to the insight run."},"timeRangeOverride":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"This is the optional time range override for the insight.\nIf provided, overrides every field in the insight's timeRange.\nIf this is provided with missing fields, defaults will be used, not the insight's timeRange.\nstart default - \"-7d\"\nend default - \"now\"\nstep default - \"day\"\nFor Pie and Text Insights, step will be ignored even if provided."},"assistantId":{"type":"string","description":"Optional runtime assistant scope for dashboards.\nThis is applied to call-table queries without mutating the saved insight."}},"description":"Options for running a saved insight, including optional time-range and output-format overrides.","title":"InsightRunDTO"},"InsightRunResponse":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier for the insight run."},"insightId":{"type":"string","description":"The unique identifier for the insight that was run."},"orgId":{"type":"string","description":"The unique identifier for the organization that owns the run."},"createdAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the insight run was created."},"updatedAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the insight run was last updated."}},"required":["id","insightId","orgId","createdAt","updatedAt"],"description":"Metadata identifying a saved insight run and its lifecycle timestamps.","title":"InsightRunResponse"},"Insight_InsightController_preview_Request":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bar"],"description":"Discriminator value: bar"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/BarInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the bar-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type","queries"],"description":"Configuration used to create a bar-chart insight from call data using metric queries, formulas, grouping, and a stepped time range."},{"type":"object","properties":{"type":{"type":"string","enum":["pie"],"description":"Discriminator value: pie"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the pie-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type","queries"],"description":"Configuration used to create a pie-chart insight from call data using metric queries, formulas, grouping, and a time range."},{"type":"object","properties":{"type":{"type":"string","enum":["line"],"description":"Discriminator value: line"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formulas":{"type":"array","items":{"$ref":"#/components/schemas/InsightFormula"},"description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"metadata":{"$ref":"#/components/schemas/LineInsightMetadata","description":"This is the metadata for the insight."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"The time range and interval used to aggregate the line-chart data."},"groupBy":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy","description":"This is the group by column for the insight when table is `call`.\nThese are the columns to group the results by.\nAll results are grouped by the time range step by default."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems"},"description":"These are the queries to run to generate the insight."}},"required":["type","queries"],"description":"Configuration used to create a line-chart insight from call data using metric queries, formulas, grouping, and a stepped time range."},{"type":"object","properties":{"type":{"type":"string","enum":["text"],"description":"Discriminator value: text"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"This is the name of the Insight."},"formula":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula","description":"Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}} which will be substituted with the query result.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula."},"timeRange":{"$ref":"#/components/schemas/InsightTimeRange","description":"The time range used to query the text-value data."},"queries":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems"},"description":"These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided"}},"required":["type","queries"],"description":"Configuration used to create a text-value insight from call data using metric queries, a formula, and a time range."}],"discriminator":{"propertyName":"type"},"title":"Insight_InsightController_preview_Request"},"ReportingBoardGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"ReportingBoardGetParametersSortOrder"},"ReportingBoardGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"ReportingBoardGetParametersSortBy"},"BoardInsightItemType":{"type":"string","enum":["insight"],"title":"BoardInsightItemType"},"BoardItemPosition":{"type":"object","properties":{"x":{"type":"number","format":"double","minimum":0},"y":{"type":"number","format":"double","minimum":0}},"required":["x","y"],"title":"BoardItemPosition"},"BoardItemSize":{"type":"object","properties":{"width":{"type":"number","format":"double","minimum":1},"height":{"type":"number","format":"double","minimum":1}},"required":["width","height"],"title":"BoardItemSize"},"BoardInsightItem":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BoardInsightItemType"},"insightId":{"type":"string"},"systemKey":{"type":"string"},"position":{"$ref":"#/components/schemas/BoardItemPosition"},"size":{"$ref":"#/components/schemas/BoardItemSize"}},"required":["type","insightId","position","size"],"title":"BoardInsightItem"},"BoardMetricWidgetItemType":{"type":"string","enum":["failed_calls_list","concurrency_chart","average_cost_breakdown_chart"],"title":"BoardMetricWidgetItemType"},"BoardMetricWidgetItem":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/BoardMetricWidgetItemType"},"position":{"$ref":"#/components/schemas/BoardItemPosition"},"size":{"$ref":"#/components/schemas/BoardItemSize"},"insightId":{"type":"string"},"systemKey":{"type":"string"}},"required":["type","position","size"],"title":"BoardMetricWidgetItem"},"BoardItemsItems":{"oneOf":[{"$ref":"#/components/schemas/BoardInsightItem"},{"$ref":"#/components/schemas/BoardMetricWidgetItem"}],"title":"BoardItemsItems"},"BoardLayout":{"type":"object","properties":{"columns":{"type":"number","format":"double","minimum":6,"maximum":6,"description":"This is the number of columns in the Board.\nFor now, it is fixed to 6."}},"required":["columns"],"title":"BoardLayout"},"Board":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BoardItemsItems"},"description":"This is the contents of the Board, which is an array of objects defining the type, contents, and position of the widgets on the Board."},"id":{"type":"string","description":"This is the unique identifier for the Board."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this Board belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Board was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the Board was last updated."},"systemKey":{"type":"string","description":"Server-owned key for system-provisioned boards. User create/update DTOs do\nnot accept this field."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the Board."},"layout":{"$ref":"#/components/schemas/BoardLayout","description":"This is the layout of the Board."},"timeRangeOverride":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"This is the timerange override for the board.\nBy default, individual insights have their own timerange.\nThis is a global override for the board which will be passed to all insights on the board."}},"required":["id","orgId","createdAt","updatedAt","name","layout"],"title":"Board"},"BoardPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Board"}},"metadata":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["results","metadata"],"title":"BoardPaginatedResponse"},"CreateBoardDtoItemsItems":{"oneOf":[{"$ref":"#/components/schemas/BoardInsightItem"},{"$ref":"#/components/schemas/BoardMetricWidgetItem"}],"title":"CreateBoardDtoItemsItems"},"CreateBoardDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CreateBoardDtoItemsItems"},"description":"This is the contents of the Board, which is an array of objects defining the type, contents, and position of the widgets on the Board."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the Board."},"layout":{"$ref":"#/components/schemas/BoardLayout","description":"This is the layout of the Board."},"timeRangeOverride":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"This is the timerange override for the board.\nBy default, individual insights have their own timerange.\nThis is a global override for the board which will be passed to all insights on the board."}},"required":["name","layout"],"title":"CreateBoardDTO"},"UpdateBoardDtoItemsItems":{"oneOf":[{"$ref":"#/components/schemas/BoardInsightItem"},{"$ref":"#/components/schemas/BoardMetricWidgetItem"}],"title":"UpdateBoardDtoItemsItems"},"UpdateBoardDTO":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UpdateBoardDtoItemsItems"},"description":"This is the contents of the Board, which is an array of objects defining the type, contents, and position of the widgets on the Board."},"name":{"type":"string","minLength":1,"maxLength":40,"description":"This is the name of the Board."},"layout":{"$ref":"#/components/schemas/BoardLayout","description":"This is the layout of the Board."},"timeRangeOverride":{"$ref":"#/components/schemas/InsightTimeRangeWithStep","description":"This is the timerange override for the board.\nBy default, individual insights have their own timerange.\nThis is a global override for the board which will be passed to all insights on the board."}},"title":"UpdateBoardDTO"},"EvalGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalGetParametersSortOrder"},"EvalGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalGetParametersSortBy"},"ChatEvalAssistantMessageMockRole":{"type":"string","enum":["assistant"],"default":"assistant","description":"This is the role of the message author.\nFor a mock assistant message, the role is always 'assistant'\n@default 'assistant'","title":"ChatEvalAssistantMessageMockRole"},"ChatEvalAssistantMessageMockToolCallArguments":{"type":"object","properties":{},"description":"This is the arguments that will be passed to the tool call.","title":"ChatEvalAssistantMessageMockToolCallArguments"},"ChatEvalAssistantMessageMockToolCall":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"description":"This is the name of the tool that will be called.\nIt should be one of the tools created in the organization."},"arguments":{"$ref":"#/components/schemas/ChatEvalAssistantMessageMockToolCallArguments","description":"This is the arguments that will be passed to the tool call."}},"required":["name"],"description":"A simulated assistant tool call with the tool name and optional arguments.","title":"ChatEvalAssistantMessageMockToolCall"},"ChatEvalAssistantMessageMock":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ChatEvalAssistantMessageMockRole","description":"This is the role of the message author.\nFor a mock assistant message, the role is always 'assistant'\n@default 'assistant'"},"content":{"type":"string","maxLength":1000,"description":"This is the content of the assistant message.\nThis is the message that the assistant would have sent."},"toolCalls":{"type":"array","items":{"$ref":"#/components/schemas/ChatEvalAssistantMessageMockToolCall"},"description":"This is the tool calls that will be made by the assistant."}},"required":["role"],"description":"A simulated assistant turn in an evaluation conversation, with optional message content and tool calls.","title":"ChatEvalAssistantMessageMock"},"ChatEvalSystemMessageMockRole":{"type":"string","enum":["system"],"default":"system","description":"This is the role of the message author.\nFor a mock system message, the role is always 'system'\n@default 'system'","title":"ChatEvalSystemMessageMockRole"},"ChatEvalSystemMessageMock":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ChatEvalSystemMessageMockRole","description":"This is the role of the message author.\nFor a mock system message, the role is always 'system'\n@default 'system'"},"content":{"type":"string","description":"This is the content of the system message that would have been added in the middle of the conversation.\nDo not include the assistant prompt as a part of this message. It will automatically be fetched during runtime."}},"required":["role","content"],"description":"A simulated system message in an evaluation conversation.","title":"ChatEvalSystemMessageMock"},"ChatEvalToolResponseMessageMockRole":{"type":"string","enum":["tool"],"default":"tool","description":"This is the role of the message author.\nFor a mock tool response message, the role is always 'tool'\n@default 'tool'","title":"ChatEvalToolResponseMessageMockRole"},"ChatEvalToolResponseMessageMock":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ChatEvalToolResponseMessageMockRole","description":"This is the role of the message author.\nFor a mock tool response message, the role is always 'tool'\n@default 'tool'"},"content":{"type":"string","description":"This is the content of the tool response message. JSON Objects should be stringified."}},"required":["role","content"],"description":"A simulated tool response in an evaluation conversation.","title":"ChatEvalToolResponseMessageMock"},"ChatEvalToolResponseMessageEvaluationRole":{"type":"string","enum":["tool"],"default":"tool","description":"This is the role of the message author.\nFor a tool response message evaluation, the role is always 'tool'\n@default 'tool'","title":"ChatEvalToolResponseMessageEvaluationRole"},"EvalOpenAiModelProvider":{"type":"string","enum":["openai"],"description":"This is the provider of the model (`openai`).","title":"EvalOpenAiModelProvider"},"EvalOpenAiModelModel":{"type":"string","enum":["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5","chat-latest","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.2-chat-latest","gpt-5.1","gpt-5.1-chat-latest","gpt-5","gpt-5-chat-latest","gpt-5-mini","gpt-5-nano","gpt-4.1-2025-04-14","gpt-4.1-mini-2025-04-14","gpt-4.1-nano-2025-04-14","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","chatgpt-4o-latest","o3","o3-mini","o4-mini","o1-mini","o1-mini-2024-09-12","gpt-4o-mini-2024-07-18","gpt-4o-mini","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4-1106-preview","gpt-4","gpt-4-0613","gpt-3.5-turbo","gpt-3.5-turbo-0125","gpt-3.5-turbo-1106","gpt-3.5-turbo-16k","gpt-3.5-turbo-0613","gpt-5.6-luna:westus3","gpt-5.6-terra:westus3","gpt-5.6-sol:westus3","gpt-5.4:eastus2","gpt-5.4:swedencentral","gpt-5.4-mini:eastus2","gpt-5.4-mini:swedencentral","gpt-5.4-nano:eastus2","gpt-5.4-nano:swedencentral","gpt-5.2:eastus2","gpt-5.2:swedencentral","gpt-5.1:eastus2","gpt-5.1:swedencentral","gpt-5:eastus2","gpt-5:swedencentral","gpt-5:canadaeast","gpt-5:eastus","gpt-5:westeurope","gpt-5:germanywestcentral","gpt-5:polandcentral","gpt-5:spaincentral","gpt-5-mini:eastus2","gpt-5-mini:swedencentral","gpt-5-mini:westeurope","gpt-5-mini:germanywestcentral","gpt-5-mini:polandcentral","gpt-5-mini:spaincentral","gpt-5-nano:eastus2","gpt-5-nano:swedencentral","gpt-4.1-2025-04-14:westus","gpt-4.1-2025-04-14:eastus2","gpt-4.1-2025-04-14:eastus","gpt-4.1-2025-04-14:westus3","gpt-4.1-2025-04-14:northcentralus","gpt-4.1-2025-04-14:southcentralus","gpt-4.1-2025-04-14:westeurope","gpt-4.1-2025-04-14:germanywestcentral","gpt-4.1-2025-04-14:polandcentral","gpt-4.1-2025-04-14:spaincentral","gpt-4.1-mini-2025-04-14:westus","gpt-4.1-mini-2025-04-14:eastus2","gpt-4.1-mini-2025-04-14:eastus","gpt-4.1-mini-2025-04-14:westus3","gpt-4.1-mini-2025-04-14:northcentralus","gpt-4.1-mini-2025-04-14:southcentralus","gpt-4.1-mini-2025-04-14:westeurope","gpt-4.1-mini-2025-04-14:germanywestcentral","gpt-4.1-mini-2025-04-14:polandcentral","gpt-4.1-mini-2025-04-14:spaincentral","gpt-4.1-nano-2025-04-14:westus","gpt-4.1-nano-2025-04-14:eastus2","gpt-4.1-nano-2025-04-14:westus3","gpt-4.1-nano-2025-04-14:northcentralus","gpt-4.1-nano-2025-04-14:southcentralus","gpt-4o-2024-11-20:swedencentral","gpt-4o-2024-11-20:westus","gpt-4o-2024-11-20:eastus2","gpt-4o-2024-11-20:eastus","gpt-4o-2024-11-20:westus3","gpt-4o-2024-11-20:southcentralus","gpt-4o-2024-11-20:westeurope","gpt-4o-2024-11-20:germanywestcentral","gpt-4o-2024-11-20:polandcentral","gpt-4o-2024-11-20:spaincentral","gpt-4o-2024-08-06:westus","gpt-4o-2024-08-06:westus3","gpt-4o-2024-08-06:eastus","gpt-4o-2024-08-06:eastus2","gpt-4o-2024-08-06:northcentralus","gpt-4o-2024-08-06:southcentralus","gpt-4o-mini-2024-07-18:westus","gpt-4o-mini-2024-07-18:westus3","gpt-4o-mini-2024-07-18:eastus","gpt-4o-mini-2024-07-18:eastus2","gpt-4o-mini-2024-07-18:northcentralus","gpt-4o-mini-2024-07-18:southcentralus","gpt-4o-2024-05-13:eastus2","gpt-4o-2024-05-13:eastus","gpt-4o-2024-05-13:northcentralus","gpt-4o-2024-05-13:southcentralus","gpt-4o-2024-05-13:westus3","gpt-4o-2024-05-13:westus","gpt-4-turbo-2024-04-09:eastus2","gpt-4-0125-preview:eastus","gpt-4-0125-preview:northcentralus","gpt-4-0125-preview:southcentralus","gpt-4-1106-preview:australiaeast","gpt-4-1106-preview:canadaeast","gpt-4-1106-preview:france","gpt-4-1106-preview:india","gpt-4-1106-preview:norway","gpt-4-1106-preview:swedencentral","gpt-4-1106-preview:uk","gpt-4-1106-preview:westus","gpt-4-1106-preview:westus3","gpt-4-0613:canadaeast","gpt-3.5-turbo-0125:canadaeast","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-4.1:australiaeast","gpt-4o:australiaeast","gpt-5.4-mini:australiaeast"],"description":"This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.","title":"EvalOpenAiModelModel"},"EvalOpenAiModelMessagesItems":{"type":"object","properties":{},"title":"EvalOpenAiModelMessagesItems"},"EvalOpenAIModel":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/EvalOpenAiModelProvider","description":"This is the provider of the model (`openai`)."},"model":{"$ref":"#/components/schemas/EvalOpenAiModelModel","description":"This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to avoid hallucinations and ensure the model judges the output correctly based on the instructions."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model.\nIf your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and therefore is recommended to set it to a low number to force the model to return a short response."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/EvalOpenAiModelMessagesItems"},"description":"These are the messages which will instruct the AI Judge on how to evaluate the assistant message.\nThe LLM-Judge must respond with \"pass\" or \"fail\" to indicate if the assistant message passes the eval.\n\nTo access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.\nThe assistant message to be evaluated will be passed as the last message in the `messages` array and can be accessed using `{{messages[-1]}}`.\n\nIt is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and then use the first user message to pass the assistant message to be evaluated."}},"required":["provider","model","messages"],"description":"OpenAI model configuration for an LLM judge, including its messages and generation settings.","title":"EvalOpenAIModel"},"EvalAnthropicModelProvider":{"type":"string","enum":["anthropic"],"description":"This is the provider of the model (`anthropic`).","title":"EvalAnthropicModelProvider"},"EvalAnthropicModelModel":{"type":"string","enum":["claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307","claude-3-5-sonnet-20240620","claude-3-5-sonnet-20241022","claude-3-5-haiku-20241022","claude-3-7-sonnet-20250219","claude-opus-4-20250514","claude-opus-4-5-20251101","claude-opus-4-6","claude-sonnet-4-20250514","claude-sonnet-4-5-20250929","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5-20251001"],"description":"This is the specific model that will be used.","title":"EvalAnthropicModelModel"},"EvalAnthropicModelMessagesItems":{"type":"object","properties":{},"title":"EvalAnthropicModelMessagesItems"},"EvalAnthropicModel":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/EvalAnthropicModelProvider","description":"This is the provider of the model (`anthropic`)."},"model":{"$ref":"#/components/schemas/EvalAnthropicModelModel","description":"This is the specific model that will be used."},"thinking":{"$ref":"#/components/schemas/AnthropicThinkingConfig","description":"This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`."},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to avoid hallucinations and ensure the model judges the output correctly based on the instructions."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model.\nIf your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and therefore is recommended to set it to a low number to force the model to return a short response."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/EvalAnthropicModelMessagesItems"},"description":"These are the messages which will instruct the AI Judge on how to evaluate the assistant message.\nThe LLM-Judge must respond with \"pass\" or \"fail\" to indicate if the assistant message passes the eval.\n\nTo access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.\nThe assistant message to be evaluated will be passed as the last message in the `messages` array and can be accessed using `{{messages[-1]}}`.\n\nIt is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and then use the first user message to pass the assistant message to be evaluated."}},"required":["provider","model","messages"],"description":"Anthropic model configuration for an LLM judge, including its messages, generation settings, and optional extended thinking.","title":"EvalAnthropicModel"},"EvalGoogleModelProvider":{"type":"string","enum":["google"],"description":"This is the provider of the model (`google`).","title":"EvalGoogleModelProvider"},"EvalGoogleModelModel":{"type":"string","enum":["gemini-3.5-flash","gemini-3.1-flash-lite","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash-thinking-exp","gemini-2.0-pro-exp-02-05","gemini-2.0-flash","gemini-2.0-flash-lite","gemini-2.0-flash-exp","gemini-2.0-flash-realtime-exp","gemini-1.5-flash","gemini-1.5-flash-002","gemini-1.5-pro","gemini-1.5-pro-002","gemini-1.0-pro"],"description":"This is the name of the model. Ex. gpt-4o","title":"EvalGoogleModelModel"},"EvalGoogleModelMessagesItems":{"type":"object","properties":{},"title":"EvalGoogleModelMessagesItems"},"EvalGoogleModel":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/EvalGoogleModelProvider","description":"This is the provider of the model (`google`)."},"model":{"$ref":"#/components/schemas/EvalGoogleModelModel","description":"This is the name of the model. Ex. gpt-4o"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to avoid hallucinations and ensure the model judges the output correctly based on the instructions."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model.\nIf your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and therefore is recommended to set it to a low number to force the model to return a short response."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/EvalGoogleModelMessagesItems"},"description":"These are the messages which will instruct the AI Judge on how to evaluate the assistant message.\nThe LLM-Judge must respond with \"pass\" or \"fail\" to indicate if the assistant message passes the eval.\n\nTo access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.\nThe assistant message to be evaluated will be passed as the last message in the `messages` array and can be accessed using `{{messages[-1]}}`.\n\nIt is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and then use the first user message to pass the assistant message to be evaluated."}},"required":["provider","model","messages"],"description":"Google model configuration for an LLM judge, including its messages and generation settings.","title":"EvalGoogleModel"},"EvalCustomModelProvider":{"type":"string","enum":["custom-llm"],"description":"This is the provider of the model (`custom-llm`).","title":"EvalCustomModelProvider"},"EvalCustomModelHeaders":{"type":"object","properties":{},"description":"These are the headers we'll use for the OpenAI client's `headers`.","title":"EvalCustomModelHeaders"},"EvalCustomModelMessagesItems":{"type":"object","properties":{},"title":"EvalCustomModelMessagesItems"},"EvalCustomModel":{"type":"object","properties":{"provider":{"$ref":"#/components/schemas/EvalCustomModelProvider","description":"This is the provider of the model (`custom-llm`)."},"url":{"type":"string","description":"These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1"},"headers":{"$ref":"#/components/schemas/EvalCustomModelHeaders","description":"These are the headers we'll use for the OpenAI client's `headers`."},"timeoutSeconds":{"type":"number","format":"double","minimum":20,"maximum":600,"description":"This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds."},"model":{"type":"string","maxLength":100,"description":"This is the name of the model. Ex. gpt-4o"},"temperature":{"type":"number","format":"double","minimum":0,"maximum":2,"description":"This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to avoid hallucinations and ensure the model judges the output correctly based on the instructions."},"maxTokens":{"type":"number","format":"double","minimum":50,"maximum":10000,"description":"This is the max tokens of the model.\nIf your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and therefore is recommended to set it to a low number to force the model to return a short response."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/EvalCustomModelMessagesItems"},"description":"These are the messages which will instruct the AI Judge on how to evaluate the assistant message.\nThe LLM-Judge must respond with \"pass\" or \"fail\" to indicate if the assistant message passes the eval.\n\nTo access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.\nThe assistant message to be evaluated will be passed as the last message in the `messages` array and can be accessed using `{{messages[-1]}}`.\n\nIt is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and then use the first user message to pass the assistant message to be evaluated."}},"required":["provider","url","model","messages"],"description":"OpenAI-compatible custom model configuration for an LLM judge, including its endpoint, headers, messages, and generation settings.","title":"EvalCustomModel"},"AssistantMessageJudgePlanAiModel":{"oneOf":[{"$ref":"#/components/schemas/EvalOpenAIModel"},{"$ref":"#/components/schemas/EvalAnthropicModel"},{"$ref":"#/components/schemas/EvalGoogleModel"},{"$ref":"#/components/schemas/EvalCustomModel"}],"description":"This is the model to use for the LLM-as-a-judge.\nIf not provided, will default to the assistant's model.\n\nThe instructions on how to evaluate the model output with this LLM-Judge must be passed as a system message in the messages array of the model.\n\nThe Mock conversation can be passed to the LLM-Judge to evaluate using the prompt {{messages}} and will be evaluated as a LiquidJS Variable. To access and judge only the last message, use {{messages[-1]}}\n\nThe LLM-Judge must respond with \"pass\" or \"fail\" and only those two responses are allowed.","title":"AssistantMessageJudgePlanAiModel"},"AssistantMessageJudgePlanAiType":{"type":"string","enum":["ai"],"description":"This is the type of the judge plan.\nUse 'ai' to evaluate the assistant message content using LLM-as-a-judge.\n@default 'ai'","title":"AssistantMessageJudgePlanAiType"},"AssistantMessageJudgePlanAI":{"type":"object","properties":{"model":{"$ref":"#/components/schemas/AssistantMessageJudgePlanAiModel","description":"This is the model to use for the LLM-as-a-judge.\nIf not provided, will default to the assistant's model.\n\nThe instructions on how to evaluate the model output with this LLM-Judge must be passed as a system message in the messages array of the model.\n\nThe Mock conversation can be passed to the LLM-Judge to evaluate using the prompt {{messages}} and will be evaluated as a LiquidJS Variable. To access and judge only the last message, use {{messages[-1]}}\n\nThe LLM-Judge must respond with \"pass\" or \"fail\" and only those two responses are allowed."},"type":{"$ref":"#/components/schemas/AssistantMessageJudgePlanAiType","description":"This is the type of the judge plan.\nUse 'ai' to evaluate the assistant message content using LLM-as-a-judge.\n@default 'ai'"},"autoIncludeMessageHistory":{"type":"boolean","description":"This is the flag to enable automatically adding the liquid variable {{messages}} to the model's messages array\nThis is only applicable if the user has not provided any messages in the model's messages array\n@default true"}},"required":["model","type"],"description":"Evaluates an assistant message with an LLM judge and a configured evaluation model.","title":"AssistantMessageJudgePlanAI"},"ChatEvalToolResponseMessageEvaluation":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ChatEvalToolResponseMessageEvaluationRole","description":"This is the role of the message author.\nFor a tool response message evaluation, the role is always 'tool'\n@default 'tool'"},"judgePlan":{"$ref":"#/components/schemas/AssistantMessageJudgePlanAI","description":"This is the judge plan that instructs how to evaluate the tool response message.\nThe tool response message can be evaluated with an LLM-as-judge by defining the evaluation criteria in a prompt."}},"required":["role","judgePlan"],"description":"An expected tool-response turn evaluated by a configured LLM judge.","title":"ChatEvalToolResponseMessageEvaluation"},"ChatEvalUserMessageMockRole":{"type":"string","enum":["user"],"default":"user","description":"This is the role of the message author.\nFor a mock user message, the role is always 'user'\n@default 'user'","title":"ChatEvalUserMessageMockRole"},"ChatEvalUserMessageMock":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ChatEvalUserMessageMockRole","description":"This is the role of the message author.\nFor a mock user message, the role is always 'user'\n@default 'user'"},"content":{"type":"string","maxLength":1000,"description":"This is the content of the user message.\nThis is the message that the user would have sent."}},"required":["role","content"],"description":"A simulated user message in an evaluation conversation.","title":"ChatEvalUserMessageMock"},"ChatEvalAssistantMessageEvaluationRole":{"type":"string","enum":["assistant"],"default":"assistant","description":"This is the role of the message author.\nFor an assistant message evaluation, the role is always 'assistant'\n@default 'assistant'","title":"ChatEvalAssistantMessageEvaluationRole"},"AssistantMessageJudgePlanExactType":{"type":"string","enum":["exact"],"description":"This is the type of the judge plan.\nUse 'exact' for an exact match on the content and tool calls - without using LLM-as-a-judge.\n@default 'exact'","title":"AssistantMessageJudgePlanExactType"},"AssistantMessageJudgePlanExact":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AssistantMessageJudgePlanExactType","description":"This is the type of the judge plan.\nUse 'exact' for an exact match on the content and tool calls - without using LLM-as-a-judge.\n@default 'exact'"},"content":{"type":"string","maxLength":1000,"description":"This is what that will be used to evaluate the model's message content.\nIf you provide a string, the assistant message content will be evaluated against it as an exact match, case-insensitive."},"toolCalls":{"type":"array","items":{"$ref":"#/components/schemas/ChatEvalAssistantMessageMockToolCall"},"description":"This is the tool calls that will be used to evaluate the model's message content.\nThe tool name must be a valid tool that the assistant is allowed to call.\n\nFor the Query tool, the arguments for the tool call are in the format - {knowledgeBaseNames: ['kb_name', 'kb_name_2']}\n\nFor the DTMF tool, the arguments for the tool call are in the format - {dtmf: \"1234*\"}\n\nFor the Handoff tool, the arguments for the tool call are in the format - {destination: \"assistant_id\"}\n\nFor the Transfer Call tool, the arguments for the tool call are in the format - {destination: \"phone_number_or_assistant_id\"}\n\nFor all other tools, they are called without arguments or with user-defined arguments"}},"required":["type","content"],"description":"Evaluates an assistant message using case-insensitive exact content matching and expected tool calls.","title":"AssistantMessageJudgePlanExact"},"AssistantMessageJudgePlanRegexType":{"type":"string","enum":["regex"],"description":"This is the type of the judge plan.\nUse 'regex' for a regex match on the content and tool calls - without using LLM-as-a-judge.\n@default 'regex'","title":"AssistantMessageJudgePlanRegexType"},"AssistantMessageJudgePlanRegex":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/AssistantMessageJudgePlanRegexType","description":"This is the type of the judge plan.\nUse 'regex' for a regex match on the content and tool calls - without using LLM-as-a-judge.\n@default 'regex'"},"content":{"type":"string","maxLength":1000,"description":"This is what that will be used to evaluate the model's message content.\nThe content will be evaluated against the regex pattern provided in the Judge Plan content field.\nEvaluation is considered successful if the regex pattern matches any part of the assistant message content."},"toolCalls":{"type":"array","items":{"$ref":"#/components/schemas/ChatEvalAssistantMessageMockToolCall"},"description":"This is the tool calls that will be used to evaluate the model's message content.\nThe tool name must be a valid tool that the assistant is allowed to call.\nThe values to the arguments for the tool call should be a Regular Expression.\nEvaluation is considered successful if the regex pattern matches any part of each tool call argument.\n\nFor the Query tool, the arguments for the tool call are in the format - {knowledgeBaseNames: ['kb_name', 'kb_name_2']}\n\nFor the DTMF tool, the arguments for the tool call are in the format - {dtmf: \"1234*\"}\n\nFor the Handoff tool, the arguments for the tool call are in the format - {destination: \"assistant_id\"}\n\nFor the Transfer Call tool, the arguments for the tool call are in the format - {destination: \"phone_number_or_assistant_id\"}\n\nFor all other tools, they are called without arguments or with user-defined arguments"}},"required":["type","content"],"description":"Evaluates assistant-message content and tool-call arguments using regular-expression patterns.","title":"AssistantMessageJudgePlanRegex"},"ChatEvalAssistantMessageEvaluationJudgePlan":{"oneOf":[{"$ref":"#/components/schemas/AssistantMessageJudgePlanExact"},{"$ref":"#/components/schemas/AssistantMessageJudgePlanRegex"},{"$ref":"#/components/schemas/AssistantMessageJudgePlanAI"}],"description":"This is the judge plan that instructs how to evaluate the assistant message.\nThe assistant message can be evaluated against fixed content (exact match or RegEx) or with an LLM-as-judge by defining the evaluation criteria in a prompt.","title":"ChatEvalAssistantMessageEvaluationJudgePlan"},"AssistantMessageEvaluationContinuePlan":{"type":"object","properties":{"exitOnFailureEnabled":{"type":"boolean","description":"This is whether the evaluation should exit if the assistant message evaluates to false.\nBy default, it is false and the evaluation will continue.\n@default false"},"contentOverride":{"type":"string","maxLength":1000,"description":"This is the content that will be used in the conversation for this assistant turn moving forward if provided.\nIt will override the content received from the model."},"toolCallsOverride":{"type":"array","items":{"$ref":"#/components/schemas/ChatEvalAssistantMessageMockToolCall"},"description":"This is the tool calls that will be used in the conversation for this assistant turn moving forward if provided.\nIt will override the tool calls received from the model."}},"description":"Controls how an evaluation proceeds after judging an assistant message, including failure handling and optional message overrides.","title":"AssistantMessageEvaluationContinuePlan"},"ChatEvalAssistantMessageEvaluation":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ChatEvalAssistantMessageEvaluationRole","description":"This is the role of the message author.\nFor an assistant message evaluation, the role is always 'assistant'\n@default 'assistant'"},"judgePlan":{"$ref":"#/components/schemas/ChatEvalAssistantMessageEvaluationJudgePlan","description":"This is the judge plan that instructs how to evaluate the assistant message.\nThe assistant message can be evaluated against fixed content (exact match or RegEx) or with an LLM-as-judge by defining the evaluation criteria in a prompt."},"continuePlan":{"$ref":"#/components/schemas/AssistantMessageEvaluationContinuePlan","description":"This is the plan for how the overall evaluation will proceed after the assistant message is evaluated.\nThis lets you configure whether to stop the evaluation if this message fails, and whether to override any content for future turns"}},"required":["role","judgePlan"],"description":"An expected assistant turn in an evaluation, including the judge plan and how the evaluation should continue afterward.","title":"ChatEvalAssistantMessageEvaluation"},"EvalMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ChatEvalAssistantMessageMock"},{"$ref":"#/components/schemas/ChatEvalSystemMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageEvaluation"},{"$ref":"#/components/schemas/ChatEvalUserMessageMock"},{"$ref":"#/components/schemas/ChatEvalAssistantMessageEvaluation"}],"title":"EvalMessagesItems"},"EvalType":{"type":"string","enum":["chat.mockConversation"],"description":"This is the type of the eval.\nCurrently it is fixed to `chat.mockConversation`.","title":"EvalType"},"Eval":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/EvalMessagesItems"},"description":"This is the mock conversation that will be used to evaluate the flow of the conversation.\n\nMock Messages are used to simulate the flow of the conversation\n\nEvaluation Messages are used as checkpoints in the flow where the model's response to previous conversation needs to be evaluated to check the content and tool calls"},"id":{"type":"string","description":"The unique identifier for the eval."},"orgId":{"type":"string","description":"The unique identifier for the organization that owns the eval."},"createdAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the eval was created."},"updatedAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the eval was last updated."},"name":{"type":"string","minLength":1,"maxLength":80,"description":"This is the name of the eval.\nIt helps identify what the eval is checking for."},"description":{"type":"string","maxLength":500,"description":"This is the description of the eval.\nThis helps describe the eval and its purpose in detail. It will not be used to evaluate the flow of the conversation."},"type":{"$ref":"#/components/schemas/EvalType","description":"This is the type of the eval.\nCurrently it is fixed to `chat.mockConversation`."}},"required":["messages","id","orgId","createdAt","updatedAt","type"],"description":"A saved eval definition containing its mock conversation, checkpoints, descriptive metadata, type, and lifecycle information.","title":"Eval"},"EvalPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Eval"},"description":"The eval definitions returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the eval result set."}},"required":["results","metadata"],"description":"A paginated collection of saved eval definitions and metadata describing the result set.","title":"EvalPaginatedResponse"},"CreateEvalDtoMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ChatEvalAssistantMessageMock"},{"$ref":"#/components/schemas/ChatEvalSystemMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageEvaluation"},{"$ref":"#/components/schemas/ChatEvalUserMessageMock"},{"$ref":"#/components/schemas/ChatEvalAssistantMessageEvaluation"}],"title":"CreateEvalDtoMessagesItems"},"CreateEvalDtoType":{"type":"string","enum":["chat.mockConversation"],"description":"This is the type of the eval.\nCurrently it is fixed to `chat.mockConversation`.","title":"CreateEvalDtoType"},"CreateEvalDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/CreateEvalDtoMessagesItems"},"description":"This is the mock conversation that will be used to evaluate the flow of the conversation.\n\nMock Messages are used to simulate the flow of the conversation\n\nEvaluation Messages are used as checkpoints in the flow where the model's response to previous conversation needs to be evaluated to check the content and tool calls"},"name":{"type":"string","minLength":1,"maxLength":80,"description":"This is the name of the eval.\nIt helps identify what the eval is checking for."},"description":{"type":"string","maxLength":500,"description":"This is the description of the eval.\nThis helps describe the eval and its purpose in detail. It will not be used to evaluate the flow of the conversation."},"type":{"$ref":"#/components/schemas/CreateEvalDtoType","description":"This is the type of the eval.\nCurrently it is fixed to `chat.mockConversation`."}},"required":["messages","type"],"description":"Configuration used to create a reusable eval containing a mock conversation and checkpoints for assessing assistant responses and tool calls.","title":"CreateEvalDTO"},"UpdateEvalDtoMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ChatEvalAssistantMessageMock"},{"$ref":"#/components/schemas/ChatEvalSystemMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageEvaluation"},{"$ref":"#/components/schemas/ChatEvalUserMessageMock"},{"$ref":"#/components/schemas/ChatEvalAssistantMessageEvaluation"}],"title":"UpdateEvalDtoMessagesItems"},"UpdateEvalDtoType":{"type":"string","enum":["chat.mockConversation"],"description":"This is the type of the eval.\nCurrently it is fixed to `chat.mockConversation`.","title":"UpdateEvalDtoType"},"UpdateEvalDTO":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/UpdateEvalDtoMessagesItems"},"description":"This is the mock conversation that will be used to evaluate the flow of the conversation.\n\nMock Messages are used to simulate the flow of the conversation\n\nEvaluation Messages are used as checkpoints in the flow where the model's response to previous conversation needs to be evaluated to check the content and tool calls"},"name":{"type":"string","minLength":1,"maxLength":80,"description":"This is the name of the eval.\nIt helps identify what the eval is checking for."},"description":{"type":"string","maxLength":500,"description":"This is the description of the eval.\nThis helps describe the eval and its purpose in detail. It will not be used to evaluate the flow of the conversation."},"type":{"$ref":"#/components/schemas/UpdateEvalDtoType","description":"This is the type of the eval.\nCurrently it is fixed to `chat.mockConversation`."}},"description":"Fields used to update an eval, including its name, description, mock conversation messages, and eval type.","title":"UpdateEvalDTO"},"EvalRunStatus":{"type":"string","enum":["running","ended","queued"],"description":"This is the status of the eval run. When an eval run is created, the status is 'running'.\nWhen the eval run is completed, the status is 'ended'.","title":"EvalRunStatus"},"EvalRunEndedReason":{"type":"string","enum":["mockConversation.done","error","timeout","cancelled","aborted"],"description":"This is the reason for the eval run to end.\nWhen the eval run is completed normally i.e end of mock conversation, the status is 'mockConversation.done'.\nWhen the eval fails due to an error like Chat error or incorrect configuration, the status is 'error'.\nWhen the eval runs for too long, due to model issues or tool call issues, the status is 'timeout'.\nWhen the eval run is cancelled by the user, the status is 'cancelled'.\nWhen the eval run is cancelled by Vapi for any reason, the status is 'aborted'.","title":"EvalRunEndedReason"},"EvalRunTargetAssistantType":{"type":"string","enum":["assistant"],"description":"This is the type of the target.\nCurrently it is fixed to `assistant`.","title":"EvalRunTargetAssistantType"},"EvalRunTargetAssistant":{"type":"object","properties":{"assistant":{"$ref":"#/components/schemas/CreateAssistantDTO","description":"This is the transient assistant that will be run against the eval"},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"This is the overrides that will be applied to the assistant."},"type":{"$ref":"#/components/schemas/EvalRunTargetAssistantType","description":"This is the type of the target.\nCurrently it is fixed to `assistant`."},"assistantId":{"type":"string","description":"This is the id of the assistant that will be run against the eval"}},"required":["type"],"description":"An assistant evaluation target provided as a saved assistant ID or a transient assistant, with optional assistant overrides.","title":"EvalRunTargetAssistant"},"EvalRunTargetSquadType":{"type":"string","enum":["squad"],"description":"This is the type of the target.\nCurrently it is fixed to `squad`.","title":"EvalRunTargetSquadType"},"EvalRunTargetSquad":{"type":"object","properties":{"squad":{"$ref":"#/components/schemas/CreateSquadDTO","description":"This is the transient squad that will be run against the eval"},"assistantOverrides":{"$ref":"#/components/schemas/AssistantOverrides","description":"This is the overrides that will be applied to the assistants."},"type":{"$ref":"#/components/schemas/EvalRunTargetSquadType","description":"This is the type of the target.\nCurrently it is fixed to `squad`."},"squadId":{"type":"string","description":"This is the id of the squad that will be run against the eval"}},"required":["type"],"description":"A squad evaluation target provided as a saved squad ID or a transient squad, with optional assistant overrides.","title":"EvalRunTargetSquad"},"EvalRunTarget":{"oneOf":[{"$ref":"#/components/schemas/EvalRunTargetAssistant"},{"$ref":"#/components/schemas/EvalRunTargetSquad"}],"description":"This is the target that will be run against the eval","title":"EvalRunTarget"},"EvalRunResultStatus":{"type":"string","enum":["pass","fail"],"description":"This is the status of the eval run result.\nThe status is only 'pass' or 'fail' for an eval run result.\nCurrently, An eval is considered `pass` only if all the Assistant Judge messages are evaluated to pass.","title":"EvalRunResultStatus"},"EvalRunResultMessagesItems":{"oneOf":[{"$ref":"#/components/schemas/ChatEvalUserMessageMock"},{"$ref":"#/components/schemas/ChatEvalSystemMessageMock"},{"$ref":"#/components/schemas/ChatEvalToolResponseMessageMock"},{"$ref":"#/components/schemas/ChatEvalAssistantMessageMock"}],"title":"EvalRunResultMessagesItems"},"EvalRunResult":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/EvalRunResultStatus","description":"This is the status of the eval run result.\nThe status is only 'pass' or 'fail' for an eval run result.\nCurrently, An eval is considered `pass` only if all the Assistant Judge messages are evaluated to pass."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/EvalRunResultMessagesItems"},"description":"This is the messages of the eval run result.\nIt contains the user/system messages"},"startedAt":{"type":"string","format":"date-time","description":"This is the start time of the eval run result."},"endedAt":{"type":"string","format":"date-time","description":"This is the end time of the eval run result."}},"required":["status","messages","startedAt","endedAt"],"description":"The pass or fail result of an evaluation run, including its conversation messages and timing.","title":"EvalRunResult"},"EvalRunCostsItems":{"type":"object","properties":{},"title":"EvalRunCostsItems"},"EvalRunType":{"type":"string","enum":["eval"],"description":"This is the type of the run.\nCurrently it is fixed to `eval`.","title":"EvalRunType"},"EvalRun":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/EvalRunStatus","description":"This is the status of the eval run. When an eval run is created, the status is 'running'.\nWhen the eval run is completed, the status is 'ended'."},"endedReason":{"$ref":"#/components/schemas/EvalRunEndedReason","description":"This is the reason for the eval run to end.\nWhen the eval run is completed normally i.e end of mock conversation, the status is 'mockConversation.done'.\nWhen the eval fails due to an error like Chat error or incorrect configuration, the status is 'error'.\nWhen the eval runs for too long, due to model issues or tool call issues, the status is 'timeout'.\nWhen the eval run is cancelled by the user, the status is 'cancelled'.\nWhen the eval run is cancelled by Vapi for any reason, the status is 'aborted'."},"eval":{"$ref":"#/components/schemas/CreateEvalDTO","description":"This is the transient eval that will be run"},"target":{"$ref":"#/components/schemas/EvalRunTarget","description":"This is the target that will be run against the eval"},"id":{"type":"string","description":"The unique identifier for the eval run."},"orgId":{"type":"string","description":"The unique identifier for the organization that owns the run."},"createdAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the eval run was created."},"startedAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the eval run started."},"endedAt":{"type":"string","format":"date-time","description":"The ISO 8601 timestamp when the eval run ended."},"endedMessage":{"type":"string","description":"This is the ended message when the eval run ended for any reason apart from mockConversation.done"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EvalRunResult"},"description":"This is the results of the eval or suite run.\nThe array will have a single item for an eval run, and multiple items each corresponding to the an eval in a suite run in the same order as the evals in the suite."},"cost":{"type":"number","format":"double","description":"This is the cost of the eval or suite run in USD."},"costs":{"type":"array","items":{"$ref":"#/components/schemas/EvalRunCostsItems"},"description":"This is the break up of costs of the eval or suite run."},"type":{"$ref":"#/components/schemas/EvalRunType","description":"This is the type of the run.\nCurrently it is fixed to `eval`."},"evalId":{"type":"string","description":"This is the id of the eval that will be run."}},"required":["status","endedReason","target","id","orgId","createdAt","startedAt","endedAt","results","cost","costs","type"],"description":"A record of an eval execution, including its target, status, results, costs, completion details, and lifecycle timestamps.","title":"EvalRun"},"EvalRunGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"EvalRunGetParametersSortOrder"},"EvalRunGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"EvalRunGetParametersSortBy"},"EvalRunPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/EvalRun"},"description":"The eval runs returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the eval-run result set."}},"required":["results","metadata"],"description":"A paginated collection of eval runs and metadata describing the result set.","title":"EvalRunPaginatedResponse"},"CreateEvalRunDtoTarget":{"oneOf":[{"$ref":"#/components/schemas/EvalRunTargetAssistant"},{"$ref":"#/components/schemas/EvalRunTargetSquad"}],"description":"This is the target that will be run against the eval","title":"CreateEvalRunDtoTarget"},"CreateEvalRunDtoType":{"type":"string","enum":["eval"],"description":"This is the type of the run.\nCurrently it is fixed to `eval`.","title":"CreateEvalRunDtoType"},"CreateEvalRunDTO":{"type":"object","properties":{"eval":{"$ref":"#/components/schemas/CreateEvalDTO","description":"This is the transient eval that will be run"},"target":{"$ref":"#/components/schemas/CreateEvalRunDtoTarget","description":"This is the target that will be run against the eval"},"type":{"$ref":"#/components/schemas/CreateEvalRunDtoType","description":"This is the type of the run.\nCurrently it is fixed to `eval`."},"evalId":{"type":"string","description":"This is the id of the eval that will be run."}},"required":["target","type"],"description":"A request to run a saved or transient eval against an assistant or squad target.","title":"CreateEvalRunDTO"},"Eval_EvalController_run_Response_200":{"type":"object","properties":{},"description":"Empty response body","title":"Eval_EvalController_run_Response_200"},"Scorecard":{"type":"object","properties":{"id":{"type":"string","description":"This is the unique identifier for the scorecard."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this scorecard belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the scorecard was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the scorecard was last updated."},"name":{"type":"string","maxLength":80,"description":"This is the name of the scorecard. It is only for user reference and will not be used for any evaluation."},"description":{"type":"string","maxLength":500,"description":"This is the description of the scorecard. It is only for user reference and will not be used for any evaluation."},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/ScorecardMetric"},"description":"These are the metrics that will be used to evaluate the scorecard.\nEach metric will have a set of conditions and points that will be used to generate the score."},"assistantIds":{"type":"array","items":{"type":"string"},"description":"These are the assistant IDs that this scorecard is linked to.\nWhen linked to assistants, this scorecard will be available for evaluation during those assistants' calls."}},"required":["id","orgId","createdAt","updatedAt","metrics"],"description":"A saved scorecard containing its evaluation metrics, scoring conditions, assistant associations, descriptive metadata, and lifecycle information.","title":"Scorecard"},"UpdateScorecardDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":80,"description":"This is the name of the scorecard. It is only for user reference and will not be used for any evaluation."},"description":{"type":"string","maxLength":500,"description":"This is the description of the scorecard. It is only for user reference and will not be used for any evaluation."},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/ScorecardMetric"},"description":"These are the metrics that will be used to evaluate the scorecard.\nEach metric will have a set of conditions and points that will be used to generate the score."},"assistantIds":{"type":"array","items":{"type":"string"},"description":"These are the assistant IDs that this scorecard is linked to.\nWhen linked to assistants, this scorecard will be available for evaluation during those assistants' calls."}},"description":"Fields used to update a scorecard, including its name, description, metrics, scoring conditions, and assistant associations.","title":"UpdateScorecardDTO"},"ObservabilityScorecardGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"ObservabilityScorecardGetParametersSortOrder"},"ObservabilityScorecardGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"ObservabilityScorecardGetParametersSortBy"},"ScorecardPaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/Scorecard"},"description":"The scorecards returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the scorecard result set."}},"required":["results","metadata"],"description":"A paginated collection of scorecards and metadata describing the result set.","title":"ScorecardPaginatedResponse"},"ProviderProviderResourceNameGetParametersProvider":{"type":"string","enum":["cartesia","11labs"],"title":"ProviderProviderResourceNameGetParametersProvider"},"ProviderProviderResourceNameGetParametersResourceName":{"type":"string","enum":["pronunciation-dictionary"],"title":"ProviderProviderResourceNameGetParametersResourceName"},"ProviderProviderResourceNameGetParametersSortOrder":{"type":"string","enum":["ASC","DESC"],"title":"ProviderProviderResourceNameGetParametersSortOrder"},"ProviderProviderResourceNameGetParametersSortBy":{"type":"string","enum":["createdAt","duration","cost"],"title":"ProviderProviderResourceNameGetParametersSortBy"},"ProviderResourceProvider":{"type":"string","enum":["cartesia","11labs"],"description":"This is the provider that manages this resource.","title":"ProviderResourceProvider"},"ProviderResourceResourceName":{"type":"string","enum":["pronunciation-dictionary"],"description":"This is the name/type of the resource.","title":"ProviderResourceResourceName"},"ProviderResourceResource":{"type":"object","properties":{},"description":"This is the full resource data from the provider's API.","title":"ProviderResourceResource"},"ProviderResource":{"type":"object","properties":{"id":{"type":"string","description":"This is the unique identifier for the provider resource."},"orgId":{"type":"string","description":"This is the unique identifier for the org that this provider resource belongs to."},"createdAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the provider resource was created."},"updatedAt":{"type":"string","format":"date-time","description":"This is the ISO 8601 date-time string of when the provider resource was last updated."},"provider":{"$ref":"#/components/schemas/ProviderResourceProvider","description":"This is the provider that manages this resource."},"resourceName":{"$ref":"#/components/schemas/ProviderResourceResourceName","description":"This is the name/type of the resource."},"resourceId":{"type":"string","description":"This is the provider-specific identifier for the resource."},"resource":{"$ref":"#/components/schemas/ProviderResourceResource","description":"This is the full resource data from the provider's API."}},"required":["id","orgId","createdAt","updatedAt","provider","resourceName","resourceId","resource"],"description":"A provider-managed pronunciation-dictionary resource mirrored in Vapi, including its provider identifiers, resource data, and lifecycle information.","title":"ProviderResource"},"ProviderResourcePaginatedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/ProviderResource"},"description":"The provider resources returned for the current page."},"metadata":{"$ref":"#/components/schemas/PaginationMeta","description":"Pagination metadata for the provider-resource result set."}},"required":["results","metadata"],"description":"A paginated collection of provider resources and metadata describing the result set.","title":"ProviderResourcePaginatedResponse"},"ProviderProviderResourceNamePostParametersProvider":{"type":"string","enum":["cartesia","11labs"],"title":"ProviderProviderResourceNamePostParametersProvider"},"ProviderProviderResourceNamePostParametersResourceName":{"type":"string","enum":["pronunciation-dictionary"],"title":"ProviderProviderResourceNamePostParametersResourceName"},"ProviderProviderResourceNameIdGetParametersProvider":{"type":"string","enum":["cartesia","11labs"],"title":"ProviderProviderResourceNameIdGetParametersProvider"},"ProviderProviderResourceNameIdGetParametersResourceName":{"type":"string","enum":["pronunciation-dictionary"],"title":"ProviderProviderResourceNameIdGetParametersResourceName"},"ProviderProviderResourceNameIdDeleteParametersProvider":{"type":"string","enum":["cartesia","11labs"],"title":"ProviderProviderResourceNameIdDeleteParametersProvider"},"ProviderProviderResourceNameIdDeleteParametersResourceName":{"type":"string","enum":["pronunciation-dictionary"],"title":"ProviderProviderResourceNameIdDeleteParametersResourceName"},"ProviderProviderResourceNameIdPatchParametersProvider":{"type":"string","enum":["cartesia","11labs"],"title":"ProviderProviderResourceNameIdPatchParametersProvider"},"ProviderProviderResourceNameIdPatchParametersResourceName":{"type":"string","enum":["pronunciation-dictionary"],"title":"ProviderProviderResourceNameIdPatchParametersResourceName"},"AnalyticsQueryTable":{"type":"string","enum":["call","subscription"],"description":"This is the table you want to query.","title":"AnalyticsQueryTable"},"AnalyticsQueryGroupBy":{"type":"string","enum":["type","assistantId","endedReason","analysis.successEvaluation","status"],"description":"This is the list of columns you want to group by.","title":"AnalyticsQueryGroupBy"},"VariableValueGroupBy":{"type":"object","properties":{"key":{"type":"string","maxLength":100,"description":"This is the key of the variable value to group by."}},"required":["key"],"description":"Groups analytics results by a selected assistant variable-value key.","title":"VariableValueGroupBy"},"TimeRangeStep":{"type":"string","enum":["second","minute","hour","day","week","month","quarter","year","decade","century","millennium"],"description":"This is the time step for aggregations.\n\nIf not provided, defaults to returning for the entire time range.","title":"TimeRangeStep"},"TimeRange":{"type":"object","properties":{"step":{"$ref":"#/components/schemas/TimeRangeStep","description":"This is the time step for aggregations.\n\nIf not provided, defaults to returning for the entire time range."},"start":{"type":"string","format":"date-time","description":"This is the start date for the time range.\n\nIf not provided, defaults to the 7 days ago."},"end":{"type":"string","format":"date-time","description":"This is the end date for the time range.\n\nIf not provided, defaults to now."},"timezone":{"type":"string","description":"This is the timezone you want to set for the query.\n\nIf not provided, defaults to UTC."}},"description":"Start, end, timezone, and time step used for analytics aggregation.","title":"TimeRange"},"AnalyticsOperationOperation":{"type":"string","enum":["sum","avg","count","min","max","history"],"description":"This is the aggregation operation you want to perform.","title":"AnalyticsOperationOperation"},"AnalyticsOperationColumn":{"type":"string","enum":["id","cost","costBreakdown.llm","costBreakdown.stt","costBreakdown.tts","costBreakdown.vapi","costBreakdown.transport","costBreakdown.analysisBreakdown.summary","costBreakdown.transcriber","costBreakdown.ttsCharacters","costBreakdown.llmPromptTokens","costBreakdown.llmCompletionTokens","costBreakdown.llmCachedPromptTokens","duration","concurrency","minutesUsed"],"description":"This is the columns you want to perform the aggregation operation on.","title":"AnalyticsOperationColumn"},"AnalyticsOperation":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/AnalyticsOperationOperation","description":"This is the aggregation operation you want to perform."},"column":{"$ref":"#/components/schemas/AnalyticsOperationColumn","description":"This is the columns you want to perform the aggregation operation on."},"alias":{"type":"string","maxLength":40,"description":"This is the alias for column name returned. Defaults to `${operation}${column}`."}},"required":["operation","column"],"description":"An aggregation or history operation applied to an analytics column, with an optional response alias.","title":"AnalyticsOperation"},"AnalyticsQuery":{"type":"object","properties":{"table":{"$ref":"#/components/schemas/AnalyticsQueryTable","description":"This is the table you want to query."},"groupBy":{"$ref":"#/components/schemas/AnalyticsQueryGroupBy","description":"This is the list of columns you want to group by."},"groupByVariableValue":{"type":"array","items":{"$ref":"#/components/schemas/VariableValueGroupBy"},"description":"This is the list of variable value keys you want to group by."},"name":{"type":"string","maxLength":40,"description":"This is the name of the query. This will be used to identify the query in the response."},"timeRange":{"$ref":"#/components/schemas/TimeRange","description":"This is the time range for the query."},"operations":{"type":"array","items":{"$ref":"#/components/schemas/AnalyticsOperation"},"description":"This is the list of operations you want to perform."}},"required":["table","name","operations"],"description":"A named analytics query against call or subscription data, including grouping, time range, and aggregation operations.","title":"AnalyticsQuery"},"AnalyticsQueryDTO":{"type":"object","properties":{"queries":{"type":"array","items":{"$ref":"#/components/schemas/AnalyticsQuery"},"description":"This is the list of metric queries you want to perform."}},"required":["queries"],"description":"A request containing one or more metric queries to run against call or subscription data.","title":"AnalyticsQueryDTO"},"AnalyticsQueryResultResultItems":{"type":"object","properties":{},"title":"AnalyticsQueryResultResultItems"},"AnalyticsQueryResult":{"type":"object","properties":{"name":{"type":"string","description":"This is the unique key for the query."},"timeRange":{"$ref":"#/components/schemas/TimeRange","description":"This is the time range for the query."},"result":{"type":"array","items":{"$ref":"#/components/schemas/AnalyticsQueryResultResultItems"},"description":"This is the result of the query, a list of unique groups with result of their aggregations.\n\nExample:\n\"result\": [\n  { \"date\": \"2023-01-01\", \"assistantId\": \"123\", \"endedReason\": \"customer-ended-call\", \"sumDuration\": 120, \"avgCost\": 10.5 },\n  { \"date\": \"2023-01-02\", \"assistantId\": \"123\", \"endedReason\": \"customer-did-not-give-microphone-permission\", \"sumDuration\": 0, \"avgCost\": 0 },\n  // Additional results\n]"}},"required":["name","timeRange","result"],"description":"The result of a named analytics query, including the evaluated time range and returned metric data.","title":"AnalyticsQueryResult"}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories."}}}}