Vapi Platform API

REST API for managing Vapi voice AI agents. Supports CRUD on Assistants, Squads, Calls, Chats, Campaigns, Sessions, Phone Numbers, Tools, Files, Structured Outputs, Insight, Eval, Observability, and Analytics. Auth is bearer token; base URL is https://api.vapi.ai.

OpenAPI Specification

vapi-openapi.yml Raw ↑
openapi: 3.0.0
paths:
  /assistant:
    post:
      operationId: AssistantController_create
      summary: Create Assistant
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAssistantDTO'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
      tags:
      - Assistants
      security:
      - bearer: []
    get:
      operationId: AssistantController_findAll
      summary: List Assistants
      parameters:
      - 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:
                type: array
                items:
                  $ref: '#/components/schemas/Assistant'
      tags:
      - Assistants
      security:
      - bearer: []
  /assistant/{id}:
    get:
      operationId: AssistantController_findOne
      summary: Get Assistant
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
      tags:
      - Assistants
      security:
      - bearer: []
    patch:
      operationId: AssistantController_update
      summary: Update Assistant
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateAssistantDTO'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
      tags:
      - Assistants
      security:
      - bearer: []
    delete:
      operationId: AssistantController_remove
      summary: Delete Assistant
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
      tags:
      - Assistants
      security:
      - bearer: []
  /squad:
    post:
      operationId: SquadController_create
      summary: Create Squad
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSquadDTO'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
      tags:
      - Squads
      security:
      - bearer: []
    get:
      operationId: SquadController_findAll
      summary: List Squads
      parameters:
      - 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:
                type: array
                items:
                  $ref: '#/components/schemas/Squad'
      tags:
      - Squads
      security:
      - bearer: []
  /squad/{id}:
    get:
      operationId: SquadController_findOne
      summary: Get Squad
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
      tags:
      - Squads
      security:
      - bearer: []
    patch:
      operationId: SquadController_update
      summary: Update Squad
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSquadDTO'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
      tags:
      - Squads
      security:
      - bearer: []
    delete:
      operationId: SquadController_remove
      summary: Delete Squad
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
      tags:
      - Squads
      security:
      - bearer: []
  /call:
    post:
      operationId: CallController_create
      summary: Create Call
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCallDTO'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/Call'
                - $ref: '#/components/schemas/CallBatchResponse'
      tags:
      - Calls
      security:
      - bearer: []
    get:
      operationId: CallController_findAll
      summary: List Calls
      parameters:
      - name: id
        required: false
        in: query
        description: This is the unique identifier for the call.
        schema:
          type: string
      - name: assistantId
        required: false
        in: query
        description: This will return calls with the specified assistantId.
        schema:
          type: string
      - name: phoneNumberId
        required: false
        in: query
        description: 'This is the phone number that will be used for the call. To
          use a transient number, use `phoneNumber` instead.


          Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.'
        schema:
          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:
                type: array
                items:
                  $ref: '#/components/schemas/Call'
      tags:
      - Calls
      security:
      - bearer: []
  /call/{id}:
    get:
      operationId: CallController_findOne
      summary: Get Call
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
      tags:
      - Calls
      security:
      - bearer: []
    patch:
      operationId: CallController_update
      summary: Update Call
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCallDTO'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
      tags:
      - Calls
      security:
      - bearer: []
    delete:
      operationId: CallController_deleteCallData
      summary: Delete Call
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteCallDTO'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
      tags:
      - Calls
      security:
      - bearer: []
  /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: []
  /campaign:
    post:
      operationId: CampaignController_create
      summary: Create Campaign
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCampaignDTO'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
      tags:
      - Campaigns
      security:
      - bearer: []
    get:
      operationId: CampaignController_findAll
      summary: List Campaigns
      parameters:
      - name: id
        required: false
        in: query
        schema:
          type: string
      - name: status
        required: false
        in: query
        schema:
          enum:
          - scheduled
          - in-progress
          - ended
          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/CampaignPaginatedResponse'
      tags:
      - Campaigns
      security:
      - bearer: []
  /campaign/{id}:
    get:
      operationId: CampaignController_findOne
      summary: Get Campaign
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
      tags:
      - Campaigns
      security:
      - bearer: []
    patch:
      operationId: CampaignController_update
      summary: Update Campaign
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCampaignDTO'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
      tags:
      - Campaigns
      security:
      - bearer: []
    delete:
      operationId: CampaignController_remove
      summary: Delete Campaign
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
      tags:
      - Campaigns
      security:
      - bearer: []
  /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
       

# --- truncated at 32 KB (2216 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vapi/refs/heads/main/openapi/vapi-openapi.yml