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-sessions-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 Sessions 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: Sessions
description: Sessions endpoints.
paths:
/session:
post:
operationId: SessionController_create
summary: Create Session
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSessionDTO'
responses:
'201':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/Session'
tags:
- Sessions
security:
- bearer: []
get:
operationId: SessionController_findAllPaginated
summary: List Sessions
parameters:
- name: id
required: false
in: query
description: This is the unique identifier for the session to filter by.
schema:
type: string
- name: name
required: false
in: query
description: This is the name of the session to filter by.
schema:
type: string
- name: assistantId
required: false
in: query
description: This is the ID of the assistant to filter sessions by.
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 ID of the squad to filter sessions by.
schema:
type: string
- name: workflowId
required: false
in: query
description: This is the ID of the workflow to filter sessions by.
schema:
type: string
- required: false
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)'
name: numberE164CheckEnabled
in: query
schema:
default: true
type: boolean
- required: false
description: This is the extension that will be dialed after the call is answered.
name: extension
in: query
schema:
maxLength: 10
example: null
type: string
- name: assistantOverrides
required: false
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'
in: query
schema: {}
- required: false
description: This is the number of the customer.
name: number
in: query
schema:
minLength: 3
maxLength: 40
type: string
- required: false
description: This is the SIP URI of the customer.
name: sipUri
in: query
schema:
type: string
- required: false
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>`.'
name: name
in: query
schema:
maxLength: 40
type: string
- required: false
description: This is the email of the customer.
name: email
in: query
schema:
maxLength: 40
type: string
- required: false
description: This is the external ID of the customer.
name: externalId
in: query
schema:
maxLength: 40
type: string
- name: customerNumberAny
required: false
in: query
description: Filter by any of the specified customer phone numbers (comma-separated).
schema:
example: +1234567890,+0987654321
type: string
- name: phoneNumberId
required: false
in: query
description: This will return sessions with the specified phoneNumberId.
schema:
type: string
- name: phoneNumberIdAny
required: false
in: query
description: This will return sessions with any of the specified phoneNumberIds.
schema:
type: array
items:
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/SessionPaginatedResponse'
tags:
- Sessions
security:
- bearer: []
/session/{id}:
get:
operationId: SessionController_findOne
summary: Get Session
parameters:
- name: id
required: true
in: path
description: The unique identifier for the resource.
schema:
format: uuid
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/Session'
tags:
- Sessions
security:
- bearer: []
patch:
operationId: SessionController_update
summary: Update Session
parameters:
- name: id
required: true
in: path
description: The unique identifier for the resource.
schema:
format: uuid
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateSessionDTO'
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/Session'
tags:
- Sessions
security:
- bearer: []
delete:
operationId: SessionController_remove
summary: Delete Session
parameters:
- name: id
required: true
in: path
description: The unique identifier for the resource.
schema:
format: uuid
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/Session'
tags:
- Sessions
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
# --- truncated at 32 KB (744 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vapi-ai/refs/heads/main/openapi/vapi-ai-sessions-api-openapi.yml