Dstny Conversational Intelligence API docs (2.0.0)

Download OpenAPI specification:Download

API v2

Use this API to get interaction and recording insights, as well as create and edit users and teams, and JWT tokens for embedding selected Dstny pages in iframes.

Bearer

Bearer token. Should be supplied in Authorization header. Example: Authorization: Bearer <token>.
To get a bearer token, go to Settings -> Api -> Token in your Dstny account, and create a new one by clicking the button in the upper right corner. In the modal, add a name and optionally description, and make sure the token is enabled if it will be used immediately.

Security Scheme Type: HTTP
HTTP Authorization Scheme: bearer
Bearer format: JWT

Webhooks

Registering a Webhook

To register a webhook, log in as an admin to copilot.dstny.se and navigate to: Settings → API → Webhooks

  1. Enter the webhook URL where events should be sent.
  2. When webhook is created it's in status enabled. You may disable it by clicking on 'Disable' (currently, only conversation_created is available).
  3. Click Save to activate the webhook.

Event Delivery

Once registered, the system will send an HTTP POST request to your webhook URL whenever an event occurs.

Available Events

1. Conversation Created (conversation_created)

Triggered when a new conversation is created.

Example Payload:

{
  "event_type": "conversation_created",
  "payload": {
    "conversation_id": "d1b919ac-2d66-4a86-870f-b043ce099e41"
  }
}

Monitoring Webhooks

  • You can view logs of webhook deliveries under Settings → API → Webhooks.
  • Failed requests will be retried up to 3 times with an increasing delay.

Future Events

More webhook events will be introduced in future updates. When new events are available, they will be listed here.

User

Get users for account

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create User

Authorizations:
Bearer
Request Body schema: application/json
email
required
string <email>
first_name
required
string
last_name
required
string
mobile_number
string
deleteMeetingRecordingDays
string
deleteContactDataDays
string
is_passive
boolean
email_aliases
Array of strings <email>
auto_join_meeting_bot
string or null
can_use_ai_agents
boolean
object

Responses

Request samples

Content type
application/json
{
  • "email": "user@example.com",
  • "first_name": "string",
  • "last_name": "string",
  • "mobile_number": "string",
  • "deleteMeetingRecordingDays": "string",
  • "deleteContactDataDays": "",
  • "is_passive": true,
  • "email_aliases": [
    ],
  • "auto_join_meeting_bot": "0",
  • "can_use_ai_agents": true,
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "username": "yolo@yolo.com",
  • "email": "yolo@yolo.com",
  • "first_name": "Joe",
  • "last_name": "Doe",
  • "profile_picture_url": "https://placeholder.com/200",
  • "mobile_number": 89295205465,
  • "teams": [
    ],
  • "accounts": [
    ],
  • "last_login": "2020-08-13T13:16:21.000Z"
}

Edit User

Authorizations:
Bearer
Request Body schema: application/json
email
string <email>
first_name
string
last_name
string
mobile_number
string
deleteMeetingRecordingDays
string
deleteContactDataDays
string
is_passive
boolean
email_aliases
Array of strings <email>
auto_join_meeting_bot
string or null
can_use_ai_agents
boolean
object

Responses

Request samples

Content type
application/json
{
  • "email": "user@example.com",
  • "first_name": "string",
  • "last_name": "string",
  • "mobile_number": "string",
  • "deleteMeetingRecordingDays": "string",
  • "deleteContactDataDays": "",
  • "is_passive": true,
  • "email_aliases": [
    ],
  • "auto_join_meeting_bot": "0",
  • "can_use_ai_agents": true,
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "id": 1,
  • "username": "yolo@yolo.com",
  • "email": "yolo@yolo.com",
  • "first_name": "Joe",
  • "last_name": "Doe",
  • "profile_picture_url": "https://placeholder.com/200",
  • "mobile_number": 89295205465,
  • "teams": [
    ],
  • "accounts": [
    ],
  • "last_login": "2020-08-13T13:16:21.000Z"
}

Team

Get teams for account

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a team

Authorizations:
Bearer
Request Body schema: application/json
name
required
string
description
required
string
type
string
selectManagers
string
deleteMeetingRecordingDays
string
deleteContactDataDays
string
managers
Array of integers
auto_join_meeting_bot
string or null
low_priority_bot
boolean
can_use_ai_agents
boolean
object

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "type": "string",
  • "selectManagers": "string",
  • "deleteMeetingRecordingDays": "string",
  • "deleteContactDataDays": "string",
  • "managers": [
    ],
  • "auto_join_meeting_bot": "0",
  • "low_priority_bot": true,
  • "can_use_ai_agents": true,
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d3f65c3e-811c-4e4b-8439-415f1ba4e8de",
  • "name": "Foo team",
  • "managers": [
    ],
  • "description": "Foo bar",
  • "created_at": "2020-08-13T13:16:21Z"
}

Update a team

Authorizations:
Bearer
Request Body schema: application/json
name
string
description
string
type
string
selectManagers
string
deleteMeetingRecordingDays
string
deleteContactDataDays
string
managers
Array of integers
auto_join_meeting_bot
string or null
low_priority_bot
boolean
can_use_ai_agents
boolean
object

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "type": "string",
  • "selectManagers": "string",
  • "deleteMeetingRecordingDays": "string",
  • "deleteContactDataDays": "string",
  • "managers": [
    ],
  • "auto_join_meeting_bot": "0",
  • "low_priority_bot": true,
  • "can_use_ai_agents": true,
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "id": "d3f65c3e-811c-4e4b-8439-415f1ba4e8de",
  • "name": "Foo team",
  • "managers": [
    ],
  • "description": "Foo bar",
  • "created_at": "2020-08-13T13:16:21Z"
}

Get users for a team

Returns all users that belong to the specified team.

Authorizations:
Bearer
path Parameters
teamId
required
string
Example: d3f65c3e-811c-4e4b-8439-415f1ba4e8de

The team ID (UUID)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Assign users to a team

Authorizations:
Bearer
Request Body schema: application/json
user_ids
required
Array of integers

Responses

Request samples

Content type
application/json
{
  • "user_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "d3f65c3e-811c-4e4b-8439-415f1ba4e8de",
  • "name": "Foo team",
  • "managers": [
    ],
  • "description": "Foo bar",
  • "created_at": "2020-08-13T13:16:21Z"
}

Conversations

Get conversations for account

Use available filters from Get Global Filters to filter conversations.

The GetConversation API supports multiple query parameters for filtering results. However, the valid values for these parameters must be retrieved from the Get Global Filters resource to ensure consistency and prevent invalid requests.

How It Works:

  1. Call Get Global Filters (GET /api/v2/global-filters) to retrieve all available filter options.
  2. Use the ID field from Get Global Filters as valid inputs when calling GetConversation.

Example Workflow:

Step 1: Fetch Available Filters

Request:

GET /api/v2/global-filters

Response:

{
  ... 
  "teams": [
    {
      "id": "75fc3b9a-b3a4-4291-8bc7-138a3bade3b4",
      "name": "Team A",
      "description": "Team A description",
      "settings": [],
      "managers": [],
    },
    {
      "id": "05e62f00-3038-4acb-9d43-0a14aa466de5",
      "name": "Team B",
      "description": "Team B description",
      }
  ],
  ... 

Step 2: Use Filters in GetConversation

Request:

GET /api/v2/conversations?global_team_ids[]=75fc3b9a-b3a4-4291-8bc7-138a3bade3b4&global_team_ids[]=05e62f00-3038-4acb-9d43-0a14aa466de5
Authorizations:
Bearer
path Parameters
search
string
Example: search=google

Full-text search query

global_user_ids
Array of integers
Example: global_user_ids[]=1&global_user_ids[]=95

IDs of users that organized the sessions

global_team_ids
Array of strings
Example: global_team_ids[]=be054e38-1a5c-4adb-a9dc-d8af1956cde5&global_team_ids[]=6f668ee4-9144-4ace-8580-7beb8ba2a516

IDs of teams whose members organized the sessions

campaign_ids
Array of strings
Example: campaign_ids[]=demo

Names of campaigns the sessions belong to

recording_types
string
Enum: "meeting" "call" "live"
Example: recording_types[]=call

Types of session to retrieve

deals_status
Array of strings
Example: deals_status[]=closed%20won

Current status of deal(s) related to sessions

global_start
string <date>
Example: global_start=2020-01-01

Earliest session date

global_end
string <date>
Example: global_end=2025-12-31

Latest session date

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a new call conversation

Creates a new conversation resource for a call. The response immediately returns a conversation_id, but note that the conversation is created asynchronously. It may take a few minutes before the conversation data is fully available and accessible via the API.

Authorizations:
Bearer
Request Body schema: application/json
call_external_id
required
string

Unique identifier for the call (external system ID).

call_start_time
required
string <date-time>

Timestamp when the call started. Format: ISO 8601.

call_end_time
string <date-time>

Timestamp when the call ended. Optional if call_duration is provided.

call_duration
integer

Duration of the call in seconds. Optional if call_end_time is provided.

call_recording_url
required
string <uri>

Publicly accessible URL to the call recording. Must respond with HTTP 200. For optimal analysis, use high-quality MP3/WAV files (16-bit/44.1kHz+) with stereo separation if available. Note. If your recording is in stereo format, set call_is_stereo to true and provide participant channel information with call_participant_channel value.

call_is_stereo
boolean

True if the audio is recorded in stereo. Defaults to false.

call_direction
required
string
Enum: "incoming" "outgoing"

Direction of the call: 'incoming' or 'outgoing'.

call_title
string

Optional call title or subject. If not provided system will generate name using provided participant information.

call_outcome
string

Outcome of the call (e.g., 'Won', 'No Answer', 'Busy').

call_participant_channel
string
Enum: "left" "right"

Audio channel the participant is on. Defaults to 'right'. This option is only used when provided call is in stereo format.

owner_email
required
string <email>

Email of the user who owns the call (required).

owner_name
string

Full name of the owner. If omitted, inferred from email.

owner_phone_number
string

Phone number of the owner.

participant_email
string <email>

Email of the call participant.

participant_first_name
string

First name of the participant. If missing, may be inferred from email.

participant_last_name
string

Last name of the participant. If missing, may be inferred from email.

participant_phone_number
string

Phone number of the participant.

participant_company_name
string

Company or organization the participant belongs to.

participant_external_id
string

External contact ID for the participant in your system.

Responses

Request samples

Content type
application/json
{
  • "call_external_id": "a1b2c3d4e5",
  • "call_start_time": "2025-04-17T08:00:00Z",
  • "call_end_time": "2025-04-17T08:15:00Z",
  • "call_duration": 900,
  • "call_is_stereo": false,
  • "call_direction": "outgoing",
  • "call_title": "Quarterly Review",
  • "call_outcome": "Won",
  • "call_participant_channel": "right",
  • "owner_email": "john.doe@example.com",
  • "owner_name": "John Doe",
  • "owner_phone_number": "+46701234567",
  • "participant_email": "client@example.org",
  • "participant_first_name": "Client",
  • "participant_last_name": "Smith",
  • "participant_phone_number": "+46709876543",
  • "participant_company_name": "Client AB",
  • "participant_external_id": "external-1234"
}

Response samples

Content type
application/json
{
  • "conversation_id": "1f07d9fe-b515-6c3e-8fd2-ce54fb85a059"
}

Get conversation insights

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get conversation transcript

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get conversation ai analytics

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get conversation playbooks

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get conversation magic variable requests

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get conversation department insights

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Global Filters

Get global filters

Retrieves all available filter values that can be used to filter conversations in the API.

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Embed

Get a short-lived JWT token

Provide the email of a user on the current account. The JWT token returned can be set as the token query parameter when embedding a page, in the iframe's src attribute.

Available embeddable pages:

  • Dashboard

    <iframe src="http://app.meetric.com/embed/dashboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.testotken"></iframe>

  • Integrations (Coming soon)

    <iframe src="http://app.meetric.com/embed/integrations?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.testtoken&parent_page=https://yourwebsite.com"></iframe>

  • Conversations (Coming soon)

  • Settings (Coming soon)

Authorizations:
Bearer
Request Body schema: application/json
email
required
user.email@company.com

Responses

Request samples

Content type
application/json
{
  • "email": "john.doe@example.com"
}

Response samples

Content type
application/json
{
  • "JWT": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}

Department

Get departments for account

Returns departments that exist for the account. Departments are derived from teams with a department type and users with department assignments.

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get teams for a department

Returns all teams that belong to the specified department (teams where team.type matches the department slug).

Authorizations:
Bearer
path Parameters
departmentSlug
required
string
Example: b2b-sales

The department slug (e.g., 'b2b-sales', 'customer-success')

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get users for a department

Returns all users that belong to the specified department. A user belongs to a department if: (1) the department is in their departments array, OR (2) they belong to a team with this department type.

Authorizations:
Bearer
path Parameters
departmentSlug
required
string
Example: b2b-sales

The department slug (e.g., 'b2b-sales', 'customer-success')

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

AI Agents

List all AI agents

Returns all AI agents configured for the account. AI agents analyze meeting transcriptions to generate summaries, track playbook adherence, extract variables, and discover insights.

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Create an AI agent

Creates a new AI agent for the account. Agent types include: meeting_summary (generates summaries), playbook (tracks adherence to sales playbooks), magic_variable (extracts structured data), and magic_insight (free-form data extraction).

Authorizations:
Bearer
Request Body schema: application/json
name
required
string

Display name of the agent

type
required
string
Enum: "meeting_summary" "playbook" "magic_variable" "magic_insight"

Type of agent

status
required
string
Enum: "active" "draft" "pause"

Agent status

customPrompt
string

Custom prompt instructions

object

Type-specific configuration

globalFilters
object

Filters for conversation selection

meetingRoleAssignment
string
Default: "sales"
Enum: "sales" "support" "internal" "onboarding" "project" "negotiation" "consulting" "customer_success"
enablePlaybookSummaryInstructions
boolean
Default: false
playbookSummaryInstructionsPrompt
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "Sales Playbook Agent",
  • "type": "playbook",
  • "status": "draft",
  • "customPrompt": "Focus on customer objections and buying signals.",
  • "typeSettings": {
    },
  • "globalFilters": { },
  • "meetingRoleAssignment": "sales",
  • "enablePlaybookSummaryInstructions": false,
  • "playbookSummaryInstructionsPrompt": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Get an AI agent

Returns details of a specific AI agent.

Authorizations:
Bearer
path Parameters
agentId
required
integer
Example: 123

The AI agent ID

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update an AI agent

Updates an existing AI agent configuration.

Authorizations:
Bearer
path Parameters
agentId
required
integer
Example: 123

The AI agent ID

Request Body schema: application/json
name
required
string

Display name of the agent

type
required
string
Enum: "meeting_summary" "playbook" "magic_variable" "magic_insight"

Type of agent

status
required
string
Enum: "active" "draft" "pause"

Agent status

customPrompt
string

Custom prompt instructions

object

Type-specific configuration

globalFilters
object

Filters for conversation selection

meetingRoleAssignment
string
Default: "sales"
Enum: "sales" "support" "internal" "onboarding" "project" "negotiation" "consulting" "customer_success"
enablePlaybookSummaryInstructions
boolean
Default: false
playbookSummaryInstructionsPrompt
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "Sales Playbook Agent",
  • "type": "playbook",
  • "status": "draft",
  • "customPrompt": "Focus on customer objections and buying signals.",
  • "typeSettings": {
    },
  • "globalFilters": { },
  • "meetingRoleAssignment": "sales",
  • "enablePlaybookSummaryInstructions": false,
  • "playbookSummaryInstructionsPrompt": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Delete an AI agent

Soft deletes an AI agent. The agent will no longer process new conversations.

Authorizations:
Bearer
path Parameters
agentId
required
integer
Example: 123

The AI agent ID

Responses

Get AI agent type templates

Returns available AI agent type templates with their default configurations, prompts, and sample data.

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get meeting role assignments

Returns available meeting role assignments that define speaker roles in transcripts (e.g., sales: Seller/Buyer, support: Agent/Client).

Authorizations:
Bearer

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

List AI agent requests

Returns requests for a specific AI agent. Use the is_test_run query parameter to filter by request type:

  • is_test_run=true - Returns only test runs (requests executed for testing/preview purposes)
  • is_test_run=false - Returns only actual requests (processed and stored results from live conversations)
  • (not set) - Returns all requests regardless of type

Test runs are typically created when previewing agent behavior on a conversation without persisting results. Actual requests are created when an agent processes a conversation and stores the results for analytics.

Authorizations:
Bearer
path Parameters
agentId
required
integer
Example: 123

The AI agent ID

query Parameters
is_test_run
string
Enum: "true" "false"
Example: is_test_run=true

Filter by request type. Use true for test runs only, false for actual processed requests only, or omit to get all requests.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Get AI agent request details

Returns details of a specific AI agent request including the prompt sent and response received.

Authorizations:
Bearer
path Parameters
agentId
required
integer
Example: 123

The AI agent ID

requestId
required
integer
Example: 456

The request ID

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Run AI agent on a conversation

Executes an AI agent on a specific conversation synchronously. Returns the analysis results immediately. Use is_test_run=false to process and store results.

Authorizations:
Bearer
path Parameters
agentId
required
integer
Example: 123

The AI agent ID

conversationId
required
string
Example: 1f07d9fe-b515-6c3e-8fd2-ce54fb85a059

The conversation ID (session UUID)

Request Body schema: application/json
is_test_run
boolean
Default: true

If true, results are not persisted. Default: true

force
boolean
Default: false

If true, forces re-execution even if cached results exist. Default: false

Responses

Request samples

Content type
application/json
{
  • "is_test_run": true,
  • "force": false
}

Response samples

Content type
application/json
{
  • "data": {
    }
}