Intelligence

Get the metrics and records behind analytics in Dixa. Find a metric or record and the filters it accepts with List metrics or List records, and look up the ids to filter on with List filter values. Then send the query to the endpoint for its category: conversations, agents or aiagents. A metric returns values such as a count or an average, and a record returns a page of the events behind it. Read the Intelligence API guide for a walkthrough.

List metrics

GET
/beta/intelligence/metrics

List the metrics you can query, with the filters and aggregates of each metric and the records it is based on. Use the metric id with Query conversation metric, Query agent metric or Query AI agent metric.

Authorization

ApiKeyAuth
headerAuthorization<token>

Query Parameters

category?string

Only list metrics in this category. If not provided, all metrics are listed.

Value in"conversations""agents""aiagents"
pageKey?string

The key of the page to fetch. To page through the results, call the link in meta.next or meta.previous of the previous response, which already carries this key.

pageLimit?integer

The number of entries per page, up to 1000. Defaults to 50, or to the page size of pageKey when one is given.

Formatint32
Default50

Response Body

The list of metrics

application/json
  1. response
data?array<>
meta?
Example Request
curl -X GET 'https://dev.dixa.io/beta/intelligence/metrics' \  -H 'Authorization: <API token>'
{
"data": [
{
"id": "closedConversations",
"name": "Closed conversations",
"category": "conversations",
"description": "The number of conversations closed in the selected period",
"deprecated": false,
"primaryFilters": [
"period",
"conversationIds"
],
"filters": [
{
"attribute": "agent",
"aliases": [
"agentId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The agent (AI or human) assigned to the conversation"
},
{
"attribute": "queue",
"aliases": [
"queueId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The queue the conversation was routed to"
},
{
"attribute": "team",
"aliases": [
"teamId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The team the conversation was assigned to"
},
{
"attribute": "tag",
"aliases": [
"tagId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne",
"IsAll"
],
"defaultOperator": "IsOne",
"description": "A tag attached to the conversation"
},
{
"attribute": "channel",
"aliases": [],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The channel the conversation came in on"
},
{
"attribute": "initialDirection",
"aliases": [
"direction"
],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The initial direction of the conversation"
},
{
"attribute": "contactPoint",
"aliases": [],
"type": "String",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The contact point the conversation arrived through"
}
],
"aggregates": [
{
"name": "count",
"type": "Integer",
"defaultIncluded": true,
"description": "The number of conversations closed in the period, including those closed by deactivated agents"
}
],
"relatedRecordIds": [
"closedConversations"
]
},
{
"id": "responseTime",
"name": "Response time",
"category": "conversations",
"description": "The time conversations waited for a reply after an end user reached out",
"definition": "Measures each completed interval as the milliseconds between an end user reaching out and the conversation being replied to. On asynchronous channels (e.g. Email, Contact form) an interval starts with an end user message and ends on the ensuing agent reply; when several end user messages arrive before a reply, the first of them starts the interval. On synchronous channels it starts when the end user reaches out and ends when they are connected to an agent (Phone) or receive the first outbound reply (e.g. Dixa Messenger). A conversation can contribute any number of intervals within the period.",
"deprecated": false,
"primaryFilters": [
"period",
"conversationIds"
],
"filters": [
{
"attribute": "agent",
"aliases": [
"agentId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The agent (AI or human) assigned to the conversation"
},
{
"attribute": "queue",
"aliases": [
"queueId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The queue the conversation was routed to"
},
{
"attribute": "team",
"aliases": [
"teamId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The team the conversation was assigned to"
},
{
"attribute": "tag",
"aliases": [
"tagId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne",
"IsAll"
],
"defaultOperator": "IsOne",
"description": "A tag attached to the conversation"
},
{
"attribute": "channel",
"aliases": [],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The channel the conversation came in on"
},
{
"attribute": "initialDirection",
"aliases": [
"direction"
],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The initial direction of the conversation"
},
{
"attribute": "contactPoint",
"aliases": [],
"type": "String",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The contact point the conversation arrived through"
}
],
"aggregates": [
{
"name": "count",
"type": "Integer",
"defaultIncluded": true,
"description": "The number of completed response-time intervals"
},
{
"name": "min",
"type": "Number",
"unit": "milliseconds",
"defaultIncluded": true,
"description": "The lowest of the completed response-time intervals"
},
{
"name": "max",
"type": "Number",
"unit": "milliseconds",
"defaultIncluded": true,
"description": "The highest of the completed response-time intervals"
},
{
"name": "sum",
"type": "Number",
"unit": "milliseconds",
"defaultIncluded": true,
"description": "The total of the completed response-time intervals"
},
{
"name": "average",
"type": "Number",
"unit": "milliseconds",
"defaultIncluded": true,
"description": "The mean of the completed response-time intervals"
},
{
"name": "stdDev",
"type": "Number",
"unit": "milliseconds",
"defaultIncluded": true,
"description": "The standard deviation of the completed response-time intervals"
}
],
"relatedRecordIds": [
"responseTime"
]
}
]
}

Shortened to two metrics. The real response lists all metrics

List records

GET
/beta/intelligence/records

List the records you can query, with the fields and filters of each record and the metrics based on it. Use the record id with Query conversation records, Query agent records or Query AI agent records.

Authorization

ApiKeyAuth
headerAuthorization<token>

Query Parameters

category?string

Only list records in this category. If not provided, all records are listed.

Value in"conversations""agents""aiagents"
pageKey?string

The key of the page to fetch. To page through the results, call the link in meta.next or meta.previous of the previous response, which already carries this key.

pageLimit?integer

The number of entries per page, up to 1000. Defaults to 50, or to the page size of pageKey when one is given.

Formatint32
Default50

Response Body

The list of records

application/json
  1. response
data?array<>
meta?
Example Request
curl -X GET 'https://dev.dixa.io/beta/intelligence/records' \  -H 'Authorization: <API token>'
{
"data": [
{
"id": "closedConversations",
"name": "Closed conversations",
"category": "conversations",
"description": "The conversations closed in the selected period, one row each",
"deprecated": false,
"primaryFilters": [
"period",
"conversationIds"
],
"filters": [
{
"attribute": "agent",
"aliases": [
"agentId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The agent (AI or human) assigned to the conversation"
},
{
"attribute": "queue",
"aliases": [
"queueId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The queue the conversation was routed to"
},
{
"attribute": "team",
"aliases": [
"teamId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The team the conversation was assigned to"
},
{
"attribute": "tag",
"aliases": [
"tagId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne",
"IsAll"
],
"defaultOperator": "IsOne",
"description": "A tag attached to the conversation"
},
{
"attribute": "channel",
"aliases": [],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The channel the conversation came in on"
},
{
"attribute": "initialDirection",
"aliases": [
"direction"
],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The initial direction of the conversation"
},
{
"attribute": "contactPoint",
"aliases": [],
"type": "String",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The contact point the conversation arrived through"
}
],
"fields": [
{
"name": "conversationId",
"type": "Integer",
"nullable": false,
"description": "The conversation id"
},
{
"name": "closedAt",
"type": "Timestamp",
"nullable": false,
"description": "When the conversation was closed"
},
{
"name": "agent",
"type": "Entity",
"nullable": true,
"description": "The agent who closed the conversation",
"idType": "Uuid"
},
{
"name": "queue",
"type": "Entity",
"nullable": true,
"description": "The queue the conversation was in when it was closed",
"idType": "Uuid"
},
{
"name": "closedBy",
"type": "Entity",
"nullable": false,
"description": "Who closed the conversation — an agent, the end user, or unknown",
"idType": "String"
},
{
"name": "channel",
"type": "Entity",
"nullable": true,
"description": "The channel the conversation came in on",
"idType": "String"
},
{
"name": "initialDirection",
"type": "Entity",
"nullable": true,
"description": "The initial direction of the conversation",
"idType": "String"
},
{
"name": "contactPoint",
"type": "Entity",
"nullable": true,
"description": "The contact point the conversation arrived through",
"idType": "String"
},
{
"name": "tags",
"type": "List",
"nullable": true,
"description": "The tags attached to the conversation",
"items": {
"type": "Entity",
"idType": "Uuid"
}
}
],
"relatedMetricIds": [
"closedConversations"
]
},
{
"id": "agentPresenceDuration",
"name": "Agent presence duration",
"category": "agents",
"description": "An agent's completed presence intervals in the selected period, one row each",
"deprecated": false,
"primaryFilters": [
"period"
],
"filters": [
{
"attribute": "agent",
"aliases": [
"agentId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The agent (AI or human) assigned to the conversation"
}
],
"fields": [
{
"name": "endedAt",
"type": "Timestamp",
"nullable": false,
"description": "When the interval ended"
},
{
"name": "agent",
"type": "Entity",
"nullable": false,
"description": "The agent the interval belongs to",
"idType": "Uuid"
},
{
"name": "startedAt",
"type": "Timestamp",
"nullable": false,
"description": "When the interval started"
},
{
"name": "working",
"type": "Boolean",
"nullable": false,
"description": "Whether the agent was working (vs away) during the interval"
},
{
"name": "availableOnEmail",
"type": "Boolean",
"nullable": false,
"description": "Whether the agent was available on email"
},
{
"name": "availableOnChat",
"type": "Boolean",
"nullable": false,
"description": "Whether the agent was available on interactive chat"
},
{
"name": "availableOnMessage",
"type": "Boolean",
"nullable": false,
"description": "Whether the agent was available on messaging"
},
{
"name": "availableOnSpeak",
"type": "Boolean",
"nullable": false,
"description": "Whether the agent was available on voice"
},
{
"name": "simultaneousRing",
"type": "Boolean",
"nullable": false,
"description": "Whether simultaneous ring was enabled"
},
{
"name": "customAwayStatus",
"type": "Entity",
"nullable": true,
"description": "The custom away status, when the agent was away on one",
"idType": "Uuid"
}
],
"relatedMetricIds": [
"agentPresenceDuration"
]
}
]
}

Shortened to two records. The real response lists all records

Get metric

GET
/beta/intelligence/metrics/{metricId}

Get a metric by id.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

metricId*string

The metric id

Response Body

The metric

application/json
  1. response
data*

A metric and how to query it

Example Request
curl -X GET 'https://dev.dixa.io/beta/intelligence/metrics/{metricId}' \  -H 'Authorization: <API token>'
{
"data": {
"id": "closedConversations",
"name": "Closed conversations",
"category": "conversations",
"description": "The number of conversations closed in the selected period",
"deprecated": false,
"primaryFilters": [
"period",
"conversationIds"
],
"filters": [
{
"attribute": "agent",
"aliases": [
"agentId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The agent (AI or human) assigned to the conversation"
},
{
"attribute": "queue",
"aliases": [
"queueId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The queue the conversation was routed to"
},
{
"attribute": "team",
"aliases": [
"teamId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The team the conversation was assigned to"
},
{
"attribute": "tag",
"aliases": [
"tagId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne",
"IsAll"
],
"defaultOperator": "IsOne",
"description": "A tag attached to the conversation"
},
{
"attribute": "channel",
"aliases": [],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The channel the conversation came in on"
},
{
"attribute": "initialDirection",
"aliases": [
"direction"
],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The initial direction of the conversation"
},
{
"attribute": "contactPoint",
"aliases": [],
"type": "String",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The contact point the conversation arrived through"
}
],
"aggregates": [
{
"name": "count",
"type": "Integer",
"defaultIncluded": true,
"description": "The number of conversations closed in the period, including those closed by deactivated agents"
}
],
"relatedRecordIds": [
"closedConversations"
]
}
}

A metric that returns a count

Get record

GET
/beta/intelligence/records/{recordId}

Get a record by id.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

recordId*string

The record id

Response Body

The record

application/json
  1. response
data*

A record and how to query it

Example Request
curl -X GET 'https://dev.dixa.io/beta/intelligence/records/{recordId}' \  -H 'Authorization: <API token>'
{
"data": {
"id": "closedConversations",
"name": "Closed conversations",
"category": "conversations",
"description": "The conversations closed in the selected period, one row each",
"deprecated": false,
"primaryFilters": [
"period",
"conversationIds"
],
"filters": [
{
"attribute": "agent",
"aliases": [
"agentId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The agent (AI or human) assigned to the conversation"
},
{
"attribute": "queue",
"aliases": [
"queueId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The queue the conversation was routed to"
},
{
"attribute": "team",
"aliases": [
"teamId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The team the conversation was assigned to"
},
{
"attribute": "tag",
"aliases": [
"tagId"
],
"type": "Uuid",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne",
"IsAll"
],
"defaultOperator": "IsOne",
"description": "A tag attached to the conversation"
},
{
"attribute": "channel",
"aliases": [],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The channel the conversation came in on"
},
{
"attribute": "initialDirection",
"aliases": [
"direction"
],
"type": "String",
"operators": [
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The initial direction of the conversation"
},
{
"attribute": "contactPoint",
"aliases": [],
"type": "String",
"operators": [
"IsEmpty",
"IsNotEmpty",
"IsOne",
"IsNotOne"
],
"defaultOperator": "IsOne",
"description": "The contact point the conversation arrived through"
}
],
"fields": [
{
"name": "conversationId",
"type": "Integer",
"nullable": false,
"description": "The conversation id"
},
{
"name": "closedAt",
"type": "Timestamp",
"nullable": false,
"description": "When the conversation was closed"
},
{
"name": "agent",
"type": "Entity",
"nullable": true,
"description": "The agent who closed the conversation",
"idType": "Uuid"
},
{
"name": "queue",
"type": "Entity",
"nullable": true,
"description": "The queue the conversation was in when it was closed",
"idType": "Uuid"
},
{
"name": "closedBy",
"type": "Entity",
"nullable": false,
"description": "Who closed the conversation — an agent, the end user, or unknown",
"idType": "String"
},
{
"name": "channel",
"type": "Entity",
"nullable": true,
"description": "The channel the conversation came in on",
"idType": "String"
},
{
"name": "initialDirection",
"type": "Entity",
"nullable": true,
"description": "The initial direction of the conversation",
"idType": "String"
},
{
"name": "contactPoint",
"type": "Entity",
"nullable": true,
"description": "The contact point the conversation arrived through",
"idType": "String"
},
{
"name": "tags",
"type": "List",
"nullable": true,
"description": "The tags attached to the conversation",
"items": {
"type": "Entity",
"idType": "Uuid"
}
}
],
"relatedMetricIds": [
"closedConversations"
]
}
}

A record you can query by period or conversation ids, with seven filters and a list of tags

POST
/beta/intelligence/conversations/metrics/{metricId}

Get the value of a conversation metric for a period or a list of conversations. All aggregates of the metric are returned. If nothing matches, count is 0 and the other aggregates are null.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

metricId*string

The id of a conversation metric

Request Body

The query

application/json
  1. body

A conversation metric query

primaryFilter*|

The period or conversations to query, given as either {"period": {...}} or {"conversationIds": [8123456, 8123481]}

filters?array<>

The filters to apply. All filters must match

timezone*string

The timezone presets and days are evaluated in, such as Europe/Copenhagen

Response Body

The metric values, keyed by aggregate name

application/json
  1. response
data*

The metric values, keyed by the name of each of the metric's aggregates. All aggregates are included. If nothing matches, count is 0, min, max, sum, average, stdDev and percentage are null, and an object value is filled with zeros

curl -X POST 'https://dev.dixa.io/beta/intelligence/conversations/metrics/closedConversations' \  -H 'Authorization: <API token>' \  -H 'Content-Type: application/json' \  -d '{  "primaryFilter": {    "period": {      "interval": {        "from": "2026-06-01T00:00:00Z",        "to": "2026-07-01T00:00:00Z"      }    }  },  "filters": [    {      "attribute": "queue",      "values": [        "2f9b6d51-38c4-4a72-9e15-7c8b3f6a2d90"      ],      "operator": "IsOne"    },    {      "attribute": "initialDirection",      "values": [        "Inbound"      ]    }  ],  "timezone": "Europe/Copenhagen"}'
{
"data": {
"count": 1284
}
}

The number of closed conversations

Query agent metric

POST
/beta/intelligence/agents/metrics/{metricId}

Get the value of an agent metric for a period. All aggregates of the metric are returned. If nothing matches, count is 0 and the other aggregates are null, except presence durations, which are 0. Deactivated agents are included.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

metricId*string

The id of an agent metric

Request Body

The query

application/json
  1. body

An agent metric query

primaryFilter*

The period to query

filters?array<>

The filters to apply. All filters must match

timezone*string

The timezone presets and days are evaluated in, such as Europe/Copenhagen

Response Body

The metric values, keyed by aggregate name

application/json
  1. response
data*

The metric values, keyed by the name of each of the metric's aggregates. All aggregates are included. If nothing matches, count is 0, min, max, sum, average, stdDev and percentage are null, and an object value is filled with zeros

curl -X POST 'https://dev.dixa.io/beta/intelligence/agents/metrics/agentPresenceDuration' \  -H 'Authorization: <API token>' \  -H 'Content-Type: application/json' \  -d '{  "primaryFilter": {    "period": {      "interval": {        "from": "2026-06-01T00:00:00Z",        "to": "2026-07-01T00:00:00Z"      }    }  },  "timezone": "Europe/Copenhagen"}'
{
"data": {
"working": {
"durationMs": 18420000,
"availability": {
"email": 18420000,
"chat": 18420000,
"message": 12300000,
"speak": 0
}
},
"away": {
"durationMs": 5400000,
"byStatus": [
{
"customAwayStatus": {
"id": "3c6f2a18-8d47-4b93-a05e-2f7c9b1d6a38",
"label": "Lunch"
},
"durationMs": 1800000
},
{
"durationMs": 3600000
}
]
}
}
}

Time working, per channel the agent was available on, and time away, per away status

Query AI agent metric

POST
/beta/intelligence/aiagents/metrics/{metricId}

Get the value of an AI agent metric for a period. All aggregates of the metric are returned. If nothing matches, the counts are 0. Deleted AI agents are included.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

metricId*string

The id of an AI agent metric

Request Body

The query

application/json
  1. body

An AI agent metric query

primaryFilter*

The period to query

filters?array<>

The filters to apply. All filters must match

timezone*string

The timezone presets and days are evaluated in, such as Europe/Copenhagen

Response Body

The metric values, keyed by aggregate name

application/json
  1. response
data*

The metric values, keyed by the name of each of the metric's aggregates. All aggregates are included. If nothing matches, count is 0, min, max, sum, average, stdDev and percentage are null, and an object value is filled with zeros

curl -X POST 'https://dev.dixa.io/beta/intelligence/aiagents/metrics/aiAgentFeedback' \  -H 'Authorization: <API token>' \  -H 'Content-Type: application/json' \  -d '{  "primaryFilter": {    "period": {      "interval": {        "from": "2026-06-01T00:00:00Z",        "to": "2026-07-01T00:00:00Z"      }    }  },  "timezone": "Europe/Copenhagen"}'
{
"data": {
"count": 412,
"thumbsUp": 351,
"thumbsDown": 61
}
}

The number of rated answers, and how many were rated thumbs up and thumbs down

POST
/beta/intelligence/conversations/records/{recordId}

Get the rows of a conversation record for a period or a list of conversations. To get the next page, send the same query with meta.next as pagination.pageKey. Columns without a value are left out of the row.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

recordId*string

The id of a conversation record

Request Body

The query

application/json
  1. body

A conversation record query

primaryFilter*|

The period or conversations to query, given as either {"period": {...}} or {"conversationIds": [8123456, 8123481]}

filters?array<>

The filters to apply. All filters must match

timezone*string

The timezone presets and days are evaluated in, such as Europe/Copenhagen

pagination?

The page to fetch. If not provided, the first page is returned

includeLabels?boolean

Whether references include a label. Defaults to true

Response Body

One page of rows, and the keys of the previous and next pages

application/json
  1. response
data?array<>

The rows of the page. The columns a row can contain are listed under fields in the record's catalogue entry

meta*

The keys of the previous and next pages, and the page size

curl -X POST 'https://dev.dixa.io/beta/intelligence/conversations/records/closedConversations' \  -H 'Authorization: <API token>' \  -H 'Content-Type: application/json' \  -d '{  "primaryFilter": {    "period": {      "interval": {        "from": "2026-06-01T00:00:00Z",        "to": "2026-07-01T00:00:00Z"      }    }  },  "filters": [    {      "attribute": "channel",      "values": [        "Email",        "ContactForm"      ],      "operator": "IsOne"    },    {      "attribute": "tag",      "values": [        "5e7a9c13-2f84-4b60-9d31-6c8a5e2f7b04",        "b3c81f6d-7a95-4e28-8c40-1f6b9d3a5e72"      ],      "operator": "IsAll"    }  ],  "timezone": "Europe/Copenhagen",  "pagination": {    "pageLimit": 50  },  "includeLabels": true}'
{
"data": [
{
"channel": {
"id": "Email",
"label": "Email"
},
"queue": {
"id": "2f9b6d51-38c4-4a72-9e15-7c8b3f6a2d90",
"label": "Support"
},
"tags": [
{
"id": "5e7a9c13-2f84-4b60-9d31-6c8a5e2f7b04",
"label": "vip"
},
{
"id": "b3c81f6d-7a95-4e28-8c40-1f6b9d3a5e72",
"label": "refund"
}
],
"closedBy": {
"id": "Agent",
"label": "Agent"
},
"closedAt": "2026-06-18T09:14:04.773+00:00",
"agent": {
"id": "a4f1c0b2-6d38-4e91-8f27-1b5d9c3e7a04",
"label": "Joe Bloggs"
},
"contactPoint": {
"id": "support@example.com"
},
"conversationId": 8123456,
"initialDirection": {
"id": "Inbound",
"label": "Inbound"
}
},
{
"channel": {
"id": "ContactForm",
"label": "Contact Form"
},
"tags": [
{
"id": "5e7a9c13-2f84-4b60-9d31-6c8a5e2f7b04",
"label": "vip"
},
{
"id": "b3c81f6d-7a95-4e28-8c40-1f6b9d3a5e72",
"label": "refund"
}
],
"closedBy": {
"id": "EndUser",
"label": "End User"
},
"closedAt": "2026-06-18T11:03:27.48+00:00",
"contactPoint": {
"id": "+18889100777"
},
"conversationId": 8123481,
"initialDirection": {
"id": "Inbound",
"label": "Inbound"
}
}
],
"meta": {
"pageLimit": 50
}
}

One row per closed conversation. Columns without a value, or a reference to something deleted such as a queue, are left out

Query agent records

POST
/beta/intelligence/agents/records/{recordId}

Get the rows of an agent record for a period. To get the next page, send the same query with meta.next as pagination.pageKey. Without filters, all agents are included, also deactivated ones.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

recordId*string

The id of an agent record

Request Body

The query

application/json
  1. body

An agent record query

primaryFilter*

The period to query

filters?array<>

The filters to apply. All filters must match

timezone*string

The timezone presets and days are evaluated in, such as Europe/Copenhagen

pagination?

The page to fetch. If not provided, the first page is returned

includeLabels?boolean

Whether references include a label. Defaults to true

Response Body

One page of rows, and the keys of the previous and next pages

application/json
  1. response
data?array<>

The rows of the page. The columns a row can contain are listed under fields in the record's catalogue entry

meta*

The keys of the previous and next pages, and the page size

curl -X POST 'https://dev.dixa.io/beta/intelligence/agents/records/agentPresenceDuration' \  -H 'Authorization: <API token>' \  -H 'Content-Type: application/json' \  -d '{  "primaryFilter": {    "period": {      "interval": {        "from": "2026-06-01T00:00:00Z",        "to": "2026-07-01T00:00:00Z"      }    }  },  "filters": [    {      "attribute": "agent",      "values": [        "a4f1c0b2-6d38-4e91-8f27-1b5d9c3e7a04",        "c81d4e2a-95b7-4c60-a3f8-2e6a7d09b415"      ],      "operator": "IsOne"    }  ],  "timezone": "Europe/Copenhagen",  "pagination": {    "pageLimit": 50  },  "includeLabels": true}'
{
"data": [
{
"working": true,
"availableOnSpeak": false,
"endedAt": "2026-06-18T12:30:00+00:00",
"availableOnMessage": true,
"agent": {
"id": "a4f1c0b2-6d38-4e91-8f27-1b5d9c3e7a04",
"label": "Joe Bloggs"
},
"simultaneousRing": false,
"availableOnChat": true,
"availableOnEmail": true,
"startedAt": "2026-06-18T08:00:00+00:00"
},
{
"working": false,
"availableOnSpeak": false,
"availableOnMessage": false,
"agent": {
"id": "a4f1c0b2-6d38-4e91-8f27-1b5d9c3e7a04",
"label": "Joe Bloggs"
},
"simultaneousRing": false,
"availableOnChat": false,
"customAwayStatus": {
"id": "3c6f2a18-8d47-4b93-a05e-2f7c9b1d6a38",
"label": "Lunch"
},
"endedAt": "2026-06-18T13:00:00+00:00",
"availableOnEmail": false,
"startedAt": "2026-06-18T12:30:00+00:00"
}
],
"meta": {
"pageLimit": 50
}
}

A working interval and an away interval. Only the away interval has a `customAwayStatus`

Query AI agent records

POST
/beta/intelligence/aiagents/records/{recordId}

Get the rows of an AI agent record for a period. To get the next page, send the same query with meta.next as pagination.pageKey. Without filters, all AI agents are included, also deleted ones.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

recordId*string

The id of an AI agent record

Request Body

The query

application/json
  1. body

An AI agent record query

primaryFilter*

The period to query

filters?array<>

The filters to apply. All filters must match

timezone*string

The timezone presets and days are evaluated in, such as Europe/Copenhagen

pagination?

The page to fetch. If not provided, the first page is returned

includeLabels?boolean

Whether references include a label. Defaults to true

Response Body

One page of rows, and the keys of the previous and next pages

application/json
  1. response
data?array<>

The rows of the page. The columns a row can contain are listed under fields in the record's catalogue entry

meta*

The keys of the previous and next pages, and the page size

curl -X POST 'https://dev.dixa.io/beta/intelligence/aiagents/records/aiAgentFeedback' \  -H 'Authorization: <API token>' \  -H 'Content-Type: application/json' \  -d '{  "primaryFilter": {    "period": {      "interval": {        "from": "2026-06-01T00:00:00Z",        "to": "2026-07-01T00:00:00Z"      }    }  },  "filters": [    {      "attribute": "aiAgent",      "values": [        "0b7e4c2d-5a91-4f38-b6e2-9d1c3a8f5e47"      ],      "operator": "IsOne"    }  ],  "timezone": "Europe/Copenhagen",  "pagination": {    "pageLimit": 50  },  "includeLabels": true}'
{
"data": [
{
"channel": {
"id": "Messenger",
"label": "Messenger"
},
"aiAgent": {
"id": "0b7e4c2d-5a91-4f38-b6e2-9d1c3a8f5e47",
"label": "Support assistant"
},
"submittedAt": "2026-06-20T10:42:13.208+00:00",
"tags": [
{
"id": "b3c81f6d-7a95-4e28-8c40-1f6b9d3a5e72",
"label": "refund"
}
],
"score": 1,
"responseId": "f3c9a1e7-62b4-4d8f-a5c0-8e2b7d41f693",
"feedbackType": {
"id": "Thumbs",
"label": "Thumbs"
},
"queue": {
"id": "2f9b6d51-38c4-4a72-9e15-7c8b3f6a2d90",
"label": "Support"
},
"conversationId": 8123517,
"initialDirection": {
"id": "Inbound",
"label": "Inbound"
}
},
{
"channel": {
"id": "Messenger",
"label": "Messenger"
},
"aiAgent": {
"id": "0b7e4c2d-5a91-4f38-b6e2-9d1c3a8f5e47",
"label": "Support assistant"
},
"submittedAt": "2026-06-20T11:05:47.9+00:00",
"feedbackType": {
"id": "Thumbs",
"label": "Thumbs"
},
"score": 0,
"responseId": "6a1d8e3b-07f2-4c95-b4e8-2d9f5a7c1e30",
"conversationId": 8123529,
"initialDirection": {
"id": "Inbound",
"label": "Inbound"
}
}
],
"meta": {
"pageLimit": 50
}
}

One row per rating: a thumbs up and a thumbs down. The second conversation was in no queue, so it has no `queue`

List filter values

GET
/beta/intelligence/filters/{attribute}/values

List the values you can filter on for an attribute, such as all queues or all tags. Deactivated agents, queues and tags are included and marked with deactivated: true.

Authorization

ApiKeyAuth
headerAuthorization<token>

Path Parameters

attribute*string

A filter attribute from List metrics or List records

Query Parameters

pageKey?string

The key of the page to fetch. To page through the results, call the link in meta.next or meta.previous of the previous response, which already carries this key.

pageLimit?integer

The number of entries per page, up to 1000. Defaults to 50, or to the page size of pageKey when one is given.

Formatint32
Default50

Response Body

The values of the filter attribute

application/json
  1. response
data?array<>
meta?
Example Request
curl -X GET 'https://dev.dixa.io/beta/intelligence/filters/{attribute}/values' \  -H 'Authorization: <API token>'
{
"data": [
{
"id": "a4f1c0b2-6d38-4e91-8f27-1b5d9c3e7a04",
"label": "Joe Bloggs",
"deactivated": false
},
{
"id": "c81d4e2a-95b7-4c60-a3f8-2e6a7d09b415",
"label": "Amara Okafor",
"deactivated": false
},
{
"id": "e6b2a704-3f19-4d82-9c5b-4a8e1f2d7c36",
"label": "Sam Petrov",
"deactivated": true
}
],
"meta": {
"next": "/beta/intelligence/filters/agent/values?pageKey=eyJvZmZzZXQiOjUwLCJsaW1pdCI6NTB9&pageLimit=50"
}
}

Agents with their display names. Deactivated agents are included and marked as deactivated