Vapi Insight API
The Insight API from Vapi — 4 operation(s) for insight.
The Insight API from Vapi — 4 operation(s) for insight.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/vapi-insight-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Vapi Analytics Insight API
description: Voice AI for developers.
version: '1.0'
contact: {}
servers:
- url: https://api.vapi.ai
tags:
- name: Insight
paths:
/reporting/insight:
post:
operationId: InsightController_create
summary: Create Insight
parameters: []
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/CreateBarInsightFromCallTableDTO'
title: CreateBarInsightFromCallTableDTO
- $ref: '#/components/schemas/CreatePieInsightFromCallTableDTO'
title: CreatePieInsightFromCallTableDTO
- $ref: '#/components/schemas/CreateLineInsightFromCallTableDTO'
title: CreateLineInsightFromCallTableDTO
- $ref: '#/components/schemas/CreateTextInsightFromCallTableDTO'
title: CreateTextInsightFromCallTableDTO
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/CreateBarInsightFromCallTableDTO'
pie: '#/components/schemas/CreatePieInsightFromCallTableDTO'
line: '#/components/schemas/CreateLineInsightFromCallTableDTO'
text: '#/components/schemas/CreateTextInsightFromCallTableDTO'
responses:
'201':
description: ''
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/BarInsight'
- $ref: '#/components/schemas/PieInsight'
- $ref: '#/components/schemas/LineInsight'
- $ref: '#/components/schemas/TextInsight'
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/BarInsight'
pie: '#/components/schemas/PieInsight'
line: '#/components/schemas/LineInsight'
text: '#/components/schemas/TextInsight'
tags:
- Insight
security:
- bearer: []
get:
operationId: InsightController_findAll
summary: Get Insights
parameters:
- name: id
required: false
in: query
schema:
type: string
- name: page
required: false
in: query
description: This is the page number to return. Defaults to 1.
schema:
minimum: 1
type: number
- name: sortOrder
required: false
in: query
description: This is the sort order for pagination. Defaults to 'DESC'.
schema:
enum:
- ASC
- DESC
type: string
- name: sortBy
required: false
in: query
description: This is the column to sort by. Defaults to 'createdAt'.
schema:
enum:
- createdAt
- duration
- cost
type: string
- 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/InsightPaginatedResponse'
tags:
- Insight
security:
- bearer: []
/reporting/insight/{id}:
patch:
operationId: InsightController_update
summary: Update Insight
parameters:
- name: id
required: true
in: path
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/UpdateBarInsightFromCallTableDTO'
title: UpdateBarInsightFromCallTableDTO
- $ref: '#/components/schemas/UpdatePieInsightFromCallTableDTO'
title: UpdatePieInsightFromCallTableDTO
- $ref: '#/components/schemas/UpdateLineInsightFromCallTableDTO'
title: UpdateLineInsightFromCallTableDTO
- $ref: '#/components/schemas/UpdateTextInsightFromCallTableDTO'
title: UpdateTextInsightFromCallTableDTO
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/UpdateBarInsightFromCallTableDTO'
pie: '#/components/schemas/UpdatePieInsightFromCallTableDTO'
line: '#/components/schemas/UpdateLineInsightFromCallTableDTO'
text: '#/components/schemas/UpdateTextInsightFromCallTableDTO'
responses:
'200':
description: ''
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/BarInsight'
- $ref: '#/components/schemas/PieInsight'
- $ref: '#/components/schemas/LineInsight'
- $ref: '#/components/schemas/TextInsight'
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/BarInsight'
pie: '#/components/schemas/PieInsight'
line: '#/components/schemas/LineInsight'
text: '#/components/schemas/TextInsight'
tags:
- Insight
security:
- bearer: []
get:
operationId: InsightController_findOne
summary: Get Insight
parameters:
- name: id
required: true
in: path
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/BarInsight'
- $ref: '#/components/schemas/PieInsight'
- $ref: '#/components/schemas/LineInsight'
- $ref: '#/components/schemas/TextInsight'
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/BarInsight'
pie: '#/components/schemas/PieInsight'
line: '#/components/schemas/LineInsight'
text: '#/components/schemas/TextInsight'
tags:
- Insight
security:
- bearer: []
delete:
operationId: InsightController_remove
summary: Delete Insight
parameters:
- name: id
required: true
in: path
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/BarInsight'
- $ref: '#/components/schemas/PieInsight'
- $ref: '#/components/schemas/LineInsight'
- $ref: '#/components/schemas/TextInsight'
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/BarInsight'
pie: '#/components/schemas/PieInsight'
line: '#/components/schemas/LineInsight'
text: '#/components/schemas/TextInsight'
tags:
- Insight
security:
- bearer: []
/reporting/insight/{id}/run:
post:
operationId: InsightController_run
summary: Run Insight
parameters:
- name: id
required: true
in: path
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/InsightRunDTO'
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/InsightRunResponse'
'201':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/InsightRunResponse'
tags:
- Insight
security:
- bearer: []
/reporting/insight/preview:
post:
operationId: InsightController_preview
summary: Preview Insight
parameters: []
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/CreateBarInsightFromCallTableDTO'
title: CreateBarInsightFromCallTableDTO
- $ref: '#/components/schemas/CreatePieInsightFromCallTableDTO'
title: CreatePieInsightFromCallTableDTO
- $ref: '#/components/schemas/CreateLineInsightFromCallTableDTO'
title: CreateLineInsightFromCallTableDTO
- $ref: '#/components/schemas/CreateTextInsightFromCallTableDTO'
title: CreateTextInsightFromCallTableDTO
discriminator:
propertyName: type
mapping:
bar: '#/components/schemas/CreateBarInsightFromCallTableDTO'
pie: '#/components/schemas/CreatePieInsightFromCallTableDTO'
line: '#/components/schemas/CreateLineInsightFromCallTableDTO'
text: '#/components/schemas/CreateTextInsightFromCallTableDTO'
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/InsightRunResponse'
'201':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/InsightRunResponse'
tags:
- Insight
security:
- bearer: []
components:
schemas:
EventsTableNumberCondition:
type: object
properties:
column:
type: string
description: The number field name from the event data
example: latency
operator:
type: string
description: Number comparison operator
example: '>='
enum:
- '='
- '!='
- '>'
- '>='
- <
- <=
value:
type: number
description: The number value to compare
example: 1000
required:
- column
- operator
- value
UpdatePieInsightFromCallTableDTO:
type: object
properties:
name:
type: string
description: This is the name of the Insight.
minLength: 1
maxLength: 255
type:
type: string
description: 'This is the type of the Insight.
It is required to be `pie` to create a pie insight.'
enum:
- pie
formulas:
type: array
description: 'Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.
The formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html
A formula is created by using the query names as the variable.
The 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.
For example, if you have 2 queries, ''Was Booking Made'' and ''Average Call Duration'', you can create a formula like this:
```
{{[''Query 1'']}} / {{[''Query 2'']}} * 100
```
```
({{[Query 1]}} * 10) + {{[Query 2]}}
```
This will take the
You can also use the query names as the variable in the formula.'
items:
$ref: '#/components/schemas/InsightFormula'
timeRange:
$ref: '#/components/schemas/InsightTimeRange'
groupBy:
type: string
description: 'This is the group by column for the insight when table is `call`.
These are the columns to group the results by.
All results are grouped by the time range step by default.'
example:
- assistant_id
enum:
- assistantId
- workflowId
- squadId
- phoneNumberId
- type
- endedReason
- customerNumber
- campaignId
- artifact.structuredOutputs[OutputID]
queries:
type: array
description: These are the queries to run to generate the insight.
items:
oneOf:
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
title: JSONQueryOnCallTableWithStringTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
title: JSONQueryOnCallTableWithNumberTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
title: JSONQueryOnCallTableWithStructuredOutputColumn
BarInsight:
type: object
properties:
name:
type: string
description: This is the name of the Insight.
minLength: 1
maxLength: 255
type:
type: string
description: 'This is the type of the Insight.
It is required to be `bar` to create a bar insight.'
enum:
- bar
formulas:
type: array
description: 'Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.
The formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html
A formula is created by using the query names as the variable.
The 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.
For example, if you have 2 queries, ''Was Booking Made'' and ''Average Call Duration'', you can create a formula like this:
```
{{[''Query 1'']}} / {{[''Query 2'']}} * 100
```
```
({{[Query 1]}} * 10) + {{[Query 2]}}
```
This will take the
You can also use the query names as the variable in the formula.'
items:
$ref: '#/components/schemas/InsightFormula'
metadata:
description: This is the metadata for the insight.
allOf:
- $ref: '#/components/schemas/BarInsightMetadata'
timeRange:
$ref: '#/components/schemas/InsightTimeRangeWithStep'
groupBy:
type: string
description: 'This is the group by column for the insight when table is `call`.
These are the columns to group the results by.
All results are grouped by the time range step by default.'
example:
- assistant_id
enum:
- assistantId
- workflowId
- squadId
- phoneNumberId
- type
- endedReason
- customerNumber
- campaignId
- artifact.structuredOutputs[OutputID]
queries:
type: array
description: These are the queries to run to generate the insight.
items:
oneOf:
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
title: JSONQueryOnCallTableWithStringTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
title: JSONQueryOnCallTableWithNumberTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
title: JSONQueryOnCallTableWithStructuredOutputColumn
- $ref: '#/components/schemas/JSONQueryOnEventsTable'
title: JSONQueryOnEventsTable
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:
format: date-time
type: string
description: This is the ISO 8601 date-time string of when the Insight was created.
updatedAt:
format: date-time
type: string
description: This is the ISO 8601 date-time string of when the Insight was last updated.
systemKey:
type: string
description: Stable server-owned identifier for system-created insights.
required:
- type
- queries
- id
- orgId
- createdAt
- updatedAt
InsightTimeRangeWithStep:
type: object
properties:
step:
type: string
description: 'This is the group by step for aggregation.
If not provided, defaults to group by day.'
enum:
- minute
- hour
- day
- week
- month
- quarter
- year
start:
type: object
description: 'This is the start date for the time range.
Should be a valid ISO 8601 date-time string or relative time string.
If not provided, defaults to the 7 days ago.
Relative time strings of the format "-{number}{unit}" are allowed.
Valid units are:
- d: days
- h: hours
- w: weeks
- m: months
- y: years'
example: '"2025-01-01" or "-7d" or "now"'
end:
type: object
description: 'This is the end date for the time range.
Should be a valid ISO 8601 date-time string or relative time string.
If not provided, defaults to now.
Relative time strings of the format "-{number}{unit}" are allowed.
Valid units are:
- d: days
- h: hours
- w: weeks
- m: months
- y: years'
example: '"2025-01-01" or "now"'
timezone:
type: string
description: 'This is the timezone you want to set for the query.
If not provided, defaults to UTC.'
EventsTableStringCondition:
type: object
properties:
column:
type: string
description: The string field name from the event data
example: provider
operator:
type: string
description: String comparison operator
example: '='
enum:
- '='
- '!='
- contains
- notContains
value:
type: string
description: The string value to compare
example: openai
required:
- column
- operator
- value
LineInsightMetadata:
type: object
properties:
xAxisLabel:
type: string
minLength: 1
maxLength: 40
yAxisLabel:
type: string
minLength: 1
maxLength: 40
yAxisMin:
type: number
yAxisMax:
type: number
name:
type: string
minLength: 1
maxLength: 255
FilterNumberArrayTypeColumnOnCallTable:
type: object
properties:
column:
type: string
description: 'This is the column in the call table that will be filtered on.
Number Array Type columns are the same as Number Type columns, but provides the ability to filter on multiple values provided as an array.
Must be a valid column for the selected table.'
example: duration
enum:
- duration
- cost
- averageModelLatency
- averageVoiceLatency
- averageTranscriberLatency
- averageTurnLatency
- averageEndpointingLatency
operator:
type: string
description: 'This is the operator to use for the filter.
The operator must be `in` or `not_in`.'
example: '"in" or "not_in"'
enum:
- in
- not_in
- is_empty
- is_not_empty
value:
description: This is the value to filter on.
type: array
items:
type: number
required:
- column
- operator
- value
UpdateBarInsightFromCallTableDTO:
type: object
properties:
name:
type: string
description: This is the name of the Insight.
minLength: 1
maxLength: 255
type:
type: string
description: 'This is the type of the Insight.
It is required to be `bar` to create a bar insight.'
enum:
- bar
formulas:
type: array
description: 'Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.
The formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html
A formula is created by using the query names as the variable.
The 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.
For example, if you have 2 queries, ''Was Booking Made'' and ''Average Call Duration'', you can create a formula like this:
```
{{[''Query 1'']}} / {{[''Query 2'']}} * 100
```
```
({{[Query 1]}} * 10) + {{[Query 2]}}
```
This will take the
You can also use the query names as the variable in the formula.'
items:
$ref: '#/components/schemas/InsightFormula'
metadata:
description: This is the metadata for the insight.
allOf:
- $ref: '#/components/schemas/BarInsightMetadata'
timeRange:
$ref: '#/components/schemas/InsightTimeRangeWithStep'
groupBy:
type: string
description: 'This is the group by column for the insight when table is `call`.
These are the columns to group the results by.
All results are grouped by the time range step by default.'
example:
- assistant_id
enum:
- assistantId
- workflowId
- squadId
- phoneNumberId
- type
- endedReason
- customerNumber
- campaignId
- artifact.structuredOutputs[OutputID]
queries:
type: array
description: These are the queries to run to generate the insight.
items:
oneOf:
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
title: JSONQueryOnCallTableWithStringTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
title: JSONQueryOnCallTableWithNumberTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
title: JSONQueryOnCallTableWithStructuredOutputColumn
- $ref: '#/components/schemas/JSONQueryOnEventsTable'
title: JSONQueryOnEventsTable
JSONQueryOnCallTableWithNumberTypeColumn:
type: object
properties:
type:
type: string
description: This is the type of query. Only allowed type is "vapiql-json".
example: vapiql-json
enum:
- vapiql-json
table:
type: string
description: This is the table that will be queried.
enum:
- call
filters:
type: array
description: 'This is the filters to apply to the insight.
The discriminator automatically selects the correct filter type based on column and operator.'
items:
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'
column:
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.
Available columns depend on the selected table.
Number Type columns are columns where the rows store Number data'
example: duration
operation:
type: string
enum:
- average
- sum
- min
- max
description: 'This is the aggregation operation to perform on the column.
When the column is a number type, the operation must be one of the following:
- average
- sum
- min
- max'
example: sum
name:
type: string
description: 'This is the name of the query.
It will be used to label the query in the insight board on the UI.'
example: Total Calls
required:
- type
- table
- column
- operation
LineInsight:
type: object
properties:
name:
type: string
description: This is the name of the Insight.
minLength: 1
maxLength: 255
type:
type: string
description: 'This is the type of the Insight.
It is required to be `line` to create a line insight.'
enum:
- line
formulas:
type: array
description: 'Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.
The formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html
A formula is created by using the query names as the variable.
The 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.
For example, if you have 2 queries, ''Was Booking Made'' and ''Average Call Duration'', you can create a formula like this:
```
{{[''Query 1'']}} / {{[''Query 2'']}} * 100
```
```
({{[Query 1]}} * 10) + {{[Query 2]}}
```
This will take the
You can also use the query names as the variable in the formula.'
items:
$ref: '#/components/schemas/InsightFormula'
metadata:
description: This is the metadata for the insight.
allOf:
- $ref: '#/components/schemas/LineInsightMetadata'
timeRange:
$ref: '#/components/schemas/InsightTimeRangeWithStep'
groupBy:
type: string
description: 'This is the group by column for the insight when table is `call`.
These are the columns to group the results by.
All results are grouped by the time range step by default.'
example:
- assistant_id
enum:
- assistantId
- workflowId
- squadId
- phoneNumberId
- type
- endedReason
- customerNumber
- campaignId
- artifact.structuredOutputs[OutputID]
queries:
type: array
description: These are the queries to run to generate the insight.
items:
oneOf:
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
title: JSONQueryOnCallTableWithStringTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
title: JSONQueryOnCallTableWithNumberTypeColumn
- $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
title: JSONQueryOnCallTableWithStructuredOutputColumn
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:
format: date-time
type: string
description: This is the ISO 8601 date-time string of when the Insight was created.
updatedAt:
format: date-time
type: string
description: This is the ISO 8601 date-time string of when the Insight was last updated.
systemKey:
type: string
description: Stable server-owned identifier for system-created insights.
required:
- type
- queries
- id
- orgId
- createdAt
- updatedAt
InsightRunResponse:
type: object
properties:
id:
type: string
insightId:
type: string
orgId:
type: string
createdAt:
format: date-time
type: string
updatedAt:
format: date-time
type: string
required:
- id
- insightId
- orgId
- createdAt
- updatedAt
BarInsightMetadata:
type: object
properties:
xAxisLabel:
type: string
minLength: 1
maxLength: 40
yAxisLabel:
type: string
minLength: 1
maxLength: 40
yAxisMin:
type: number
yAxisMax:
type: number
name:
type: string
minLength: 1
maxLen
# --- truncated at 32 KB (76 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vapi/refs/heads/main/openapi/vapi-insight-api-openapi.yml