Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/vapi-ai-chats-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Vapi Analytics Chats API
description: Vapi API — Analytics resource. Voice AI for developers.
version: '1.0'
contact:
name: Vapi
url: https://vapi.ai
servers:
- url: https://api.vapi.ai
security:
- bearer: []
tags:
- name: Chats
description: Chats endpoints.
paths:
/chat:
get:
operationId: ChatController_listChats
summary: List Chats
parameters:
- name: id
required: false
in: query
description: This is the unique identifier for the chat to filter by.
schema:
type: string
- name: assistantId
required: false
in: query
description: This is the unique identifier for the assistant that will be used for the chat.
schema:
type: string
- name: assistantIdAny
required: false
in: query
description: Filter by multiple assistant IDs. Provide as comma-separated values.
schema:
example: assistant-1,assistant-2,assistant-3
type: string
- name: squadId
required: false
in: query
description: This is the unique identifier for the squad that will be used for the chat.
schema:
type: string
- name: sessionId
required: false
in: query
description: This is the unique identifier for the session that will be used for the chat.
schema:
type: string
- name: previousChatId
required: false
in: query
description: This is the unique identifier for the previous chat to filter by.
schema:
type: string
- name: page
required: false
in: query
description: This is the page number to return. Defaults to 1.
schema:
minimum: 1
type: number
- name: sortOrder
required: false
in: query
description: This is the sort order for pagination. Defaults to 'DESC'.
schema:
enum:
- ASC
- DESC
type: string
- name: sortBy
required: false
in: query
description: This is the column to sort by. Defaults to 'createdAt'.
schema:
enum:
- createdAt
- duration
- cost
type: string
- name: limit
required: false
in: query
description: This is the maximum number of items to return. Defaults to 100.
schema:
minimum: 0
maximum: 1000
type: number
- name: createdAtGt
required: false
in: query
description: This will return items where the createdAt is greater than the specified value.
schema:
format: date-time
type: string
- name: createdAtLt
required: false
in: query
description: This will return items where the createdAt is less than the specified value.
schema:
format: date-time
type: string
- name: createdAtGe
required: false
in: query
description: This will return items where the createdAt is greater than or equal to the specified value.
schema:
format: date-time
type: string
- name: createdAtLe
required: false
in: query
description: This will return items where the createdAt is less than or equal to the specified value.
schema:
format: date-time
type: string
- name: updatedAtGt
required: false
in: query
description: This will return items where the updatedAt is greater than the specified value.
schema:
format: date-time
type: string
- name: updatedAtLt
required: false
in: query
description: This will return items where the updatedAt is less than the specified value.
schema:
format: date-time
type: string
- name: updatedAtGe
required: false
in: query
description: This will return items where the updatedAt is greater than or equal to the specified value.
schema:
format: date-time
type: string
- name: updatedAtLe
required: false
in: query
description: This will return items where the updatedAt is less than or equal to the specified value.
schema:
format: date-time
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ChatPaginatedResponse'
tags:
- Chats
security:
- bearer: []
post:
operationId: ChatController_createChat
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).'
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateChatDTO'
responses:
'200':
description: Chat response - either non-streaming chat or streaming
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/Chat'
- $ref: '#/components/schemas/CreateChatStreamResponse'
'201':
description: ''
content:
application/json:
schema:
type: object
tags:
- Chats
security:
- bearer: []
/chat/{id}:
get:
operationId: ChatController_getChat
summary: Get Chat
parameters:
- name: id
required: true
in: path
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/Chat'
tags:
- Chats
security:
- bearer: []
delete:
operationId: ChatController_deleteChat
summary: Delete Chat
parameters:
- name: id
required: true
in: path
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/Chat'
tags:
- Chats
security:
- bearer: []
/chat/responses:
post:
operationId: ChatController_createOpenAIChat
summary: Create Chat (OpenAI Compatible)
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OpenAIResponsesRequest'
responses:
'200':
description: OpenAI Responses API format - either non-streaming or streaming
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/ResponseObject'
- $ref: '#/components/schemas/ResponseTextDeltaEvent'
- $ref: '#/components/schemas/ResponseTextDoneEvent'
- $ref: '#/components/schemas/ResponseCompletedEvent'
- $ref: '#/components/schemas/ResponseErrorEvent'
'201':
description: ''
content:
application/json:
schema:
type: object
tags:
- Chats
security:
- bearer: []
components:
schemas:
CreateMistralCredentialDTO:
type: object
properties:
provider:
type: string
enum:
- mistral
apiKey:
type: string
maxLength: 100
description: This is not returned in the API.
name:
type: string
description: This is the name of credential. This is just for your reference.
minLength: 1
maxLength: 40
required:
- provider
- apiKey
CreateTextEditorToolDTO:
type: object
properties:
messages:
type: array
description: 'These are the messages that will be spoken to the user as the tool is running.
For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.'
items:
oneOf:
- $ref: '#/components/schemas/ToolMessageStart'
title: ToolMessageStart
- $ref: '#/components/schemas/ToolMessageComplete'
title: ToolMessageComplete
- $ref: '#/components/schemas/ToolMessageFailed'
title: ToolMessageFailed
- $ref: '#/components/schemas/ToolMessageDelayed'
title: ToolMessageDelayed
type:
type: string
enum:
- textEditor
description: The type of tool. "textEditor" for Text Editor tool.
subType:
type: string
enum:
- text_editor_20241022
description: The sub type of tool.
server:
description: "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result."
allOf:
- $ref: '#/components/schemas/Server'
name:
type: string
description: The name of the tool, fixed to 'str_replace_editor'
default: str_replace_editor
enum:
- str_replace_editor
rejectionPlan:
description: "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```"
allOf:
- $ref: '#/components/schemas/ToolRejectionPlan'
required:
- type
- subType
- name
TransferDestinationAssistant:
type: object
properties:
message:
description: 'This is spoken to the customer before connecting them to the destination.
Usage:
- If this is not provided and transfer tool messages is not provided, default is "Transferring the call now".
- 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.
This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.'
oneOf:
- type: string
- $ref: '#/components/schemas/CustomMessage'
type:
type: string
enum:
- assistant
transferMode:
type: string
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'"
enum:
- rolling-history
- swap-system-message-in-history
- swap-system-message-in-history-and-remove-transfer-tool-messages
- delete-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
FallbackGladiaTranscriber:
type: object
properties:
provider:
type: string
description: This is the transcription provider that will be used.
enum:
- gladia
model:
description: This is the Gladia model that will be used. Default is 'fast'
oneOf:
- type: string
enum:
- fast
- accurate
- solaria-1
languageBehaviour:
description: Defines how the transcription model detects the audio language. Default value is 'automatic single language'.
oneOf:
- type: string
enum:
- manual
- automatic single language
- automatic multiple languages
language:
type: string
description: Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.
enum:
- af
- sq
- am
- ar
- hy
- as
- az
- ba
- eu
- be
- bn
- bs
- br
- bg
- ca
- zh
- hr
- cs
- da
- nl
- en
- et
- fo
- fi
- fr
- gl
- ka
- de
- el
- gu
- ht
- ha
- haw
- he
- hi
- hu
- is
- id
- it
- ja
- jv
- kn
- kk
- km
- ko
- lo
- la
- lv
- ln
- lt
- lb
- mk
- mg
- ms
- ml
- mt
- mi
- mr
- mn
- my
- ne
- 'no'
- nn
- oc
- ps
- fa
- pl
- pt
- pa
- ro
- ru
- sa
- sr
- sn
- sd
- si
- sk
- sl
- so
- es
- su
- sw
- sv
- tl
- tg
- ta
- tt
- te
- th
- bo
- tr
- tk
- uk
- ur
- uz
- vi
- cy
- yi
- yo
languages:
type: array
description: Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.
items:
type: string
enum:
- af
- sq
- am
- ar
- hy
- as
- az
- ba
- eu
- be
- bn
- bs
- br
- bg
- ca
- zh
- hr
- cs
- da
- nl
- en
- et
- fo
- fi
- fr
- gl
- ka
- de
- el
- gu
- ht
- ha
- haw
- he
- hi
- hu
- is
- id
- it
- ja
- jv
- kn
- kk
- km
- ko
- lo
- la
- lv
- ln
- lt
- lb
- mk
- mg
- ms
- ml
- mt
- mi
- mr
- mn
- my
- ne
- 'no'
- nn
- oc
- ps
- fa
- pl
- pt
- pa
- ro
- ru
- sa
- sr
- sn
- sd
- si
- sk
- sl
- so
- es
- su
- sw
- sv
- tl
- tg
- ta
- tt
- te
- th
- bo
- tr
- tk
- uk
- ur
- uz
- vi
- cy
- yi
- yo
transcriptionHint:
type: string
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.
⚠️ 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.'
maxLength: 600
example: custom vocabulary
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.
example: false
audioEnhancer:
type: boolean
description: If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false.
example: false
confidenceThreshold:
type: number
description: 'Transcripts below this confidence threshold will be discarded.
@default 0.4'
minimum: 0
maximum: 1
example: 0.4
endpointing:
type: number
minimum: 0.01
maximum: 10
example: 0.05
description: Endpointing time in seconds - time to wait before considering speech ended
speechThreshold:
type: number
minimum: 0
maximum: 1
example: 0.6
description: Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)
customVocabularyEnabled:
type: boolean
example: false
description: Enable custom vocabulary for improved accuracy
customVocabularyConfig:
description: Custom vocabulary configuration
allOf:
- $ref: '#/components/schemas/GladiaCustomVocabularyConfigDTO'
region:
type: string
enum:
- us-west
- eu-west
description: Region for processing audio (us-west or eu-west)
example: us-west
receivePartialTranscripts:
type: boolean
example: false
description: Enable partial transcripts for low-latency streaming transcription
required:
- provider
RimeAIVoice:
type: object
properties:
cachingEnabled:
type: boolean
description: This is the flag to toggle voice caching for the assistant.
example: true
default: true
provider:
type: string
description: This is the voice provider that will be used.
enum:
- rime-ai
voiceId:
description: This is the provider-specific ID that will be used.
oneOf:
- 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
title: Suggested Voice Options
description: Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions.
- type: string
title: Any Rime AI Voice ID
description: Any valid Rime AI voice ID. See https://docs.rime.ai/docs/voices for the full catalog.
model:
type: string
description: This is the model that will be used. Defaults to 'arcana' when not specified.
enum:
- arcana
- mistv2
- mist
example: arcana
speed:
type: number
description: This is the speed multiplier that will be used.
minimum: 0.1
example: null
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.'
example: false
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.'
example: false
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
example: false
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
example: null
language:
type: string
description: 'Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.'
enum:
- en
- es
- de
- fr
- ar
- hi
- ja
- he
- pt
- ta
- si
example: en
chunkPlan:
description: This is the plan for chunking the model output before it is sent to the voice provider.
allOf:
- $ref: '#/components/schemas/ChunkPlan'
fallbackPlan:
description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
allOf:
- $ref: '#/components/schemas/FallbackPlan'
required:
- provider
- voiceId
CreateSquadDTO:
type: object
properties:
name:
type: string
description: This is the name of the squad.
members:
description: 'This is the list of assistants that make up the squad.
The call will start with the first assistant in the list.'
type: array
items:
$ref: '#/components/schemas/SquadMemberDTO'
membersOverrides:
description: 'This can be used to override all the assistants'' settings and provide values for their template variables.
Both `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.'
allOf:
- $ref: '#/components/schemas/AssistantOverrides'
required:
- members
CreateCustomerDTO:
type: object
properties:
numberE164CheckEnabled:
type: boolean
description: 'This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should be used if you know your use case requires it.
Use cases:
- `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.
- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.
If `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\+?[a-zA-Z0-9]+$/`).
@default true (E164 check is enabled)'
default: true
extension:
type: string
description: This is the extension that will be dialed after the call is answered.
maxLength: 10
example: null
assistantOverrides:
description: 'These are the overrides for the assistant''s settings and template variables specific to this customer.
This allows customization of the assistant''s behavior for individual customers in batch calls.'
allOf:
- $ref: '#/components/schemas/AssistantOverrides'
number:
type: string
description: This is the number of the customer.
minLength: 3
maxLength: 40
sipUri:
type: string
description: This is the SIP URI of the customer.
name:
type: string
description: 'This is the name of the customer. This is just for your own reference.
For SIP inbound calls, this is extracted from the `From` SIP header with format `"Display Name" <sip:username@domain>`.'
maxLength: 40
email:
type: string
description: This is the email of the customer.
maxLength: 40
externalId:
type: string
description: This is the external ID of the customer.
maxLength: 40
CreateAzureCredentialDTO:
type: object
properties:
provider:
type: string
enum:
- azure
service:
type: string
description: This is the service being used in Azure.
enum:
- speech
- blob_storage
default: speech
region:
type: string
description: This is the region of the Azure resource.
enum:
- australiaeast
- canadaeast
- canadacentral
- centralus
- eastus2
- eastus
- france
- germanywestcentral
- india
- japaneast
- japanwest
- northcentralus
- norway
- polandcentral
- southcentralus
- spaincentral
- swedencentral
- switzerland
- uaenorth
- uk
- westeurope
- westus
- westus3
apiKey:
type: string
# --- truncated at 32 KB (730 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vapi-ai/refs/heads/main/openapi/vapi-ai-chats-api-openapi.yml