Aggregate conversation data with Conversation Insights
In this guide, you'll use Conversation Insights to discover available data and aggregate your conversation metrics.
Complete the prerequisites:
- Create a Twilio account.
- Store your Twilio credentials in environment variables.
- Set up Conversation Orchestrator with at least one conversation.
Info
Insights data becomes available approximately 15 minutes after conversation events.
Before querying, use the Metadata API to see what measures and dimensions are available.
Send a GET request to the Metadata endpoint:
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function fetchMetadata() {14const metadata = await client.insights.v3.metadata.fetch();1516console.log(metadata.domain);17}1819fetchMetadata();
The response includes a list of cubes, each with its available measures and dimensions.
1{2"domain": "Conversations",3"cubes": [4{5"name": "Conversation",6"description": "Contains aggregated conversation event data",7"measures": [8{9"name": "Conversation.Count",10"type": "number",11"aggregation": "countDistinct",12"description": "The count of unique conversations"13}14],15"dimensions": [16{17"name": "Conversation.ConversationId",18"type": "string",19"description": "The unique identifier for the conversation"20}21]22}23]24}
To get the total conversation count, make a POST request to the Query endpoint.
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function createQueryResults() {14const query = await client.insights.v3.query.create({15domain: "Conversations",16query: {17measures: ["Conversation.Count"],18filters: [19{20expressions: [21{22op: "GT",23field: "Conversation.CreatedDate",24values: ["2026-04-02"],25},26],27},28],29},30});3132console.log(query.domain);33}3435createQueryResults();
The response includes your aggregated data:
1{2"domain": "Conversations",3"items": [4{5"Conversation.Count": "2"6}7],8"meta": {9"key": "items",10"nextToken": null,11"pageSize": 50,12"previousToken": null13}14}
Query conversations grouped by dimensions. This example counts conversations by status:
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function createQueryResults() {14const query = await client.insights.v3.query.create({15domain: "Conversations",16query: {17measures: ["Conversation.Count"],18dimensions: ["Conversation.ConversationStatus"],19filters: [20{21expressions: [22{23op: "GT",24field: "Conversation.CreatedDate",25values: ["2026-04-02"],26},27],28},29],30},31});3233console.log(query.domain);34}3536createQueryResults();
The response groups results by status:
1{2"domain": "Conversations",3"items": [4{5"Conversation.ConversationStatus": "ACTIVE",6"Conversation.Count": "15"7}8],9"meta": {10"key": "items",11"nextToken": null,12"pageSize": 50,13"previousToken": null14}15}
Query operator results to analyze intelligence operators run on your conversations. This example counts operator results grouped by operator name:
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function createQueryResults() {14const query = await client.insights.v3.query.create({15domain: "Conversations",16query: {17measures: ["OperatorResult.Count"],18dimensions: ["OperatorResult.OperatorName"],19filters: [20{21expressions: [22{23op: "GT",24field: "OperatorResult.CreatedDate",25values: ["2026-04-02"],26},27],28},29],30},31});3233console.log(query.domain);34}3536createQueryResults();
The response groups results by operator name:
1{2"domain": "Conversations",3"items": [4{5"OperatorResult.Count": "168",6"OperatorResult.OperatorName": "Sentiment"7}8],9"meta": {10"key": "items",11"nextToken": null,12"pageSize": 1,13"previousToken": null14}15}
Query operator results that used a specific Knowledge Base. This example retrieves conversations and operator names filtered by Knowledge Base ID:
1// Download the helper library from https://www.twilio.com/docs/node/install2const twilio = require("twilio"); // Or, for ESM: import twilio from "twilio";34// Find your Account SID at twilio.com/console5// Provision API Keys at twilio.com/console/runtime/api-keys6// and set the environment variables. See http://twil.io/secure7// For local testing, you can use your Account SID and Auth token8const accountSid = process.env.TWILIO_ACCOUNT_SID;9const apiKey = process.env.TWILIO_API_KEY;10const apiSecret = process.env.TWILIO_API_SECRET;11const client = twilio(apiKey, apiSecret, { accountSid: accountSid });1213async function createQueryResults() {14const query = await client.insights.v3.query.create({15domain: "Conversations",16query: {17dimensions: [18"OperatorResult.ConversationId",19"OperatorResult.OperatorName",20"OperatorResult.KnowledgeBaseId",21],22filters: [23{24op: "AND",25expressions: [26{27op: "GT",28field: "OperatorResult.CreatedDate",29values: ["2026-04-10"],30},31{32op: "EQ",33field: "OperatorResult.KnowledgeBaseId",34values: ["know_knowledgebase_xxxxxxxxxxxxxxxxxxxxxxxxxxxx"],35},36],37},38],39},40});4142console.log(query.domain);43}4445createQueryResults();
The response returns operator results filtered by the specified Knowledge Base:
1{2"domain": "Conversations",3"items": [4{5"OperatorResult.ConversationId": "conv_conversation_xxxxxxxxxxxxxxxxxxxxxxxxxxxx",6"OperatorResult.OperatorName": "Sentiment",7"OperatorResult.KnowledgeBaseId": "know_knowledgebase_xxxxxxxxxxxxxxxxxxxxxxxxxxxx"8}9],10"meta": {11"key": "items",12"nextToken": null,13"pageSize": 1,14"previousToken": null15}16}
To learn more about Conversation Insights, see the following resources:
- Data model: understand cubes, measures, and dimensions.
- Query syntax: learn how to construct complex queries with filters, ordering, and pagination.