Spoke API Reference (2026-06-05)

Download OpenAPI specification:

Introduction

Welcome to the Spoke Developer API. This API allows you to connect Spoke Phone and Spoke Enlighten to your existing business systems in a variety of ways:

  • Access the Spoke Unified Directory via the Directory endpoint. This endpoint provides comprehensive details about each Directory entry, including Availability. You can read more about the Spoke Directory and its core concepts here
  • Upload customer, supplier and other CRM contacts into Spoke Phone via the Phonebooks and Contacts endpoint. Once integrated, these contacts become searchable in the Spoke mobile application external phonebook. Any new incoming calls from phone numbers that have matching details in the phonebook will automatically show enhanced caller ID details.
  • Access detailed call logs via the Calls endpoint. You can extract this data for reporting, real-time analytics or even integrate them back into customer records in your CRM system.
  • View Spoke User status via the Users endpoint, and build a custom dashboard to see who is available in real-time.
  • Add SIP trunk extensions to the Spoke Unified Directory by managing your Spoke SIP Trunk integration via the Trunks endpoint. Integrating with this endpoint and its associated Trunk Devices, Trunk Users and Trunk Queues endpoints allows you to synchronise your legacy internal phone directory with Spoke, giving your Spoke users a unified view across your entire organisation.
  • Subscribe to webhook events so that your systems can be notified when call and conversation related events occur on the Spoke platform.
  • Send system generated SMS messages via the Conversations /conversationMessages endpoint. The messages will be automatically added to the user's conversations in the Spoke application.
  • Create Data Actions to customise your call workflows
  • Automatically analyse calls and conversations using the Spoke Enlighten AI Content Analysis /contentAnalysis endpoint.

Access to the API

If you have a Spoke account, you can access the Spoke Developer API via https://integration.spokephone.com. This production endpoint provides access to your live user data.

If you do not have a Spoke account, you have two options:

  • If you have your own Twilio account and want to deploy Spoke into that account, enabling you to integrate Spoke with other Twilio applications, go to https://account.spokephone.com/twilio to create a free developer account.
  • If you want use Spoke's services without needing your own Twilio account, go to https://account.spokephone.com/signup to sign up for trial account.

Either account will allow you to get started and provides access to full production functionality.

Feedback

If you have requests, feedback or questions, please request to join the Spoke Phone Tech Community on Slack at https://spoke-phone-tech.slack.com

Authentication

The Spoke API uses OAuth v2.0 client credentials flow to authenticate requests. You can manage your API access in the Spoke Account Portal at https://account.spokephone.com/login

To authenticate with the Spoke API you need to follow these steps:

  1. Create an API key
  2. Generate an Access Token
  3. Make Authenticated Requests

For more details on the OAuth 2.0 client credentials flow, see the overview at https://auth0.com/docs/flows/concepts/client-credentials

Create an API key

You must first login as an Administrator to your account in the Spoke Phone Account Portal at https://account.spokephone.com/login. Open the settings page, click Other, Developers, and add a new API key. This is a one time operation.

Developer API Screenshot

Once the "API key" is created, you will be provided with the necessary details (OAuth 2.0 Client ID, OAuth 2.0 client secret, Authentication service URL) needed to create an access token.

Generate a Token

Once you have created an "API key", the next step is to obtain a bearer token from the Spoke Phone Auth Service at https://auth.spokephone.com/oauth/token. This step requires making an HTTP POST to the Authorization Service URL provided in the step above, with the request body containing an application/x-www-form-urlencoded string with the following fields:

Field Name Description
client_id The client id from the Developer API
client_secret The client secret from the Developer API
grant_type Always client_credentials

A javascript example of this is below:

const response = await fetch("https://auth.spokephone.com/oauth/token", {
  method: 'post',
  body: querystring.stringify({
    client_id: "{CLIENT_ID_FROM_DEVELOPER_API}",
    client_secret: "{CLIENT_SECRET_FROM_DEVELOPER_API}",
    grant_type: "client_credentials"
  }),
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});

const { access_token } = response.json();

Note: The auth token endpoint still supports sending an application/json body, however this content type is deprecated in favour of application/x-www-form-urlencoded.

Make Authenticated Requests

To make authenticated API requests, you must provide a valid bearer token in an HTTP Header:

Authorization: Bearer {access_token}

Once you have obtained an access token, you must provide this as a Bearer token for all subsequent API requests.

const response = await fetch("https://integration.spokephone.com/phonebooks", {
  method: "get",
  headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${access_token}` },
});

Access Token Expiration

Access tokens expire after 3600 seconds (1 hour). It is up to the developer to implement appropriate refresh logic, by following the same token generation process above. Note that as flow is a client credentials flow, intended for machine to machine operations, we do not provide a token refresh endpoint. Instead, requesting a new access token using the same client_id/client_secret is sufficient.

API Guide

Requests and Responses

The API is RESTful. All requests should be made over HTTPS, and accessed from https://integration.spokephone.com.

Requests

Most of the parameters and request data will be contained in the body of the HTTP request. The Spoke Phone API accepts JSON in the HTTP request body. No other data format (e.g. XML) is supported.

Responses

The success or failure of an HTTP request is returned as a standard HTTP status code:

  • a 2xx code for success
  • a 4xx or 5xx code for failure

The response body will always be encoded in JSON format. No other data format (e.g. XML) is supported.

Pagination

The Spoke Phone API uses a cursor based model for paging of large result sets. Paging support is available for the following endpoints:

  • GET /phonebooks
  • GET /phonebooks/{id}/contacts
  • GET /calls
  • GET /trunks
  • GET /trunks/{trunkId}/trunkDevices
  • GET /trunks/{trunkId}/trunkQueues
  • GET /trunks/{trunkId}/trunkUsers

All of these endpoints support an optional limit parameter. If this parameter is omitted, the default limit is 100. The maximum limit is 1000 for any single request. You can retrieve a list of phonebooks without retrieving associated contacts with GET /phonebooks?limit=0

Example

GET https://integration.spokephone.com/calls?limit=2 HTTP/1.1
Host: integration.spokephone.com

200 Response

{
    "meta": {
        "next": "eyJsYXN0TW9kaWZpZWRUaW1lc3RhbXAiOjE1Njg2NzUzOTE3NTIsImNhbGxJZCI6ImE2YzVkMDgwLWQ0MWUtMTFlOS1hYzZiLWE5MTliMjAwYWFlNCIsIm9yZ2FuaXNhdGlvbklkIjoiOTQ4NzhhYzEtMDI3OS0xMWU5LWI0ZmEtNmJiYzgxMGEzZjJkIn0="
    },
    "calls": [ { ... }, { ... } ]
}

Endpoints that support paging return a meta field in the response object, which includes a next token to be used in subsequent requests.

Simply pass the next token in the query string of the next GET to retrieve the next page of results.

If there are no additional pages the next field will be empty.

Batch Operations

Batch operations such as uploading a list of contacts requires replacing the entire contents of a given Phonebook. Additional batch upload support may be introduced in the future.

Upload Limits

Individual PUTS and POSTS are limited to 6MB total (JSON encoded) data size. If a given Phonebook contains more than 6MB of data then it should be split into separate phonebooks, until such time that we introduce batch upload paging.

Last Modified Timestamp

The GET /calls endpoint supports paging by last modified timestamp. This is because a call can have additional notes stored against it well after the call ends, and there is a small amount of latency between the call end and any recordings becoming available. The last modified timestamp will be updated whenever any additional data is stored against the call.

Calling a GET /calls?modified={timestamp} will retrieve all calls created or modified since the provided timestamp. This means that the API may return a Call that was returned in response to a previous request. It is the responsibility of the client application to reconcile the response content and upsert the retrieved calls as appropriate.

The timestamp value is a a numeric timestamp in milliseconds since the Unix epoch.

Date/Time Values

In general for any date/time or timestamp types, this API will provide two fields:

  1. {fieldName}At: This is an ISO8601 formatted date/time. All date/times are UTC.
  2. {fieldName}Timestamp: This is a numeric timestamp in milliseconds since the Unix epoch.

Postman Collection

Download Postman Collection: Download

To use the postman collection you will need to have authentication credentials, which can be obtained in the Developer section of the Spoke Phone Account Portal (see Create an API key for more details on how to create API authentication credentials).

We recommend setting up the following variables in a postman environment clientId, clientSecret, tokenUrl, and baseUrl. To authenticate every request for the postman collection for an hour (the lifetime of an authentication token), you will need to edit the collection Authorization to use OAuth 2.0 with client credentials. Once you have completed this setup you will be able to make any request in the collection, and be authenticated to do so.

Developer API Screenshot Developer API Screenshot

Core Concepts

The Spoke Directory

Each item in the Spoke directory is called a directory entry. Spoke's core directory entry types are userWithAvailability, teamWithAvailability and device. If you have enabled our PBX augmentation feature, then a Directory can also contain trunkUser, trunkDevice and trunkGroup types - these are equivalent to the device type with some additional attributes for display and search purposes.

Devices

In Spoke, you can add a SIP Device as a standalone Device, and it will appear as an entry in a Spoke directory. In Spoke, a SIP Device only provides basic dialtone and call audio functionality. Rich functionality is available through Spoke's desktop and mobile softphone applications, and we recommend SIP devices are only used for common area or conference room phones.

Note: Spoke does not currently support adding a Twilio client as a standalone entry in the Spoke directory. Instead, Twilio clients are automatically created when you add a Spoke user and they sign in using the Spoke mobile or desktop applications.

Users

In Spoke, a User can have multiple callable endpoints, for example:

  • a Mobile phone running the Spoke mobile application for iOS or Android
  • a Desktop PC running the Spoke desktop application for MacOS or Android
  • a SIP Device registered to the Twilio SIP Registrar or to a third party PBX interconnected via a SIP Trunk

When a call arrives on Spoke for a given User, Spoke will dial all endpoints associated with that User. The endpoint that is answered wins and Spoke automatically stops ringing the user's other endpoints. Additionally, the user can transparently move the call from one endpoint to another, enabling them to answer a call at their desk and continue it on their mobile phone when leaving the office.

Call Groups/Teams

A Team (or Call Group) in Spoke is analogous to a hunt group in traditional PBX systems. A Team consists of one or more User or Device members, and has business rules that define how a call is routed to those members, as well as what happens when the call goes unanswered. When a call arrives on Spoke for a Team, Spoke will automatically create a call offer flow that dials the members of the team based on those pre-defined rules. For User team members, the same dial rules apply, which means that when the call is offered to the User, all of the user's endpoints are dialled at once.

Company Contacts in Spoke

Company Contacts are external contacts that are managed via the Phonebooks and Contacts endpoints.

Spoke supports two types of phonebooks:

  • Company Contacts (Shared): Contacts in shared phonebooks are searchable and visible to all users of the Spoke application.
  • Company Contacts (Assigned): Contacts in assigned phonebooks are searchable and visible only to the user who is assigned that phonebook.

All Company Contacts are searchable and visible in the Spoke application under the 'External' tab. They are not editable by end-users and must be managed through the Spoke API.

Company Contacts (Shared)

Shared company contacts are used where you do not need to restrict which users can access a contact.

You can create and manage multiple Shared phonebooks, these are searchable and visible to all users.

Company Contacts (Assigned)

Each Spoke User also has a phonebook that contains company contacts that only they can see or search. This is useful for use cases where you need to restrict which contacts a user has access to.

You manage a user's phonebook via the creating or updating a personal phonebook endpoint, using the user's email address as follows:

PUT https://integration.spokephone.com/phonebooks/email@example.com

Extensions

Every entry in the Spoke directory is assigned an extension number.

Extensions are the primary mechanism for connecting calls that have already been answered by another Twilio application (such as Studio) to entries in the Spoke Directory. We do not, however, use extensions for internal call routing.

Extensions are created and managed through the Spoke account portal, and can be assigned to any Device, Team or User in your account. Extensions are unique, and there is a one to one mapping between extension and directory entry.

Calls on Spoke

All Spoke calls involve a conference bridge; this allows us to support warm transfer, multi-party calls, recording and other functionality.

This means that when a call arrives on the Spoke platform, the incoming call is placed into a conference via <Dial><Conference>... TwiML. We then use Twilio's Create Call REST API to dial all endpoints based on the target of the incoming call (a Device, Team or User as described above). When the call is answered by one of the endpoints, all other calls are cancelled, and the "winning" call is placed into the same conference.

Routing Twilio Calls into Spoke

When you activate a phone number from your Twilio account on Spoke, the Spoke platform automatically attaches Spoke's standard inbound TwiML application to the phone number. From that point forward, all routing and call handling is taken care of by Spoke.

If you want greater control over a call, including the ability to send a call to Spoke and have Spoke send the call back to your application if the call goes unanswered, then we recommend using Spoke's redirect handler.

The Spoke redirect handler enables you to programmatically connect incoming calls that have been processed with other Twilio applications (such as Studio, Flex or your own application) to Spoke.

The redirect handler url has the following form:

https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={YOUR_ORGANISATION_ID}

The handler accepts the following parameters:

Note: The parameter order listed below is important as all requests to the handler are signature validated.

# Parameter Required Description
1 extension Yes The extension you are redirecting the call to
2 nextOfferTimeout No The number of seconds to wait before offering the call to the next available user(s) in a call group, see the supported range below.
3 organisationId Yes Your unique Spoke account identifier
4 priority No The priority of the call, see the supported range below.
5 returnTo No One of flow or taskQueue or postEndpoint.
6 returnToId No The identifier of the returnTo destination, see the expected value below.
7 sendToVoicemail No If true, force the call to be sent to voicemail
8 timeout No The number of seconds to wait for a user or anyone in a call group to answer, see the supported range below.
9 x-<passthroughParameter> No Passthrough parameter to store against the call. See below for more details on how to set passthrough parameters.

Note: The Spoke Directory API provides a pre-formed twimlRedirectUrl for each directory entry that includes the correct extension and organisationId parameters.

To connect an incoming Twilio call with a Spoke directory entry, simply update the call using Twilio's REST API as follows:

const client = require('twilio')();

client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  .update({
    method: 'POST',
    url: 'https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={SPOKE_ORG_ID}'
  });

This will connect the incoming call to Spoke and follow the dial rules outlined in the Spoke Directory section above.

Using Spoke's Redirect Handler

If sendToVoicemail is true, then Spoke will send the call to the target extension's voicemail, if that extension is a type that supports voicemail. Once the customer leaves a voicemail, the call ends. User and Team extensions will always have a voicemail, however other directory entry types do not currently support voicemail. In the case of extensions that do not support voicemail, there are two possible scenarios:

  • If returnTo/returnToId are provided, then the call will be returned to the target defined by returnToId as described in the section Returning unanswered calls below
  • If returnTo/returnToId are not provided, the call will silently end. Due to this behaviour, we recommend that returnTo and returnToId are always provided

It is important to note that if sendToVoicemail is true then Spoke will never ring the target extension, instead the call goes straight to the target extension's voicemail flow.

Returning unanswered calls

If you update the call with the redirect URL documented above, and only provide the extension and organisationId parameters, then Spoke's standard business rules kick in. This means that if the target extension is unavailable or does not answer, then Spoke's standard "unanswered call" rules apply:

  • For calls to a User extension, the call will go the user's voicemail
  • For calls to a Team extension, the call will follow the call group's "unanswered" call flow configuration - which could send the call to another call group, the group's voicemail or to an external PSTN number

To override this behaviour, and return control of the call back to your application, you have three options:

1. Return to a Studio Flow

Add &returnTo=flow&returnToId={FLOW_SID} to the url parameter in the update method above:

const client = require('twilio')();

client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  .update({
    method: 'POST',
    url: 'https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={SPOKE_ORG_ID}&returnTo=flow&returnToId={STUDIO_FLOW_SID}'
  });

This will return the call to a Twilio Studio flow. If you have sent the call from the same flow by using the redirect widget, then you can control what happens next to the call by connecting a new widget to the return output of the redirect widget.

2. Send the call to a TaskRouter Workflow

Add &returnTo=taskQueue&returnToId={WORKFLOW_SID} to the url parameter in the update method above:

const client = require('twilio')();

client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  .update({
    method: 'POST',
    url: 'https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={SPOKE_ORG_ID}&returnTo=taskQueue&returnToId={WORKFLOW_SID}'
  });

This will send the call to a Twilio Task Router Workflow, which could be attached to Flex, or a workflow/task queue that your own application listens to.

3. Send the call to an HTTPS endpoint

Add &returnTo=postEndpoint&returnToId={ENCODED_HTTPS_URL} to the url parameter in the update method above. This can be a Twilio Function or any HTTPS endpoint that accepts a POST request.

The following example will redirect the call to the provided URL.

const client = require('twilio')();

const returnToPostEndpoint = encodeURIComponent("https://example.com/return-post-endpoint");

client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  .update({
    method: 'POST',
    url: `https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={SPOKE_ORG_ID}&returnTo=postEndpoint&returnToId=${returnToPostEndpoint}`
  });

Details about the request body sent by Twilio can be found here.

Note: The POST request will be sent by Twilio with an X-Twilio-Signature header. We recommend you secure the endpoint by validating that the request is coming from Twilio. For redirects to a Twilio Function, this can be done by setting the visibility of the Function to Protected.

Invalid URLs will be ignored and unanswered calls will not be returned.

Sending the call to voicemail

Add &sendToVoicemail=true to the url parameter in the update method above:

const client = require('twilio')();

client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  .update({
    method: 'POST',
    url: 'https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={SPOKE_ORG_ID}&sendToVoicemail=true'
  });

This will force Spoke's call flows to bypass availability checks and assume the target entry has no availability. In the case of a Team, it also bypasses unanswered call roll-over rules. The call will be sent directly to the target entry's voicemail. The target entry will:

  • Receive a standard missed call/voicemail notification
  • See a missed call in their call history
  • Receive a voicemail email including transcript (if that option is enabled)

Note : As noted above, only User and Team extensions currently support voicemail.

Overriding call timeouts

If a valid number is provided as the timeout, then Spoke will use it as the number of seconds to wait for someone to answer the call before returning the call or sending it to voicemail.

  • For calls to a User or a Device, this is the number of seconds Spoke will ring the user or the device.
    • The supported range of values for timeout when calling a user or a device is from 10 to 70 seconds. If the provided parameter falls outside the range, it will be rounded to the nearest supported value.
  • For calls to a Team, this is the number of the seconds Spoke will wait for someone to answer the call before returning or forwarding the call.
    • The supported range of values for timeout when calling a team is from 10 to 300 seconds. If the provided parameter falls outside the range, it will be rounded to the nearest supported value.

If a valid number is provided as the nextOfferTimeout, then Spoke will use it as the number of seconds to wait for calls to a Team before offering the call to the next available user(s). The supported range of values for nextOfferTimeout is from 5 to 60 seconds. If the provided parameter falls outside the range, it will be rounded to the nearest supported value.

Note : The asynchronous nature of API calls between Spoke and Twilio coupled with the overhead of setting up and tearing down call legs means that timeout values are indicative only, and the follow on action may occur some number of seconds after the timeout expires.

Setting call priority

If a valid value is provided as the priority, then Spoke will use it to:

  • Determine which calls take priority when selecting the next call to queue for a user.
  • Determine the order in which calls are offered to a user.

The supported range of values for priority is an integer value between 1 and 9, where 1 is the highest priority and 9 is the lowest. If the provided parameter falls outside the range, the call will be assigned a default value of 5.

Setting passthrough parameters

Passthrough parameters are stored against the call record and are then included in the call's webhook events. These parameters can also be retrieved when getting the call resource through the Spoke API.

Use passthrough parameters with Redirect to track calls that have been initially handled by other Twilio applications (such as Studio, Flex or your own custom application), ensuring that the outcome of the call can be associated correctly with your external applications (such as CRM or in-house systems).

Examples of passthrough parameters include caller verification, IVR selections or other data collected from external systems during the initial phase of the call.

To attach passthrough parameters to a call, add them to the url parameter with the parameter name prefixed with x- when updating the call:

const client = require('twilio')();

client.calls
  .update({
      method: 'POST',
      url: 'https://api.spokephone.com/telephony/redirect?extension={EXTENSION}&organisationId={SPOKE_ORG_ID}&x-contactId=HS12345&x-orderId=OR12345'
  });

Important: All the query parameters of the url must be in alphabetical order. In the example above x-contactId must come before x-orderId.

  • Size Limit: The total length of all passthrough parameters (including parameter names and values) must not exceed 1000 bytes. If this limit is exceeded, all passthrough parameters will be discarded.
  • Processing: Parameter names and values are URL-decoded, validated for safety, and stored as-is upon input. No additional processing is performed.

Sample Integrations

Using Spoke's Runtime Functions to integrate Twilio Studio with Spoke's Programmable Softphone

Overview

You can get up and running quickly with Spoke and Twilio Studio by leveraging Spoke's Directory API and our open source Twilio Runtime Functions.

  1. The Spoke Directory API provides you with programmable lookup into the Spoke Unified Directory. The response payload includes real time availability of Spoke Users and Teams, enabling you to make routing decisions based on real time presence and availability.
  2. Get the Spoke Twilio Runtime functions here. These functions deploy into your Twilio account and give you quickstart access to the Spoke Directory API from Twilio Studio.

Before getting started, we recommend you read the Core Concepts section above to familiarise yourself with the Spoke Directory structure and how Twilio calls integrate with Spoke.

To follow along with this guide, you'll need a free Spoke developer account, deployed into your Twilio account, (get one at https://account.spokephone.com/twilio) and you should have set your Spoke account up with 1 or 2 users.


How To: Basic Studio Flow Using getExtension Function and twimlRedirectUrl

In this How To, we're going to show you how to quickly get a Twilio Studio flow connecting to Spoke using the Directory API and Twilio Runtime Functions.

Studio Flow with Get Extension and Redirect

The above Studio flow leverages the getExtension function to check availability of a Spoke directory entry, and if it is available send the call over to that extension.

1. Setup

To get started, you'll need to deploy the Spoke Twilio Runtime Functions into your account, then create a Studio Flow attached to a Twilio phone number, and add a Gather widget.

2. Add Run Function widget

To access one of the functions you just deployed from a Studio flow, drop a Run Function widget into your flow and connect it to the User Pressed Keys output out of your Gather widget. From here, select the SERVICE, ENVIRONMENT, and FUNCTION you want to run:

Get Extension Widget Config

You will need to add one parameter to the function, called extension, and set the value to {{widgets.welcome_message.Digits}}.

The getExtension function returns the following fields by default.

  1. displayName - The display label of the directory entry
  2. type - The type (userWithAvailability, teamWithAvailability etc) of the directory entry
  3. status - The current (real time) availability of the directory entry
  4. availabilitySummary - Human readable availability summary
  5. twimlRedirectUrl - Redirect the call to this url to connect the caller to the directory entry

You can change the function to return any directory entry fields - these are documented in the GET /directory section of the developer reference.

3. Add Split Widget

The split widget allows you to branch your flow based on a matching condition. Drop a Split widget into your flow and connect it to the Success output of the Run Function widget.

Get Extension Widget Config

In this case we are branching based on the status field - and will only send the call to the directory entry associated with the extension if the entry is available. You can access the response body fields from the run function widget using the following path: {{widgets.[run_function_widget_name].parsed.[field_name]}}.

In this case, we want to check the availability status of the extension, so we check that the widgets.get_extension.parsed.status field is equal to available

4. Add Redirect Widget

The final step is to add the redirect widget which will send the incoming call across to the Spoke extension. Drop a TwiML Redirect widget into your flow and connect it to the If value equal to available output of the Split widget.

TwiML Redirect Widget Config

Configuring this widget is simple - you just need to set the URL field to {{widgets.get_extension.parsed.twimlRedirectUrl}}

5. Publish and test your flow

That's it! Now all you need to do is publish your flow, and test that it works.

To test, dial the incoming number attached to your Studio flow, and when you hear the gather prompt, enter the extension of one of your Spoke users. If you've configured everything correctly, the call should connect through to the user's softphone on Spoke.

Review

This How To has introduced you to creating a basic Studio flow connected to a Spoke softphone, using the Spoke Directory API and Runtime functions. This only scratches the surface of what you can build.

Here are some other ideas to explore:

  • Return the caller back to the initial gather menu if the extension is not found
  • Add a second gather widget to the No condition matches output of the Split widget and build a new flow around the extension being unavailable - maybe send the caller to a Flex queue.
  • Use the optional returnTo and returnToId parameters to return the call to your flow if the call goes unanswered in Spoke.

Microsoft Power Automate to Dynamic 365

Overview

The Power Automate package is provided as an example set of templates to get you started with the most common integration scenarios from Spoke to Dynamics 365. We expect anyone using the provided templates to accept and own the operation and management of these example Microsoft Power Automate flows and ensure it is fit for purpose in the environment it is installed.

Power Automate is a service that helps you create automated workflows between your favorite apps and services, to synchronize files, get notifications, collect and update data, and more.

Power Automate is an ideal solution for customers using Microsoft, to integrate new and existing workflows to Spoke Phone, and take advantage of owning the integration and business workflows end to end.

Spoke has created a set of example template flows to get a customer up and running with the most common scenarios using MS Power Automate to integrate Spoke to Dynamics 365.

Read the DISCLAIMER before downloading the samples

Download the User Guide

Download the Microsoft Power Automate to Dynamics 365 samples

Download the postman collection of sample Spoke webhook events

Webhook Events

Overview

Spoke supports webhooks as a mechanism for notifying your systems when an event occurs. Webhooks are useful for listening to asynchronous events occurring on the Spoke platform, such as changes to a call's state over time; a change to the contact associated with a call; or a call recording becoming available.

To get started, you will need to configure a webhook in the Spoke account portal. Alternatively, you can use the Webhook API to configure a webhook. During configuration you will be given the option to specify event types you wish to receive notifications for. You will also be required to provide a valid, publicly routable HTTPS URL that accepts POST requests with the application/json content type.

Every Spoke event sent to your webhook is wrapped in the following standard wrapper that provides important information about the event, such as its type, a timestamp of when it was created, and the event data itself.

Securing Your Webhooks

Once your application is configured to receive events, it will listen for any event sent to the endpoint. For security reasons, we strongly recommend that you ensure requests to your endpoint come from Spoke. The easiest method to validate that a request was sent via Spoke is to verify the signature, and timestamp sent in every request against the secret that was provided to you when you created your webhook.

Verifying the signature

A request is considered valid based on the following conditions:

  • The x-spoke-timestamp header is a valid UNIX timestamp, and represents a time sent within the last 5 minutes (using millisecond precision). This header allows the consumer to validate when a request was sent, to avoid replay attacks.
  • The x-spoke-signature header is formatted as sha256=<HMAC algorithm cipher text>, and it contains the correct hash based on the hexadecimal representation of the SHA256 HMAC algorithm with the signing secret applied to <x-spoke-timestamp header value>.<request body>. The calculated hash includes the timestamp to ensure that an attacker cannot modify the timestamp without also invalidating the message signature.

A request can be validated via the following:

const isValidSpokeRequest = (requestBody: string, signingSecret: string, spokeTimestamp: number, spokeSignature: string): boolean => {

  // Determine if timestamp is valid
  const isValidTimestamp = (Date.now() - spokeTimestamp) <= 300000; // 5 x 60 x 1000
  if (!isValidTimestamp) {
    return false;
  }

  // Determine if the signature is valid
  const [algorithm, cipher] = spokeSignature.split("=");
  const body = `${spokeTimestamp}.${requestBody}`

  const h = crypto.createHmac(algorithm, signingSecret);
  h.update(body);
  return h.digest("hex") === cipher;
}

Delivery Attempts, Retries and Event Ordering

Delivery Attempts

Spoke will attempt to deliver events to your webhooks 10 times, over the course of 24 hours with an exponential back off. For an event to be considered successfully delivered, your endpoint will need to respond with a valid 2XX HTTP status code within 5 seconds of the HTTP request being received. In the Developers section of the Account Portal, you can view all attempts to deliver an event to your endpoint.

Retries

Spoke will retry delivering a webhook event if the request fails and your endpoint responds with any of the following status codes:

  • Server-side errors: 5xx
  • Throttling errors: 429
  • Request timeout errors: 408

Failed delivery attempts that respond with any other status codes will not be retried. For example, responses with a 400 status code (Bad Request) will not be retried, as it signals that repeating the same request will fail with the same error.

Automatic Disabling of Webhooks

In order to manage system capacity across the platform, Spoke will automatically disable a webhook once more than consecutive 1000 events have failed to deliver. The Spoke Administrator who created the webhook will be notified via email that the webhook has been disabled.

Order of Events

Spoke does not guarantee delivery of events in the order in which they are generated. Your endpoint should not expect delivery of events in order, and should handle these accordingly.

Example Timelines of Events

Below are some examples of when the above events might occur during the lifetime of some calls.

Note: These are example timelines. While most of the events will fire in a similar order to the ones given below, this is not guaranteed. See Order of Events for more details on how event ordering might affect your webhook.

Example Timelines of Call and Availability Events


Example 1 - Basic Call Timeline with User Answered Call

User Actions

Events Fired

Customer Alice starts a call to Spoke User Bob.

Bob answers the call

After talking for a while, Alice is satisfied with Bob's response and hangs up the call.

Bob also hangs up the call

The call has completed on the Spoke platform


Example 2 - Unanswered Call to Team

User Actions

Events Fired

Customer Alice starts a call to the Customer Support team

No one is available to answer the call, and the call goes to voicemail

After talking leaving a message, Alice hangs up the call.

The call has completed on the Spoke platform

The voicemail recording has finished processing, with the voicemail transcript sent to members of the Customer Support team


Example 3 - Contact Assignment and Recording Transcript

User Actions

Events Fired

Customer Alice starts a call to Bob. Alice has a new number that isn't in Bob's CRM so she shows up as an unknown caller to Bob. Bob answers the call

Bob determines that the Unknown caller is actually Customer Alice

Bob decides that this call is about Alice's money, and decides to highlight the current part of the call as "Money"

Alice hangs up the call, Bob hangs up the call, and the call ends.

Call recording successfully completes processing

Call recording is transcribed successfully

Example Timelines of Conversation Events


Example 1

User Actions

Events Fired

User Alice wants to talk to Bob over SMS

Alice sends an SMS to Bob through the Spoke Phone app

Bob receives the SMS from Alice and replies

Alice finishes messaging with Bob. The conversation automatically goes into an inactive state after 30 minutes

After a year of inactivity, the conversation gets closed automatically


Example 2

User Actions

Events Fired

Customer Bob wants to talk to user Alice over SMS

Bob sends an SMS to Alice

Alice receives the SMS from Bob through the Spoke Phone app and replies

Alice finishes messaging with Bob, neither party sends an SMS for 30 minutes. The conversation goes into an inactive state

Bob starts messaging Alice again in the conversation. The timer for both inactive state and the closed state gets reset

Bob finishes messaging with Alice, neither party sends an SMS for 30 minutes. The conversation goes into an inactive state

Alice manually closes the conversation

Changelog

2026-06-04 - Added support for analyzing content from aggregated agent scorecards

  • Added a new variant of POST /contentAnalysis request payload to support analyzing aggregated agent scorecards

2026-05-19 - Added licenses field to User object

2026-05-14 - Added new Conversation Messages API and deprecated legacy message APIs

2026-05-11 - Added support for getting a user by email

  • Added new optional query parameter email to GET /users endpoint

2026-04-30 - Added support for controlling user notifications in Conversations APIs

2026-03-11 - Redirect API now accepts any valid HTTPS URL

  • The Redirect API now accepts any valid HTTPS URL as the returnToId, when returnTo is set to postEndpoint

2026-02-20 - Added support for Enlighten integration with Insights Data Action

2026-01-07 - Added new author, participants and channel attributes to Conversation webhook events

2025-12-18 - Added a new Content Analysis by Call ID endpoint

2025-12-15 - Added a new Content Analysis endpoint

2025-12-01 - Added support for usage information to Content Analysis artifacts

2025-09-01 - New conversation contact assigned webhook event

2025-07-29 - Added support for setting conversation name in Messages API

  • Added support for setting the conversation's name via POST /messages
  • Added location to User in Call and Conversation types
  • Added media to Message type in conversation webhook events
    • The media.vendorResourceUrl is populated for BYOT accounts

2025-07-21 - New contact shared webhook event

2025-07-17 - Added support for deleting a content analysis

2025-07-07 - Added support for recording's transcription model via content analysis APIs

  • Added optional transcriptionModel attribute to recordings of content in POST /contentAnalysis request payload

2025-06-30 - Added support for custom analyzer via content analysis APIs

  • Added support for custom analyzer attribute when submitting a content analysis request via POST /contentAnalysis endpoint
  • Added analyzer attribute to ContentAnalysis type

2025-06-17 - New content analysis APIs and webhook event

2025-05-06 - Added support for creating, reading, updating and deleting personal phonebooks

  • Added documentation for creating or updating a personal phonebook
  • Updated description for existing /phonebooks/{id} and /phonebooks/{id}/contacts/* endpoints
    • Added support for using a user's email address as the phonebook id parameter to refer to the user's personal phonebook

2025-04-14 - Added support for calls with multiple transcripts

  • Added support for call.transcription_completed event
  • Updated the documentation for text attribute of Transcript type
    • The transcript text may include LEAVE and JOIN speaker events for call recordings
  • Added vendorCallIds attribute to dials attribute of parties in the Call type

2025-02-12 - Added support for user's manager and sending a team message on behalf of a user

2025-01-13 - Include passthrough parameters in Call Insights data action requests

  • Added passthrough parameters as query string parameters in Call Insights data action requests

2024-12-16 - Added support for call recording's transcript

  • Added support for call.transcript.created event
  • Added new transcript attribute to call Recording type

2024-12-09 - New transcript APIs and webhook event

2024-12-03 - Added support for passthrough parameters via Conversation data actions and Conversation APIs

  • Added support for passthrough parameters via the Inbound Conversations data action
  • Added support for passthrough parameters via the Send a new SMS message and Send a new Team SMS message APIs
  • Added support for passthrough parameters in conversation webhook events

2024-11-25 - Added support for passthrough parameters via Outbound Call and Team Call data actions and Redirect API

  • Added support for passthrough parameters via the Outbound Call and Team Call data actions
  • Added support for passthrough parameters via the Redirect API

2024-10-22 - Add support for application deep linking

  • Added new call, dial and message deep link routes for the Spoke Phone app
    • spoke://call/{callId} - Navigates to the details of the specified call
    • spoke://call/{callId}/insight - Navigates to the insight for the specified call
    • spoke://dial?contactNumber={contactNumber}&callerId={callerId} - Dials a contact number using a specified caller ID
    • spoke://message/sms?contactAddress={contactAddress}&companyAddress={companyAddress}&body={body} - Starts or continues an SMS conversation using the given companyAddress as the sender ID and prefills the message input with the provided body
    • spoke://message/whatsapp?contactAddress={contactAddress}&companyAddress={companyAddress}&templateName={templateName} - Starts or continues a WhatsApp conversation using the given companyAddress as the sender ID, prefilled with a message generated from the content template matching templateName

2024-10-14 - Add support for getting and deleting a specific call recording

2024-09-09 - New mimeType and channels attributes for call recordings

  • Added new mimeType and channels attributes to call Recording type
  • Added new organisationId attribute webhook event data
  • Added new spoke.precall request origin for Call Insights Data Action requests from the Spoke Phone app's incoming calls

2024-08-26 - Add support for setting call priority in Team Call Data Action

  • Added new optional parameter priority to Team Call Data Action Response Payload
  • Added optional timezone attribute to parties attribute of Call type
    • The attribute will be included only if the party is of type user

2024-07-25 - New Insights Data Action response payload and request origin

  • Introduced new Insights Data Action response payload to support context
    • The old response payload is now deprecated. To migrate to the new payload, return the existing payload as cards in the new payload.
  • Added new spoke.callhistory request origin for Call Insights Data Action requests from the Spoke Phone app's call history
  • Updated contactEmail and contactId for Call Insights Data Action request parameters for internal calls to a Spoke user

2024-05-14 - Fixed incorrect example

  • Fixed incorrect example given for the close timer field. After 30 days should be P30D not PT30D.

2024-05-07 - Add support for setting close timer in Messages API and Inbound Conversations Data Action

2024-04-19 - Add support for setting close timer in Team Messages API

  • Added new optional parameter closeTimer to /teamMessages endpoint

2024-02-08 - New Webhook APIs

  • Added new APIs to manage webhooks
    • GET /webhooks endpoint for listing existing webhooks with pagination
    • POST /webhooks endpoint for creating a new webhook
    • GET /webhooks/{id} endpoint for getting an existing webhook
    • PUT /webhooks/{id} endpoint for updating an existing webhook
    • DELETE /webhooks/{id} endpoint for deleting an existing webhook
  • Added links to example webhook event payloads under the Types of Events section

2024-01-22 - New desktopEnrolledReleaseChannel attributes for user

  • Added new desktopEnrolledReleaseChannel attribute to UserWithAvailability type

2023-10-09 - Add WhatsApp Support for Inbound Conversations Data Action

  • Added new whatsApp channel to Inbound Conversations Data Action request payload
    • companyAddress and contactAddress are updated to support the new whatsApp channel

2023-10-03 - New fields for Conversation and Message

  • Added new vendor, vendorConversationId, initiatedBy, companyNumberOwner and name fields to Conversation type
    • initiatedBy and companyNumberOwner fields will only be populated for conversations created after 2 October 2023
  • Added new vendorMessageId and isApiCreated fields to Message Type

2023-09-25 - Add support for setting conversation claim rule with Inbound Conversation Data Action

  • Added new claimRule to Inbound Conversations Data Action response payload

2023-09-20 - New Team Messages API

  • Added new POST /teamMessages API to send messages on behalf of team using team assigned DDI

2023-07-06 - New loginStatus and isDirectorySynced attributes for user

  • Added new loginStatus and isDirectorySynced attributes to UserWithAvailability type

2023-06-26 - New Inbound Conversations Data Action

  • Added documentation for the Inbound Conversations Data Action functionality
  • Changed Call Group to Team inline with changes to Spoke admin and application user interfaces

2023-04-11 - Fixed unanswered calls not returned from Redirect API on missed cold transfers

  • Fixed unanswered cold transfers not being returned when returnTo and returnToId parameters are provided

2023-03-13 - Override call group display name via Call Group Data Action

  • Added support for override call group display name via Call Group Data Action
  • Added optional overriddenDisplayName attribute to assignedCallGroup and directoryTarget attributes of Call type
    • The attribute will be included only if the team's the display name is overridden via Call Group Data Action

2023-03-02 - Updated Outbound Call Data Action for calls made by SIP devices

  • Added optional device parameters deviceId, deviceAddress and deviceExtension to Outbound Call Data Action request parameters
    • The device parameters will only be included if call is placed by a standalone SIP device
  • Added support for blocking outbound calls placed by standalone SIP devices via Outbound Call Data Action
    • This overrides the flag set against the SIP device "Outbound calls allowed"

2023-02-21 - New isHidden status for team

  • Added new optional query parameter includeHiddenCallGroups to /directory endpoint
    • If true, return all directory entries, including hidden call groups.
    • By default, this flag is false and hidden call groups are excluded from the response
  • Added new isHidden attribute to TeamWithAvailability type

2023-01-23 - New Assigned Call Group attribute on Call and Call Group Data Action Request

  • Added new assignedCallGroup attribute to Call type
    • This attribute is only populated for inbound calls, and identifies the last team directory entry a call was for.
    • Use this attribute to identify calls to a given team.
    • The attribute contains a trimmed version of the directory entry, containing id, displayName, type, and extension
  • IMPORTANT CHANGE
    • The directoryTarget field on the CallGroupDataActionRequestPayload object has been deprecated in favour of assignedCallGroup.
    • The field will be removed completely in a future release. Please migrate to the new field.

2023-01-11 - New Call Group Data Action and Call Attributes for Analytics & Reporting

  • Added documentation for the Call Group Data Action functionality
  • Added new extension, email and dials attributes to each party in parties attribute of Call type
    • The dials contains a list of dial attempts to the call party with a reason for each dial
  • Added new joinedAt and leftAt attributes to each connection in connections attribute of Call type

2022-10-25 - New Insights Data Action

  • Added documentation for the new Data Action functionality
  • Moved original Data Actions menu into its own section

2022-09-28 - Override call timeouts

  • Added support for overriding call timeouts using twimlRedirectUrl

2022-06-20 - New blocked call status and Data Action documentation

  • Added new blocked call status and blocked outcome to Call type
    • This status is currently for outbound calls only.
    • The reason attribute on the blocked outcome identifies the reason the call was blocked. E.g. the reason is set to dataAction when the outbound call was blocked by Outbound Call Data Action.
  • Added documentation for the new Data Action functionality

2022-06-02 - New Outcome and Tariff attributes on Call

  • Added new outcome attribute to Call type
    • This attribute is populated for all calls, and identifies the final outcome of a call
    • For inbound calls, the attribute has an optional reason field, which identifies the reason a call was abandoned or missed.
  • Added new tariff attribute to Call type, and new call.tariffed event
    • This attribute is populated after the call has been tariffed.
    • Once tariffed, a call.tariffed event is emitted
    • The tariff is calculated for each connected call party on the call, based on the connection's route, duration and per-minute price
    • This field will only be populated for Spoke accounts that have the "Include Tariff in Call API" add-on enabled in their account. Contact your Spoke Account Manager to have this add-on enabled.

2022-05-04 - New suspended status for user

  • Added new optional query parameter includeSuspendedUsers to /directory endpoint
    • If true, return all directory entries, including suspended users.
    • By default, this flag is false and suspended users are excluded from the response
  • UserWithAvailability.status is now one of invited, active or suspended

2022-04-11 - New Call Attributes for Analytics & Reporting

  • Added new directoryTarget attribute to Call type
    • This attribute is only populated for inbound calls, and identifies the initial directory entry a call was for.
    • Use this attribute to identify calls to a given team, user or other directory entry.
    • Webhook call events will include this attribute after the call has been processed by the Spoke telephony service. This means the earliest events in the call lifecycle to include this attribute will be call.answered / call.not_answered
    • The attribute contains a trimmed version of the directory entry, containing id, displayName, type, extension and email
  • Added new waitTime and waitTimeText attributes to Call type
    • For an answered call, the waitTime is calculated as the millisecond difference between startedAt and answeredAt fields.
    • For an unanswered call, the waitTime is equivalent to the value of duration.
    • The waitTimeText field is a human readable version of the waitTime field, similar to durationText
  • Added GET /directory/{entryId} endpoint.
    • Retrieves specified entry from the directory

2022-03-17 - New GET endpoint on /phonebooks

2022-02-02

  • Added new excludeEmpty query parameter to the GET /phonebooks endpoint.
    • Set this to true to exclude phonebooks that do not contain any contacts.
  • Added support for optional sortOrder and contactNumber query parameters to GET /calls endpoint.

2021-12-15 - New Call Events and Send to Voicemail Support

  • Added support for call.started, call.answered, call.not_answered, call.hungup event
  • Added support for sending a call directly to voicemail using twimlRedirectUrl

2021-11-24 - New vendor and vendorCallId fields

  • Added new vendor and vendorCallId fields to UserWithAvailability and Call types
    • These fields include the vendor who carried the call and the vendor's call ID
    • In the case of Twilio, vendorCallId contains the callSid of the parent call
    • For the UserWithAvailability type, these fields will be populated (along with callId) when the user's availability status is busy and notAvailableRule is busyOnACall

2021-11-23 - User & Team Availability Webhook Events

  • Added support for user.availability.updated event
  • Added support for team.availability.updated event

2021-11-03

  • Added new sipAddress field to Device object for /directory endpoint

2021-10-20

  • Added new fields to trunkUsers, trunkDevices and trunkQueues which are returned by /trunks and /directory
    • displayName - Display name of the directory entry
    • type - Directory type
    • twimlRedirectUrl - Redirecting an inbound Twilio call to this target url will transfer the call to this entry

2021-10-11 - Added trunk entities to /directory endpoint

  • Added trunkUsers, trunkDevices and trunkQueues to the list of entries returned by /directory endpoint

2021-10-05 - Updated mobile field of User and UserWithAvailability objects

  • Updated mobile field of User and UserWithAvailability objects
    • This field will now be omitted if the organisation is configured to exclude employee phone numbers from Spoke APIs

2021-09-30 - Added twimlRedirectUrl field to objects for /directory and /users endpoint

  • Added new twimlRedirectUrl field to TeamWithAvailability, UserWithAvailability and Device object for

2021-09-27 - New /directory endpoint

  • Added /directory endpoint. Lists or finds directory entries. Supports optional search parameters.
    • Lists all directory entries in the organisation. This list is equivalent to the list in Spoke application "Internal" directory view. Currently the list includes users, teams and devices. Future revisions will include trunkUsers, trunkDevices and trunkQueues
    • Optional query parameters to search the directory by extension, ivrKey or phoneNumber
  • Added new fields to /users endpoint:
    • phoneNumbers - List of phone numbers of the user
    • displayName - Display name of the user
    • type - Directory type
    • availability.availabilitySummary - Describes the current availability of the user

2021-05-31 - Send SMS Messages

  • Added support for sending SMS Messages on behalf of a Spoke user:
    • The Spoke user must have an SMS enabled DDI
    • The from parameter allows you to specify either the user's SMS enabled DDI or their email address
    • The message will be added to a conversation (if one exists with the customer) or a new conversation will be automatically created
    • The message will appear in the user's conversations view in the Spoke application
    • The conversation.message.created event will be fired when the message is created.

2021-03-22 - Conversation Webhook Events

  • Added support for Conversation events
    • conversation.inactive
    • conversation.closed
    • conversation.message.created

2020-09-08 - New Webhooks support

  • You can now create webhooks in your Spoke organisation, allowing you to listen to events as they occur within the Spoke platform. Webhooks are particularly useful for listening to call events, updating, and reacting to these in your system in near real-time.

2020-08-05 - Added ability to assign Trunk Users & Phone Numbers to Spoke Users

  • You can now assign trunk users and phone numbers to Spoke users when creating or updating trunk users via the /trunks/{trunkId}/trunkUsers/* endpoint.

2020-07-24 - New OAuth 2.0 content type support

  • The content type for generating OAuth 2.0 access tokens using the client_credentials grant type now supports application/x-www-form-urlencoded, this is better aligned with RFC6749 which outlines how OAuth 2.0 tokens should be generated. The previous application/json format is now deprecated.

2020-07-17 - Added missing fields for Phonebook, Contact, Trunk Device, Trunk Queue and Trunk User to documentation

  • Requests for PUT /phonebooks endpoints can include additional nullable fields in the body: countryIso
  • Requests for PUT /phonebooks and /contacts endpoints with contact can include additional nullable fields in the body: firstName, lastName and jobTitle
  • Requests for PUT/POST /trunks/{trunkId}/trunkDevices/* endpoints can include additional nullable fields in the body: description, location, model and product
  • Requests for PUT/POST /trunks/{trunkId}/trunkQueues/* endpoints can include additional nullable fields in the body: description
  • Requests for PUT/POST /trunks/{trunkId}/trunkUsers/* endpoints can include additional nullable fields in the body: department, description, jobTitle, location and manager

2020-07-07 - Unified Directory: Support for managing SIP trunk directory entries

  • You can now manage SIP devices, users and queues associated with your SIP Trunks. Any devices, users or queues created via this API will appear in the Internal company directory in the Spoke application. These endpoints are directly dialable from Spoke, and can optionally be associated with a Spoke User, providing full integration between Spoke and your legacy PBX.

    By integrating with the Unified Directory you can automate the process of synchronising the entries in your legacy phone system with Spoke. Platform specific integrations (e.g. Cisco UCM) will be available from Spoke Integration Partners, or you can use the following API endpoints directly:

    • Added /trunks endpoint. Lists all SIP Trunks in the organisation. Trunks must be created via the Spoke account portal and will required additional network configuration.
    • Added /trunks/{trunkId}/trunkDevices/* endpoints, with ability to list, add, update and delete Trunk Devices. Trunk devices usually represent real phones in communal areas, such as a conference phone or lunch room phone.
    • Added /trunks/{trunkId}/trunkUsers/* endpoints, with ability to list, add, update and delete Trunk Users. Trunk users usually represent the individual users in your phone system who may have soft phones or desk phones.
    • Added /trunks/{trunkId}/trunkQueues/* endpoints, with ability to list, add, update and delete Trunk Queues. Trunk queues usually represent call queues or hunt groups in your phone system.

2019-11-26 - New /users endpoint

  • Added /users endpoint. Lists all Spoke users in the organisation. This list is equivalent to the list of Users in Spoke application "Internal" directory view.
    • The list includes each user's availability
    • The availability state for a given user is close to real time (lag 1-5 seconds).
    • Details about Availability statuses and reason fields are included in the API response.
  • Current limitations
    • This endpoint currently supports GET /users and GET /users/{id}. Future versions may support PUT methods to enable external control of availability
    • The following properties will be exposed in a future version of this API : extensions, phone_numbers, teams

2019-11-12 - Added extra fields to Call object to simplify CRM integration

  • Responses from the /calls endpoints now include additional fields:
    • isInternal: If this field is true then the call was between internal Spoke Users only.
    • contactNumber: This is the phone number of the external party to the call, irrespective of the callDirection value. This field can be used to identify a matching customer record in an external system if required.
    • companyNumber: This is the phone number of the company used for the call, and will either be the number the external party called for inbound calls, or the caller id for outbound calls.
  • Added new CallSummary type which provides a set of narrative summary fields about the call, suitable for populating a call note record in an external CRM system. This object includes the following fields, and is exposed as the summary field under the Call object:
    • header: A Short header summarising the call content. This is dependent on call direction, and what is known about the caller and callee.
    • contactNumberDescription: A short description of the contactNumber (e.g "Called in from +64218880000").
    • companyNumberDescription: A short description of the companyNumber (e.g. "Call in to +6498880000").
    • outcome: A short description of the outcome of the call. This includes who answered the call, whether it was transferred and the duration of the call. (e.g. "Answered by Joseph Brealey. Transferred to Joanna Brown. Spoke for 3 minutes")
  • IMPORTANT CHANGE
    • The initiator and recipient fields on the Call object have been deprecated in favour of contactNumber and companyNumber.
    • This change should simplify integrations with external CRM systems as contactNumber will always represent the phone number of the external call party.
    • These fields will be removed completely in a future release. Please migrate to the new fields.

2019-10-08 - Added Notes to Call object

  • Responses from the /calls endpoints now include a notes type.
    • Notes can be recorded at any time after the call ends
    • A call can have multiple sets of notes recorded against it
  • Added a section in the API guide relating to date/time and timestamp fields.

2019-09-30 - New /calls endpoint

  • Added /calls endpoint:
    • Provides the ability to retrieve calls that have been received or made by the organisation
    • Calls can be queried by time range (before, since parameters) and/or last modified timestamp (modified parameter).
    • Only returns calls that have ended (where all parties have hung up), in-flight calls are not included in the response at this time
  • IMPORTANT CHANGE
    • Deprecated singular endpoints (/phonebook & /phonebook/{id}/contact) in favour of plural endpoints.
    • All future collection endpoints will be plural in form (/phonebooks, /phonebooks/{id}, /calls)
    • The current singular endpoints continue to function but will be removed in a future release. Please migrate to the new endpoints.
    • The deprecated endpoints are marked in the Deprecated section of this document
  • BREAKING CHANGE
    • Replaced nextContact query string parameter with next parameter as the standard parameter for response result set paging across all endpoints

2019-07-31 - Initial Release

  • Provides the ability to synchronise company contacts (customers, suppliers) into Spoke's external phonebook. We use this phonebook to identify incoming callers and to allow Spoke users to search and place calls. This has been modelled as follows:
    • A Phonebook is a collection of Contact(s), where a Contact is a record containing a name/phone number(s)/email addresses.
    • You can batch upload to a Phonebook (which replaces the entire contents) or upsert a single Contact into a Phonebook.
    • We support multiple external phonebooks, this allows our customers some flexibility, primarily if they are using our CSV upload functionality and have data.
  • Supports authentication via OAuth 2.0 Client Credentials Flow

Data Action Concepts

Overview

Spoke supports data actions as a mechanism for customizing organization specific work flows. They are useful for configuring additional call rules, such as blocking outbound calls to specific phone numbers, or overriding the caller ID shown on outbound calls.

To get started, you will need to configure a data action in the Spoke Account Portal. You will need to provide a valid, publicly routable HTTPS URL that accepts GET or POST requests with the application/json content type.

Spoke will invoke this URL with the corresponding payload when performing a data action.

For security reasons, we strongly recommend that you ensure requests to your endpoint come from Spoke. The easiest method to validate that a request was sent via Spoke is to verify the signature.

Securing Data Actions

Verifying the signature

A request is considered valid based on the following conditions:

  • The x-spoke-timestamp header is a valid UNIX timestamp, and represents a time sent within the last 5 minutes (using millisecond precision). This header allows the consumer to validate when a request was sent, to avoid replay attacks.
  • The x-spoke-signature header is formatted as sha256=<HMAC algorithm cipher text>, and it contains the correct hash based on the hexadecimal representation of the SHA256 HMAC algorithm with the signing secret applied to <x-spoke-timestamp header value>.<request data>.
    • The calculated hash includes the timestamp to ensure that an attacker cannot modify the timestamp without also invalidating the message signature.
    • The source of <request data> depends on the HTTP method used:
      • For GET requests, it is the request URL including the query parameters
      • For POST requests, it is the raw request body

A request can be validated via the following:

const isValidSpokeRequest = (requestData: string, signingSecret: string, spokeTimestamp: number, spokeSignature: string): boolean => {

  // Determine if timestamp is valid
  const isValidTimestamp = (Date.now() - spokeTimestamp) <= 300000; // 5 x 60 x 1000
  if (!isValidTimestamp) {
    return false;
  }

  // Determine if the signature is valid
  const [algorithm, cipher] = spokeSignature.split("=");
  const body = `${spokeTimestamp}.${requestData}`

  const h = crypto.createHmac(algorithm, signingSecret);
  h.update(body);
  return h.digest("hex") === cipher;
}

Delivery Attempts

Spoke will attempt to deliver Data Action events to your server once. To successfully invoke the data action, your endpoint must respond with a valid response payload within 2 seconds of the HTTP request being received.

Failure to return a response within the timeout period will not be treated as an error condition. If your endpoint does not return a response within the timeout period, the call will proceed as planned, using the original configuration for the call.

Inbound Conversations

Overview

The Inbound Conversations Data Action allows you to programmatically handle the creation of a new conversation, including:

  • Sending auto response messages
  • Assigning one or more Spoke users to manage the conversation
  • Updating the conversation name

A Conversation in Spoke is a thread of messages between a group of two or more participants. Participants can be on external channels, such as SMS or WhatsApp, or internal channels, such as user of Spoke application. External participants connect to a conversation through an SMS or WhatsApp enabled number. Internal participants connect using the Spoke application.

This Data Action is invoked when a new conversation is created from an incoming message from a participant on an external channel. A new conversation is created when a message is received from an external contact that is not already involved in an active conversation with the given company number.

Implementing this data action allows you to define which Spoke Users (if any) are responsible for managing the conversation, as well as optionally sending an auto response to the external participant. Once a conversation is created, this Data Action will not be invoked again for the contact number/company address pair, until the active conversation is closed.

Note: Spoke uses the Twilio Conversations API to support conversational messaging in the Spoke application. The Data Action(s) documented here extend the functionality of the Conversations API to enable routing, shared inbox functionality and auto response management. You can read more about Twilio's conversations API here.

Below are the settings that can be controlled via Inbound Conversations Data Action.

Auto Response

Allows an auto response message to be sent to the customer. Use this to automatically respond to the customer without waiting for a user to respond.

On top of normal auto response scenarios such as Thanks for your message, we'll be with you shortly, the auto response feature can be used for scenarios where you do not want your users handling a conversation, for example:

  • Profanity in the incoming message
  • Time of day
  • A closed or unmonitored service channel

Routing Action

Defines whether a conversation is to be routed to Spoke users via assign or not routed via donotroute.

If a conversation is set to donotroute then no Spoke users will be assigned to the conversation. The conversation will be closed, and because no internal participants are assigned the customer will not receive any response, unless the auto response feature is also used.

Assign Users

Allows one or more Spoke users to be assigned to the conversation. This allows you to fine tune which users are added to a specific conversation. You can add more than one user, and all users can actively participate in the conversation.

Each user is identified by their email address in Spoke. Invalid emails are ignored.

Conversation Name

Allows a name to be assigned to a conversation. Use this to provide more context to your Spoke users about the conversation. The name will appear in the conversation list in the Spoke application, and will be used as the title for any push notifications that are sent to users' devices when new messages are added to the conversation.

Claim Rule

Allows a claim rule to be assigned to a conversation. Claiming a conversation requires a single team member to 'claim' ownership of the conversation. When a conversation is claimable, a 'Claim Conversation' button displays in the Spoke application. Once claimed, all other team members are removed from the conversation.

Close Timer

Allows a close timer to be set to a conversation. Use this to control how long the conversation will remain open before being automatically closed by the system. The timer is reset any time a conversation is updated, including adding new messages.

Specify the timer value in ISO8601 duration format.

Passthrough Parameters

Sets the passthrough parameters associated with the conversation.

The maximum size of passthrough parameters is 1000 bytes. If this limit is exceeded, then the passthrough parameters from the response will be discarded.

Request and Response

Spoke sends an HTTP POST request with the following parameters in the request body, and expects a response payload of the below shape within 2 seconds.

If the request returns a non-200 response or times out and the fallback URL is configured, Spoke will send another request to the fallback URL with the same payload.

If no response payload is returned, the conversation will proceed as planned, using the original configuration for the given company address. This means that:

  • Messages to an assigned SMS enabled DDI will be routed to the assigned users
  • Company numbers or addresses that are unassigned will not have any users added to the conversation, and the conversation will be automatically closed

Inbound Conversations Data Action Request Parameters

Any of
channel
required
string

The channel of the inbound conversation.

The value for this field will always be sms, signifying that the conversation was originated by an inbound SMS message from a single contact address to a company address

Value: "sms"
companyAddress
required
string

The company number that the conversation was routed to. This will be one of the numbers defined in the Spoke Phone Number settings page.

The value for this field will always be a phone number in +E164 format (e.g. +16508221060)

contactAddress
required
string

The address of the external party that originated the conversation.

The value for this field will always be a phone number in +E164 format (e.g. +16508221060)

contactDisplayName
string

The display name of the phonebook contact (if any) associated with the external party on the call.

contactId
string

The ID of the phonebook contact (if any) associated with the external party on the call.

conversationId
required
string

The Spoke ID of the conversation

required
object (MessageContent)

The content of the message

body
string

The content of the message, can be up to 1,600 characters long.

Array of objects (MessageContentMedia)

If the message contains media, contains details of the media object(s).

vendorConversationId
required
string

The vendor's identifier for the conversation

Example
{
  • "channel": "sms",
  • "companyAddress": "string",
  • "contactAddress": "string",
  • "contactDisplayName": "string",
  • "contactId": "string",
  • "conversationId": "string",
  • "messageContent": {
    • "body": "string",
    • "media": [
      • {
        • "fileSize": 0,
        • "mimeType": "string",
        • "tempUrl": "string"
        }
      ]
    },
  • "vendorConversationId": "string"
}

Inbound Conversations Data Action Response Payload

assignUsers
Array of strings

List of users to be added to the conversation. Required when routingAction is assign.

Each user is identified by their email address in Spoke. Invalid email addresses are ignored.

For numbers assigned to a team shared inbox, if there are no valid emails in the assignUsers payload, the users associated with the team will be assigned to the conversation.

A conversation can have up to 10 participants and users will be added to the conversation until this limit is reached.

object (AutoResponseContent)

Returning this parameter will create an auto response message that will be added to the conversation. All participants will see the response content.

author
required
string

The author of the auto response message. This will show as the participant name in the conversation.

body
required
string

The content of the auto response message. Can be up to 1,600 characters long.

claimRule
string
Enum: "claimable" "not_claimable" "required_before_reply"

Defines whether a conversation can be claimed by a Spoke user. Claiming allows a user to take exclusive ownership of a conversation. Once claimed, other Spoke participants will be removed from the conversation.

For numbers assigned to a team shared inbox, if no value is provided, then the setting for the team shared inbox will apply.

Possible values:

  • claimable: The conversation can be claimed at any time by any user assigned to the conversation

  • not_claimable: The conversation is not claimable

  • required_before_reply: A variant of claimable, this requires the conversation to be claimed before a reply can be sent to the external participant

closeTimer
string

Set this value to control how long the conversation will remain open before being automatically closed by the system. The timer is reset any time a conversation is updated, including adding new messages.

Specify the timer value in ISO8601 duration format. For example, to automatically close a conversation:

  • After 12 hours: PT12H
  • After 30 days: P30D
  • After 3 months: P3M

The following are the minimum and maximum values for the field:

  • Minimum Value: 600 seconds (PT600S)
  • Maximum Value: 180 days (P180D)
name
string

Name of the conversation. Can be up to 100 characters long.

object (ConversationPassthroughParametersResponse)

If specified, stores the passthrough parameters against the conversation.

Each passthrough parameter key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

The maximum size of passthrough parameters is 1000 bytes.

Example:

{
  "x-contactId": "HS12345",
  "x-orderId": "ORD12345"
}
object (ConversationPassthroughParametersResponse)

If specified, stores the passthrough parameters against the conversation.

Each passthrough parameter key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

The maximum size of passthrough parameters is 1000 bytes.

Example:

{
  "x-contactId": "HS12345",
  "x-orderId": "ORD12345"
}
routingAction
string
Enum: "assign" "donotroute"

How the conversation should be handled - assign or donotroute

assign: Assign the message to one or more Spoke users, if this value is set, then assignUsers is required

donotroute: Do not assign any users. The conversation will remain open however no additional participants will be added to the conversation. You can use this option to block an incoming message due to content, profanity etc.

{
  • "assignUsers": [
    • "string"
    ],
  • "autoResponseContent": {
    • "author": "string",
    • "body": "string"
    },
  • "claimRule": "claimable",
  • "closeTimer": "string",
  • "name": "string",
  • "passthroughParameters": { },
  • "routingAction": "assign"
}

Insights

Overview

The Custom Insights Application Data Action allows you to programmatically enrich and customize information about a customer while you are viewing their contact card or are on a call with them in the Spoke Phone app.

Before getting started, we recommend you read the Data Action Concepts section above to familiarise yourself with the Spoke Data Action mechanism and how Twilio calls integrate with Spoke.

Developer API Screenshot

When a user views a contact card or is on a call, Spoke sends an HTTP GET request to the URL you have configured for the Custom Insights Application Data Action and expects a response that contains the Insight cards that will be displayed when the user views that contact’s Insights.

Developer API Screenshot

Contact Insights

Spoke Phone app users can view Insights for other Spoke users from the internal directory or phonebook contacts from the external directory.

Developer API Screenshot

Spoke will include the following fields as query parameters when sending a contact Insights request to the configured URL for Custom Insights Application Data Action:

Any of
contactEmail
string or null

The phonebook contact's email address for which to request Insights data.

If the contact has multiple emails, this field will be the first email stored in the phonebook for that contact.

This field will be null if the contact has no email.

contactId
required
string

The identifier of a phonebook contact for which to request Insights data.

contactSource
required
string

The name of the phonebook that the contact being looked up belongs to (e.g. Zoho or My CSV-Upload Phonebook).

The contactSource field will match the phonebook name as listed in the Spoke Account Portal integrations page.

isInternal
required
boolean

Indicates whether the contact being looked up is an internal Spoke user.

This field will be false when looking up a phonebook contact.

requestOrigin
required
string

A concatenation of which Spoke app and where in the app the data is being requested.

Possible values:

  • spoke.contactlookup: Denotes Contact Insights being requested from the Spoke Phone app
Value: "spoke.contactlookup"
userEmail
required
string

Email of the user that is requesting Insights.

Example
{
  • "contactEmail": "string",
  • "contactId": "string",
  • "contactSource": "string",
  • "isInternal": false,
  • "requestOrigin": "spoke.contactlookup",
  • "userEmail": "string"
}

The request will be sent every time the user opens a contact card from the directory.

As can be seen in the request shape above, the request payloads are slightly different between internal contacts and external phonebook contacts.

Mainly, for internal contacts, the contactSource field will not be provided and the isInternal field will be true. Whereas for external phonebook contacts, the contactSource field will be included and the isInternal field will be false.

Call Insights

Spoke Phone app users can view Insights for calls from the call screen Insights tab.

Developer API Screenshot

Spoke will include the following fields as query parameters when sending a call Insights request to the configured URL:

callId
string or null

The Spoke identifier for the call.

This field will be null for an Insights data action from the Speedy app.

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (calls between Spoke users and/or devices).

contactEmail
string or null

The email address of the contact being called or the contact who originated the call

For calls to/from phonebook contacts, this field will contain the first email stored in the phonebook for the contact:

  • who originated the call for inbound calls
  • who is being called for outbound calls

For Spoke internal calls to a user, this field will contain the email of the Spoke user being called.

This field will be null for calls to/from phone numbers that do not match any phonebook contacts, or if the phonebook contact has no email.

contactId
string or null

The identifier of the contact being called or the contact who originated the call.

For calls to/from phonebook contacts, this field will contain the identifier of the contact:

  • who originated the call for inbound calls
  • who is being called for outbound calls

For Spoke internal calls to a user, this field will contain the identifier of the Spoke user being called.

This field will be null for calls to/from phone numbers that do not match any phonebook contacts.

contactNumber
string or null

The phone number of the external party that originated or terminated this call.

Possible values:

  • null: This field will be blank for Spoke internal calls (calls between Spoke users and/or devices).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
contactSource
string or null

The name of the phonebook that the contact being called or the contact who originated the call belongs to (e.g. Zoho or My CSV-Upload Phonebook).

The contactSource field will match the phonebook name as listed in the Spoke Account Portal integrations page.

This field will be null when isInternal is true.

direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
isInternal
required
boolean

Indicates whether the call is an internal (Spoke User to Spoke User) call. If this flag is true then there is no external party on the call, and the contactNumber, companyNumber and contactSource fields will be empty.

requestOrigin
required
string
Enum: "speedy.call" "spoke.call" "spoke.callhistory" "spoke.precall"

A concatenation of which Spoke app and where in the app the data is being requested.

Possible values:

  • spoke.precall: Denotes Call Insights being requested from the Spoke Phone app's incoming call screen
  • spoke.call: Denotes Call Insights being requested from the Spoke Phone app active call insights screen
  • spoke.callhistory: Denotes Call Insights being requested from the Spoke Phone app's call history
  • speedy.call: Denotes Call Insights being requested from the Speedy app
userEmail
required
string

Email of the user that is requesting Insights.

vendorCallId
required
string

The vendor's identifier for the call.

{
  • "callId": "string",
  • "companyNumber": "string",
  • "contactEmail": "string",
  • "contactId": "string",
  • "contactNumber": "string",
  • "contactSource": "string",
  • "direction": "inbound",
  • "isInternal": true,
  • "requestOrigin": "speedy.call",
  • "userEmail": "string",
  • "vendorCallId": "string"
}

If Spoke has identified that a call involves a contact, then the request will also include the associated contactId, contactEmail, and contactSource (contactSource only included for external phonebook contacts).

Passthrough Parameters

Any existing passthrough parameters stored against the call are included in the request. Passthrough parameters are flattened into key-value pairs, URL-encoded, and then appended to the query string.

Example:

Given a call with the following passthrough parameters:

{
    "x-contactId": "HS12345",
    "x-orderId": "OR12345"
  }

The constructed Call Insights data action request will be:

https://api.example.com/insights?direction=outbound&isInternal=false&requestOrigin=spoke.call&userEmail=alice@smith.com&vendorCallId=CA1234&x-contactId=HS12345&x-orderId=OR12345

Conversation Insights

Spoke app users can view primary party's Insights for conversations from the conversation screen pop up menu or the conversation settings screen.

Developer API Screenshot Developer API Screenshot
Developer API Screenshot Developer API Screenshot

Spoke app users can also view any selected party's Insights for conversations from the participant pop up menu of the conversation settings screen.

Developer API Screenshot Developer API Screenshot

Spoke will include the following fields as query parameters when sending a conversation Insights request to the configured URL:

companyNumber
string or null

The company number that originated or received this conversation. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal conversations (where isInternal is true).

contactEmail
string or null

The email address of the contact who originated or received the conversation

For Spoke internal conversations, this field will contain the email of the Spoke user. For conversations with phonebook contacts, this field will contain the first email stored in the phonebook for that contact.

This field will be null for conversations with phone numbers that do not match any phonebook contacts, or if the phonebook contact has no email.

contactId
string or null

The identifier of the contact who originated or received this conversation.

For Spoke internal conversations, this field will contain the Spoke user identifier. For conversations with phonebook contacts, this field will contain the identifier of that contact.

This field will be null for conversations with phone numbers that do not match any phonebook contacts.

contactNumber
string or null

The phone number of the external party that originated or received this conversation.

This field will be null for Spoke internal conversations (where isInternal is true).

contactSource
string or null

The name of the phonebook that the contact who originated or received the conversation belongs to (e.g. Zoho or My CSV-Upload Phonebook).

The contactSource field will match the phonebook name as listed in the Spoke Account Portal integrations page.

This field will be null when isInternal is true.

initiatedBy
required
string (ConversationInitiatorType)
Enum: "api" "contact" "user"

Identifies whether the conversation was initiated by a user, a contact or via the Spoke API.

Possible values:

  • user: A Spoke user initiated the conversation
  • contact: The external party initiated the conversation
  • api: The conversation was initiated by a call to the Spoke API
isInternal
required
boolean

Indicates whether the conversation is an internal (Spoke User to Spoke User) conversation. If this flag is true then there is no external party in the conversation, and the contactNumber, companyNumber and contactSource fields will be empty.

requestOrigin
required
string

A concatenation of which Spoke app and where in the app the data is being requested.

Possible values:

  • spoke.conversation: Denotes Conversation Insights being requested from the Spoke Phone app
Value: "spoke.conversation"
userEmail
required
string

Email of the user that is requesting Insights.

vendorConversationId
required
string

The vendor's identifier for the conversation.

{
  • "companyNumber": "string",
  • "contactEmail": "string",
  • "contactId": "string",
  • "contactNumber": "string",
  • "contactSource": "string",
  • "initiatedBy": "api",
  • "isInternal": true,
  • "requestOrigin": "spoke.conversation",
  • "userEmail": "string",
  • "vendorConversationId": "string"
}

Insights Response

Similar to other Data Actions, Spoke expects a response within 2 seconds. The response payload is expected to be an object containing Insight cards with optional context and preferences, as specified in the shape below.

Array of InsightCard (objects) or (any or null)

Insights Cards that will be displayed below the Insights Summary

No Insights Cards will be displayed if cards is null, missing or empty.

Any of
Array
InsightCardBanner (object) or (any or null)

Banner that will be displayed directly under the title.

No banner will be displayed if either:

  • banner is null or missing
  • banner.text is null or missing
body
string or null

String containing Markdown that will be displayed as the main body of the Insights Card. Only Basic Markdown Syntax is supported in the body field.

Note: Due to potential security concerns, HTML in Markdown is not supported.

No main body will be displayed if body is null or missing.

InsightCardButton (object) or (any or null)

Button serving as a link to provided URL that will be displayed at the bottom of the Insights Card.

No button will be displayed if:

  • button is null or missing
  • either button.url or button.text are null or missing
string or (any or null)

Initial expansion state of the Insights Card.

Possible values:

  • expanded
  • collapsed

If provided state is either expanded or collapsed, then the user can toggle the card's expansion state.

If state is null or not provided, the card will show as expanded and cannot be collapsed.

InsightCardThumbnail (object) or (any or null)

Thumbnail that will be shown next to the title.

No thumbnail will be displayed if:

  • thumbnail is null or missing
  • both thumbnail.icon_name and thumbnail.color are null or missing
title
required
string

Title of the Insights Card.

InsightContext (object) or (any or null)

Insights Summary that will be displayed above the Insights Cards

No Insights Summary will be displayed if context is null or missing.

Any of
body
required
string

String containing Markdown that will be displayed as the main body of the Insights Summary. Only Basic Markdown Syntax is supported in the body field. Maximum 500 characters are allowed. Extra characters will be truncated.

Note: Due to potential security concerns, HTML in Markdown is not supported.

footer
string or null

Plain text used to display content in footer banner of the Insights Summary. Maximum 100 characters are allowed. Extra characters will be truncated.

No footer banner will be displayed if footer is null or missing.

InsightContextMetric (object) or (any or null)

First metric box of the Insights Summary that will be displayed above the main body of the Insights Summary.

No metric box will be displayed if both metric1 and metric2 are null or missing.

InsightContextMetric (object) or (any or null)

Second metric box of the Insights Summary that will be displayed above the main body of the Insights Summary.

No metric box will be displayed if both metric1 and metric2 are null or missing.

InsightPreferences (object) or (any or null)

Preferences for the Insights response.

Any of
object (InsightCardsPreferences)

Preferences for Insights Cards.

object (InsightContextPreferences)

Preferences for the Insights Context.

{
  • "cards": [
    • {
      • "banner": {
        • "text": "string",
        • "type": "error"
        },
      • "body": "string",
      • "button": {
        • "text": "string",
        • "url": "string"
        },
      • "state": "collapsed",
      • "thumbnail": {
        • "color": "string",
        • "icon_name": "string"
        },
      • "title": "string"
      }
    ],
  • "context": {
    • "body": "string",
    • "footer": "string",
    • "metric1": {
      • "label": "string",
      • "textColor": "string",
      • "value": "string"
      },
    • "metric2": {
      • "label": "string",
      • "textColor": "string",
      • "value": "string"
      }
    },
  • "preferences": {
    • "cards": {
      • "enlighten": {
        • "display": "after"
        }
      },
    • "context": {
      • "preferredSource": "dataAction"
      }
    }
}

Combining with Enlighten Insights

If your organization has Enlighten Call Insights enabled and Data Action Insights configured in the Spoke Account Portal, you can use the preferences field in the Insights response to control how Enlighten Insights are displayed alongside your Data Action Insight cards.

The following table describes the behavior of the Spoke application when these settings are configured:

Enlighten Call Insights Enabled Data Action Insights Configured Behavior
Yes Yes Both sources displayed, preferences controls card ordering and context source
Yes No Only Enlighten Insights displayed
No Yes Only Data Action Insights displayed
No No No Insights displayed

Example

The following Insights Response uses the preferences field (see the schema definition above) to configure what to display in the Spoke application when both Enlighten and Data Action insights are enabled. Screenshots of each screen are shown below.

{
  "context": {
    "body": "**Peter Parker** - CEO at Stark Industries.\nLast contacted 3 days ago regarding renewal."
  },
  "cards": [
    {
      "title": "Customer Info",
      "body": "**Name**: Peter Parker\n**Company**: Stark Industries\n**Role**: CEO\n**Location**: London, UK",
      "state": "expanded",
      "thumbnail": { "icon_name": "person" }
    },
    {
      "title": "Recent Activity",
      "body": "1. Opened renewal quote email - 2 hours ago\n2. Visited [pricing page](https://example.com/pricing) - yesterday\n3. Spoke with support about billing - 3 days ago",
      "state": "expanded",
      "thumbnail": { "icon_name": "history" }
    }
  ],
  "preferences": {
    "context": {
      "preferredSource": "dataAction"
    },
    "cards": {
      "enlighten": {
        "display": "before"
      }
    }
  }
}

Pre-call (desktop only)

Only the context is shown. The context from the Insights Response is displayed as specified by preferredSource.

Pre-call screen

Call Summary (call history → select a call)

Only the context is shown. The context from the Insights Response is displayed as specified by preferredSource.

Call summary screen

In-call (active call → Insights tab)

The context from the Insights Response is shown followed by the card list. Enlighten cards are displayed before the Data Action cards as specified by display.

In-call screen

Contact Insights (directory → select contact → Insights)

The context from the Insights Response is shown followed by the card list. Enlighten cards are displayed before the Data Action cards as specified by display.

Contact insights screen

Call Intelligence (call history → select a call → Insights)

The context from the Insights Response is shown followed by the card list. Enlighten cards are displayed before the Data Action cards as specified by display.

Call intelligence screen

Debugging

A table of Insights Data Actions that have been performed is available on the configuration page on the Spoke Account Portal and can be used to debug your Custom Insights Application.

Developer API Screenshot

Status Types

The status column on the table refers to the response from the configured URL. There are 3 status types:

  • success
  • failure
  • noData

It is important to note that status does not refer to the validity of the response body.

Here are cases of each status type when they appear on the Spoke Account Portal and their scenarios when users click to view Insights and there is an error:

  • The table will not be updated with a new entry if the Insights app has not been configured for an organisation

Developer API Screenshot
Spoke Phone App
Developer API Screenshot

  • An entry with a status of success will be added if:

    • there is a valid response or
    • the response is not valid JSON or is malformed
Table of Insights Data Actions item
Developer API Screenshot
Spoke Phone App
Developer API Screenshot

  • An entry with a status of failed will be added if a network error is encountered

Table of Insights Data Actions item
Developer API Screenshot
Spoke Phone App
Developer API Screenshot

  • An entry with a status of noData when the response is empty (i.e. if there is no payload) or an empty array is returned

Table of Insights Data Actions item
Developer API Screenshot
Spoke Phone App
Developer API Screenshot

Outbound Call

Overview

The Outbound Call Data Action Function allows you to programmatically change the default state/configuration of an outbound Spoke call, right as the call is about to be placed.

When you set up Spoke, you set up company defaults for items such as call recording, the CallerIDs customers see when your team make calls, etc. Outbound Data Actions allow you to change this default behavior on a call-by-call basis.


These are the actions that are supported by Outbound Call Data Action:

Override Dial Permission

Allow or block any outbound call made to the specified phone number. Applies to all calls, whether made from the Spoke Phone application or a SIP device. For SIP device calls, this overrides the flag set against "Outbound calls allowed".


Override Outbound Caller ID

Overrides the caller ID for any outbound call made.


Passthrough Parameters

Overrides the passthrough parameters associated with the outbound call. Passthrough parameters can be attached to an outbound call using Spoke's Deep Linking dial verb.

Existing passthrough parameters are included in the GET request and are flattened and appended to the query string as key-value pairs.

Passthrough parameters from the data action response will be merged with the existing passthrough parameters associated with the call. If a key exists in both the response and the current passthrough parameters, the value from the response will override the existing value.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the passthrough parameters from the response will be discarded, and the stored passthrough parameters will not be updated.


Request and Response

Spoke sends an HTTP GET request with the following query parameters, and expects a response payload of the below shape within 2 seconds. If no response payload is returned, the call will proceed as planned, using the original configuration for the call.

The request parameters for this Data Action will vary based on how the call is initiated:

  • If the call is initiated by a user or a SIP device attached to the user, the request will include the userId, userExtension, and userEmail parameters. No device-related parameters will be included.

  • If the call is initiated by a standalone SIP device, the request will not include any user-related parameters and will include the deviceId, deviceExtension, and deviceAddress parameters instead.

Outbound Call Data Action Request Parameters

callId
string

The Spoke ID of the call.

callerId
required
string

The Caller ID or ANI that Spoke is proposing to use for placing this call.

contactEmail
string

The email address of the contact being called.

contactId
string

The ID of the contact being called.

contactNumber
required
string

The phone number being called.

deviceAddress
string

The SIP address of the standalone SIP device that is placing the call.

deviceExtension
string

The extension of the standalone SIP device that is placing the call.

deviceId
string

The id of the standalone SIP device that is placing the call.

userEmail
string

The email address of the Spoke Phone user who is placing the call.

userExtension
string

The extension of the Spoke Phone user who is placing the call.

userId
string

The id of the Spoke Phone user who is placing the call.

vendorCallId
required
string

The vendor's identifier for the call.

{
  • "callId": "string",
  • "callerId": "string",
  • "contactEmail": "string",
  • "contactId": "string",
  • "contactNumber": "string",
  • "deviceAddress": "string",
  • "deviceExtension": "string",
  • "deviceId": "string",
  • "userEmail": "string",
  • "userExtension": "string",
  • "userId": "string",
  • "vendorCallId": "string"
}

Passthrough Parameters

The existing passthrough parameters are flattened into key-value pairs, URL-encoded, and then appended to the query string.

Example:

Given a call with the following passthrough parameters:

{
  "x-customerName": "John Doe",
  "x-item": "Smartphone & Accessories"
}

The constructed data action request will be:

https://api.example.com/outboundCall?callerId=1234&contactNumber=%2B12178888888&vendorCallId=4321&x-customerName=John%20Doe&x-item=Smartphone%20%26%20Accessories

Outbound Call Data Action Response Payload

callerId
string

Returning this parameter will override the Caller ID that Spoke (or the user) has selected. The value must be in a valid E164 format and be a verified caller ID in the account.

dialPermission
string
Enum: "allowed" "blocked"

Outbound Dial permission. Return either of the following values:

  • blocked: Prevents the call from taking place. The call status will show as Blocked in call history.
  • allowed: Allow the call to be made. This is the default value for this parameter if it is not included in the response payload. For SIP devices, the value needs to be explicitly set to override the "Outbound calls allowed" flag set against the SIP device.
object (CallPassthroughParametersResponse)

If specified, updates the passthrough parameters stored against the call by merging the existing passthrough parameters with the returned passthrough parameters. If a key exists in both the existing passthrough parameters and the returned passthrough parameters, the returned parameter value will overwrite the existing value.

Each passthrough parameter key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

Example:

{
  "x-contactId": "HS12345",
  "x-orderId": "ORD12345"
}
object (CallPassthroughParametersResponse)

If specified, updates the passthrough parameters stored against the call by merging the existing passthrough parameters with the returned passthrough parameters. If a key exists in both the existing passthrough parameters and the returned passthrough parameters, the returned parameter value will overwrite the existing value.

Each passthrough parameter key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

Example:

{
  "x-contactId": "HS12345",
  "x-orderId": "ORD12345"
}
{
  • "callerId": "string",
  • "dialPermission": "allowed",
  • "passthroughParameters": { }
}

Team Call

Overview

The Team Call Data Action allows you to programmatically override team configuration just prior to a call being offered to a team.

Note that the data action is not invoked if the call is sent directly to the team's voicemail e.g. transferring to the team's voicemail or redirecting to Spoke via its extension with sendToVoicemail=true.

Below are the configurations that can be overridden via Team Call Data Action.

Display Name

Overrides the display name of the team the call will be offered to. This overridden name will be displayed in following areas:

  • Incoming call screen for new calls, transferred calls, and rolled over calls to the team
  • Incoming call and missed call notifications
  • Current call screen
  • Users' call history and call details on Spoke applications
  • Account-wide call history and call summary on Spoke Account Portal
  • Call summary and voicemail summary emails

Note: This field is ignored for internal calls.

Users

Overrides the list of users who are offered the call. This allows you to fine tune who is offered individual calls while still following standard team offer flows.

Each user is identified by their email address in Spoke. Invalid emails are ignored.

Availability rules still apply - only available users will be offered the call.

If the team's offer pattern is set to Round-robin, the call will be offered to the users in the order in which they appear in the list.


Timeout

Overrides the number of the seconds Spoke will wait for someone to answer the call before returning or forwarding the call.

The supported range of values for timeout is from 10 to 300 seconds. If the provided value falls outside the range, it will be rounded to the nearest supported value.


Next Offer Timeout

Overrides the number of the seconds Spoke will wait before offering the call to the next available user(s).

The supported range of values for nextOfferTimeout is from 5 to 60 seconds. If the provided value falls outside the range, it will be rounded to the nearest supported value.

Note : The asynchronous nature of API calls between Spoke and Twilio coupled with the overhead of setting up and tearing down call legs means that timeout values are indicative only, and the follow on action may occur some number of seconds after the timeout expires.


Priority

Overrides the priority of the call. This allows you to prioritise or deprioritise the call.

The supported range of values for priority is an integer value between 1 and 9, where 1 is the highest priority and 9 is the lowest. If the provided parameter falls outside the range, the call will be assigned a default value of 5.


Passthrough Parameters

Overrides the passthrough parameters associated with the inbound call.

Passthrough parameters can be attached to an inbound call when using Spoke's Redirect Handler.

Existing passthrough parameters are included in the POST request. If there are no existing passthrough parameters, the passthroughParameters field will be an empty object.

Passthrough parameters from the data action response will be merged with the existing passthrough parameters associated with the call. If a key exists in both the response and the current passthrough parameters, the value from the response will override the existing value.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the passthrough parameters from the response will be discarded, and the stored passthrough parameters will not be updated.


Request and Response

Spoke sends an HTTP POST request with the following parameters in the request body, and expects a response payload of the below shape within 2 seconds.

If the request returns a non-200 response or times out and the fallback URL is configured, Spoke will send another request to the fallback URL with the same payload.

If no response payload is returned, the call will proceed as planned, using the original team configuration.

Team Call Data Action Request Parameters

required
object (CallGroupDirectoryEntry)

Contains directory entry of the team which the call was offered to.

displayName
string

The display name of the entry in the Spoke directory. This field is equivalent to the displayName field for a directory entry in the Spoke Directory API.

extension
string

The extension of the entry in the Spoke directory.

id
required
string

The unique ID of the entry in the Spoke directory.

type
required
string

The type of the entry in the Spoke directory. This value will be team for the calls to the team.

Value: "team"
callId
required
string

The Spoke ID of the call.

companyNumber
string

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactId
string

The ID of the phonebook contact (if any) associated with the external party on the call.

contactNumber
string

The phone number of the external party that originated or terminated this call.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
required
object (DeprecatedDirectoryTarget)

** DEPRECATED ** Use the assignedCallGroup field instead.

displayName
string

The display name of the entry in the Spoke directory. This field is equivalent to the displayName field for a directory entry in the Spoke Directory API.

extension
string

The extension of the entry in the Spoke directory.

id
required
string

The unique ID of the entry in the Spoke directory.

type
required
string

The type of the entry in the Spoke directory. This value will be team for the calls to the team.

Value: "team"
isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke Team) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

required
object (CurrentCallGroupOfferConfig)

Configuration that shows how the call will be offered to the team.

nextOfferTimeout
required
number

Number of seconds Spoke will wait before offering the call to the next available user(s).

timeout
required
number

Number of seconds Spoke will wait for someone to answer the call.

required
object (CurrentCallGroupUsers)

Lists of users the call will be offered to.

passthroughParameters
required
object

The existing passthrough parameters stored against the call record.

If there are no existing passthrough parameters, this field will be an empty object.

vendorCallId
required
string

The vendor's identifier for the call.

{
  • "assignedCallGroup": {
    • "displayName": "string",
    • "extension": "string",
    • "id": "string",
    • "type": "team"
    },
  • "callId": "string",
  • "companyNumber": "string",
  • "contactId": "string",
  • "contactNumber": "string",
  • "directoryTarget": {
    • "displayName": "string",
    • "extension": "string",
    • "id": "string",
    • "type": "team"
    },
  • "isInternal": true,
  • "offerConfig": {
    • "nextOfferTimeout": 0,
    • "timeout": 0,
    • "users": {
      • "group1": [
        • "string"
        ],
      • "group2": [
        • "string"
        ]
      }
    },
  • "passthroughParameters": { },
  • "vendorCallId": "string"
}

Team Call Data Action Response Payload

callGroupDisplayName
string

This overrides the current display name of the team the call will be offered to.

Note: This field is ignored for internal calls.

Overriding the display name will change what is displayed in the following areas:

  • Incoming call screen for new calls, transferred calls, and rolled over calls to a team
  • Incoming call and missed call notifications
  • Current call screen
  • Users' call history and call details on Spoke applications
  • Account-wide call history and call summary on Spoke account portal
  • Call summary and voicemail summary emails
object (OverrideCallGroupOfferConfig)

Configuration that overrides how the call will be offered to the team.

nextOfferTimeout
number

Number of seconds to wait before offering the call to the next available user(s).

The supported range of values for nextOfferTimeout is from 5 to 60 seconds. If the provided value falls outside the range, it will be rounded to the nearest supported value.

timeout
number

Number of seconds to wait for someone to answer the call.

The supported range of values for timeout is from 10 to 300 seconds. If the provided value falls outside the range, it will be rounded to the nearest supported value.

object (OverrideCallGroupUsers)

Lists of users the call will be offered to.

Each user is identified by their email address in Spoke. Invalid emails are ignored. Availability rules still apply - only available users will be offered the call.

If the team call's offer pattern is set to Round-robin, the call will be offered to the users in the order in which they appear in the list.

object (CallPassthroughParametersResponse)

If specified, updates the passthrough parameters stored against the call by merging the existing passthrough parameters with the returned passthrough parameters. If a key exists in both the existing passthrough parameters and the returned passthrough parameters, the returned parameter value will overwrite the existing value.

Each passthrough parameter key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

Example:

{
  "x-contactId": "HS12345",
  "x-orderId": "ORD12345"
}
object (CallPassthroughParametersResponse)

If specified, updates the passthrough parameters stored against the call by merging the existing passthrough parameters with the returned passthrough parameters. If a key exists in both the existing passthrough parameters and the returned passthrough parameters, the returned parameter value will overwrite the existing value.

Each passthrough parameter key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

Example:

{
  "x-contactId": "HS12345",
  "x-orderId": "ORD12345"
}
priority
number

If specified, overrides the priority of the call. Use this to prioritise or deprioritise a call.

Priority is used:

  • To determine which calls take priority when selecting the next call to queue for a user.
  • To determine the order in which calls are offered to a user.

The supported range of values for priority is an integer value between 1 and 9, where 1 is the highest priority and 9 is the lowest. Any calls with an undefined or invalid priority are assigned a default value of 5.

{
  • "callGroupDisplayName": "string",
  • "offerConfig": {
    • "nextOfferTimeout": 0,
    • "timeout": 0,
    • "users": {
      • "group1": [
        • "string"
        ],
      • "group2": [
        • "string"
        ]
      }
    },
  • "passthroughParameters": { },
  • "priority": 0
}

Example Timelines

A Team Call Data Action will be triggered any time a call is about to be offered to a given team. This means that it may be triggered more than one time during a call, for example:

  • The team is configured with an overflow rule that routes unanswered calls to a second team
  • A call is transferred by an agent to another team

In both cases above, if a Team Call Data Action is configured, two requests will be made to the configured URL. In the second request, the directoryTarget and offerConfig attributes of the request payload will be updated to reflect the new team. All other attributes will remain the same.

Data actions for teams are triggered irrespective of the source of a call. This includes:

  • Direct calls to the team via a team DDI
  • Calls redirected into Spoke from an external IVR such as Studio
  • Calls received via the Spoke IVR
  • Any actions that result in calls being offered to a team from the Spoke application, such as transfer or a user calling the team directly

The following examples illustrate when data action requests will be made during the lifecycle of a call.


Example 1 - Inbound Call with Transfer

User Actions

Team Call Data Action Request Sent

Customer Alice starts a call to a company number.

Request for Reception Desk

Alice presses 0 for Reception Desk

Bob answers the call and talks to Alice.

Request for Sales

Bob transfers Alice to the Sales team

Fred answers the call and talks to Alice.

Fred hangs up the call.


Example 2 - Direct Call with Offer Forwarding

User Actions

Team Call Data Action Request Sent

Request for Customer Support

Customer Alice starts a call to the Customer Support team.

No one in the Customer Support team answers.

Request for Reception Desk

The offer is forwarded to Reception Desk according to Customer Support's configuration.

Natty answers the call and talks to Alice.

Natty hangs up the call.


Example 3 - Redirect to a Team Call via API

User Actions

Team Call Data Action Request Sent

Request for Regional Sales

Call from Alice is redirected to the Regional Sales team via its extension number.

No one in the Regional Sales team is available.

The call is returned to the originating Twilio Studio flow.

Request for Global Sales

The call is redirected to the Global Sales team via its extension number.

Dob answers the call and talks to Alice.

Alice hangs up the call


Spoke App Deep Linking

Deep links in the Spoke Phone app allow users to route directly to specific resources or perform actions within the app by clicking a link on a web page or launching a URL from another application. These links streamline navigation, enabling users to view call history, make a call, or send messages in one click.

Deep links work across all supported platforms - Windows, MacOS, iOS and Android - and use a special spoke: URL scheme that is registered when the Spoke app is installed on the target device.

Requirement: The Spoke Phone app must be installed on the device for the deep links to work.

Supported Functionality

  • Call History: View call details
  • Dialing: Dial a number with a specified caller ID.
  • Messaging: Initiate or continue SMS or WhatsApp conversations.

Each URL must be URI-encoded before use to ensure correct parsing.

Call History

View call details

spoke://call/{callId}

Navigates to the details of the specified call.

Parameters

  • callId - The unique identifier of the call.
    • If callId is invalid or not provided, or the call does not exist, the app will redirect to the user's Call History list.

Example

spoke://call/e814fb79-3f4f-4cf3-94ed-f88a5c15cb9e

Dial

Dial a number

spoke://dial?contactNumber={contactNumber}&callerId={callerId}

Dials a contact number using a specified caller ID.

Parameters

  • contactNumber - The phone number to dial in +E164 format.
    • If contactNumber is not provided, the app will open the Dial Pad.
    • If contactNumber is invalid, it will be prefilled in the Dial Pad, allowing the user to edit it.
  • callerId (optional) - The caller ID to use for the call.
    • If callerId is not provided, the call will be made using the user's default caller ID.
    • callerId must be from the list of available caller IDs assigned to the user. If the callerId is invalid, the app will prompt the user to select a valid one.
    • If callerId is valid but contactNumber is invalid, the valid callerId will be preselected in the Dial Pad.

Example

spoke://dial?contactNumber=%2B64221112222&callerId=%2B14341112222

Note: Both %2B64221112222 and %2B14341112222 are URI-encoded +E164 phone numbers, but the Spoke Phone app is able to handle +64221112222 as well.

Passthrough parameters

The Spoke Phone app supports passthrough parameters when dialling a contact via a deep link. Passthrough parameters are stored against the call record and are then included in the call's webhook events. These parameters can also be retrieved when getting the call resource through the Spoke API.

Use passthrough parameters to track a call made by a user from a link in an external application (such as a CRM or in-house system) and associate the outcome of the call (including call recordings and any other records created by the Spoke platform) with the external platform.

To attach passthrough parameters to a call, add them to the deep link URL as a query string parameter with the parameter name prefixed with x-, e.g.:

spoke://dial?contactNumber=%2B64221112222&callerId=%2B14341112222&x-contactId=HS12345&x-orderId=OR12345

Opening the above deep link URL will result in the call object in the webhook event payload and the call resource in the API to contain a passthroughParameters object containing the exact parameters provided in the deep link URL:

{
  ...,
  passthroughParameters: {
    "x-contactId": "HS12345",
    "x-orderId": "OR12345"
  }
}

The passthrough parameters in the deep link URL are limited to a total of 1000 bytes.

If the total size of the passthrough parameters exceeds 1000 bytes, the call will not be made and the Spoke app will navigate to the dial pad, prefilled with provided the contactNumber and callerId.

Passthrough parameters will not be stored against the call if opening the deep link results in the call not being made. This includes the following scenarios:

  • The passthrough parameters exceeds the limit of 1000 bytes and the user subsequently presses the dial button on the dial pad.
  • The contactNumber is invalid and the user subsequently edits the number on the dial pad and presses the dial button.
  • The callerId is invalid and the user subsequently selects a valid callerId on the dial pad and presses the dial button.
  • No contactNumber is provided and the user subsequently enters a number on the dial pad and presses the dial button.

It is important to ensure that the source system implements appropriate validation of all required parameters. This includes ensuring that:

  • callerId MUST be a valid +E164 number
  • contactNumber MUST be a valid +E164 number
  • Passthrough parameter length does not exceed the documented limit

Message

Send an SMS message

spoke://message/sms?contactAddress={contactAddress}&companyAddress={companyAddress}&body={body}

Starts or continues an SMS conversation using the given companyAddress as the sender ID and prefills the message input with the provided body.

Important: Messages are never automatically sent. The user must press the send button after reviewing or editing the prefilled content.

Parameters

  • contactAddress - The +E164-formatted phone number of the contact.
    • If contactAddress is invalid or not provided, the app will navigate to the Messages tab.
    • If an SMS conversation with contactAddress exists, the user will be directed to that conversation; otherwise a new SMS conversation will be created.
  • companyAddress (optional) - The +E164-formatted phone number to use as the messaging sender ID.
    • companyAddress must be a phone number from the user's list of available SMS-capable numbers.
    • If companyAddress is invalid, the user will be prompted to select a valid phone number from the list of available SMS sender IDs.
  • body (optional) - The message content to prefill in the message input.
    • body should be URI-encoded to ensure correct parsing.
    • If body is not provided, the message input will be empty.

Example

spoke://message/sms?contactAddress=%2B64221112222&companyAddress=%2B14341112222&body=Hi%20Bob%2C%20this%20is%20Alice

Send a WhatsApp message

spoke://message/whatsapp?contactAddress={contactAddress}&companyAddress={companyAddress}&templateName={templateName}

Starts or continues a WhatsApp conversation using the given companyAddress as the sender ID, prefilled with a message generated from the Twilio content template matching templateName.

Important: Messages are never automatically sent. The user must press the send button after reviewing the content generated from the matching template.

Parameters

  • contactAddress - The WhatsApp address of the contact. E.g.: whatsapp:+64221112222
    • If contactAddress is invalid or not provided, the app will navigate to the Messages tab.
    • If a WhatsApp conversation with contactAddress exists, the user will be directed to that conversation; otherwise a new WhatsApp conversation will be created.
  • companyAddress (optional) - The WhatsApp address to use as the messaging sender ID. E.g.: whatsapp:+14341112222
    • companyAddress must be a WhatsApp-capable number from the user's list of available WhatsApp-capable numbers.
    • If companyAddress is invalid or missing, the user will be prompted to select a valid phone number from the user's list of available WhatsApp sender IDs.
  • templateName (optional) - The friendly name of the approved WhatsApp content template available.
    • The templateName must match the friendly name of the WhatsApp-approved content template on Twilio.
    • If templateName is not provided, the user will be prompted to select a template from the list of available templates.
    • If templateName is invalid, the message input will be empty.
    • For more details, refer to our WhatsApp support documentation or the Twilio Content API.

Example

spoke://message/whatsapp?contactAddress=whatsapp%3A%2B64221112222&companyAddress=whatsapp%3A%2B14341112222&templateName=WelcomeMessage

Directory

The Spoke Unified Directory is a comprehensive directory of all the users, teams and devices in your organisation. It is used to store and manage your legacy internal phone directory.

List or search the unified Spoke directory

Lists or finds directory entries. All search parameters are optional.

If no parameters are provided then a paged list of directory entries, ordered alphabetically by displayName will be returned.

query Parameters
next
string (next)

Optional next token for object pagination

limit
required
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

extension
string (extension)

Returns directory filtered by extension number. Exact match only.

This parameter is incompatible with ivrKey and phoneNumber

phoneNumber
string (phoneNumber)

Returns directory filtered by phone number. Exact match only. The result set will return the directory entry with the assigned phone number.

This parameter is incompatible with extension and ivrKey

ivrKey
string (ivrKey)

Returns directory filtered by IVR key. Exact match only.

This parameter is incompatible with extension and phoneNumber

includeSuspendedUsers
string (includeSuspendedUsers)

Return all directory entries, including suspended users.

By default, this flag is false and suspended users are excluded from the response.

includeHiddenCallGroups
string (includeHiddenCallGroups)

If true, the result set will include all call groups (teams) irrespective of a group's isHidden flag.

If false, the result set will only include call groups (teams) that have isHidden set to false.

By default, this flag is false and hidden call groups are excluded from the response.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
Array of Device (object) or UserWithAvailability (object) or TeamWithAvailability (object) or TrunkUser (object) or TrunkDevice (object) or TrunkQueue (object) (DirectoryEntry)

The list of directory entries returned by the query. Entries can be any of UserWithAvailability, TeamWithAvailability, Device, TrunkUser, TrunkDevice, TrunkQueue types. The entry type discriminator is used to determine the object type.

Array
Any of
deviceType
string
Enum: "deskPhone" "softPhone"
displayName
required
string

The display name of this directory entry.

extension
string
id
required
string

The id of the device.

sipAddress
string

The device's SIP address

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "device"
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

Response samples

Content type
application/json
{
  • "entries": [
    • {
      • "deviceType": "deskPhone",
      • "displayName": "string",
      • "extension": "string",
      • "id": "string",
      • "sipAddress": "string",
      • "twimlRedirectUrl": "string",
      • "type": "device"
      }
    ],
  • "meta": {
    • "next": "string"
    }
}

Get a directory entry

Retrieves a directory entry

path Parameters
entryId
required
string (entryId)

The directory entry ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
Any of
deviceType
string
Enum: "deskPhone" "softPhone"
displayName
required
string

The display name of this directory entry.

extension
string
id
required
string

The id of the device.

sipAddress
string

The device's SIP address

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "device"

Response samples

Content type
application/json
Example
{
  • "deviceType": "deskPhone",
  • "displayName": "string",
  • "extension": "string",
  • "id": "string",
  • "sipAddress": "string",
  • "twimlRedirectUrl": "string",
  • "type": "device"
}

Users

Users are the individual Spoke Users in your account. You can query this API to get all active users and their current system availability.

List users with availability

This API endpoint lists all users in your organisation and their current availability.

query Parameters
email
string (email)

Filter users by email address. Exact match only. If there is a user with the given email address, the response will contain one user with that email address.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
Array
object (Availability)

The user's current availability to take calls.

desktopEnrolledReleaseChannel
required
string (DesktopReleaseChannel)
Enum: "stable" "beta" "alpha"

The user's current enrolled release channel for the Spoke Phone desktop application.

This field will contain one of the following values:

  • stable: latest stable release
  • beta: beta pre-release
  • alpha: alpha early access release
displayName
required
string

User’s name as it appears in the Spoke Directory

email
string

User's email address (as registered in Spoke)

extension
string

User's extension

firstName
string

User's first name

id
required
string

The id of the user

isDirectorySynced
required
boolean

Indicates whether the user is managed via the organisation's employee directory platform.

jobTitle
string

User's job title (as registered in Spoke)

licenses
Array of strings (LicenseName)
Items Enum: "callHub10Pack" "callHub20Pack" "callHub5Pack" "enlightenEssentials" "enlightenPro" "essentials" "proCx"

The names of the licenses assigned to this user.

lastName
string

User's last name

location
string

User’s location (as registered in Spoke)

loginStatus
required
string (LoginStatus)
Enum: "loggedIn" "loggedOut"
object (ManagerUserDirectoryEntry)

The entry in the Spoke directory for the manager assigned to the user.

This field identifies the entry for the manager in the Spoke directory. The directory entry for the manager will always have a type of user.

This field will be null if a manager has not been assigned to the user.

mobile
string

User's mobile number (as registered in Spoke)

This will be omitted if the organisation is configured to exclude mobile numbers from API responses

required
Array of objects (DirectoryPhoneNumber)

The list of phone numbers (DIDs) associated with this user

status
required
string

The current registration status of the user. Will be one of invited, active or suspended

teams
Array of strings

The list of team names that the user is a member of

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "user"

Response samples

Content type
application/json
[
  • {
    • "availability": {
      • "availabilitySummary": "string",
      • "callId": "string",
      • "endAt": "string",
      • "endTimestamp": 0,
      • "notAvailableReason": "string",
      • "notAvailableRule": "busyOnACall",
      • "status": "available",
      • "statusAt": "string",
      • "statusTimestamp": 0,
      • "timezone": "string",
      • "vendor": "twilio",
      • "vendorCallId": "string"
      },
    • "desktopEnrolledReleaseChannel": "stable",
    • "displayName": "string",
    • "email": "string",
    • "extension": "string",
    • "firstName": "string",
    • "id": "string",
    • "isDirectorySynced": true,
    • "jobTitle": "string",
    • "licenses": [
      • "callHub10Pack"
      ],
    • "lastName": "string",
    • "location": "string",
    • "loginStatus": "loggedIn",
    • "manager": {
      • "displayName": "string",
      • "email": "string",
      • "id": "string"
      },
    • "mobile": "string",
    • "phoneNumbers": [
      • {
        • "numberDisplay": "string",
        • "numberE164": "string",
        • "numberLocal": "string"
        }
      ],
    • "status": "string",
    • "teams": [
      • "string"
      ],
    • "twimlRedirectUrl": "string",
    • "type": "user"
    }
]

Get a user

Retrieve a user resource, and its data.

path Parameters
id
required
string (id)

The user ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
object (Availability)

The user's current availability to take calls.

availabilitySummary
string

Describes the current availability of the user.

This field is automatically generated based on the user's current status.

callId
string

If notAvailableRule is busyOnACall then this field contains the Spoke callId of the active call

endAt
string or null

Date/Time (UTC - ISO8601 format) that the currently active notAvailableRule expires. This value will be null if the status is available or the notAvailableRule is busyOnACall.

endTimestamp
number or null

Unix timestamp that the currently active notAvailableRule expires. This value will be null if the status is available or the notAvailableRule is busyOnACall.

notAvailableReason
string or null

A text field describing the reason for the user being busy or offline. The content of this field is intended for display purposes and is derived from the notAvailableRule, endTimestamp and timezone fields.

This field will contain values such as On another call or Offline until 12:32pm AEDT.

This field will be null if status is available

string or (any or null)

If the status is not available, this field contains the currently active rule. If this field contains a value the user will not be offered any calls if they are a member of any team.

This field will contain one of the following values:

  • busyOnACall: Currently on another call. The callId field will contain the id of the active call.
  • busyRestOfTheDay: The user has selected themselves busy for the rest of the day.
  • busyUntil: The user has selected themselves busy until a certain time.
  • offlineHours: The user has selected offline hours in the Spoke application, and this rule is active.
  • offlineWeekends: The user has selected that they are offline during weekends, and this rule is active.
  • offlineVacation: The user has selected that they are currently on vacation.

This field will be null if status is available

status
required
string (AvailabilityStatus)
Enum: "available" "busy" "offline"

The current availability status.

This field will contain one of the following values:

  • available: available for taking a call
  • busy: active but not available to take a call.
  • offline: not active and not available to take a call.
statusAt
required
string

Date/Time (UTC - ISO8601 format) that the user's status was last updated.

statusTimestamp
required
number

Unix timestamp that the user's status was last updated.

timezone
required
string

The timezone of the user. This field is automatically populated from the timezone of the user's mobile device.

The value will be one of the timezone Area/Location name values (e.g. America/New_York) from the public tz database.

vendor
string

If notAvailableRule is busyOnACall then this field contains the CPaaS vendor that carried the call. One of the following values:

  • twilio
Value: "twilio"
vendorCallId
string

If notAvailableRule is busyOnACall then this field contains the vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
desktopEnrolledReleaseChannel
required
string (DesktopReleaseChannel)
Enum: "stable" "beta" "alpha"

The user's current enrolled release channel for the Spoke Phone desktop application.

This field will contain one of the following values:

  • stable: latest stable release
  • beta: beta pre-release
  • alpha: alpha early access release
displayName
required
string

User’s name as it appears in the Spoke Directory

email
string

User's email address (as registered in Spoke)

extension
string

User's extension

firstName
string

User's first name

id
required
string

The id of the user

isDirectorySynced
required
boolean

Indicates whether the user is managed via the organisation's employee directory platform.

jobTitle
string

User's job title (as registered in Spoke)

licenses
Array of strings (LicenseName)
Items Enum: "callHub10Pack" "callHub20Pack" "callHub5Pack" "enlightenEssentials" "enlightenPro" "essentials" "proCx"

The names of the licenses assigned to this user.

lastName
string

User's last name

location
string

User’s location (as registered in Spoke)

loginStatus
required
string (LoginStatus)
Enum: "loggedIn" "loggedOut"
object (ManagerUserDirectoryEntry)

The entry in the Spoke directory for the manager assigned to the user.

This field identifies the entry for the manager in the Spoke directory. The directory entry for the manager will always have a type of user.

This field will be null if a manager has not been assigned to the user.

displayName
required
string

The display name of the entry in the Spoke directory. This field is equivalent to the displayName field for a directory entry in the Spoke Directory API.

email
string

The email address of the entry.

id
required
string

The unique ID of the entry in the Spoke directory.

mobile
string

User's mobile number (as registered in Spoke)

This will be omitted if the organisation is configured to exclude mobile numbers from API responses

required
Array of objects (DirectoryPhoneNumber)

The list of phone numbers (DIDs) associated with this user

Array
numberDisplay
string

Phone number in international format e.g. +1 650-822-1060

numberE164
string

Phone number in +E164 format. e.g. +16508221060

numberLocal
string

Phone number in local/national format e.g. (650) 822-1060

status
required
string

The current registration status of the user. Will be one of invited, active or suspended

teams
Array of strings

The list of team names that the user is a member of

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "user"

Response samples

Content type
application/json
{
  • "availability": {
    • "availabilitySummary": "string",
    • "callId": "string",
    • "endAt": "string",
    • "endTimestamp": 0,
    • "notAvailableReason": "string",
    • "notAvailableRule": "busyOnACall",
    • "status": "available",
    • "statusAt": "string",
    • "statusTimestamp": 0,
    • "timezone": "string",
    • "vendor": "twilio",
    • "vendorCallId": "string"
    },
  • "desktopEnrolledReleaseChannel": "stable",
  • "displayName": "string",
  • "email": "string",
  • "extension": "string",
  • "firstName": "string",
  • "id": "string",
  • "isDirectorySynced": true,
  • "jobTitle": "string",
  • "licenses": [
    • "callHub10Pack"
    ],
  • "lastName": "string",
  • "location": "string",
  • "loginStatus": "loggedIn",
  • "manager": {
    • "displayName": "string",
    • "email": "string",
    • "id": "string"
    },
  • "mobile": "string",
  • "phoneNumbers": [
    • {
      • "numberDisplay": "string",
      • "numberE164": "string",
      • "numberLocal": "string"
      }
    ],
  • "status": "string",
  • "teams": [
    • "string"
    ],
  • "twimlRedirectUrl": "string",
  • "type": "user"
}

User Events

User-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

user.availability.updated Webhook

Request Body schema: application/json

Occurs whenever the availability of any user changes.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (UserEventData)
required
object (UserWithAvailability)
object (Availability)

The user's current availability to take calls.

desktopEnrolledReleaseChannel
required
string (DesktopReleaseChannel)
Enum: "stable" "beta" "alpha"

The user's current enrolled release channel for the Spoke Phone desktop application.

This field will contain one of the following values:

  • stable: latest stable release
  • beta: beta pre-release
  • alpha: alpha early access release
displayName
required
string

User’s name as it appears in the Spoke Directory

email
string

User's email address (as registered in Spoke)

extension
string

User's extension

firstName
string

User's first name

id
required
string

The id of the user

isDirectorySynced
required
boolean

Indicates whether the user is managed via the organisation's employee directory platform.

jobTitle
string

User's job title (as registered in Spoke)

licenses
Array of strings (LicenseName)
Items Enum: "callHub10Pack" "callHub20Pack" "callHub5Pack" "enlightenEssentials" "enlightenPro" "essentials" "proCx"

The names of the licenses assigned to this user.

lastName
string

User's last name

location
string

User’s location (as registered in Spoke)

loginStatus
required
string (LoginStatus)
Enum: "loggedIn" "loggedOut"
object (ManagerUserDirectoryEntry)

The entry in the Spoke directory for the manager assigned to the user.

This field identifies the entry for the manager in the Spoke directory. The directory entry for the manager will always have a type of user.

This field will be null if a manager has not been assigned to the user.

mobile
string

User's mobile number (as registered in Spoke)

This will be omitted if the organisation is configured to exclude mobile numbers from API responses

required
Array of objects (DirectoryPhoneNumber)

The list of phone numbers (DIDs) associated with this user

status
required
string

The current registration status of the user. Will be one of invited, active or suspended

teams
Array of strings

The list of team names that the user is a member of

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "user"
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "user.availability.updated"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.942Z",
  • "data": {
    • "user": {
      • "availability": {
        • "availabilitySummary": "Sabrina is on another call",
        • "callId": "2df36ade-aeaa-441b-8f12-f17284dea38d",
        • "notAvailableReason": "On another call",
        • "notAvailableRule": "busyOnACall",
        • "status": "busy",
        • "statusAt": "2026-06-05T05:57:18.944Z",
        • "statusTimestamp": 1780639038944,
        • "timezone": "America/Moncton",
        • "vendor": "twilio",
        • "vendorCallId": "CA6A348FA310E9480E99A2BB34F70CBCEA"
        },
      • "desktopEnrolledReleaseChannel": "stable",
      • "displayName": "Elsa Thiel",
      • "email": "Wade_Auer@yahoo.com",
      • "extension": 5413671,
      • "firstName": "Colton",
      • "id": "e89bf73a-1f3e-4cd4-87e7-dde4854d74ab",
      • "isDirectorySynced": false,
      • "jobTitle": "Principal Infrastructure Engineer",
      • "lastName": "Boyer",
      • "licenses": [
        • "enlightenPro",
        • "proCx"
        ],
      • "location": "Broderickfield",
      • "loginStatus": "loggedIn",
      • "mobile": "+15802677598",
      • "phoneNumbers": [
        • {
          },
        • {
          }
        ],
      • "status": "active",
      • "teams": [
        • "Business-focused interactive attitude",
        • "Extended directional array",
        • "Monitored data-driven frame"
        ],
      • "twimlRedirectUrl": "https://edible-discourse.org",
      • "type": "user"
      }
    },
  • "id": "d934f06b-518e-47a8-993a-a40ecbcacf9a",
  • "timestamp": 1780639038942,
  • "type": "user.availability.updated",
  • "version": "2020-07-15"
}

Teams

Teams are groups of Spoke Users and SIP Devices.

Team Events

Team-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

team.availability.updated Webhook

Request Body schema: application/json

Occurs whenever the availability of any user in a team changes.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (TeamEventData)
required
object (TeamWithAvailability)
object (TeamAvailability)

The team's current availability to take calls

displayName
required
string

The display name of this directory entry.

extension
string
id
required
string

The id of the team

isHidden
required
boolean

Indicates whether the team is hidden from Spoke directory or not.

ivrKeyCode
number

[ 0 .. 9 ]

required
Array of objects (DirectoryPhoneNumber)

The list of phone numbers (DIDs) associated with this team

Array of objects (UserWithAvailability)
twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "team"
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "team.availability.updated"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.944Z",
  • "data": {
    • "team": {
      • "availability": {
        • "availabilitySummary": "1 of 4 people available",
        • "status": "available",
        • "totalAvailable": 1,
        • "totalMembers": 4
        },
      • "displayName": "Fundamental cohesive archive",
      • "extension": 1696523,
      • "id": "b2843c58-66da-4e9f-873b-5f2ccac6e35f",
      • "isHidden": false,
      • "ivrKeyCode": 0,
      • "phoneNumbers": [ ],
      • "teamMembers": [
        • {
          },
        • {
          },
        • {
          },
        • {
          }
        ],
      • "twimlRedirectUrl": "https://glossy-custody.info",
      • "type": "team"
      }
    },
  • "id": "4824cc26-8c72-4bb9-8535-d180fafa7fd6",
  • "timestamp": 1780639038944,
  • "type": "team.availability.updated",
  • "version": "2020-07-15"
}

Phonebooks

Phonebooks are containers that hold an organisation's contacts. Typically you will create one phonebook per integration (e.g. CRM) to store Contacts for that integration against.

List phonebooks with contacts

List the phonebooks and their contacts. Not all contacts may be returned. The limit query parameter applies to the total number of contacts in the result set, not the number returned in each phonebook.

If excludeEmpty is set to true and the search parameter is not provided, only phonebooks with contacts are returned. By default, the excludeEmpty parameter is false and all phonebooks will be returned.

query Parameters
search
string (search)

The search term for filtering contacts. Must have at least 3 characters if provided.

limit
string (limit)

The maximum number of contacts to return. Default to 100, maximum is 1000

excludeEmpty
string (excludeEmpty)

Set this value as true to exclude phonebooks that do not contain any contacts. Set it as false to get all phonebooks. Defaults to false. This parameter is ignored if the search parameter is provided.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
Array
required
Array of objects (Contact)

The list of contacts belonging to the phonebook. May be empty if no matched contacts are found.

description
string

The description of the phonebook

id
required
string

ID of the phonebook

managedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

name
required
string

The name of the phonebook

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
ownerId
required
string

** DEPRECATED **. Refer to owner field instead.

sourceId
string

ID of the phonebook's source

uploaded
required
number

UTC timestamp of the latest upload time

Response samples

Content type
application/json
[
  • {
    • "contacts": [
      • {
        • "companyName": "string",
        • "emails": [
          ],
        • "firstName": "string",
        • "id": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "phoneNumbers": [
          ],
        • "phonebookId": "string",
        • "phonebookManagedBy": "organisation",
        • "phonebookName": "string",
        • "phonebookOwner": {
          }
        }
      ],
    • "description": "string",
    • "id": "string",
    • "managedBy": "organisation",
    • "name": "string",
    • "owner": {
      • "id": "string",
      • "type": "organisation"
      },
    • "ownerId": "string",
    • "sourceId": "string",
    • "uploaded": 0
    }
]

Create phonebook with contacts

Create a new phonebook and populates it with the provided contacts.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the phonebook to be created

Array of objects (ContactInput)

The list of contacts belonging to this phonebook

Array
companyName
string or null

Optional company name of the contact

Array of objects (ValueWithLabel)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
string

ID of the contact. Must be specified if other contacts in the same phonebook are created with a specified ID.

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (ValueWithLabel)

List of phone numbers of the contact

countryIso
string or null

Country ISO code for formatting local phone numbers. Must be set if contacts are given

description
string

The description of the phonebook

name
required
string

The name of the phonebook

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string

The description of the phonebook

id
required
string

ID of the phonebook

managedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

name
required
string

The name of the phonebook

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"
ownerId
required
string

** DEPRECATED **. Refer to owner field instead.

sourceId
string

ID of the phonebook's source

uploaded
required
number

UTC timestamp of the latest upload time

Request samples

Content type
application/json
{
  • "contacts": [
    • {
      • "companyName": "string",
      • "emails": [
        • {
          }
        ],
      • "firstName": "string",
      • "id": "string",
      • "jobTitle": "string",
      • "lastName": "string",
      • "phoneNumbers": [
        • {
          }
        ]
      }
    ],
  • "countryIso": "string",
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "id": "string",
  • "managedBy": "organisation",
  • "name": "string",
  • "owner": {
    • "id": "string",
    • "type": "organisation"
    },
  • "ownerId": "string",
  • "sourceId": "string",
  • "uploaded": 0
}

Get phonebook with contacts

Retrieve the phonebook and its contacts. For a large phonebook with number of contacts exceeding the limit, next contact ID is given for pagination.

If id is an email address of a user, then the user's personal phonebook will be retrieved.

path Parameters
id
required
string (id)

The phonebook ID

query Parameters
search
string (search)

The search term for filtering contacts. Must have at least 3 characters if provided.

limit
string (limit)

The maximum number of contacts to return. Default to 100, maximum is 1000

next
string (next)

Optional next token for object pagination

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
Array of objects (Contact)

The list of contacts belonging to the phonebook. May be empty if no matched contacts are found.

Array
companyName
string or null

Optional company name of the contact

Array of objects (Email)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
required
string

The ID of the contact

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (PhoneNumber)

List of phone numbers of the contact

phonebookId
required
string

The ID of the phonebook this contact belongs to

phonebookManagedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

phonebookName
string

The name of the phonebook this contact belongs to

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
description
string

The description of the phonebook

id
required
string

ID of the phonebook

managedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

name
required
string

The name of the phonebook

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"
ownerId
required
string

** DEPRECATED **. Refer to owner field instead.

sourceId
string

ID of the phonebook's source

uploaded
required
number

UTC timestamp of the latest upload time

Response samples

Content type
application/json
{
  • "contacts": [
    • {
      • "companyName": "string",
      • "emails": [
        • {
          }
        ],
      • "firstName": "string",
      • "id": "string",
      • "jobTitle": "string",
      • "lastName": "string",
      • "phoneNumbers": [
        • {
          }
        ],
      • "phonebookId": "string",
      • "phonebookManagedBy": "organisation",
      • "phonebookName": "string",
      • "phonebookOwner": {
        • "id": "string",
        • "type": "organisation"
        }
      }
    ],
  • "description": "string",
  • "id": "string",
  • "managedBy": "organisation",
  • "meta": {
    • "next": "string"
    },
  • "name": "string",
  • "owner": {
    • "id": "string",
    • "type": "organisation"
    },
  • "ownerId": "string",
  • "sourceId": "string",
  • "uploaded": 0
}

Update phonebook and its contacts

Update an existing phonebook and replace its contacts with the provided contacts.

path Parameters
id
required
string (id)

The phonebook ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the phonebook to be updated

Array of objects (ContactInput)

The list of contacts belonging to this phonebook

Array
companyName
string or null

Optional company name of the contact

Array of objects (ValueWithLabel)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
string

ID of the contact. Must be specified if other contacts in the same phonebook are created with a specified ID.

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (ValueWithLabel)

List of phone numbers of the contact

countryIso
string or null

Country ISO code for formatting local phone numbers. Must be set if contacts are given

description
string

The description of the phonebook

name
string

The name of the phonebook

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string

The description of the phonebook

id
required
string

ID of the phonebook

managedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

name
required
string

The name of the phonebook

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"
ownerId
required
string

** DEPRECATED **. Refer to owner field instead.

sourceId
string

ID of the phonebook's source

uploaded
required
number

UTC timestamp of the latest upload time

Request samples

Content type
application/json
{
  • "contacts": [
    • {
      • "companyName": "string",
      • "emails": [
        • {
          }
        ],
      • "firstName": "string",
      • "id": "string",
      • "jobTitle": "string",
      • "lastName": "string",
      • "phoneNumbers": [
        • {
          }
        ]
      }
    ],
  • "countryIso": "string",
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "id": "string",
  • "managedBy": "organisation",
  • "name": "string",
  • "owner": {
    • "id": "string",
    • "type": "organisation"
    },
  • "ownerId": "string",
  • "sourceId": "string",
  • "uploaded": 0
}

Delete phonebook and its contacts

Delete the specified phonebook and all of its contacts.

If id is an email address of a user, then the user's personal phonebook will be deleted.

path Parameters
id
required
string (id)

The phonebook ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Create or update a personal phonebook with contacts

Create or update a personal phonebook. Personal phonebooks are owned by a user and are not shared with other users. If the user matching the email does not already have a personal phonebook, then it will be created.

path Parameters
required
object (Email)

The email of the user that the personal phonebook is owned by

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the personal phonebook to be created or updated

Array of objects (ContactInput)

The list of contacts belonging to this phonebook

Array
companyName
string or null

Optional company name of the contact

Array of objects (ValueWithLabel)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
string

ID of the contact. Must be specified if other contacts in the same phonebook are created with a specified ID.

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (ValueWithLabel)

List of phone numbers of the contact

countryIso
string or null

Country ISO code for formatting local phone numbers. Must be set if contacts are given

description
string

The description of the phonebook

name
string

The name of the phonebook

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string

The description of the phonebook

id
required
string

ID of the phonebook

managedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

name
required
string

The name of the phonebook

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"
ownerId
required
string

** DEPRECATED **. Refer to owner field instead.

sourceId
string

ID of the phonebook's source

uploaded
required
number

UTC timestamp of the latest upload time

Request samples

Content type
application/json
{
  • "contacts": [
    • {
      • "companyName": "string",
      • "emails": [
        • {
          }
        ],
      • "firstName": "string",
      • "id": "string",
      • "jobTitle": "string",
      • "lastName": "string",
      • "phoneNumbers": [
        • {
          }
        ]
      }
    ],
  • "countryIso": "string",
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "id": "string",
  • "managedBy": "organisation",
  • "name": "string",
  • "owner": {
    • "id": "string",
    • "type": "organisation"
    },
  • "ownerId": "string",
  • "sourceId": "string",
  • "uploaded": 0
}

Contacts

Contacts represent external contacts to your organisation. Spoke uses contacts in each phonebook to identify incoming callers and to allow Spoke users to search and place calls.

Add a new contact to a phonebook

Add the given contact to an existing phonebook. Replace the contact if the given ID matches an existing once. Other contacts in the phonebook are not modified.

If id is an email address of a user, then the given contact will be added to the user's personal phonebook.

path Parameters
id
required
string (id)

The phonebook ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

New contacts to add and required metadata

required
object (ContactInput)
companyName
string or null

Optional company name of the contact

Array of objects (ValueWithLabel)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
string

ID of the contact. Must be specified if other contacts in the same phonebook are created with a specified ID.

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (ValueWithLabel)

List of phone numbers of the contact

countryIso
string or null

Country ISO code for formatting local phone numbers

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
companyName
string or null

Optional company name of the contact

Array of objects (Email)

Optional list of emails of the contact

Array
email
string or null

Email address

label
required
string

Email label e.g. work, personal

firstName
string or null

Optional first name of the contact

id
required
string

The ID of the contact

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (PhoneNumber)

List of phone numbers of the contact

Array
label
required
string

Number label e.g. work, home

numberDisplay
required
string

Formatted for display or what the user provided

numberE164
string or null

Formatted as E164 number if the number is valid

numberRaw
required
string

The number provided with all white spaces removed for searchability

phonebookId
required
string

The ID of the phonebook this contact belongs to

phonebookManagedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

phonebookName
string

The name of the phonebook this contact belongs to

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"

Request samples

Content type
application/json
{
  • "contact": {
    • "companyName": "string",
    • "emails": [
      • {
        • "label": "string",
        • "value": "string"
        }
      ],
    • "firstName": "string",
    • "id": "string",
    • "jobTitle": "string",
    • "lastName": "string",
    • "phoneNumbers": [
      • {
        • "label": "string",
        • "value": "string"
        }
      ]
    },
  • "countryIso": "string"
}

Response samples

Content type
application/json
{
  • "companyName": "string",
  • "emails": [
    • {
      • "email": "string",
      • "label": "string"
      }
    ],
  • "firstName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "lastName": "string",
  • "phoneNumbers": [
    • {
      • "label": "string",
      • "numberDisplay": "string",
      • "numberE164": "string",
      • "numberRaw": "string"
      }
    ],
  • "phonebookId": "string",
  • "phonebookManagedBy": "organisation",
  • "phonebookName": "string",
  • "phonebookOwner": {
    • "id": "string",
    • "type": "organisation"
    }
}

Get phonebook contact

Retrieve the specified contact from an existing phonebook.

If id is an email address of a user, then the specified contact will be retrieved from the user's personal phonebook.

path Parameters
id
required
string (id)

The phonebook ID

contactId
required
string (contactId)

The contact ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
companyName
string or null

Optional company name of the contact

Array of objects (Email)

Optional list of emails of the contact

Array
email
string or null

Email address

label
required
string

Email label e.g. work, personal

firstName
string or null

Optional first name of the contact

id
required
string

The ID of the contact

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (PhoneNumber)

List of phone numbers of the contact

Array
label
required
string

Number label e.g. work, home

numberDisplay
required
string

Formatted for display or what the user provided

numberE164
string or null

Formatted as E164 number if the number is valid

numberRaw
required
string

The number provided with all white spaces removed for searchability

phonebookId
required
string

The ID of the phonebook this contact belongs to

phonebookManagedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

phonebookName
string

The name of the phonebook this contact belongs to

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"

Response samples

Content type
application/json
{
  • "companyName": "string",
  • "emails": [
    • {
      • "email": "string",
      • "label": "string"
      }
    ],
  • "firstName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "lastName": "string",
  • "phoneNumbers": [
    • {
      • "label": "string",
      • "numberDisplay": "string",
      • "numberE164": "string",
      • "numberRaw": "string"
      }
    ],
  • "phonebookId": "string",
  • "phonebookManagedBy": "organisation",
  • "phonebookName": "string",
  • "phonebookOwner": {
    • "id": "string",
    • "type": "organisation"
    }
}

Update an existing contact

Update an existing contact in a phonebook with the new data.

If id is an email address of a user, then the contact in the user's personal phonebook will be updated.

path Parameters
id
required
string (id)

The phonebook ID

contactId
required
string (contactId)

The contact ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the contact to be updated

required
object (ContactInput)
companyName
string or null

Optional company name of the contact

Array of objects (ValueWithLabel)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
string

ID of the contact. Must be specified if other contacts in the same phonebook are created with a specified ID.

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (ValueWithLabel)

List of phone numbers of the contact

countryIso
string or null

Country ISO code for formatting local phone numbers

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
companyName
string or null

Optional company name of the contact

Array of objects (Email)

Optional list of emails of the contact

Array
email
string or null

Email address

label
required
string

Email label e.g. work, personal

firstName
string or null

Optional first name of the contact

id
required
string

The ID of the contact

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

required
Array of objects (PhoneNumber)

List of phone numbers of the contact

Array
label
required
string

Number label e.g. work, home

numberDisplay
required
string

Formatted for display or what the user provided

numberE164
string or null

Formatted as E164 number if the number is valid

numberRaw
required
string

The number provided with all white spaces removed for searchability

phonebookId
required
string

The ID of the phonebook this contact belongs to

phonebookManagedBy
required
string (PhonebookManagedBy)
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

phonebookName
string

The name of the phonebook this contact belongs to

required
OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner)
Any of
id
required
string

The ID of the organisation

type
required
string

The owner type of the phonebook. When this value is organisation, the phonebook is owned by the organisation and is accessible by all users from the organisation.

Value: "organisation"

Request samples

Content type
application/json
{
  • "contact": {
    • "companyName": "string",
    • "emails": [
      • {
        • "label": "string",
        • "value": "string"
        }
      ],
    • "firstName": "string",
    • "id": "string",
    • "jobTitle": "string",
    • "lastName": "string",
    • "phoneNumbers": [
      • {
        • "label": "string",
        • "value": "string"
        }
      ]
    },
  • "countryIso": "string"
}

Response samples

Content type
application/json
{
  • "companyName": "string",
  • "emails": [
    • {
      • "email": "string",
      • "label": "string"
      }
    ],
  • "firstName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "lastName": "string",
  • "phoneNumbers": [
    • {
      • "label": "string",
      • "numberDisplay": "string",
      • "numberE164": "string",
      • "numberRaw": "string"
      }
    ],
  • "phonebookId": "string",
  • "phonebookManagedBy": "organisation",
  • "phonebookName": "string",
  • "phonebookOwner": {
    • "id": "string",
    • "type": "organisation"
    }
}

Delete a contact

Delete the specified contact from an existing phonebook.

If id is an email address of a user, then the contact will be deleted from the user's personal phonebook.

path Parameters
id
required
string (id)

The phonebook ID

contactId
required
string (contactId)

The contact ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Contact Events

Contact-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

contact.shared Webhook

Request Body schema: application/json

Occurs whenever a new contact is shared by a user, specifying that they would like this contact to be added or updated in an externally connected system.

A contact can be shared by a user from the Spoke Phone application in the following ways:

  • Adding a contact from the External Directory
  • Adding a contact for an unknown phone number associated with a call, either from the Participants tab of a live call or from the details of a Call History item
  • Adding a contact for an unknown phone number participant in a conversation

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
ContactSharedWithAddActionEventData (object) or ContactSharedWithUpdateActionEventData (object) (ContactEventData)
Any of
action
required
string

Indicates that a new contact has been shared, with the user specifying that they would like this contact to be added to an externally connected system.

Value: "add"
required
object (NewContactShared)

The details of the new contact that was shared by the user.

required
object (SharedContactContext)

The details about the activity in which the contact was shared.

This field will be an empty object if the contact was shared from the External directory.

required
object (ContactSharedByUser)

The user who shared the contact.

This field identifies the entry for the user in the Spoke directory.

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "contact.shared"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.930Z",
  • "data": {
    • "action": "add",
    • "contact": {
      • "companyName": "Weber Inc",
      • "emails": [
        • {
          },
        • {
          }
        ],
      • "firstName": "Laurie",
      • "id": "02a654ca-56eb-4d95-b1b5-59d72cb95986",
      • "jobTitle": null,
      • "lastName": "Bartell",
      • "phoneNumbers": [
        • {
          }
        ],
      • "phonebookId": "2317e5b1-eb13-48fc-af60-80b60f3a0db7",
      • "phonebookName": "Open-source logistical concept"
      },
    • "context": {
      • "data": {
        • "answeredAt": "2026-06-05T05:57:18.932Z",
        • "assignedUser": {
          },
        • "companyNumber": "+13165707315",
        • "contactNumber": "+10561655290",
        • "direction": "inbound",
        • "directoryTarget": {
          },
        • "forms": [ ],
        • "highlights": [ ],
        • "id": "c486aec6-f20a-48b9-841b-88bf2d5b51d9",
        • "initiator": "+15336645826",
        • "isConference": false,
        • "isInternal": false,
        • "lastModifiedAt": "2026-06-05T05:57:18.931Z",
        • "lastModifiedTimestamp": 1780639038931,
        • "parties": [
          ],
        • "recipient": "d1672a17-a184-4fad-b5e7-df209d376382",
        • "recordings": [ ],
        • "startedAt": "2026-06-05T05:57:18.931Z",
        • "startedTimestamp": 1780639038931,
        • "status": "started",
        • "summary": {
          },
        • "user": {
          },
        • "vendor": "twilio",
        • "vendorCallId": "CA614DABBC6E3441D38BE626D1C51527C3",
        • "waitTime": 13937,
        • "waitTimeText": "a few seconds"
        },
      • "type": "call"
      },
    • "sharedByUser": {
      • "displayName": "Kelly Heaney DVM",
      • "email": "Jodi.Shanahan14@gmail.com",
      • "id": "9961dc22-f0e2-4cf6-b5e7-dd08e63805dc"
      }
    },
  • "id": "f310567f-7ab1-4f7f-84fc-3567e67ab513",
  • "timestamp": 1780639038930,
  • "type": "contact.shared",
  • "version": "2020-07-15"
}

Calls

Call related data for all calls made or received on the Spoke platform by your organisation. Query these endpoints to retrieve comprehensive call data records that can then be imported into a BI tool or stored as call activities in your CRM system.

List calls

Lists your calls. You can restrict the result set using any of the following parameters:

  • since (unix timestamp): Only return calls that started on or after the given timestamp.
  • before (unix timestamp): Only return calls that started on or before the given timestamp.
  • modified (unix timestamp): Only return calls that have been modified since the given timestamp. We recommend you use this parameter if you are regularly polling the API to retrieve the latest calls. The modified timestamp will be updated if a user stores additional notes against a call after the call has ended.
  • includeActive: Return all calls, active and ended. By default, this is false and only ended calls are returned.

These parameters may be used in combination (i.e. get all calls between since and before that have been updated after modified).

This endpoint supports paging. By default the API will return 100 calls, configurable up to a maximum of 1000 calls at a time. If the result from a previous call includes a next value in the result set you can use the value returned as tne next parameter in the query string to retrieve the next page of results.

query Parameters
next
string (next)

Optional next token for object pagination

limit
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

since
string (since)

Get all matching created since (UNIX timestamp)

before
string (before)

Get all matching records created before (UNIX timestamp)

modified
string (modified)

Get all records modified since (UNIX timestamp)

includeActive
string (includeActive)

Set this value as true to get all calls, active and ended. Set it as false to get only ended calls. Defaults to false.

includeRecordingUrl
string (includeRecordingUrl)

Set this value as true to get recording URLs for call recordings, voicemail and highlights. Set it as false to omit the URLs. Defaults to true.

sortOrder
string (sortOrder)

The order of results returned when listing calls.

One of the following values:

  • ascending: Sort results in ascending order (oldest first). By default, the results will be sorted using the lastModifiedTimestamp field. If the since or before parameter is specified, the results will be sorted using the startedTimestamp field.
  • descending: Sort results in descending order (latest first). By default, the results will be sorted using the lastModifiedTimestamp field. If the since or before parameter is specified, the results will be sorted using the startedTimestamp field.

By default, the results will be sorted in ascending order using the lastModifiedTimestamp field.

contactNumber
string (contactNumber)

Only return calls where the contactNumber field matches the parameter value. The parameter value must be provided in +E164 format.

Use this parameter to find calls for a given external party such as a customer.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
Array of objects (Call)
Array
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

Response samples

Content type
application/json
{
  • "calls": [
    • {
      • "answeredAt": "string",
      • "assignedCallGroup": {
        • "displayName": "string",
        • "extension": "string",
        • "id": "string",
        • "overriddenDisplayName": "string",
        • "type": "team"
        },
      • "assignedContact": {
        • "companyName": "string",
        • "emails": [
          ],
        • "firstName": "string",
        • "id": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "phoneNumbers": [
          ],
        • "phonebookId": "string",
        • "phonebookManagedBy": "organisation",
        • "phonebookName": "string"
        },
      • "assignedUser": {
        • "email": "string",
        • "firstName": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "location": "string",
        • "manager": {
          },
        • "mobile": "string",
        • "userId": "string"
        },
      • "companyNumber": "string",
      • "contactNumber": "string",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "string",
        • "email": "string",
        • "extension": "string",
        • "id": "string",
        • "overriddenDisplayName": "string",
        • "type": "string"
        },
      • "duration": 0,
      • "durationText": "string",
      • "endedAt": "string",
      • "forms": [
        • {
          }
        ],
      • "highlights": [
        • {
          }
        ],
      • "id": "string",
      • "initiator": "string",
      • "isConference": true,
      • "isInternal": true,
      • "lastModifiedAt": "string",
      • "lastModifiedTimestamp": 0,
      • "notes": [
        • {
          }
        ],
      • "outcome": {
        • "reason": "dataAction",
        • "status": "abandoned"
        },
      • "parties": [
        • {
          }
        ],
      • "passthroughParameters": { },
      • "recipient": "string",
      • "recordings": [
        • {
          }
        ],
      • "startedAt": "string",
      • "startedTimestamp": 0,
      • "status": "string",
      • "summary": {
        • "companyNumberDescription": "string",
        • "contactNumberDescription": "string",
        • "header": "string",
        • "outcome": "string"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "string",
        • "firstName": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "location": "string",
        • "manager": {
          },
        • "mobile": "string",
        • "userId": "string"
        },
      • "vendor": "twilio",
      • "vendorCallId": "string",
      • "voicemail": {
        • "duration": 0,
        • "durationText": "string",
        • "id": "string",
        • "recordingUrl": "string",
        • "recordingUrlExpiresTimestamp": 0,
        • "transcription": "string",
        • "transcriptionConfidence": 0
        },
      • "waitTime": 0,
      • "waitTimeText": "string"
      }
    ],
  • "meta": {
    • "next": "string"
    }
}

Get a call

Get a call resource by ID.

path Parameters
id
required
string (id)

The call ID

query Parameters
includeRecordingUrl
string (includeRecordingUrl)

Set this value as true to get recording URLs for call recordings, voicemail and highlights. Set it as false to omit the URLs. Defaults to true.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

Any of
displayName
string

The display name of the entry in the Spoke directory. This field is equivalent to the displayName field for a directory entry in the Spoke Directory API.

extension
string

The extension of the entry in the Spoke directory.

id
required
string

The unique ID of the entry in the Spoke directory

overriddenDisplayName
string

The overridden display name of the team in the Spoke directory.

Refer to Team Call Data Action for how to override the display name of a team.

type
required
string

The type of the entry in the Spoke directory. This value will be always be team for an assigned team call.

Value: "team"
AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

Any of
companyName
string or null

Optional company name of the contact

Array of objects (Email)

Optional list of emails of the contact

firstName
string or null

Optional first name of the contact

id
string

The ID of the contact

jobTitle
string or null

Optional job title of the contact

lastName
string or null

Optional last name of the contact

Array of objects (PhoneNumber)

List of phone numbers of the contact

phonebookId
string

The ID of the phonebook this contact belongs to

phonebookManagedBy
string
Enum: "organisation" "user"

Specifies whether the phonebook is managed by the phonebook owner or by the organisation via the Spoke API.

Possible values:

  • organisation: Contacts in the phonebook can only be managed by the organisation administrators via the Spoke API. For a personal phonebook, the owner of the phonebook will have read access to contacts but cannot update or delete any contacts.
  • user: For phonebooks owned by a user only. Contacts in the phonebook can only be managed by the owner of the phonebook. Contacts will not be accessible via the Spoke API for Read, Update or Delete operations.

When accessed via the Spoke API, this value will always be organisation.

phonebookName
string

The name of the phonebook this contact belongs to

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

email
string or null

User's email address (as registered in Spoke)

firstName
string or null

User's first name

jobTitle
string or null

User's job title (as registered in Spoke)

lastName
string or null

User's last name

location
string or null

User’s location (as registered in Spoke)

ManagerUserDirectoryEntry (object) or (any or null)
mobile
string or null

User's mobile number (as registered in Spoke)

This will be omitted if the organisation is configured to exclude mobile numbers from API responses

userId
required
string

The id of the user

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

displayName
string

The display name of the entry in the Spoke directory. This field is equivalent to the displayName field for a directory entry in the Spoke Directory API.

email
string

For an entry of type user contains the email address of the entry. Not populated for other types.

extension
string

The extension of the entry in the Spoke directory.

id
required
string

The unique ID of the entry in the Spoke directory

overriddenDisplayName
string

The overridden display name of the entry in the Spoke directory.

Refer to Team Call Data Action for how to override the display name of a team. Overriding display name for user, device, trunkUser, trunkDevice and trunkQueue is not currently possible.

type
required
string

The type of the entry in the Spoke directory. One of user, team, device, trunkUser, trunkDevice, trunkQueue

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array
description
required
string

The description of the form

formData
object

The data submitted in the form

id
required
string

The id of the form

name
required
string

The name of the form

reference
required
string

Your reference for this form

startedAt
required
string

Date/Time (UTC - ISO8601 format) when the user started the form

startedTimestamp
required
number

Unix timestamp when the user started the form

status
required
string (FormStatus)
Enum: "started" "submitted"
submittedAt
string

Date/Time (UTC - ISO8601 format) when the user submitted the form

submittedTimestamp
number

Unix timestamp when the user submitted the form

type
required
string

The type of form

Value: "conversation"
required
object (User)

A User represents a user of the Spoke platform.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

Array
createdAt
required
string

Date/Time (UTC - ISO8601 format) when the user creates the highlight

required
object (User)

A User represents a user of the Spoke platform.

createdTimestamp
required
number

Unix timestamp when the user creates the highlight

duration
number

Duration of the highlight recording in seconds

This will be omitted if the recording is not yet available

durationText
string

Duration of the highlight recording in (mm:ss) format

This will be omitted if the recording is not yet available

id
required
string

The id of the highlight

recordingStartedAt
string

Date/Time (UTC - ISO8601 format) when the highlight recording starts

This will be omitted if the recording is not yet available

recordingStartedTimestamp
number

Unix timestamp when the highlight recording starts

This will be omitted if the recording is not yet available

recordingUrl
string

URL of the highlight for retrieval

The URL is a signed url that expires one hour after the highlight was recorded. To get a newly signed URL, GET the call resource from the /calls/:id API endpoint.

This will be omitted if

  • the recording is not yet available
  • the query parameter includeRecordingUrl is set to false
recordingUrlExpiresTimestamp
number

Expiry time (unix timestamp) of the signed url. After this time the recording will no longer be retrievable.

This will be omitted if

  • the recording is not yet available
  • the query parameter includeRecordingUrl is set to false
tags
Array of strings

Tags associated with the highlight

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

Array
createdAt
required
string

Date/Time (UTC - ISO8601 format) that the note was originally created.

required
object (User)

A User represents a user of the Spoke platform.

createdTimestamp
required
number

Unix timestamp that the note was originally created.

id
required
string

The id of the note.

locale
required
string

The ISO language and country code (e.g. en-NZ) used by the transcription engine for transcribing the note contents.

required
Array of objects (NoteContent)

A list of individual note content items.

A NoteContent object represents an individually transcribed item within a Note. It is possible for a user to edit the content field prior to saving the note, in which case the edited flag will be set to true, and the transcriptionConfidence value will be set to 1.

As a general rule of thumb, transcriptionConfidence values > 0.93 will have good quality transcription and need little editing.

noteText
required
string

Note text. This is a calculated field and is created by concatenating the content fields from individual NoteContent items, separated by \n\n

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

string or (any or null)

The outcome reason of the call.

Populated for inbound calls with outcome status of missed or abandoned.

For missed calls, one of:

  • noOneAvailable: Spoke was unable to offer the call to any users
  • noOnePickedUp: The call was offered to one or more users but no one picked up
  • outsideBusinessHours: The call was received outside business hours

For abandoned calls, one of:

  • earlyOfferAbandon: The caller disconnected within 5 seconds of the call being offered to a user
  • ivrAbandon: The caller disconnected before the call was offered to any users

Populated for outbound calls with outcome status of blocked.

For blocked calls, one of:

  • dataAction: The configured Outbound Call Data Action endpoint returned a "blocked" dial permission for the call

This field will be null for answered calls.

status
required
string (CallOutcomeStatus)
Enum: "abandoned" "answered" "blocked" "missed"

The outcome status of the call. One of:

  • answered
  • missed
  • abandoned
  • blocked
Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

Array
required
Array of objects (CallPartyConnection)

A list of connections on this call for this party. May be empty if the party did not answer any dial attempts.

required
Array of objects (CallPartyDial)

A list of dial attempts to the call party during this call. This list includes unanswered dials resulting from team call offers, DDI calls, transfers, forwards and conference group adds.

displayValue
required
string

Possible values:

  • user and device types: the display name of the party in the Spoke Directory.
  • phone types: If there is a matching phonebook contact, this field will contain the display name field from the contact, otherwise this field will contain the party's phone number in international format (e.g. +1 650-822-1060)
email
string

For a party of type user contains the email address of the entry. Not populated for other types.

extension
string

The extension of the entry in the Spoke directory. Only populated when isInternal = true

id
required
string

The id of the call party. Possible values:

  • user and device types: the id of the party in the Spoke Directory.
  • phone types: The party's phone number in +E164 format (e.g. +16508221060)
isInternal
required
boolean

Whether this party is internal to the system. true for user and device types, false otherwise.

timezone
string

For a party of type user contains the timezone of the user. A user's timezone is detected automatically in the Spoke Client and is updated on changes in availability.

Timezone is represented as an IANA timezone database name (e.g. America/Los_Angeles).

type
required
string (CallPartyType)
Enum: "device" "phone" "user"

The type of the call party. One of:

  • user: A user on the Spoke platform
  • device: A device on the Spoke platform such as a SIP device
  • phone: A PSTN connected phone
passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

Array
callId
required
string

The ID of the call this recording belongs to

channels
required
number (RecordingChannels)
Enum: 1 2

The number of channels in the recording. One of:

  • 1: mono
  • 2: stereo
duration
required
number

Duration of the call recording in seconds

fileSize
required
number

The size of the call recording file in bytes

id
required
string

The ID of the call recording

mimeType
required
string (RecordingMimeType)
Enum: "audio/mpeg" "audio/wav"

The MIME type of the recording. One of:

  • audio/mpeg
  • audio/wav
startedAt
required
string

Date/Time (UTC - ISO8601 format) when the call recording started

object (CallRecordingTranscript)

The transcript of the call recording

url
string

URL of the recording for retrieval.

The URL is a signed URL that expires six hours after the call was recorded. To get a newly signed URL, GET the call resource from the /calls/:id API endpoint.

If the query parameter includeRecordingUrl is set to false, this will be omitted.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

companyNumberDescription
string

One line text description of the company phone number that was used for this call:

  • Inbound: If the call direction is inbound then this will be the number that the external party called (company number, team or personal DDI)
  • Outbound: If the call direction is outbound then this will be the caller id that was user.

Examples of this field are:

  • Called in to +64 9 888 0680
  • Called out from +64 9 888 0680
contactNumberDescription
string

One line text description of the external call party:

  • Inbound: If call direction is inbound then this will be the caller ID of the external party.
  • Outbound: If the call direction is outbound then this will be the number that was called.

Examples of this field are:

  • Inbound: Called in from +64 21 888 111
  • Outbound: Called out to +64 21 888 111

Phone number will be in an international +E164 (display) format. If the external party has masked their caller id then the phone number value will be "ANONYMOUS" or other similar undialable value.

header
required
string

One line description of call, for example:

  • Inbound call {to (Engineering|Joseph Brealey)} from Isabella Rose-Torres
  • Outbound call from Joseph Brealey to John Smith
outcome
string

The outcome of the call. This is a short summary of what happened to the call and depends on a number of factors:

  • Whether the call was answered
  • If the call was transferred to any other Spoke users

Examples of this field:

  • Answered by Joseph Brealey, transferred to Joanna Brown.
  • Unanswered call
object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

required
Array of objects (ConnectedPartyTariff)
total
required
number

The total cost of the call as calculated by the tariffing engine

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

email
string or null

User's email address (as registered in Spoke)

firstName
string or null

User's first name

jobTitle
string or null

User's job title (as registered in Spoke)

lastName
string or null

User's last name

location
string or null

User’s location (as registered in Spoke)

ManagerUserDirectoryEntry (object) or (any or null)
mobile
string or null

User's mobile number (as registered in Spoke)

This will be omitted if the organisation is configured to exclude mobile numbers from API responses

userId
required
string

The id of the user

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

duration
required
number

Duration of the voicemail recording in seconds

durationText
required
string

Duration of the voicemail recording in (mm:ss) format

id
required
string

The ID of the voicemail

recordingUrl
string

URL of the voicemail for retrieval.

The URL is a signed URL that expires six hours after the voicemail was recorded. To get a newly signed URL, GET the call resource from the /calls/:id API endpoint.

If the query parameter includeRecordingUrl is set to false, this will be omitted.

recordingUrlExpiresTimestamp
number

Expiry time (unix timestamp) of the signed URL. After this time the recording will no longer be retrievable.

If the query parameter includeRecordingUrl is set to false, this will be omitted.

transcription
required
string

The automatically transcribed text of the voicemail.

transcriptionConfidence
required
number

Number between 0 and 1 representing the "confidence" of the accuracy of the speech to text transcription.

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

Response samples

Content type
application/json
{
  • "answeredAt": "string",
  • "assignedCallGroup": {
    • "displayName": "string",
    • "extension": "string",
    • "id": "string",
    • "overriddenDisplayName": "string",
    • "type": "team"
    },
  • "assignedContact": {
    • "companyName": "string",
    • "emails": [
      • {
        • "email": "string",
        • "label": "string"
        }
      ],
    • "firstName": "string",
    • "id": "string",
    • "jobTitle": "string",
    • "lastName": "string",
    • "phoneNumbers": [
      • {
        • "label": "string",
        • "numberDisplay": "string",
        • "numberE164": "string",
        • "numberRaw": "string"
        }
      ],
    • "phonebookId": "string",
    • "phonebookManagedBy": "organisation",
    • "phonebookName": "string"
    },
  • "assignedUser": {
    • "email": "string",
    • "firstName": "string",
    • "jobTitle": "string",
    • "lastName": "string",
    • "location": "string",
    • "manager": {
      • "displayName": "string",
      • "email": "string",
      • "id": "string"
      },
    • "mobile": "string",
    • "userId": "string"
    },
  • "companyNumber": "string",
  • "contactNumber": "string",
  • "direction": "inbound",
  • "directoryTarget": {
    • "displayName": "string",
    • "email": "string",
    • "extension": "string",
    • "id": "string",
    • "overriddenDisplayName": "string",
    • "type": "string"
    },
  • "duration": 0,
  • "durationText": "string",
  • "endedAt": "string",
  • "forms": [
    • {
      • "description": "string",
      • "formData": { },
      • "id": "string",
      • "name": "string",
      • "reference": "string",
      • "startedAt": "string",
      • "startedTimestamp": 0,
      • "status": "started",
      • "submittedAt": "string",
      • "submittedTimestamp": 0,
      • "type": "conversation",
      • "user": {
        • "email": "string",
        • "firstName": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "location": "string",
        • "manager": {
          },
        • "mobile": "string",
        • "userId": "string"
        }
      }
    ],
  • "highlights": [
    • {
      • "createdAt": "string",
      • "createdByUser": {
        • "email": "string",
        • "firstName": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "location": "string",
        • "manager": {
          },
        • "mobile": "string",
        • "userId": "string"
        },
      • "createdTimestamp": 0,
      • "duration": 0,
      • "durationText": "string",
      • "id": "string",
      • "recordingStartedAt": "string",
      • "recordingStartedTimestamp": 0,
      • "recordingUrl": "string",
      • "recordingUrlExpiresTimestamp": 0,
      • "tags": [
        • "string"
        ]
      }
    ],
  • "id": "string",
  • "initiator": "string",
  • "isConference": true,
  • "isInternal": true,
  • "lastModifiedAt": "string",
  • "lastModifiedTimestamp": 0,
  • "notes": [
    • {
      • "createdAt": "string",
      • "createdByUser": {
        • "email": "string",
        • "firstName": "string",
        • "jobTitle": "string",
        • "lastName": "string",
        • "location": "string",
        • "manager": {
          },
        • "mobile": "string",
        • "userId": "string"
        },
      • "createdTimestamp": 0,
      • "id": "string",
      • "locale": "string",
      • "noteContents": [
        • {
          }
        ],
      • "noteText": "string"
      }
    ],
  • "outcome": {
    • "reason": "dataAction",
    • "status": "abandoned"
    },
  • "parties": [
    • {
      • "connections": [
        • {
          }
        ],
      • "dials": [
        • {
          }
        ],
      • "displayValue": "string",
      • "email": "string",
      • "extension": "string",
      • "id": "string",
      • "isInternal": true,
      • "timezone": "string",
      • "type": "device"
      }
    ],
  • "passthroughParameters": { },
  • "recipient": "string",
  • "recordings": [
    • {
      • "callId": "string",
      • "channels": 1,
      • "duration": 0,
      • "fileSize": 0,
      • "id": "string",
      • "mimeType": "audio/mpeg",
      • "startedAt": "string",
      • "transcript": {
        • "createdAt": 0,
        • "id": "string",
        • "source": {
          },
        • "speakers": [
          ],
        • "text": "string"
        },
      • "url": "string"
      }
    ],
  • "startedAt": "string",
  • "startedTimestamp": 0,
  • "status": "string",
  • "summary": {
    • "companyNumberDescription": "string",
    • "contactNumberDescription": "string",
    • "header": "string",
    • "outcome": "string"
    },
  • "tariff": {
    • "connectedPartyTariffs": [
      • {
        • "amount": 0,
        • "direction": "inbound",
        • "durationSec": 0,
        • "initiator": "string",
        • "quantity": 0,
        • "recipient": "string",
        • "recipientCountry": "string",
        • "routeDescription": "string",
        • "total": 0,
        • "transport": "carrier",
        • "vendorCallId": "string"
        }
      ],
    • "total": 0
    },
  • "user": {
    • "email": "string",
    • "firstName": "string",
    • "jobTitle": "string",
    • "lastName": "string",
    • "location": "string",
    • "manager": {
      • "displayName": "string",
      • "email": "string",
      • "id": "string"
      },
    • "mobile": "string",
    • "userId": "string"
    },
  • "vendor": "twilio",
  • "vendorCallId": "string",
  • "voicemail": {
    • "duration": 0,
    • "durationText": "string",
    • "id": "string",
    • "recordingUrl": "string",
    • "recordingUrlExpiresTimestamp": 0,
    • "transcription": "string",
    • "transcriptionConfidence": 0
    },
  • "waitTime": 0,
  • "waitTimeText": "string"
}

Get a call recording

Get a call recording recource by ID

path Parameters
id
required
string (id)

The call ID

recordingId
required
string (recordingId)

The call recording ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
callId
required
string

The ID of the call this recording belongs to

channels
required
number (RecordingChannels)
Enum: 1 2

The number of channels in the recording. One of:

  • 1: mono
  • 2: stereo
duration
required
number

Duration of the call recording in seconds

fileSize
required
number

The size of the call recording file in bytes

id
required
string

The ID of the call recording

mimeType
required
string (RecordingMimeType)
Enum: "audio/mpeg" "audio/wav"

The MIME type of the recording. One of:

  • audio/mpeg
  • audio/wav
startedAt
required
string

Date/Time (UTC - ISO8601 format) when the call recording started

object (CallRecordingTranscript)

The transcript of the call recording

createdAt
required
number

UTC timestamp of the transcript creation

id
required
string

ID of the transcript

required
object (TranscriptSource)

The source or origin of the audio content being transcribed.

A transcript can be created from a call recording or a voicemail.

required
Array of objects (TranscriptSpeaker)

The list of speakers in the transcript

text
required
string

The full text of the transcript

If the audio source is a call recording:

  • The transcript may include JOIN and LEAVE events if any speakers join or leave the call while it's being recorded.
  • The timestamp on each line is offset from the start of the first call recording if the call has multiple recordings

Example:

"[JOIN: Alice Johnson (0:01)]\n\n[Alice Johnson (0:02)]: Hello Bob, how can I assist you today?\n\n[Bob Smith (0:05)]: Hi Alice, I cannot login into my account.\n\n[Alice Johnson (0:08)]: Okay, let me transfer to you to one of our account managers. Just a moment.\n\n[LEAVE: Alice Johnson (0:10)]\n\n[JOIN: David Young (0:20)]\n\n[David Young (0:22)]: Hi Bob, I understand you're having trouble logging into your account."

url
string

URL of the recording for retrieval.

The URL is a signed URL that expires six hours after the call was recorded. To get a newly signed URL, GET the call resource from the /calls/:id API endpoint.

If the query parameter includeRecordingUrl is set to false, this will be omitted.

Response samples

Content type
application/json
{
  • "callId": "string",
  • "channels": 1,
  • "duration": 0,
  • "fileSize": 0,
  • "id": "string",
  • "mimeType": "audio/mpeg",
  • "startedAt": "string",
  • "transcript": {
    • "createdAt": 0,
    • "id": "string",
    • "source": {
      • "contextId": "string",
      • "id": "string",
      • "type": "call"
      },
    • "speakers": [
      • {
        • "displayName": "string",
        • "email": "string",
        • "id": "string",
        • "numberE164": "string"
        }
      ],
    • "text": "string"
    },
  • "url": "string"
}

Delete a call recording

Delete the specified call recording of a call

path Parameters
id
required
string (id)

The call ID

recordingId
required
string (recordingId)

The call recording ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

List a call's content analysis data

Lists your content analysis data for a specific Spoke call ID. Only content analysis data with status succeeded are included.

You can restrict the result set using the artifact parameter to only return content analysis data that contain a specific artifact schema name.

This endpoint supports paging. By default the API will return content analysis items, configurable up to a maximum. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

path Parameters
id
required
string (id)

The call ID

query Parameters
next
string (next)

Optional next token for object pagination

limit
string (limit)

The number of objects fetched per request. Default to 5, maximum is 10

artifact
string (artifact)

Only return content analysis data that contain a specific artifact schema name

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
Array of objects (ContentAnalysis)

The content analyses matching the filters provided as query params

Array
object (ContentAnalysisAnalyzer)

The analyzer used when analyzing the content. Only populated when the analysis has started.

Array of objects (ContentAnalysisResultArtifact)

The list of artifacts created from the analysis process

object (ContentAnalysisFailure)

Details of the analysis failure. Only provided when the analysis failed.

id
required
string

The ID of the analysis

required
ContentAnalysisCallRequest (object) or ContentAnalysisAgentScorecardsRequest (object) (ContentAnalysisRequest)

The payload containing the content and related information required to be processed and analyzed.

status
required
string (ContentAnalysisStatus)
Enum: "analyzing" "failed" "queued" "succeeded" "transcribing"

The analysis status. One of:

  • queued: The request has been received and queued.
  • transcribing: The recordings provided in the request are being transcribed.
  • analyzing: The content is being analyzed.
  • succeeded: Analysis succeeded and the artifacts are available.
  • failed: Analysis failed. Check the error details for more information.
transcript
string

The transcript content that was analyzed

The source of the value on this field depends whether recordings or transcripts are provided in the request:

  • If recordings are provided, this is the combined transcript created from the recordings.
  • If transcripts are provided, this is the combined transcript from the request.
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

Response samples

Content type
application/json
{
  • "contentAnalysis": [
    • {
      • "analyzer": {
        • "name": "string",
        • "version": "string"
        },
      • "artifacts": [
        • {
          }
        ],
      • "failure": {
        • "description": "string",
        • "reason": "contentInaccessible"
        },
      • "id": "string",
      • "request": {
        • "analyzer": {
          },
        • "content": {
          },
        • "participants": [
          ],
        • "passthroughParameters": { },
        • "source": {
          }
        },
      • "status": "analyzing",
      • "transcript": "string"
      }
    ],
  • "meta": {
    • "next": "string"
    }
}

Call Events

Call-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

call.answered Webhook

Request Body schema: application/json

Occurs whenever a party answers a call. A party could either be a Spoke User or an external contact, depending on whether the call direction is inbound or outbound.

This event may fire multiple times for a single call. For example, if a call is transferred from one user to another, then this event will fire for each user who has answered the call. To determine the most recent user who answered the call, check the assignedUser field in the CallEventData payload.

Note: This event does not fire for internal (user to user) calls or for Spoke conference calls.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.answered"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.892Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.895Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Maia13@gmail.com",
        • "firstName": "Gladys",
        • "jobTitle": "Future Configuration Manager",
        • "lastName": "Renner",
        • "mobile": "+16880610687",
        • "userId": "696bd2bf-0128-4aa6-872d-c3f482e415d5"
        },
      • "companyNumber": "+18684863625",
      • "contactNumber": "+16200855728",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Holly Gorczany",
        • "email": "Cheryl_Hettinger-Considine50@hotmail.com",
        • "extension": 3123196,
        • "id": "c423c046-08b2-40b8-92c5-57805e795b89",
        • "type": "user"
        },
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "4e512160-cc00-402b-9b9e-00fc46926899",
      • "initiator": "+14687528227",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.894Z",
      • "lastModifiedTimestamp": 1780639038894,
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "4fee7377-e272-41a8-82aa-aabab88a91e7",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.894Z",
      • "startedTimestamp": 1780639038894,
      • "status": "started",
      • "summary": {
        • "companyNumberDescription": "Called in to +17871853775",
        • "contactNumberDescription": "Called in from +17282925824",
        • "header": "Inbound call from +18791392275 to Conner Hauck IV"
        },
      • "user": {
        • "email": "Domingo52@gmail.com",
        • "firstName": "Elmore",
        • "jobTitle": "Senior Program Liaison",
        • "lastName": "Hagenes",
        • "mobile": "+11805703255",
        • "userId": "5332d5e4-35d7-42a9-898e-53db83276e8c"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CACA149A2EE48E47178B41879B39507214",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "9df6cda2-6a24-404c-a578-1aa90c03d7d9",
  • "timestamp": 1780639038892,
  • "type": "call.answered",
  • "version": "2020-07-15"
}

call.contact_assigned Webhook

Request Body schema: application/json

Occurs whenever a contact is assigned to a call.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.contact_assigned"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.914Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.915Z",
      • "assignedContact": {
        • "companyName": "Beer and Sons",
        • "emails": [
          ],
        • "firstName": "John",
        • "id": "67bd4ae2-7982-4788-af04-08d7179a0872",
        • "jobTitle": null,
        • "lastName": "Abbott",
        • "phoneNumbers": [
          ],
        • "phonebookId": "4cec7ec0-a52f-4eeb-84e6-1fbb0445f379",
        • "phonebookName": "nihil creptio"
        },
      • "assignedUser": {
        • "email": "Adonis_Botsford46@hotmail.com",
        • "firstName": "Jaycee",
        • "jobTitle": "Forward Operations Associate",
        • "lastName": "Mills",
        • "mobile": null,
        • "userId": "eed4927f-3652-4b7e-b01f-b9c6efb13ab7"
        },
      • "companyNumber": "+16820354336",
      • "contactNumber": "+18282806607",
      • "direction": "outbound",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "b1a3c2ce-449a-4c30-8fa3-4ebb5d37b53d",
      • "initiator": "87019e0a-e54d-4299-b40c-922b2a30462b",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.915Z",
      • "lastModifiedTimestamp": 1780639038915,
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "+10955784031",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.915Z",
      • "startedTimestamp": 1780639038915,
      • "status": "started",
      • "summary": {
        • "companyNumberDescription": "Called out from +18680889158",
        • "contactNumberDescription": "Called out to +17009706077",
        • "header": "Outbound call to Lynette Gorczany from Andrew Jacobson"
        },
      • "user": {
        • "email": "Ted47@hotmail.com",
        • "firstName": "Stanford",
        • "jobTitle": "Customer Assurance Liaison",
        • "lastName": "Veum",
        • "mobile": null,
        • "userId": "62c96a73-9dd0-41f6-8da5-a632c71b3fce"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CAA73CA2120D004454A1AFA7EBDA464F48",
      • "waitTime": 5359,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "65e433ef-1366-4eef-ac40-b554b7085cb0",
  • "timestamp": 1780639038914,
  • "type": "call.contact_assigned",
  • "version": "2020-07-15"
}

call.contact_assigned_with_add Webhook

Request Body schema: application/json

DEPRECATED: This event has been deprecated and will be removed in a future version of the API. Please use the contact.shared event instead.

Occurs whenever a contact is assigned to a call with the user specifying that they would like this user to be added to an externally connected system.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.contact_assigned_with_add"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.916Z",
  • "data": {
    • "call": {
      • "assignedCallGroup": {
        • "displayName": "Charley Bednar",
        • "extension": 5439916,
        • "id": "5ab4c70c-1aba-46fb-b566-aca8d973d286",
        • "type": "team"
        },
      • "assignedContact": {
        • "emails": [
          ],
        • "firstName": "Shelia",
        • "lastName": "Ferry",
        • "phoneNumbers": [
          ]
        },
      • "assignedUser": { },
      • "companyNumber": "+13547849439",
      • "contactNumber": "+19946471162",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Lela Walker",
        • "extension": 7169132,
        • "id": "fe356ee2-cf2d-49cb-8e9c-41f93d8dc038",
        • "type": "team"
        },
      • "duration": 59093,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.917Z",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "670c6dbd-ff3e-4f51-acd4-3fddfb18b32c",
      • "initiator": "+14348641432",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.917Z",
      • "lastModifiedTimestamp": 1780639038917,
      • "outcome": {
        • "reason": "noOneAvailable",
        • "status": "missed"
        },
      • "parties": [
        • {
          },
        • {
          },
        • {
          },
        • {
          }
        ],
      • "recipient": "+15515675075",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.917Z",
      • "startedTimestamp": 1780639038917,
      • "status": "missed",
      • "summary": {
        • "companyNumberDescription": "Called in to +14382879312",
        • "contactNumberDescription": "Called in from +18757819657",
        • "header": "Inbound call from Eulah Rippin to +10755415947",
        • "outcome": "Missed call"
        },
      • "user": { },
      • "vendor": "twilio",
      • "vendorCallId": "CA85A577CBA3CE4FEDB9BDA105AEB18710",
      • "waitTime": 59093,
      • "waitTimeText": "a minute"
      }
    },
  • "id": "812d5c0a-3acc-4c05-8f95-e2e33e1035f4",
  • "timestamp": 1780639038916,
  • "type": "call.contact_assigned_with_add",
  • "version": "2020-07-15"
}

call.contact_assigned_with_update Webhook

Request Body schema: application/json

DEPRECATED: This event has been deprecated and will be removed in a future version of the API. Please use the contact.shared event instead.

Occurs whenever a contact is assigned to a call with the user specifying that they would like this user to be updated in an externally connected system.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.contact_assigned_with_update"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.917Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.918Z",
      • "assignedContact": {
        • "companyName": "White - Huels",
        • "emails": [
          ],
        • "firstName": "Zula",
        • "id": "f0236a19-a1c9-4e80-926d-7830bf418504",
        • "jobTitle": "Corporate Interactions Assistant",
        • "lastName": "Klocko",
        • "phoneNumbers": [
          ],
        • "phonebookId": "c756e3ab-d43f-486a-83f5-89853cef5d9b",
        • "phonebookName": "avaritia auditor"
        },
      • "assignedUser": {
        • "email": "Consuelo_Cummings61@yahoo.com",
        • "firstName": "Franklin",
        • "jobTitle": "Senior Division Liaison",
        • "lastName": "Schultz",
        • "mobile": null,
        • "userId": "dfa18d00-0d4c-41ab-b572-edfb7c104c1e"
        },
      • "companyNumber": "+17405223659",
      • "contactNumber": "+10176438820",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Rashawn Herzog",
        • "email": "Mitchell22@gmail.com",
        • "extension": 5421114,
        • "id": "a4f4fca7-f675-43ab-a506-d351467d1f48",
        • "type": "user"
        },
      • "duration": 62778,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.919Z",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "c3a65d7f-4066-45b6-8509-e2a4be343165",
      • "initiator": "+15662719410",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.919Z",
      • "lastModifiedTimestamp": 1780639038919,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          },
        • {
          }
        ],
      • "recipient": "1c8b8187-ef11-4e3d-aade-73910fc13497",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.919Z",
      • "startedTimestamp": 1780639038919,
      • "status": "accepted",
      • "summary": {
        • "companyNumberDescription": "Called in to +19956895457",
        • "contactNumberDescription": "Called in from +16498139403",
        • "header": "Inbound call from +11604484978 to Winfield Maggio",
        • "outcome": "Answered by Ian Schneider. Transferred to Ira Jacobs MD. Spoke for a minute"
        },
      • "user": {
        • "email": "Sarai_Bernier@hotmail.com",
        • "firstName": "Lynne",
        • "jobTitle": "Principal Branding Representative",
        • "lastName": "Purdy-Rath",
        • "mobile": "+10191959610",
        • "userId": "28cbbe8b-572c-4fb4-aa49-d2e6118a4533"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA47DD665E2F0B45F58AA49382F495D051",
      • "waitTime": 12180,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "1479dfdd-b138-48f1-bf33-3292815d9d6d",
  • "timestamp": 1780639038917,
  • "type": "call.contact_assigned_with_update",
  • "version": "2020-07-15"
}

call.ended Webhook

Request Body schema: application/json

Occurs whenever a call ends.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.ended"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.901Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.902Z",
      • "assignedContact": {
        • "companyName": "Kulas - Dickinson",
        • "emails": [
          ],
        • "firstName": "Presley",
        • "id": "1f0211a3-f089-4e21-a050-db291aa2b91f",
        • "jobTitle": null,
        • "lastName": "Ebert-Ledner",
        • "phoneNumbers": [
          ],
        • "phonebookId": "2178395d-5667-41fb-b6ad-72752e49035a",
        • "phonebookName": "casso vespillo"
        },
      • "assignedUser": {
        • "email": "Jevon47@gmail.com",
        • "firstName": "Zoila",
        • "jobTitle": "Global Usability Architect",
        • "lastName": "Herzog",
        • "mobile": null,
        • "userId": "b4a7b685-6159-443a-9830-377dfdae677b"
        },
      • "companyNumber": "+10280125888",
      • "contactNumber": "+16223617560",
      • "direction": "outbound",
      • "duration": 76603,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.902Z",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "7c180b49-6637-44ad-805a-615a1e71b0cf",
      • "initiator": "bdd0c2bb-ec6b-4bfc-b688-bed06ff89508",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.902Z",
      • "lastModifiedTimestamp": 1780639038902,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "+13545953385",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.902Z",
      • "startedTimestamp": 1780639038902,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called out from +17491986755",
        • "contactNumberDescription": "Called out to +15524392012",
        • "header": "Outbound call to George Hamill from Dwayne Bashirian",
        • "outcome": "Spoke for a minute"
        },
      • "user": {
        • "email": "Olivia.Macejkovic29@hotmail.com",
        • "firstName": "Willie",
        • "jobTitle": "Direct Markets Coordinator",
        • "lastName": "Prohaska",
        • "mobile": null,
        • "userId": "71b35825-a47e-4512-8798-64f74803e9f3"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA76F9A4C43AA8428695875E810BF066A5",
      • "waitTime": 5359,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "c57d5266-cda2-481a-a861-2cbf7496748a",
  • "timestamp": 1780639038901,
  • "type": "call.ended",
  • "version": "2020-07-15"
}

call.form.started Webhook

Request Body schema: application/json

Signifies that a user has selected a custom form to enter data relating to the call.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallFormEventData)
required
object (Call)
required
object (Form)
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.form.started"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.919Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.920Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Amani_Grimes72@hotmail.com",
        • "firstName": "Asa",
        • "jobTitle": "District Brand Engineer",
        • "lastName": "McKenzie",
        • "mobile": "+16707946544",
        • "userId": "8d532a05-2548-42bf-a1e7-be90464d4b0a"
        },
      • "companyNumber": "+14423152726",
      • "contactNumber": "+13666503963",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Aaron Auer DDS",
        • "email": "Ludwig15@gmail.com",
        • "extension": 3397246,
        • "id": "62c2dd89-0b3e-4798-9c05-ebe2221093aa",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.921Z",
      • "forms": [
        • {
          }
        ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "463435e3-868e-407d-a563-5e89f2a64d74",
      • "initiator": "+15900801886",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.920Z",
      • "lastModifiedTimestamp": 1780639038921,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "f2954e18-a785-4ee8-a70a-4456d9f16e6b",
      • "recordings": [
        • {
          }
        ],
      • "startedAt": "2026-06-05T05:57:18.920Z",
      • "startedTimestamp": 1780639038921,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +15739770819",
        • "contactNumberDescription": "Called in from +13239142975",
        • "header": "Inbound call from +17268587187 to Delfina Ryan",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Amari.Runolfsdottir68@yahoo.com",
        • "firstName": "Loren",
        • "jobTitle": "Principal Infrastructure Technician",
        • "lastName": "Moen",
        • "mobile": "+13796582245",
        • "userId": "ad24920d-2eea-45b6-af16-a5d8c6acd90d"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CAF746619C90944B4CB6293B737B41482D",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      },
    • "form": {
      • "description": null,
      • "id": "79d3fbd5-74c9-4c35-a47c-5e3fad84e6ef",
      • "name": "ultio studio",
      • "reference": "corporis",
      • "startedAt": "2026-06-05T05:57:18.920Z",
      • "startedTimestamp": 1780639038920,
      • "status": "started",
      • "type": "conversation",
      • "user": {
        • "email": "Inez97@hotmail.com",
        • "firstName": "Lizzie",
        • "jobTitle": "Customer Operations Specialist",
        • "lastName": "Quitzon",
        • "mobile": "+17794770050",
        • "userId": "584b3ef6-ba76-4006-b678-e57df7f5feeb"
        }
      }
    },
  • "id": "bcdec794-f50b-4217-a3cf-9c4a97689791",
  • "timestamp": 1780639038919,
  • "type": "call.form.started",
  • "version": "2020-07-15"
}

call.form.submitted Webhook

Request Body schema: application/json

Signifies that a user has completed entering data relating to a call and has submitted the form.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallFormEventData)
required
object (Call)
required
object (Form)
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.form.submitted"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.921Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.923Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Velva57@yahoo.com",
        • "firstName": "Darnell",
        • "jobTitle": "Principal Branding Developer",
        • "lastName": "Conn",
        • "mobile": "+10266371222",
        • "userId": "f1fbf1d0-9408-48b4-ae31-bcd89cb46cd4"
        },
      • "companyNumber": "+12430846124",
      • "contactNumber": "+12978769634",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Enrique Goyette",
        • "email": "Edwina.Mante@gmail.com",
        • "extension": 3579828,
        • "id": "db7a9eb2-3755-4132-b71b-f30c034ac360",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.923Z",
      • "forms": [
        • {
          }
        ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "efa7c0c0-3524-4891-b5eb-ee22932c9c45",
      • "initiator": "+16301455233",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.923Z",
      • "lastModifiedTimestamp": 1780639038923,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "12b39c0a-71ef-43d3-9293-55d5250dc79c",
      • "recordings": [
        • {
          }
        ],
      • "startedAt": "2026-06-05T05:57:18.923Z",
      • "startedTimestamp": 1780639038923,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +15396033979",
        • "contactNumberDescription": "Called in from +12146555501",
        • "header": "Inbound call from +14819718815 to Eva Howe",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Bert_Hickle83@hotmail.com",
        • "firstName": "Berta",
        • "jobTitle": "Forward Security Facilitator",
        • "lastName": "Haag",
        • "mobile": "+13352288754",
        • "userId": "57b3ccf1-32ce-4489-a304-b98f4169da0f"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA72BE12A4336D459A80038EC6CCD89511",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      },
    • "form": {
      • "description": null,
      • "formData": {
        • "accidentCarLocation": [
          ],
        • "accidentDate": "2024-02-01",
        • "accidentDesc": "Denuo consuasor verecundia commodi utpote quod. Canonicus depraedor coma tendo angulus advenio curis. Undique ipsa sapiente. Nulla decumbo utrimque.",
        • "accidentTime": "08:25:00",
        • "firstName": "Ethan",
        • "lastName": "Bauch",
        • "mainDriver": "Yes",
        • "phoneNumber": "+17531203256",
        • "repairsEstimate": "$100000"
        },
      • "id": "6c446417-9cf4-439e-8de2-371497bc2373",
      • "name": "clementia volubilis",
      • "reference": "subvenio",
      • "startedAt": "2026-06-05T05:57:18.922Z",
      • "startedTimestamp": 1780639038922,
      • "status": "started",
      • "submittedAt": "2026-06-05T05:57:18.922Z",
      • "submittedTimestamp": 1780639038922,
      • "type": "conversation",
      • "user": {
        • "email": "Marianne.McGlynn58@yahoo.com",
        • "firstName": "Mason",
        • "jobTitle": "Customer Tactics Manager",
        • "lastName": "Schimmel",
        • "mobile": "+15311438181",
        • "userId": "01cd8cca-5341-4db1-91f5-83ebc448cbc0"
        }
      }
    },
  • "id": "6923ea4f-9441-440f-86aa-2e7cbcf6d6eb",
  • "timestamp": 1780639038921,
  • "type": "call.form.submitted",
  • "version": "2020-07-15"
}

call.highlight.created Webhook

Request Body schema: application/json

Occurs whenever a user presses the highlight button in a call.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallHighlightEventData)
required
object (Call)
required
object (Highlight)
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.highlight.created"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.909Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.910Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Marguerite.Donnelly64@hotmail.com",
        • "firstName": "Santina",
        • "jobTitle": "Direct Identity Liaison",
        • "lastName": "Koepp",
        • "mobile": "+12758426997",
        • "userId": "4e50e73e-7667-4665-8aea-24481fffe7e6"
        },
      • "companyNumber": "+19414220633",
      • "contactNumber": "+10206387827",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Todd Kilback",
        • "email": "Gregory.Jerde82@gmail.com",
        • "extension": 440495,
        • "id": "af8c0772-3f50-48b1-b120-f14cc1061445",
        • "type": "user"
        },
      • "forms": [ ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "1aab1db3-d80a-4fb0-853f-f464e47fcc38",
      • "initiator": "+13295875637",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.910Z",
      • "lastModifiedTimestamp": 1780639038910,
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "737cf48c-c45d-4829-9da6-23af09e3a50e",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.910Z",
      • "startedTimestamp": 1780639038910,
      • "status": "started",
      • "summary": {
        • "companyNumberDescription": "Called in to +14487221528",
        • "contactNumberDescription": "Called in from +12124077868",
        • "header": "Inbound call from +17736856980 to Edgar Carter"
        },
      • "user": {
        • "email": "Eulah6@hotmail.com",
        • "firstName": "Isaias",
        • "jobTitle": "Customer Response Developer",
        • "lastName": "Bosco",
        • "mobile": "+15832018132",
        • "userId": "a773f135-e9d5-45f3-aaae-00bfaf19a940"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CAAEE92F90F0324143B4AD89D144C6DC97",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      },
    • "highlight": {
      • "createdAt": "2026-06-05T05:57:18.909Z",
      • "createdByUser": {
        • "email": "Donna.Predovic@yahoo.com",
        • "firstName": "Conrad",
        • "jobTitle": "Forward Communications Director",
        • "lastName": "Bahringer",
        • "mobile": "+16795557085",
        • "userId": "1b5e37fa-8f18-4a80-bb5f-b0634252799d"
        },
      • "createdTimestamp": 1780639038909,
      • "id": "e911cc18-22d8-4cc0-8c12-063c4df92150",
      • "tags": [
        • "corpus"
        ]
      }
    },
  • "id": "bebcd6ce-2cd5-4b50-9303-6d5c32192dbb",
  • "timestamp": 1780639038909,
  • "type": "call.highlight.created",
  • "version": "2020-07-15"
}

call.highlight.recording_available Webhook

Request Body schema: application/json

Occurs whenever the recording for the highlight is available.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallHighlightEventData)
required
object (Call)
required
object (Highlight)
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.highlight.recording_available"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.910Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.911Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Jamie58@yahoo.com",
        • "firstName": "Melanie",
        • "jobTitle": "District Identity Architect",
        • "lastName": "Kub",
        • "mobile": "+12379945982",
        • "userId": "00f73f78-92ed-405b-9db0-13a66f19cd2b"
        },
      • "companyNumber": "+18889779863",
      • "contactNumber": "+13131490884",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Tommie Rodriguez",
        • "email": "Mildred.Heller-Shanahan77@hotmail.com",
        • "extension": 5283874,
        • "id": "455aafa6-84ad-45e6-b60b-8fcab4948728",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.911Z",
      • "forms": [ ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "958fab00-d5b0-425b-ab60-08a56d2fc957",
      • "initiator": "+12059839330",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.912Z",
      • "lastModifiedTimestamp": 1780639038912,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "775f148c-4d18-4f89-aa6b-3fc80b36472c",
      • "recordings": [
        • {
          }
        ],
      • "startedAt": "2026-06-05T05:57:18.912Z",
      • "startedTimestamp": 1780639038912,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +17362276924",
        • "contactNumberDescription": "Called in from +16376435805",
        • "header": "Inbound call from +12309142489 to Dalton Spencer",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Ashley.Stehr78@yahoo.com",
        • "firstName": "Micah",
        • "jobTitle": "District Integration Consultant",
        • "lastName": "Nolan",
        • "mobile": "+13658183283",
        • "userId": "0fe14a25-33f6-46eb-a107-6676588342b7"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA65163BA20A8F4B6281ED92702B882BD8",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      },
    • "highlight": {
      • "createdAt": "2026-06-05T05:57:18.911Z",
      • "createdByUser": {
        • "email": "Natalie_Kshlerin@gmail.com",
        • "firstName": "Shakira",
        • "jobTitle": "Lead Branding Coordinator",
        • "lastName": "Bergstrom",
        • "mobile": "+13905035886",
        • "userId": "f82eed97-2f6c-4892-9b99-ec05f884c886"
        },
      • "createdTimestamp": 1780639038911,
      • "duration": 30,
      • "durationText": "0:30",
      • "id": "5cfb012c-a4ac-4a18-b7c6-e28e2185d108",
      • "recordingStartedAt": "2026-06-05T05:57:18.913Z",
      • "recordingStartedTimestamp": 1780639038913,
      • "recordingUrlExpiresTimestamp": 1780639038913,
      • "tags": [
        • "cura"
        ]
      }
    },
  • "id": "7c393bb1-e967-4bc1-b186-0ed5571de9a6",
  • "timestamp": 1780639038910,
  • "type": "call.highlight.recording_available",
  • "version": "2020-07-15"
}

call.hungup Webhook

Request Body schema: application/json

Occurs whenever a call party hangs up. This event fires each time a party leaves the call.

Note: This event does not fire for internal (user to user) calls or for Spoke conference calls.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.hungup"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.898Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.899Z",
      • "assignedContact": {
        • "companyName": "Weissnat and Sons",
        • "emails": [
          ],
        • "firstName": "Shari",
        • "id": "490ad4fc-5894-4324-aa24-11e28e97bda6",
        • "jobTitle": null,
        • "lastName": "Aufderhar",
        • "phoneNumbers": [
          ],
        • "phonebookId": "19a0095a-6664-4462-bb27-81600f0b5ba3",
        • "phonebookName": "deficio cursus"
        },
      • "assignedUser": {
        • "email": "Nancy_Hartmann@yahoo.com",
        • "firstName": "Megan",
        • "jobTitle": "Global Directives Producer",
        • "lastName": "Jacobs",
        • "mobile": null,
        • "userId": "13086667-39dc-473c-9dea-f916d238bb5b"
        },
      • "companyNumber": "+12602832430",
      • "contactNumber": "+10490078150",
      • "direction": "outbound",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "60a2f326-6f34-4758-a388-43d7324d40de",
      • "initiator": "101a14b2-7dc8-4522-b6ba-fe30e0fd3e45",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.899Z",
      • "lastModifiedTimestamp": 1780639038900,
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "+12766876674",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.899Z",
      • "startedTimestamp": 1780639038900,
      • "status": "started",
      • "summary": {
        • "companyNumberDescription": "Called out from +16695941777",
        • "contactNumberDescription": "Called out to +18049976563",
        • "header": "Outbound call to Yolanda Volkman-Orn from Isai Hilpert",
        • "outcome": "Spoke for a minute"
        },
      • "user": {
        • "email": "Lenora21@hotmail.com",
        • "firstName": "Susan",
        • "jobTitle": "District Intranet Designer",
        • "lastName": "Corkery",
        • "mobile": null,
        • "userId": "d2ff9147-9187-4685-b28e-b959e346e7a1"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA82684C49D37A46B7AB2238591C6DF4E5",
      • "waitTime": 5359,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "bdb4b82d-0a7c-4be0-9f3b-82c6e1d9187b",
  • "timestamp": 1780639038898,
  • "type": "call.hungup",
  • "version": "2020-07-15"
}

call.not_answered Webhook

Request Body schema: application/json

Occurs whenever a call goes unanswered:

  1. For an inbound call to a Spoke team, this event will fire when the call is unanswered, and goes to voicemail or rolls over to another group
  2. For an inbound call to a Spoke user or device, this event will fire when the user rejects the call OR if the call goes to voicemail
  3. For an outbound call to a contact, this event will fire if the party rejects the call and the call does not go to voicemail. If the call goes to voicemail then the call is treated as answered, and a call.answered event will be fired instead.

Note: This event does not fire for internal (user to user) calls or for Spoke conference calls.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.not_answered"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.895Z",
  • "data": {
    • "call": {
      • "assignedContact": { },
      • "assignedUser": { },
      • "companyNumber": "+13638272157",
      • "contactNumber": "+19575008150",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Mariano Schuster",
        • "email": "Salvatore_Hermann8@yahoo.com",
        • "extension": 8257332,
        • "id": "6e6ce9a4-affa-4bac-ae7a-e4ad445610f2",
        • "type": "user"
        },
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "750cb184-6427-4740-b449-9149fe8a736f",
      • "initiator": "+14071235586",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.896Z",
      • "lastModifiedTimestamp": 1780639038896,
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "3fb7ed35-d80f-4b3d-abaf-1f74d97e6c33",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.896Z",
      • "startedTimestamp": 1780639038896,
      • "status": "started",
      • "summary": {
        • "companyNumberDescription": "Called in to +12113139645",
        • "contactNumberDescription": "Called in from +11501170450",
        • "header": "Inbound call from +15596655689 to Joaquin Veum"
        },
      • "user": { },
      • "vendor": "twilio",
      • "vendorCallId": "CA35252E65EFE84274BF50A592A3C3158C"
      }
    },
  • "id": "b563bdf0-f1b2-4214-9c83-3a0415224e71",
  • "timestamp": 1780639038895,
  • "type": "call.not_answered",
  • "version": "2020-07-15"
}

call.note.created Webhook

Request Body schema: application/json

Occurs whenever a user creates a new note for a call.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallNoteEventData)
required
object (Call)
required
object (Note)
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.note.created"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.907Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.908Z",
      • "assignedContact": {
        • "companyName": null,
        • "contactId": "d75bdbf8-2316-48eb-b506-c9a4bb8c6729",
        • "emails": [
          ],
        • "firstName": "Eunice",
        • "id": "c2908add-9f76-4e66-819d-7ba2fefe2e0f",
        • "jobTitle": null,
        • "lastName": "Monahan",
        • "phoneNumbers": [
          ],
        • "phonebookId": "4892d8b3-b969-4031-8e39-8009ca0d5493",
        • "phonebookName": "Intuitive local pricing structure"
        },
      • "assignedUser": {
        • "email": "Dewey22@yahoo.com",
        • "firstName": "Kristy",
        • "jobTitle": "Customer Quality Officer",
        • "lastName": "Conroy",
        • "mobile": null,
        • "userId": "b681bba4-fca5-428e-beae-634f954bd471"
        },
      • "companyNumber": "+19098440791",
      • "contactNumber": "+17096340770",
      • "direction": "outbound",
      • "duration": 39574,
      • "durationText": "a few seconds",
      • "endedAt": "2026-06-05T05:57:18.908Z",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "c26b5e79-f0f2-42e6-af6f-270846131a8c",
      • "initiator": "ba6a1709-f9c2-4612-b3e4-3811c6dbcf65",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.908Z",
      • "lastModifiedTimestamp": 1780639038908,
      • "notes": [
        • {
          }
        ],
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "+11575261515",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.908Z",
      • "startedTimestamp": 1780639038908,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called out from +18147199258",
        • "contactNumberDescription": "Called out to +16333383964",
        • "header": "Outbound call to Constance Boyer from Jonas Gerhold",
        • "outcome": "Spoke for a few seconds"
        },
      • "user": {
        • "email": "Luz_Lynch-Monahan88@hotmail.com",
        • "firstName": "Vergie",
        • "jobTitle": "Future Research Producer",
        • "lastName": "D'Amore",
        • "mobile": null,
        • "userId": "3a7ef053-efd0-4b4c-90ec-df501a7a744b"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CACD08FB40A41D4E45BEE30A72E38D59D5",
      • "waitTime": 2347,
      • "waitTimeText": "a few seconds"
      },
    • "note": {
      • "createdAt": "2026-06-05T05:57:18.908Z",
      • "createdByUser": {
        • "email": "Janet_Farrell@hotmail.com",
        • "firstName": "Julius",
        • "jobTitle": "Customer Accountability Strategist",
        • "lastName": "Purdy",
        • "mobile": null,
        • "userId": "576aed21-79e0-47c0-adc2-8c311617c620"
        },
      • "createdTimestamp": 1780639038908,
      • "id": "bb9f1182-b4ed-4979-8f07-9af16f34a92c",
      • "noteContents": [
        • {
          }
        ],
      • "noteText": "Totus carpo succurro tempora. Tabesco sollers denego ascit cresco adfectus reprehenderit pecus angulus demo. Ait pax repudiandae eius titulus. Tametsi adsum vulgo amicitia ratione depopulo cum civis. Vilitas suggero cenaculum usus quas vomer."
      }
    },
  • "id": "f73534c1-9b72-4baf-be9f-4f893bd2f78b",
  • "timestamp": 1780639038907,
  • "type": "call.note.created",
  • "version": "2020-07-15"
}

call.recording.available Webhook

Request Body schema: application/json

Occurs whenever the recording of the call becomes available.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallRecordingEventData)
required
object (Call)
required
object (Recording)
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.recording.available"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.903Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.904Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Gabriella26@hotmail.com",
        • "firstName": "Mathew",
        • "jobTitle": "Corporate Interactions Planner",
        • "lastName": "Nikolaus",
        • "mobile": "+10948613868",
        • "userId": "b37291fe-05dd-47cb-92e2-5284dfc5ba4d"
        },
      • "companyNumber": "+17474280449",
      • "contactNumber": "+11981905508",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Mr. Sandra Olson",
        • "email": "Michelle13@gmail.com",
        • "extension": 8626878,
        • "id": "0d186d20-7233-4af1-a202-a9992257d8c3",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.904Z",
      • "forms": [ ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "9613706c-b7e2-46ea-b4e9-43584c9a3bdc",
      • "initiator": "+14269502566",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.904Z",
      • "lastModifiedTimestamp": 1780639038904,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "80ccdcd6-c83d-4b24-aa4e-0979c0c32cad",
      • "recordings": [
        • {
          }
        ],
      • "startedAt": "2026-06-05T05:57:18.904Z",
      • "startedTimestamp": 1780639038904,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +18659627761",
        • "contactNumberDescription": "Called in from +15305808159",
        • "header": "Inbound call from +10069777579 to Dr. Marshall Bashirian",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Edward9@yahoo.com",
        • "firstName": "Ralph",
        • "jobTitle": "Lead Assurance Designer",
        • "lastName": "Ernser",
        • "mobile": "+18819835624",
        • "userId": "6d9964d9-a8b1-44b1-8f42-8ed0b1cbe50b"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CAAD72BFE03CDD411498CAEF75A751747B",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      },
    • "recording": {
      • "callId": "9613706c-b7e2-46ea-b4e9-43584c9a3bdc",
      • "channels": 2,
      • "duration": 732,
      • "fileSize": 439,
      • "id": "11cc5b94-0a33-4c1f-90f6-1a46a9c29cb1",
      • "mimeType": "audio/mpeg",
      • "startedAt": "2026-06-05T05:57:18.904Z",
      }
    },
  • "id": "887bdb5c-f70a-4649-8842-b414105ed128",
  • "timestamp": 1780639038903,
  • "type": "call.recording.available",
  • "version": "2020-07-15"
}

call.started Webhook

Request Body schema: application/json

Occurs whenever a call starts on the Spoke platform.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.started"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.887Z",
  • "data": {
    • "call": {
      • "assignedContact": { },
      • "assignedUser": { },
      • "companyNumber": "+19343495169",
      • "contactNumber": "+18924809771",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Noemie Dicki MD",
        • "email": "Savannah4@gmail.com",
        • "extension": 4470604,
        • "id": "66043deb-718f-4610-bea3-6b4021902e5f",
        • "type": "user"
        },
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "620eb435-49a4-433e-b37d-b8fd05c58d1b",
      • "initiator": "+15804801840",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.889Z",
      • "lastModifiedTimestamp": 1780639038889,
      • "parties": [
        • {
          }
        ],
      • "recipient": "d3510d10-e182-4d76-9ac5-b2c0ccf8b747",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.890Z",
      • "startedTimestamp": 1780639038890,
      • "status": "started",
      • "summary": {
        • "companyNumberDescription": "Called in to +12294051085",
        • "contactNumberDescription": "Called in from +14685330404",
        • "header": "Inbound call from +16874625757 to Tomas Leuschke"
        },
      • "user": { },
      • "vendor": "twilio",
      • "vendorCallId": "CAF43C3098AF134B51BC595FBE5E6FDFAF"
      }
    },
  • "id": "5badada9-a3a5-4a2a-8e0b-5bed66eb30f1",
  • "timestamp": 1780639038887,
  • "type": "call.started",
  • "version": "2020-07-15"
}

call.tariffed Webhook

Request Body schema: application/json

Occurs once a call has been tariffed by the Spoke Call Tariffing engine. Happens shortly after call.ended.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.tariffed"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.924Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.924Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Katherine55@yahoo.com",
        • "firstName": "Luther",
        • "jobTitle": "District Metrics Strategist",
        • "lastName": "Gerhold",
        • "mobile": "+12019740279",
        • "userId": "5008e22f-3453-48d2-abd2-5098ce071231"
        },
      • "companyNumber": "+14820798221",
      • "contactNumber": "+11207742518",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Jan Kunze MD",
        • "email": "Oliver.Hickle7@hotmail.com",
        • "extension": 4519991,
        • "id": "033f78a0-2ac9-41f2-8887-254fc1adbe99",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.924Z",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "12d2383f-78d5-47fb-8c25-38a99379cf69",
      • "initiator": "+14555262561",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.924Z",
      • "lastModifiedTimestamp": 1780639038924,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "c6e3b006-ceaa-4979-a5ec-c5d411d3f807",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.925Z",
      • "startedTimestamp": 1780639038925,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +10693854698",
        • "contactNumberDescription": "Called in from +15769223501",
        • "header": "Inbound call from +11422910239 to Teresa Considine",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Gerald_Stamm@hotmail.com",
        • "firstName": "Cameron",
        • "jobTitle": "Central Factors Engineer",
        • "lastName": "Nitzsche",
        • "mobile": "+13834179846",
        • "userId": "4ba87593-3da2-499d-bd32-acde72363095"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CAABB9022B129B4D9E8FC1D1B8F88CF407",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "25882cd0-2441-4786-b6ba-c14f09233877",
  • "timestamp": 1780639038924,
  • "type": "call.tariffed",
  • "version": "2020-07-15"
}

call.transcript.created Webhook

Request Body schema: application/json

Occurs whenever a transcript of a call recording is created.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallTranscriptEventData)
required
object (Call)
required
object (Transcript)

The transcript

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.transcript.created"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.925Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.927Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Freddie_Runolfsson@hotmail.com",
        • "firstName": "Ted",
        • "jobTitle": "Lead Communications Manager",
        • "lastName": "Kuhn",
        • "mobile": "+12634045378",
        • "userId": "2b21988f-850b-48b9-a2e0-b9ba3a4847dc"
        },
      • "companyNumber": "+19640467753",
      • "contactNumber": "+13589753842",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Dr. Michael Ebert",
        • "email": "Melody_Moen@yahoo.com",
        • "extension": 7585582,
        • "id": "8b82b25a-4aed-4275-bb1e-8266d1e26fcd",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.927Z",
      • "forms": [ ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "940e47a9-c4f6-40d5-8252-99f3b247c786",
      • "initiator": "+12462380204",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.927Z",
      • "lastModifiedTimestamp": 1780639038927,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "1232dc12-f6c1-4d3c-af2f-d25ec129ad59",
      • "recordings": [
        • {
          }
        ],
      • "startedAt": "2026-06-05T05:57:18.927Z",
      • "startedTimestamp": 1780639038927,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +10207787944",
        • "contactNumberDescription": "Called in from +19792029800",
        • "header": "Inbound call from +15146324661 to Cody Volkman",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Erick_Gutmann85@gmail.com",
        • "firstName": "Irvin",
        • "jobTitle": "Global Infrastructure Specialist",
        • "lastName": "Stokes",
        • "mobile": "+14122359719",
        • "userId": "70cbb5b0-3915-4c20-9ef2-a937ccedc2eb"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA1398D53718284885859A2B64272576B8",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      },
    • "transcript": {
      • "createdAt": 1780639038926,
      • "id": "3f0b575b-b355-45ee-865b-69689acf5ac4",
      • "source": {
        • "contextId": "940e47a9-c4f6-40d5-8252-99f3b247c786",
        • "id": "0794a761-5192-4d51-9ea0-c2134f7305e2",
        • "type": "call"
        },
      • "speakers": [
        • {
          }
        ],
      • "text": "Soleo pauper error conspergo vox aptus deorsum unus. Hic crapula capto vinitor tristis tam. Excepturi aequitas turbo tripudio conitor bellum vivo. Articulus comedo usitas addo ante spero alias. Occaecati deripio degusto audentia deorsum accommodo spargo. Admoveo comburo thesaurus totus tumultus. Demo tergum animi xiphias correptius tenax. Comptus sonitus concedo vallum ipsum dapifer consequatur vulgivagus. Carcer verumtamen adopto vitiosus alo. Cum mollitia blanditiis adeptio cauda. Ocer accedo cetera voluntarius adfero adulescens spoliatio capillus caelestis. Tondeo complectus iure. Acies perferendis contabesco illum. Desolo pel conspergo argumentum deinde stultus odit vero utrimque. Uterque spiculum theatrum perferendis. Caries vehemens quae tergeo vinco solutio truculenter aliquid. Antiquus absens calculus currus aequus. Nostrum uterque adipisci. Agnosco voluntarius spiritus. Cometes synagoga delicate strues tactus dedecor toties damno. Spiculum tonsor cetera provident volubilis eos delicate molestiae. Cernuus vomica nulla alias nihil volva argentum. Turbo adaugeo comparo. Versus virga adstringo canto. Crustulum spoliatio facilis derelinquo decumbo alius credo surculus benigne eos. Suscipit timor adfero auctor aequitas via cupio caute amiculum delego. Contabesco arbitro possimus demo cotidie cum ager ademptio synagoga crux. Vitae causa accusator acsi vis caveo vos utilis cupiditas. Turba vesica nobis tepidus confido una claro adfectus desidero. Ademptio eveniet demoror amissio illo talio comparo occaecati vulpes corpus. Constans pax uredo argumentum. Defendo amiculum tantillus decretum ullam trans chirographum cruciamentum acceptus aurum. Colligo studio stipes conduco solutio suggero utrimque confido angustus repellendus. Vere creber vulgaris atrox. Cenaculum calculus decretum corona defluo rem defungo benigne arca. Speculum abscido pecco comparo. Maxime neque voluptatum derelinquo solitudo ullam doloremque unde vigor stultus. Depulso arbustum advoco cubicularis solitudo candidus textor veritatis reprehenderit. Tutamen deleniti caste tamen. Alii conicio ustilo debilito adsuesco coniuratio demulceo debitis vigor clibanus. Temporibus cicuta curiositas cometes cuius annus aeger alienus solus. Considero terra calco soleo alter quas solum conventus apparatus. Clam beatae benigne aegrotatio adstringo vesco vinum decor. Argumentum taceo caelestis varius. Allatus via talis provident ater. Deprecator accusamus attero subnecto deludo atque. Basium sodalitas excepturi pecto. Versus timor aer appono error sollers subvenio vel coerceo. Viscus ulterius deripio cruciamentum verumtamen tumultus circumvenio. Inventore vix vetus spiculum utrum acidus."
      }
    },
  • "id": "9c0c7aa1-ee72-41b6-b811-6773b5dfe69e",
  • "timestamp": 1780639038925,
  • "type": "call.transcript.created",
  • "version": "2020-07-15"
}

call.transcription_completed Webhook

Request Body schema: application/json

Signifies that the transcription process for the call is completed. This event will only fire once for calls with multiple recordings.

Note: This event only fires for recorded calls with transcription enabled.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallEventData)
required
object (Call)
answeredAt
string

Date/Time (UTC - ISO8601 format) that this call started

AssignedCallGroup (object) or (any or null)

The team assigned to the call. This is a calculated value and is determined as the last team that is offered the call.

This field will be null for calls that are sent directly to users or phone numbers.

AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the call.

object (AssignedCallUser)

The user assigned to the call. This is a calculated value and is determined as the last user on the call

companyNumber
string or null

The company number that originated or terminated this call. This will be one of the numbers defined in the Spoke Phone Number settings page.

This field will be null for Spoke internal calls (where isInternal is true).

contactNumber
string or null

The phone number of the external party that originated or terminated this call. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

Possible values:

  • null: This field will be blank for Spoke internal calls (where isInternal is true).
  • ANONYMOUS: If the external party has masked their caller id then this field will contain the value ANONYMOUS
  • +E164 Number: A phone number in +E164 format (e.g. +16508221060)
direction
required
string (CallDirection)
Enum: "inbound" "outbound"

Call direction. One of the following values:

  • inbound: An incoming call to Spoke Phone from an external caller
  • outbound: An outgoing call from Spoke Phone to another caller
object (CallDirectoryEntry)

For inbound calls, contains the directory entry the call was originally routed to/intended for. For outbound calls, this field will be empty.

In the case of calls to teams where roll-over rules have applied, this field will contain the first "offered" team only.

duration
number

Duration of the call in milliseconds.

durationText
string

Duration of the call in human readable form

endedAt
string

Date/Time (UTC - ISO8601 format) that this call ended or the caller hung up

Array of objects (Form)

A list of forms started or submitted for this call.

A Form represents a form started or submitted by a Spoke user, during the call, at the end of the call, or at any time after the call has ended.

Array of objects (Highlight)

A list of highlights for this call.

A Highlight represents a snapshot of the call, taken at a point in time by a Spoke user, with one or more optional tags selected.

It is possible to have multiple Highlights in a call, and each Highlight may have multiple tags associated with it.

id
required
string

The id of the call

initiator
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

isConference
required
boolean

Indicates whether the call was a Spoke conference call.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

isInternal
required
boolean

Indicates whether the call was an internal (Spoke User to Spoke User) call. If this flag is true then there was no external party on the call, and the contactNumber and companyNumber fields will be empty.

This field is provided to simplify integration with CRM platforms. As there is no 'customer' or external party involved in the call these calls can be excluded from CRM call logs.

Webhook events call.answered, call.not_answered, call.hungup will not fire for calls where this field is set to true

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that this call was last modified.

lastModifiedTimestamp
required
number

Unix timestamp that this call record was last modified.

Array of objects (Note)

A list of notes recorded against a call.

A Note represents a note recorded by a Spoke user at the end of the call, or at any time after the call has ended The note is first transcribed and then optionally edited by the user.

It is possible to store multiple Notes against a call, and each Note can have multiple NoteContent items for each paragraph of text recorded.

object (CallOutcome)

The final outcome of the call. Populated for all calls, once the call has ended.

For inbound calls that are unanswered (i.e. missed or abandoned) this field contains further details about the reason for the outcome.

For outbound calls that are blocked this field contains further details about the reason for the outcome.

Array of objects (CallParty)

A list of the parties on this call. Each call will consist of at least one, and possibly many, call parties.

A call party represents a User, Device or in the case of external parties, an E164 PSTN phone number.

It is possible for a party to leave and then rejoin a call via transfer or conference. Each instance of the party joining the call is represented by a separate entry in the connections attribute of the call party.

passthroughParameters
object

Passthrough parameters associated with the call. Use passthrough parameters to initiate and trace calls from other systems.

Passthrough parameters can be associated with a call via the following mechanisms.

  • Deep linking - dialing a call via the Spoke App
  • Redirect - redirecting a call to Spoke from Twilio
  • Data Action - returning passthrough parameters in response to a call related data action request.

The parameter names and values are URL decoded, safety checked and stored on input and no additional processing is performed.

recipient
required
string

** DEPRECATED **. Use the contactNumber and companyNumber fields instead.

Array of objects (Recording)

All recordings associated with this call.

It is possible for a call to have more than one recording if the organisation has the ad-hoc recording option enabled. This option allows users to toggle recording on and off during the call. In this case there will be one recording per "on" period.

startedAt
required
string

Date/Time (UTC - ISO8601 format) that this call started.

startedTimestamp
required
number

Unix timestamp that this call was started

status
required
string

Status of the call. One of the following values:

  • started
  • offered
  • missed
  • accepted
  • ended
  • abandoned
  • blocked
required
object (CallSummary)

Human readable call summary suitable for inserting into call note fields in CRM platforms.

Currently these are provided in English language only.

object (Tariff)

The overall call tariff calculated by Spoke's call tariffing engine.

Note: This field is only populated when the optional "Call Tariffing API" add-on is enabled.

For BYOT Customers:

  • Tariffing does not meter calls that are not carried by Spoke. For example, Flex-only or Studio-only calls will not be metered.
  • Due to the asynchronous nature of the Twilio platform, call durations are likely to differ on Spoke vs Twilio.
  • Incoming calls that are initially handled through Studio before being redirected to Spoke will have their start time as the time the Spoke Redirect Handler was called. In these cases, the total time for an inbound call tariffed on Spoke will not include the time the caller was interacting with Studio.

All calls are tariffed in real time. This field will be populated once the call has ended.

Tariffing does not meter other services such as call recording.

Tariffs are calculated based on the following factors:

  • The number of connected call parties. An answered call has a minimum of two call party connections.

  • Each party is tariffed based on a call route. There are a number of factors which determine a call route, including the mode of transport (e.g. Spoke Client, SIP or PSTN), and, in the case of PSTN calls, the initiator and recipient numbers

  • If a a user leaves and then rejoins a call via transfer or conference, each instance will be treated as a separate party for the purpose of tariffing. Each party connection is identifiable by vendorCallId for reconciliation against external systems

  • Call duration. By default, the Spoke tariffing engine tariffs calls rounded up to the nearest minute. This means that a connection which is 10 seconds long will be billed with a quantity of 1, similarly a connection which is 75 seconds long will be billed with a quantity of 2

  • The total call cost is calculated as the sum of the individual connected party tariffs.

object (FirstCallUser)

The first user on the call. This is the user who either initiated the call (for outbound calls) or answered the call (for inbound calls).

vendor
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorCallId
string

The vendor's identifier for the call. The value of this field is dependent on the value of the vendor field:

  • twilio: the CallSid of the parent call
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

waitTime
number

The length of time in milliseconds the first caller waited prior to the call being answered by a user or an external party.

If the call was answered, this field is calculated as the time difference between startedAt and answeredAt, where startedAt is the time that the call started on the Spoke platform.

For inbound calls, if the customer has interacted with the Spoke IVR, then wait time will include the IVR interaction time.

For unanswered calls this field is equivalent to the duration of the call.

waitTimeText
string

Wait time of the call in human readable form

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.transcription_completed"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.927Z",
  • "data": {
    • "call": {
      • "answeredAt": "2026-06-05T05:57:18.929Z",
      • "assignedContact": { },
      • "assignedUser": {
        • "email": "Bobby_Corkery90@gmail.com",
        • "firstName": "Blanca",
        • "jobTitle": "Internal Identity Orchestrator",
        • "lastName": "Stark",
        • "mobile": "+13057802685",
        • "userId": "2e2cedb7-f9f0-4fb4-855a-2d8a5e55b4c3"
        },
      • "companyNumber": "+10829813735",
      • "contactNumber": "+11547349643",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Willow Lebsack",
        • "email": "Emma_McGlynn@hotmail.com",
        • "extension": 7952154,
        • "id": "e166e246-9a88-4fc4-8a9f-515c7b545657",
        • "type": "user"
        },
      • "duration": 70779,
      • "durationText": "a minute",
      • "endedAt": "2026-06-05T05:57:18.930Z",
      • "forms": [ ],
      • "highlights": [
        • {
          },
        • {
          }
        ],
      • "id": "a98988a8-bf0b-4b45-aa5f-3f52ab49846c",
      • "initiator": "+13974362221",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.930Z",
      • "lastModifiedTimestamp": 1780639038930,
      • "outcome": {
        • "status": "answered"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "ea7b9f7a-e62c-40d9-ab9b-431a6bb131ab",
      • "recordings": [
        • {
          },
        • {
          }
        ],
      • "startedAt": "2026-06-05T05:57:18.930Z",
      • "startedTimestamp": 1780639038930,
      • "status": "ended",
      • "summary": {
        • "companyNumberDescription": "Called in to +17620032478",
        • "contactNumberDescription": "Called in from +11836284996",
        • "header": "Inbound call from +13032018050 to Alexie Zemlak",
        • "outcome": "Spoke for a minute"
        },
      • "tariff": {
        • "connectedPartyTariffs": [
          ],
        • "total": 0
        },
      • "user": {
        • "email": "Tyree_Kuhic@gmail.com",
        • "firstName": "Devin",
        • "jobTitle": "Forward Web Representative",
        • "lastName": "Schoen",
        • "mobile": "+13355371455",
        • "userId": "0f2202de-0d25-46fb-a1d2-22efecf71aa9"
        },
      • "vendor": "twilio",
      • "vendorCallId": "CA16109AE1765D498B810CC4DE1D227CF2",
      • "waitTime": 13937,
      • "waitTimeText": "a few seconds"
      }
    },
  • "id": "f1ad9fb3-c29b-45c8-9939-91998574b358",
  • "timestamp": 1780639038927,
  • "type": "call.transcription_completed",
  • "version": "2020-07-15"
}

call.voicemail.available Webhook

Request Body schema: application/json

Occurs whenever the voicemail for a missed call becomes available.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (CallVoicemailEventData)
required
object (Call)
required
object (Voicemail)

Voicemail associated with this call.

If a call with direction of inbound has a status of missed then there may be a voicemail recording. This provides details about the voicemail and optionally

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "call.voicemail.available"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.905Z",
  • "data": {
    • "call": {
      • "assignedContact": { },
      • "assignedUser": { },
      • "companyNumber": "+17219568678",
      • "contactNumber": "+14493760325",
      • "direction": "inbound",
      • "directoryTarget": {
        • "displayName": "Bennie Ziemann-Heaney",
        • "email": "Sam.Armstrong@gmail.com",
        • "extension": 1112268,
        • "id": "e0b35e7e-8532-4cdf-adb4-581b4fd4b62a",
        • "type": "user"
        },
      • "duration": 37315,
      • "durationText": "a few seconds",
      • "endedAt": "2026-06-05T05:57:18.906Z",
      • "forms": [ ],
      • "highlights": [ ],
      • "id": "8482c6e7-a19d-43a9-a544-9d2a2e0e27a3",
      • "initiator": "+18680116797",
      • "isConference": false,
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.906Z",
      • "lastModifiedTimestamp": 1780639038906,
      • "outcome": {
        • "reason": "noOnePickedUp",
        • "status": "missed"
        },
      • "parties": [
        • {
          },
        • {
          }
        ],
      • "recipient": "10ebfde0-ebcd-400b-b8c2-e8b6f76d5383",
      • "recordings": [ ],
      • "startedAt": "2026-06-05T05:57:18.906Z",
      • "startedTimestamp": 1780639038906,
      • "status": "missed",
      • "summary": {
        • "companyNumberDescription": "Called in to +17690803115",
        • "contactNumberDescription": "Called in from +11599356566",
        • "header": "Inbound call from +18952691321 to Lois Feil",
        • "outcome": "Missed call"
        },
      • "user": { },
      • "vendor": "twilio",
      • "vendorCallId": "CA9FD4E6C4C13547DDB171A4730D6A0DF3",
      • "voicemail": {
        • "duration": 11,
        • "durationText": "0:11",
        • "id": "c117c82f-d241-45e0-8fef-67567ad49b00",
        • "transcription": "Verbum caelum sapiente termes torqueo aequus una vae versus aggero. Argentum arcesso stella. Curo studio surgo thorax tersus arx tersus. Arx statua virgo architecto sustineo aureus.",
        • "transcriptionConfidence": 0.6608153581619263
        },
      • "waitTime": 37315,
      • "waitTimeText": "a few seconds"
      },
    • "voicemail": {
      • "duration": 11,
      • "durationText": "0:11",
      • "id": "c117c82f-d241-45e0-8fef-67567ad49b00",
      • "recordingUrl": "https://noted-coin.net/",
      • "recordingUrlExpiresTimestamp": 1780639038906,
      • "transcription": "Verbum caelum sapiente termes torqueo aequus una vae versus aggero. Argentum arcesso stella. Curo studio surgo thorax tersus arx tersus. Arx statua virgo architecto sustineo aureus.",
      • "transcriptionConfidence": 0.6608153581619263
      }
    },
  • "id": "89d408a5-bbe6-47a0-b87e-4a25bb35b396",
  • "timestamp": 1780639038905,
  • "type": "call.voicemail.available",
  • "version": "2020-07-15"
}

Conversations

Conversations represent long-running message threads between a Spoke user with an SMS enabled DDI and a customer of your organisation.

Send a new conversation message

Sends a new SMS or Group MMS message to one or more contacts. The message is associated with a conversation owned by either a Spoke Team or a Spoke Member, identified via the sender field. If a conversation between the company number and the contact address(es) exists, the message will be added to it; otherwise a new conversation is created. Note that as a result of this request being successfully processed, a conversation.message.created webhook event will be generated.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the message

assignUsers
Array of strings

Required if routingAction is assign_users. A list of user email addresses to assign to the conversation. A conversation can have up to 10 participants and users will be added to the conversation until this limit is reached. Assignment behaviour depends on the value of routingAction:

  • assign_users: Only assign the users defined in the request payload

  • assign_owner: Assign the users defined in the request payload in addition to the owner's users.

claimRule
string
Enum: "claimable" "not_claimable" "required_before_reply"

If provided, sets the claim rule for a newly created conversation. The value is ignored if the conversation already exists.

closeTimer
string

Set this value to control how long the conversation will remain open before being automatically closed by the system. The timer is reset any time a conversation is updated, including adding new messages.

Specify the timer value in ISO8601 duration format. For example, to automatically close a conversation:

  • After 12 hours: PT12H
  • After 30 days: P30D
  • After 3 months: P3M

The following are the minimum and maximum values for the field:

  • Minimum Value: 600 seconds (PT600S)
  • Maximum Value: 180 days (P180D)
contactAddresses
required
Array of strings

The numbers of the contacts to send the message to. Must be in +E164 format.

If more than one contact address is provided, the message is sent as a Group MMS message.

conversationName
string

If provided, then use the provided value to set the initial Conversation Name. This value displays in the conversations list in the Spoke application. Can be up to 100 characters long.

required
object (CreateMessageContent)
author
string or null

If included, this will show as the participant name in the conversation. It will not be visible to external participants. If not included, the name of the associated team will be used.

The sendAsUser field must not be provided when this field is provided.

body
required
string

The content of the message. Can be up to 1600 characters long. Messages longer than 160 characters will incur a per-message for each 160 character block.

sendAsUser
string or null

If included, then the message will appear in the Spoke app and conversation.message.* webhook events as if the user has sent the message. The following rules apply:

  • The value of this field must be the email address of a user in your Spoke account.
  • The user must be a participant in the conversation. To ensure the user is assigned to the conversation, specify their email address in the assignUsers array.
  • The author field must not be provided when this field is provided.
notificationMode
string
Enum: "notify_unread" "silent_read" "silent_unread"

Controls notification and unread indicators for API-delivered messages.

Defaults to notify_unread.

Values:

  • notify_unread: Sends a system notification and keeps the message unread. Use for messages that need immediate attention.

  • silent_unread: Suppresses system notifications and keeps the message unread. Use for bulk messages that users can check later.

  • silent_read: Suppresses system notifications and marks the message as read unless the conversation already has existing unread messages. Use for background delivery.

passthroughParameters
object

If provided, stores passthrough parameters against the conversation. Passthrough parameters are included in the conversation's webhook events.

Use passthrough parameters to track conversations, ensuring the outcome of a conversation can be associated correctly with your external applications (such as CRM or in-house systems).

Passthrough parameters are key-value pairs. Each key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

Example:

{
  ...
  passthroughParameters: {
    "x-contactId": "HS12345",
    "x-orderId": "ORD12345"
  }
}

If the conversation already exists and has passthrough parameters, the new parameters will be merged with the existing parameters. If a key exists in both the existing passthrough parameters and the new passthrough parameters, the new parameter value will overwrite the existing value.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

routingAction
string
Enum: "assign_owner" "assign_users" "do_not_route"

Defines whether to assign users to the conversation that is created as a result of the message.

Possible values:

  • assign_users: Assign the conversation to one or more Spoke users. If this value is used, the assignUsers parameter must be non-empty

  • do_not_route: Do not assign any Spoke users to the conversation. If the customer replies, no one will be able to respond to the customer

  • assign_owner: Assign the conversation to the owner of the company address. Currently supports team and member owners only.

required
CreateConversationMessageE164Sender (object) or CreateConversationMessageUserEmailSender (object) (CreateConversationMessageSender)

Identifies which phone number the message is sent from.

Any of
companyAddress
required
string

The company number to send from. Must be in +E164 format.

type
required
string

The type of sender.

The value for this field must be e164, signifying that the message is sent from the company phone number provided in companyAddress.

Value: "e164"

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
hasExistingConversation
required
boolean

Indicates whether the conversation already existed before this message was sent. If true, the message was added to an existing conversation. If false, a new conversation was created for this message.

vendor
required
string
Value: "twilio"

The CPaaS vendor that carried the message. One of the following values:

  • twilio
vendorConversationId
required
string

The vendor's identifier of the conversation associated with the message that was created. The value of this field is dependent on the value of the vendor field:

  • twilio: the ConversationSid of the conversation
vendorMessageId
string

The vendor's identifier of the message that was created. The value of this field is dependent on the value of the vendor field:

  • twilio: the MessageSid of the message

This field will be undefined if a new Group MMS conversation was created for this message. In this case, you should subscribe to the conversation.message.created webhook event to retrieve the message details when it is created asynchronously.

Request samples

Content type
application/json
{
  • "assignUsers": [
    • "string"
    ],
  • "claimRule": "claimable",
  • "closeTimer": "string",
  • "contactAddresses": [
    • "string"
    ],
  • "conversationName": "string",
  • "messageContent": {
    • "author": "string",
    • "body": "string",
    • "sendAsUser": "string"
    },
  • "notificationMode": "notify_unread",
  • "passthroughParameters": { },
  • "routingAction": "assign_owner",
  • "sender": {
    • "companyAddress": "string",
    • "type": "e164"
    }
}

Response samples

Content type
application/json
{
  • "hasExistingConversation": true,
  • "vendor": "twilio",
  • "vendorConversationId": "string",
  • "vendorMessageId": "string"
}

Send a new SMS message Deprecated

DEPRECATED: This endpoint has been deprecated and will be removed in a future version of the API. Please use the POST /conversationMessages endpoint instead.

Sends a new SMS message to a number on behalf of a Spoke User. The Spoke user must have an SMS enabled DDI. If a conversation between the specified user and the number exists, the message will automatically be added to the conversation. If a conversation does not exist, a new one will be created containing the message. Note that as a result of this request being successfully processed, a conversation.message.created webhook event will be generated.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the message

body
required
string

The content of the message, can be up to 1,600 characters long

closeTimer
string or null

Set this value to control how long the conversation will remain open before being automatically closed by the system. The timer is reset any time a conversation is updated, including adding new messages.

Specify the timer value in ISO8601 duration format. For example, to automatically close a conversation:

  • After 12 hours: PT12H
  • After 30 days: P30D
  • After 3 months: P3M

The following are the minimum and maximum values for the field:

  • Minimum Value: 600 seconds (PT600S)
  • Maximum Value: 180 days (P180D)
conversationName
string or null

If provided, then use the provided value to set the initial Conversation Name. This value displays in the conversations list in the Spoke application. Can be up to 100 characters long.

from
required
string

Either the user’s email address, or their SMS enabled DDI (in +E164 form). If an email address is provided, we will automatically use the user’s default SMS DDI

notifyUsers
boolean or null

Controls whether notifications for this message are sent to users.

When a conversation already exists between the company address and the contact address, setting notifyUsers to false will still notify the existing participants.

passthroughParameters
object

If provided, stores passthrough parameters against the conversation. Passthrough parameters are included in the conversation's webhook events.

Use passthrough parameters to track conversations, ensuring the outcome of a conversation can be associated correctly with your external applications (such as CRM or in-house systems).

Passthrough parameters are key-value pairs. Each key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

Example:

{
  ...
  passthroughParameters: {
    "x-contactId": "HS12345",
    "x-orderId": "ORD12345"
  }
}

If the conversation already exists and has passthrough parameters, the new parameters will be merged with the existing parameters. If a key exists in both the existing passthrough parameters and the new passthrough parameters, the new parameter value will overwrite the existing value.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

to
required
string

The recipient’s phone number in +E164 form, e.g. +61488881234 or +155512345678

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
success
required
boolean

Request samples

Content type
application/json
{
  • "body": "string",
  • "closeTimer": "string",
  • "conversationName": "string",
  • "from": "string",
  • "notifyUsers": true,
  • "passthroughParameters": { },
  • "to": "string"
}

Response samples

Content type
application/json
{
  • "success": true
}

Send a new Team SMS message Deprecated

DEPRECATED: This endpoint has been deprecated and will be removed in a future version of the API. Please use the POST /conversationMessages endpoint instead.

Sends a new SMS message to a number on behalf of a Spoke Team. The Spoke team must have an SMS enabled DDI. If a conversation between the specified team and the number exists, the message will automatically be added to the conversation. If a conversation does not exist, a new one will be created containing the message. Note that as a result of this request being successfully processed, a conversation.message.created webhook event will be generated.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the message

Any of
Array of strings or (any or null)

Required if routingAction is assign_users. A list of user email addresses to assign to the conversation. A conversation can have up to 10 participants and users will be added to the conversation until this limit is reached. Assignment behaviour depends on the value of routingAction:

  • assign_users: Only assign the users defined in the request payload

  • assign_team: Assign the users defined in the request payload in addition to the team’s users.

Any of
Array
string
channel
string

The type of the conversation channel.

This field is optional and defaults to the sms channel if not provided. If provided, the value must be sms, signifying that the message is an SMS message to a single contact.

string or (any or null)

If provided, sets the claim rule for a newly created conversation. The value is ignored if the conversation already exists.

Any of
string
Enum: "claimable" "not_claimable" "required_before_reply"

If provided, sets the claim rule for a newly created conversation. The value is ignored if the conversation already exists.

closeTimer
string or null

Set this value to control how long the conversation will remain open before being automatically closed by the system. The timer is reset any time a conversation is updated, including adding new messages.

Specify the timer value in ISO8601 duration format. For example, to automatically close a conversation:

  • After 12 hours: PT12H
  • After 30 days: P30D
  • After 3 months: P3M

The following are the minimum and maximum values for the field:

  • Minimum Value: 600 seconds (PT600S)
  • Maximum Value: 180 days (P180D)
companyAddress
required
string

The company number to use as the sender Id. Must be in +E164 format.

contactAddress
required
string

The number of the contact to send the message to. Must be in +E164 format.

conversationName
string or null

If provided, then use the provided value to set the initial Conversation Name. This value displays in the conversations list in the Spoke application. Can be up to 100 characters long.

required
object (CreateMessageContent)
author
string or null

If included, this will show as the participant name in the conversation. It will not be visible to external participants. If not included, the name of the associated team will be used.

The sendAsUser field must not be provided when this field is provided.

body
required
string

The content of the message. Can be up to 1600 characters long. Messages longer than 160 characters will incur a per-message for each 160 character block.

sendAsUser
string or null

If included, then the message will appear in the Spoke app and conversation.message.* webhook events as if the user has sent the message. The following rules apply:

  • The value of this field must be the email address of a user in your Spoke account.
  • The user must be a participant in the conversation. To ensure the user is assigned to the conversation, specify their email address in the assignUsers array.
  • The author field must not be provided when this field is provided.
notifyUsers
boolean or null

Controls whether notifications for this message are sent to users.

When a conversation already exists between the company address and the contact address(es), setting notifyUsers to false will still notify the existing participants.

passthroughParameters
object

If provided, stores passthrough parameters against the conversation. Passthrough parameters are included in the conversation's webhook events.

Use passthrough parameters to track conversations, ensuring the outcome of a conversation can be associated correctly with your external applications (such as CRM or in-house systems).

Passthrough parameters are key-value pairs. Each key must start with the prefix x- and the value must be a string. Otherwise, the parameter will be ignored.

Example:

{
  ...
  passthroughParameters: {
    "x-contactId": "HS12345",
    "x-orderId": "ORD12345"
  }
}

If the conversation already exists and has passthrough parameters, the new parameters will be merged with the existing parameters. If a key exists in both the existing passthrough parameters and the new passthrough parameters, the new parameter value will overwrite the existing value.

The maximum size of passthrough parameters is 1000 bytes. If the merged passthrough parameters exceed 1000 bytes, then the stored passthrough parameters will not be updated.

string or (any or null)

Defines whether to assign users to the conversation that is created as a result of the message.

Any of
string
Enum: "assign_team" "assign_users" "do_not_route"

Defines whether to assign users to the conversation that is created as a result of the message.

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
hasExistingConversation
required
boolean

Indicates whether the conversation already existed before this message was sent. If true, the message was added to an existing conversation. If false, a new conversation was created for this message.

vendor
required
string
Value: "twilio"

The CPaaS vendor that carried the message. One of the following values:

  • twilio
vendorConversationId
required
string

The vendor's identifier of the conversation associated with the message that was created. The value of this field is dependent on the value of the vendor field:

  • twilio: the ConversationSid of the conversation
vendorMessageId
string or null

The vendor's identifier of the message that was created. The value of this field is dependent on the value of the vendor field:

  • twilio: the MessageSid of the message

This field will be undefined if a new Group MMS conversation was created for this message. In this case, you should subscribe to the conversation.message.created webhook event to retrieve the message details when it is created asynchronously.

Request samples

Content type
application/json
Example
{
  • "assignUsers": [
    • "string"
    ],
  • "channel": "string",
  • "claimRule": "claimable",
  • "closeTimer": "string",
  • "companyAddress": "string",
  • "contactAddress": "string",
  • "conversationName": "string",
  • "messageContent": {
    • "author": "string",
    • "body": "string",
    • "sendAsUser": "string"
    },
  • "notifyUsers": true,
  • "passthroughParameters": { },
  • "routingAction": "assign_team"
}

Response samples

Content type
application/json
{
  • "hasExistingConversation": true,
  • "vendor": "twilio",
  • "vendorConversationId": "string",
  • "vendorMessageId": "string"
}

Conversation Events

Conversation-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

conversation.closed Webhook

Request Body schema: application/json

Occurs whenever the conversation is closed. A conversation can be manually closed by a user, or automatically closed by the system after a year of inactivity.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (ConversationEventData)
required
SmsConversation (object) or WhatsAppConversation (object) or GroupMmsConversation (object) or InternalConversation (object) (Conversation)
Any of
AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the conversation.

User (object) or (any or null)

The user assigned to the conversation. This is a calculated value and is determined as the first user on the conversation

channel
required
string

The type of the conversation channel.

The value for this field will always be sms, signifying that the conversation is an SMS conversation between one or more Spoke users represented by a single company address and a single external contact address.

Value: "sms"
companyNumber
required
string

The company number that originated or received this conversation. This will be one of the numbers defined in the Spoke Phone Number settings page.

object or (any or null)

The entry in the Spoke directory that the companyNumber is assigned to. This field is populated when the conversation is created and is not updated if the conversation is re-assigned to a different directory entry.

This field identifies the Spoke team or user that the companyNumber is assigned to. It will be null for conversations involving company numbers that are not assigned to a user or team.

contactNumber
required
string

The phone number of the external party that originated or received this conversation. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

The value of this field will always be a phone number in +E164 format (e.g. +16508221060).

id
required
string

The id of the conversation

string or (any or null)

Identifies whether the conversation was initiated by a user, a contact or via the Spoke API.

Possible values:

  • user: A Spoke user initiated the conversation
  • contact: The external party initiated the conversation
  • api: The conversation was initiated by a call to the Spoke API
isInternal
required
boolean

Indicates whether the conversation was an internal (Spoke User to Spoke User) conversation.

The value for this field will always be false for conversations with an external party (i.e. SMS, Group MMS or WhatsApp conversations).

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that last message received from this conversation.

lastModifiedTimestamp
required
number

Unix timestamp that last message received from this conversation.

required
Array of objects (Message)

A list of Messages for this conversation.

name
string or null

The name of the conversation. This is the name that is displayed in the Spoke application.

required
Array of ConversationParticipant.User (object) or ConversationParticipant.Contact (object)

A list of the participants in this conversation.

A conversation participant represents either a Spoke user or an external contact. The type field of each participant indicates whether the participant is a Spoke user or an external contact.

passthroughParameters
object

Passthrough parameters associated with the Conversation. Use passthrough parameters to initiate and trace conversations from other systems.

Passthrough parameters can be associated with a Conversation via the following mechanisms.

  • Send SMS API - sending a message via the Spoke API.
  • Send Team SMS API - sending a Team message via the Spoke API
  • Data Action - returning passthrough parameters the response to a Conversation related data action request.

The parameter names and values are safety checked and stored on input and no additional processing is performed.

User (object) or (any or null)

The first user on the conversation. This is the user who either initiated the conversation (for outbound conversation) or received the conversation (for inbound conversation).

vendor
required
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorConversationId
required
string

The vendor's identifier for the conversation. The value of this field is dependent on the value of the vendor field

  • twilio: the ConversationSid of the conversation
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "conversation.closed"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.935Z",
  • "data": {
    • "conversation": {
      • "assignedContact": {
        • "companyName": "Mayer - Rolfson",
        • "firstName": "Erica",
        • "id": "d2608f2f-1dc2-4198-a602-502b1bcfa349",
        • "jobTitle": null,
        • "lastName": "Larson",
        • "phoneNumbers": [
          ],
        • "phonebookId": "94096aee-508a-457d-969f-fc2faa2f0ce4",
        • "phonebookName": "Implemented immersive parallelism"
        },
      • "assignedUser": {
        • "email": "Lisa82@gmail.com",
        • "firstName": "Henrietta",
        • "jobTitle": "International Communications Agent",
        • "lastName": "Wunsch",
        • "mobile": "+19629182837",
        • "userId": "97b1bb0b-3d6f-49c6-b8c5-ad2e485e8006"
        },
      • "channel": "sms",
      • "companyNumber": "+10669447701",
      • "companyNumberOwner": {
        • "displayName": "Elsie Von",
        • "email": "Adolfo_Toy35@hotmail.com",
        • "id": "cf954d66-0c95-49f9-be21-da9f9e49313c",
        • "type": "user"
        },
      • "contactNumber": "+17140908126",
      • "id": "34cba483-d81b-4c8a-ad20-6ea92970db6b",
      • "initiatedBy": "user",
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.937Z",
      • "lastModifiedTimestamp": 1780639038937,
      • "messages": [ ],
      • "participants": [
        • {
          },
        • {
          }
        ],
      • "user": {
        • "email": "Sabrina_Erdman65@hotmail.com",
        • "firstName": "Skylar",
        • "jobTitle": "Internal Metrics Associate",
        • "lastName": "Lueilwitz",
        • "mobile": "+19487532384",
        • "userId": "3dc8468d-9d51-45fc-b3e1-ea77e5a262ba"
        },
      • "vendor": "twilio",
      • "vendorConversationId": "CH43C200A5826D498CA3A8DBF6F00077F0"
      }
    },
  • "id": "1f751a25-154d-4a50-bebd-006fde2bf9d2",
  • "timestamp": 1780639038935,
  • "type": "conversation.closed",
  • "version": "2020-07-15"
}

conversation.contact_assigned Webhook

Request Body schema: application/json

Occurs whenever a contact is assigned to a conversation.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (ConversationEventData)
required
SmsConversation (object) or WhatsAppConversation (object) or GroupMmsConversation (object) or InternalConversation (object) (Conversation)
Any of
AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the conversation.

User (object) or (any or null)

The user assigned to the conversation. This is a calculated value and is determined as the first user on the conversation

channel
required
string

The type of the conversation channel.

The value for this field will always be sms, signifying that the conversation is an SMS conversation between one or more Spoke users represented by a single company address and a single external contact address.

Value: "sms"
companyNumber
required
string

The company number that originated or received this conversation. This will be one of the numbers defined in the Spoke Phone Number settings page.

object or (any or null)

The entry in the Spoke directory that the companyNumber is assigned to. This field is populated when the conversation is created and is not updated if the conversation is re-assigned to a different directory entry.

This field identifies the Spoke team or user that the companyNumber is assigned to. It will be null for conversations involving company numbers that are not assigned to a user or team.

contactNumber
required
string

The phone number of the external party that originated or received this conversation. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

The value of this field will always be a phone number in +E164 format (e.g. +16508221060).

id
required
string

The id of the conversation

string or (any or null)

Identifies whether the conversation was initiated by a user, a contact or via the Spoke API.

Possible values:

  • user: A Spoke user initiated the conversation
  • contact: The external party initiated the conversation
  • api: The conversation was initiated by a call to the Spoke API
isInternal
required
boolean

Indicates whether the conversation was an internal (Spoke User to Spoke User) conversation.

The value for this field will always be false for conversations with an external party (i.e. SMS, Group MMS or WhatsApp conversations).

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that last message received from this conversation.

lastModifiedTimestamp
required
number

Unix timestamp that last message received from this conversation.

required
Array of objects (Message)

A list of Messages for this conversation.

name
string or null

The name of the conversation. This is the name that is displayed in the Spoke application.

required
Array of ConversationParticipant.User (object) or ConversationParticipant.Contact (object)

A list of the participants in this conversation.

A conversation participant represents either a Spoke user or an external contact. The type field of each participant indicates whether the participant is a Spoke user or an external contact.

passthroughParameters
object

Passthrough parameters associated with the Conversation. Use passthrough parameters to initiate and trace conversations from other systems.

Passthrough parameters can be associated with a Conversation via the following mechanisms.

  • Send SMS API - sending a message via the Spoke API.
  • Send Team SMS API - sending a Team message via the Spoke API
  • Data Action - returning passthrough parameters the response to a Conversation related data action request.

The parameter names and values are safety checked and stored on input and no additional processing is performed.

User (object) or (any or null)

The first user on the conversation. This is the user who either initiated the conversation (for outbound conversation) or received the conversation (for inbound conversation).

vendor
required
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorConversationId
required
string

The vendor's identifier for the conversation. The value of this field is dependent on the value of the vendor field

  • twilio: the ConversationSid of the conversation
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "conversation.contact_assigned"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.940Z",
  • "data": {
    • "conversation": {
      • "assignedContact": {
        • "companyName": "Hickle - Orn",
        • "emails": [
          ],
        • "firstName": "Ben",
        • "id": "0d386068-fd8e-450d-aea0-94c1d04a3733",
        • "jobTitle": null,
        • "lastName": "Leuschke",
        • "phoneNumbers": [
          ],
        • "phonebookId": "059f9272-0ea3-47ab-b096-6b4f3735e11a",
        • "phonebookName": "Managed systematic protocol"
        },
      • "assignedUser": {
        • "email": "Nicholas63@yahoo.com",
        • "firstName": "Marlene",
        • "jobTitle": "",
        • "lastName": "Upton",
        • "mobile": null,
        • "userId": "600aad14-b200-476d-bfa9-579c4dbc8c54"
        },
      • "channel": "sms",
      • "companyNumber": "+10787467674",
      • "companyNumberOwner": {
        • "displayName": "Devolved sustainable hierarchy",
        • "id": "ec2108ff-be3b-4db9-bdfb-853ddf865125",
        • "type": "team"
        },
      • "contactNumber": "+16683717616",
      • "id": "c6c95be5-31c0-4f87-90c1-50eca0c6f203",
      • "initiatedBy": "user",
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.941Z",
      • "lastModifiedTimestamp": 1780639038941,
      • "messages": [ ],
      • "participants": [
        • {
          },
        • {
          }
        ],
      • "user": {
        • "email": "Ricardo_OReilly@gmail.com",
        • "firstName": "Elsie",
        • "jobTitle": "Central Usability Producer",
        • "lastName": "Douglas",
        • "mobile": null,
        • "userId": "21253004-1732-4391-b56e-323507d12241"
        },
      • "vendor": "twilio",
      • "vendorConversationId": "CH4D6F391A045346AC8B435F1936127FEB"
      }
    },
  • "id": "cfa15bd2-c2e4-4108-9102-07c405e0c333",
  • "timestamp": 1780639038940,
  • "type": "conversation.contact_assigned",
  • "version": "2020-07-15"
}

conversation.inactive Webhook

Request Body schema: application/json

Occurs whenever the conversation is inactive. A conversation is automatically marked as inactive 30 minutes after the last message was sent or received. This event can be used to add the content of the conversation to an external system.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (ConversationEventData)
required
SmsConversation (object) or WhatsAppConversation (object) or GroupMmsConversation (object) or InternalConversation (object) (Conversation)
Any of
AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the conversation.

User (object) or (any or null)

The user assigned to the conversation. This is a calculated value and is determined as the first user on the conversation

channel
required
string

The type of the conversation channel.

The value for this field will always be sms, signifying that the conversation is an SMS conversation between one or more Spoke users represented by a single company address and a single external contact address.

Value: "sms"
companyNumber
required
string

The company number that originated or received this conversation. This will be one of the numbers defined in the Spoke Phone Number settings page.

object or (any or null)

The entry in the Spoke directory that the companyNumber is assigned to. This field is populated when the conversation is created and is not updated if the conversation is re-assigned to a different directory entry.

This field identifies the Spoke team or user that the companyNumber is assigned to. It will be null for conversations involving company numbers that are not assigned to a user or team.

contactNumber
required
string

The phone number of the external party that originated or received this conversation. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

The value of this field will always be a phone number in +E164 format (e.g. +16508221060).

id
required
string

The id of the conversation

string or (any or null)

Identifies whether the conversation was initiated by a user, a contact or via the Spoke API.

Possible values:

  • user: A Spoke user initiated the conversation
  • contact: The external party initiated the conversation
  • api: The conversation was initiated by a call to the Spoke API
isInternal
required
boolean

Indicates whether the conversation was an internal (Spoke User to Spoke User) conversation.

The value for this field will always be false for conversations with an external party (i.e. SMS, Group MMS or WhatsApp conversations).

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that last message received from this conversation.

lastModifiedTimestamp
required
number

Unix timestamp that last message received from this conversation.

required
Array of objects (Message)

A list of Messages for this conversation.

name
string or null

The name of the conversation. This is the name that is displayed in the Spoke application.

required
Array of ConversationParticipant.User (object) or ConversationParticipant.Contact (object)

A list of the participants in this conversation.

A conversation participant represents either a Spoke user or an external contact. The type field of each participant indicates whether the participant is a Spoke user or an external contact.

passthroughParameters
object

Passthrough parameters associated with the Conversation. Use passthrough parameters to initiate and trace conversations from other systems.

Passthrough parameters can be associated with a Conversation via the following mechanisms.

  • Send SMS API - sending a message via the Spoke API.
  • Send Team SMS API - sending a Team message via the Spoke API
  • Data Action - returning passthrough parameters the response to a Conversation related data action request.

The parameter names and values are safety checked and stored on input and no additional processing is performed.

User (object) or (any or null)

The first user on the conversation. This is the user who either initiated the conversation (for outbound conversation) or received the conversation (for inbound conversation).

vendor
required
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorConversationId
required
string

The vendor's identifier for the conversation. The value of this field is dependent on the value of the vendor field

  • twilio: the ConversationSid of the conversation
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "conversation.inactive"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.932Z",
  • "data": {
    • "conversation": {
      • "assignedContact": {
        • "companyName": "Gorczany, Mills and Stoltenberg",
        • "emails": [
          ],
        • "firstName": "Geoffrey",
        • "id": "666144b1-c20d-4bb6-80e2-80612f9fa696",
        • "jobTitle": "National Optimization Orchestrator",
        • "lastName": "Mann",
        • "phoneNumbers": [
          ],
        • "phonebookId": "6958cee2-677d-4287-89b3-1a1f8e0decc0",
        • "phonebookName": "Reduced contextually-based policy"
        },
      • "assignedUser": {
        • "email": "Ora.Lang44@yahoo.com",
        • "firstName": "Whitney",
        • "jobTitle": null,
        • "lastName": "Thompson",
        • "mobile": null,
        • "userId": "91fe2613-9ce0-4bb9-a458-df497886d458"
        },
      • "channel": "sms",
      • "companyNumber": "+17471102857",
      • "companyNumberOwner": {
        • "displayName": "Vicky Wolff-Barton",
        • "email": "Carolanne49@gmail.com",
        • "id": "514cf4b9-4796-4abc-99aa-1ac914332783",
        • "type": "user"
        },
      • "contactNumber": "+10918197859",
      • "id": "4980b1e4-6ca0-4fef-8a4b-f56ba82d9c4d",
      • "initiatedBy": "user",
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.934Z",
      • "lastModifiedTimestamp": 1780639038934,
      • "messages": [
        • {
          },
        • {
          },
        • {
          }
        ],
      • "participants": [
        • {
          },
        • {
          },
        • {
          }
        ],
      • "user": {
        • "email": "Cordie.Luettgen@hotmail.com",
        • "firstName": "Elbert",
        • "jobTitle": null,
        • "lastName": "Murazik",
        • "mobile": null,
        • "userId": "34eada24-baab-4de8-aeb5-d6de5bfaf27c"
        },
      • "vendor": "twilio",
      • "vendorConversationId": "CHFAE1076750864DA8AD1E2C7B6D839E3C"
      }
    },
  • "id": "87d52e48-7bb3-4114-ae16-e8b5cec4a6be",
  • "timestamp": 1780639038932,
  • "type": "conversation.inactive",
  • "version": "2020-07-15"
}

conversation.message.created Webhook

Request Body schema: application/json

Occurs for each message created (received or sent) on a conversation.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (ConversationEventData)
required
SmsConversation (object) or WhatsAppConversation (object) or GroupMmsConversation (object) or InternalConversation (object) (Conversation)
Any of
AssignedContact (object) or (any or null)

The phonebook contact (if any) associated with the external party on the conversation.

User (object) or (any or null)

The user assigned to the conversation. This is a calculated value and is determined as the first user on the conversation

channel
required
string

The type of the conversation channel.

The value for this field will always be sms, signifying that the conversation is an SMS conversation between one or more Spoke users represented by a single company address and a single external contact address.

Value: "sms"
companyNumber
required
string

The company number that originated or received this conversation. This will be one of the numbers defined in the Spoke Phone Number settings page.

object or (any or null)

The entry in the Spoke directory that the companyNumber is assigned to. This field is populated when the conversation is created and is not updated if the conversation is re-assigned to a different directory entry.

This field identifies the Spoke team or user that the companyNumber is assigned to. It will be null for conversations involving company numbers that are not assigned to a user or team.

contactNumber
required
string

The phone number of the external party that originated or received this conversation. Use this field for CRM integration if there is no value in the assignedContact field and you wish to create a new record for unknown customer numbers.

The value of this field will always be a phone number in +E164 format (e.g. +16508221060).

id
required
string

The id of the conversation

string or (any or null)

Identifies whether the conversation was initiated by a user, a contact or via the Spoke API.

Possible values:

  • user: A Spoke user initiated the conversation
  • contact: The external party initiated the conversation
  • api: The conversation was initiated by a call to the Spoke API
isInternal
required
boolean

Indicates whether the conversation was an internal (Spoke User to Spoke User) conversation.

The value for this field will always be false for conversations with an external party (i.e. SMS, Group MMS or WhatsApp conversations).

lastModifiedAt
required
string

Date/Time (UTC - ISO8601 format) that last message received from this conversation.

lastModifiedTimestamp
required
number

Unix timestamp that last message received from this conversation.

required
Array of objects (Message)

A list of Messages for this conversation.

name
string or null

The name of the conversation. This is the name that is displayed in the Spoke application.

required
Array of ConversationParticipant.User (object) or ConversationParticipant.Contact (object)

A list of the participants in this conversation.

A conversation participant represents either a Spoke user or an external contact. The type field of each participant indicates whether the participant is a Spoke user or an external contact.

passthroughParameters
object

Passthrough parameters associated with the Conversation. Use passthrough parameters to initiate and trace conversations from other systems.

Passthrough parameters can be associated with a Conversation via the following mechanisms.

  • Send SMS API - sending a message via the Spoke API.
  • Send Team SMS API - sending a Team message via the Spoke API
  • Data Action - returning passthrough parameters the response to a Conversation related data action request.

The parameter names and values are safety checked and stored on input and no additional processing is performed.

User (object) or (any or null)

The first user on the conversation. This is the user who either initiated the conversation (for outbound conversation) or received the conversation (for inbound conversation).

vendor
required
string
Value: "twilio"

The CPaaS vendor that carried the call. One of the following values:

  • twilio
vendorConversationId
required
string

The vendor's identifier for the conversation. The value of this field is dependent on the value of the vendor field

  • twilio: the ConversationSid of the conversation
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "conversation.message.created"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.937Z",
  • "data": {
    • "conversation": {
      • "assignedContact": {
        • "companyName": "Grant, Kassulke and Paucek",
        • "emails": [
          ],
        • "firstName": "Constance",
        • "id": "aaf9b438-6a26-4ac4-b4a0-0fc2b1247d67",
        • "jobTitle": null,
        • "lastName": "Jaskolski",
        • "phoneNumbers": [
          ],
        • "phonebookId": "983ef235-ca8a-4fec-bc6e-6d3c43132a53",
        • "phonebookName": "Phased regional approach"
        },
      • "assignedUser": {
        • "email": "Orion.Feeney@yahoo.com",
        • "firstName": "Kane",
        • "jobTitle": "",
        • "lastName": "Moen",
        • "mobile": null,
        • "userId": "d308deef-21c4-4122-89f9-d0108ce360c1"
        },
      • "channel": "sms",
      • "companyNumber": "+13504678240",
      • "companyNumberOwner": {
        • "displayName": "Fundamental national generative AI",
        • "id": "1d36cb68-e6b6-44a7-96c5-51559e6b6125",
        • "type": "team"
        },
      • "contactNumber": "+13467286259",
      • "id": "b7f40792-0aa9-4958-9b50-e7ebd947801c",
      • "initiatedBy": "user",
      • "isInternal": false,
      • "lastModifiedAt": "2026-06-05T05:57:18.939Z",
      • "lastModifiedTimestamp": 1780639038939,
      • "messages": [
        • {
          }
        ],
      • "participants": [
        • {
          },
        • {
          }
        ],
      • "user": {
        • "email": "Arnoldo.Wolff63@hotmail.com",
        • "firstName": "Lewis",
        • "jobTitle": "Direct Branding Supervisor",
        • "lastName": "Weimann",
        • "mobile": null,
        • "userId": "7894ec90-0a53-4837-be62-fcb4d96f82be"
        },
      • "vendor": "twilio",
      • "vendorConversationId": "CH3BC0DF9F016847C3BF417CAD6B23265C"
      }
    },
  • "id": "7f02ac88-4f3e-4668-ae09-d0db98430459",
  • "timestamp": 1780639038937,
  • "type": "conversation.message.created",
  • "version": "2020-07-15"
}

Transcripts

Transcripts represent written versions of audio content, typically transcribed from call or voicemail recordings made or received on the Spoke platform.

List transcripts

Lists your transcripts. You can restrict the result set using any of the following parameters:

  • since (unix timestamp): Only return transcripts that were created after the given timestamp.
  • before (unix timestamp): Only return transcripts that were created before the given timestamp.
  • sourceId: Only return transcripts that were created from the given source.
  • sourceContextId: Only return transcripts that were created from the given source's context.

These parameters may be used in combination (i.e. get all transcripts between since and before that were created from a specific source).

This endpoint supports paging. By default the API will return 100 transcripts, configurable up to a maximum of 1000 transcripts at a time. If the result from a previous transcript includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

query Parameters
next
string (next)

Optional next token for object pagination

limit
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

since
string (since)

Get all matching objects created since (UNIX timestamp)

before
string (before)

Get all matching objects created before (UNIX timestamp)

sourceId
string (sourceId)

Only return transcripts where the source.id field matches the parameter value

sourceContextId
string (sourceContextId)

Only return transcripts where the source.contextId field matches the parameter value

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

required
Array of objects (Transcript)
Array
createdAt
required
number

UTC timestamp of the transcript creation

id
required
string

ID of the transcript

required
object (TranscriptSource)

The source or origin of the audio content being transcribed.

A transcript can be created from a call recording or a voicemail.

required
Array of objects (TranscriptSpeaker)

The list of speakers in the transcript

text
required
string

The full text of the transcript

If the audio source is a call recording:

  • The transcript may include JOIN and LEAVE events if any speakers join or leave the call while it's being recorded.
  • The timestamp on each line is offset from the start of the first call recording if the call has multiple recordings

Example:

"[JOIN: Alice Johnson (0:01)]\n\n[Alice Johnson (0:02)]: Hello Bob, how can I assist you today?\n\n[Bob Smith (0:05)]: Hi Alice, I cannot login into my account.\n\n[Alice Johnson (0:08)]: Okay, let me transfer to you to one of our account managers. Just a moment.\n\n[LEAVE: Alice Johnson (0:10)]\n\n[JOIN: David Young (0:20)]\n\n[David Young (0:22)]: Hi Bob, I understand you're having trouble logging into your account."

Response samples

Content type
application/json
{
  • "meta": {
    • "next": "string"
    },
  • "transcripts": [
    • {
      • "createdAt": 0,
      • "id": "string",
      • "source": {
        • "contextId": "string",
        • "id": "string",
        • "type": "call"
        },
      • "speakers": [
        • {
          }
        ],
      • "text": "string"
      }
    ]
}

Get a transcript

Get a transcript resource by ID.

path Parameters
id
required
string (id)

The transcript ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object (TranscriptLinks)

The URLs for resources associated with the transcript

call
string

URL of the call resource associated with the transcript

recording
string

URL of the call recording resource associated with the transcript

segments
required
string

URL of the transcript segments associated with the transcript

required
object (Transcript)

The transcript

createdAt
required
number

UTC timestamp of the transcript creation

id
required
string

ID of the transcript

required
object (TranscriptSource)

The source or origin of the audio content being transcribed.

A transcript can be created from a call recording or a voicemail.

required
Array of objects (TranscriptSpeaker)

The list of speakers in the transcript

text
required
string

The full text of the transcript

If the audio source is a call recording:

  • The transcript may include JOIN and LEAVE events if any speakers join or leave the call while it's being recorded.
  • The timestamp on each line is offset from the start of the first call recording if the call has multiple recordings

Example:

"[JOIN: Alice Johnson (0:01)]\n\n[Alice Johnson (0:02)]: Hello Bob, how can I assist you today?\n\n[Bob Smith (0:05)]: Hi Alice, I cannot login into my account.\n\n[Alice Johnson (0:08)]: Okay, let me transfer to you to one of our account managers. Just a moment.\n\n[LEAVE: Alice Johnson (0:10)]\n\n[JOIN: David Young (0:20)]\n\n[David Young (0:22)]: Hi Bob, I understand you're having trouble logging into your account."

Response samples

Content type
application/json
{
  • "links": {
    • "call": "string",
    • "recording": "string",
    • "segments": "string"
    },
  • "transcript": {
    • "createdAt": 0,
    • "id": "string",
    • "source": {
      • "contextId": "string",
      • "id": "string",
      • "type": "call"
      },
    • "speakers": [
      • {
        • "displayName": "string",
        • "email": "string",
        • "id": "string",
        • "numberE164": "string"
        }
      ],
    • "text": "string"
    }
}

Delete a transcript

Delete a transcript resource by ID.

path Parameters
id
required
string (id)

The transcript ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Get transcript segments by transcript ID

Get associated transcript segments of a transcript by its ID.

path Parameters
id
required
string (id)

The transcript ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
Array of objects (TranscriptSegment)
Array
endTime
required
number

The end time of the segment in milliseconds from audio start

speakerId
string

The speaker ID of the segment

startTime
required
number

The start time of the segment in milliseconds from audio start

text
required
string

The text of the segment

required
Array of objects (TranscriptWord)

The list of words in the segment

Response samples

Content type
application/json
{
  • "segments": [
    • {
      • "endTime": 0,
      • "speakerId": "string",
      • "startTime": 0,
      • "text": "string",
      • "words": [
        • {
          }
        ]
      }
    ]
}

Transcript Events

Transcript-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

transcript.created Webhook

Request Body schema: application/json

Occurs whenever a transcript is created.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (TranscriptEventData)
object (TranscriptLinks)

The URLs for resources associated with the transcript

required
object (Transcript)

The transcript

id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "transcript.created"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.947Z",
  • "data": {
    • "transcript": {
      • "createdAt": 1780639038949,
      • "id": "8f7a8dfc-d1b9-49d0-a49d-94b97d583da1",
      • "source": {
        • "contextId": "a8e39ece-883b-4271-9227-bfb92c154f4f",
        • "id": "35d23030-a587-4ae5-908a-601a0915e43b",
        • "type": "voicemail"
        },
      • "speakers": [
        • {
          }
        ],
      • "text": "Valde derideo spectaculum annus textor angelus virtus curiositas carcer pauci. Suffragium tracto volo. Provident deorsum depopulo. Clarus tepesco perspiciatis adipiscor sol coaegresco. Cetera verumtamen vito. Incidunt beatae denuncio alii aequitas ambitus cohors solutio. Sustineo aut volva tergum totus. Animus odit valde explicabo. Volva crepusculum harum summisse statim tenus. Summa theatrum denuo tamquam. Capio pariatur sequi custodia alter creber teneo et non aperte. Ocer excepturi contra adopto defetiscor canto nostrum beneficium ipsam cenaculum. Ancilla apud alii. Allatus sto nesciunt curtus vesco cervus debilito paens terreo voluptas. Quidem armarium sublime defero velut bos sordeo suscipit aestas astrum. Abduco tamisium anser vestigium decimus. Aedificium arceo cavus coepi cotidie demum. Patruus conscendo atrocitas tripudio. Pecus demitto substantia earum voluptas recusandae. Appositus venio stipes ultra esse. Curtus degenero cibo vivo. Vinitor cado tres creber. Verbum ad vinco tumultus astrum volup eveniet appello corroboro cupiditate. Soleo clementia videlicet clamo. Complectus acidus tero speculum vester condico fugit suppellex tondeo contabesco. Turba blanditiis id apparatus. Ascisco delibero tantum atrox temptatio ascisco viriliter volo quis. Accommodo similique aggredior tum. Curto articulus derideo victoria. Cultellus vorago carus averto armarium. Sortitus aegre suspendo vulgus. Esse tempus tunc deludo antiquus quo. Tepidus absorbeo iste aetas pax aer statua adficio sufficio defessus. Nihil terga caries. Bis cura canto sufficio incidunt dolores aureus. Aiunt dens varietas timidus arcesso creptio crepusculum. Sopor placeat caute arbor sperno bibo. Brevis ipsa desino abduco. Corrigo curriculum autus acidus facilis auditor suppellex bis sollicito nam. Culpa conventus sui tenuis volubilis despecto. Decens agnitio capitulus non cohors adaugeo civis debitis coniuratio corrupti. Curiositas absorbeo casus approbo. Crepusculum caute acies cerno virgo. Vestrum depono articulus. Cruciamentum cribro convoco possimus casus tremo aduro curis cuppedia caput. Vehemens crebro derideo volutabrum. Clibanus minus capto terreo denique bellicus vociferor consuasor adamo adfero. Denuo conduco amoveo magni cuppedia creptio astrum tantum terra adamo. Combibo sursum convoco tempus tyrannus teres aggredior pel. Ducimus adstringo averto uxor."
      }
    },
  • "id": "2e506016-40b2-4f29-b9c8-18aad5be2c3f",
  • "timestamp": 1780639038947,
  • "type": "transcript.created",
  • "version": "2020-07-15"
}

Content Analysis

A content analysis job represents an AI-generated automated analysis of call recordings or transcripts. Running a content analysis job extracts key information from a recording or transcript into structured JSON payloads that can be used to drive downstream automation or systems integration.

Get a content analysis

Get a content analysis resource by ID.

path Parameters
id
required
string (id)

The content analysis ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
object (ContentAnalysisAnalyzer)

The analyzer used when analyzing the content. Only populated when the analysis has started.

name
required
string

The name of the analyzer

version
required
string

The version of the analyzer

Array of objects (ContentAnalysisResultArtifact)

The list of artifacts created from the analysis process

Array
data
required
object

The artifact payload

schema
required
string

The name of the JSON schema this artifact conforms to

Array of objects (ResourceUsage)

The model token usage to produce the artifact

object (ContentAnalysisFailure)

Details of the analysis failure. Only provided when the analysis failed.

description
string

The description of the failure

reason
required
string (ContentAnalysisFailureReason)
Enum: "contentInaccessible" "fatalError" "invalidRequest" "transcriptionFailed"

The reason for the analysis failure. One of:

  • contentInaccessible: The content provided in the request is not accessible e.g. recording URLs are not valid.
  • transcriptionFailed: The recordings provided in the request could not be transcribed.
  • invalidRequest: The request contains invalid data.
  • fatalError: A fatal error occurred during the content analysis process.
id
required
string

The ID of the analysis

required
ContentAnalysisCallRequest (object) or ContentAnalysisAgentScorecardsRequest (object) (ContentAnalysisRequest)

The payload containing the content and related information required to be processed and analyzed.

Any of
object (ContentAnalysisRequestAnalyzer)

The analyzer to be used when analyzing the content.

If provided and valid, this will be used instead of the default analyzer for the given source type.

required
object (ContentAnalysisCallContent)

The content for a call source. Either recordings or transcripts must be provided.

required
Array of objects (ContentAnalysisCallParticipant)

The list of participants in the call

passthroughParameters
object

Passthrough parameters to include with the content analysis results. Use passthrough parameters to initiate and trace the analysis from other systems.

Passthrough parameters can only be specified when the content analysis is created.

required
object (ContentAnalysisCallSource)

The source when the content being analyzed originates from a call.

status
required
string (ContentAnalysisStatus)
Enum: "analyzing" "failed" "queued" "succeeded" "transcribing"

The analysis status. One of:

  • queued: The request has been received and queued.
  • transcribing: The recordings provided in the request are being transcribed.
  • analyzing: The content is being analyzed.
  • succeeded: Analysis succeeded and the artifacts are available.
  • failed: Analysis failed. Check the error details for more information.
transcript
string

The transcript content that was analyzed

The source of the value on this field depends whether recordings or transcripts are provided in the request:

  • If recordings are provided, this is the combined transcript created from the recordings.
  • If transcripts are provided, this is the combined transcript from the request.

Response samples

Content type
application/json
{
  • "analyzer": {
    • "name": "string",
    • "version": "string"
    },
  • "artifacts": [
    • {
      • "data": { },
      • "schema": "string",
      • "usage": [
        • {
          }
        ]
      }
    ],
  • "failure": {
    • "description": "string",
    • "reason": "contentInaccessible"
    },
  • "id": "string",
  • "request": {
    • "analyzer": {
      • "name": "string"
      },
    • "content": {
      • "recordings": [
        • {
          }
        ],
      • "transcripts": [
        • {
          }
        ]
      },
    • "participants": [
      • {
        • "connections": [
          ],
        • "data": {
          },
        • "displayName": "string",
        • "id": "string",
        • "type": "contact"
        }
      ],
    • "passthroughParameters": { },
    • "source": {
      • "data": { },
      • "endedTimestamp": 0,
      • "id": "string",
      • "product": "string",
      • "startedTimestamp": 0,
      • "type": "call",
      • "url": "string",
      • "vendor": "string"
      }
    },
  • "status": "analyzing",
  • "transcript": "string"
}

Delete a content analysis

Delete a content analysis by ID. This will abort the content analysis and delete its associated data.

path Parameters
id
required
string (id)

The content analysis ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

List content analysis data

Lists your content analysis data. Only content analysis data with status succeeded are included.

You can restrict the result set using any of the following parameters:

  • since (unix timestamp in milliseconds): Only return content analysis data where the first recording or transcript started on or after the given timestamp.
  • before (unix timestamp in milliseconds): Only return content analysis data where the first recording or transcript started on or before the given timestamp.
  • sourceId: Only return content analysis data for a specific source (e.g., a Spoke call ID).
  • participantId: Only return content analysis data where a specific participant ID is present.
  • contactNumber: Only return content analysis data where a specific contact participant phone number is present.
  • artifact: Only return content analysis data that contain a specific artifact schema name.

These parameters may be used in combination.

This endpoint supports paging. By default the API will return 5 content analysis items, configurable up to a maximum of 10 at a time. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

Results are sorted by the first recording or transcript's started timestamp in descending order (newest first).

query Parameters
next
string (next)

Optional next token for object pagination

limit
string (limit)

The number of objects fetched per request. Default to 5, maximum is 10

since
string (since)

Get all content analysis data where the first recording or transcript started after this time (UNIX timestamp)

before
string (before)

Get all content analysis data where the first recording or transcript started before this time (UNIX timestamp)

sourceId
string (sourceId)

Get all content analysis data where the source id from the request matches this parameter

participantId
string (participantId)

Get all content analysis data which contains a participant in the request with this id

contactNumber
string (contactNumber)

Get all content analysis data which contains a participant in the request with this numberE164. This parameter is ignored if the participantId parameter is provided

artifact
string (artifact)

Get all content analysis data which contains an artifact of the given schema name, e.g. "generalSummary"

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
Array of objects (ContentAnalysis)

The content analyses matching the filters provided as query params

Array
object (ContentAnalysisAnalyzer)

The analyzer used when analyzing the content. Only populated when the analysis has started.

Array of objects (ContentAnalysisResultArtifact)

The list of artifacts created from the analysis process

object (ContentAnalysisFailure)

Details of the analysis failure. Only provided when the analysis failed.

id
required
string

The ID of the analysis

required
ContentAnalysisCallRequest (object) or ContentAnalysisAgentScorecardsRequest (object) (ContentAnalysisRequest)

The payload containing the content and related information required to be processed and analyzed.

status
required
string (ContentAnalysisStatus)
Enum: "analyzing" "failed" "queued" "succeeded" "transcribing"

The analysis status. One of:

  • queued: The request has been received and queued.
  • transcribing: The recordings provided in the request are being transcribed.
  • analyzing: The content is being analyzed.
  • succeeded: Analysis succeeded and the artifacts are available.
  • failed: Analysis failed. Check the error details for more information.
transcript
string

The transcript content that was analyzed

The source of the value on this field depends whether recordings or transcripts are provided in the request:

  • If recordings are provided, this is the combined transcript created from the recordings.
  • If transcripts are provided, this is the combined transcript from the request.
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

Response samples

Content type
application/json
{
  • "contentAnalysis": [
    • {
      • "analyzer": {
        • "name": "string",
        • "version": "string"
        },
      • "artifacts": [
        • {
          }
        ],
      • "failure": {
        • "description": "string",
        • "reason": "contentInaccessible"
        },
      • "id": "string",
      • "request": {
        • "analyzer": {
          },
        • "content": {
          },
        • "participants": [
          ],
        • "passthroughParameters": { },
        • "source": {
          }
        },
      • "status": "analyzing",
      • "transcript": "string"
      }
    ],
  • "meta": {
    • "next": "string"
    }
}

Create a new content analysis

Submit a new request to analyze the provided content.

Note: Usage of this API requires an entitlement to be enabled on your Spoke Account. Contact your Spoke Account Manager for more information.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

The payload containing the content and related information required to be processed and analyzed.

Any of
object (ContentAnalysisRequestAnalyzer)

The analyzer to be used when analyzing the content.

If provided and valid, this will be used instead of the default analyzer for the given source type.

name
required
string

The name of the analyzer

required
object (ContentAnalysisCallContent)

The content for a call source. Either recordings or transcripts must be provided.

Array of objects (ContentAnalysisRecording)

A list of audio recordings. They will be transcribed and then analyzed based on the created transcript.

The corresponding transcripts will be available in the result when the request is completed.

Array of objects (ContentAnalysisTranscript)

A list of transcripts to be analyzed.

required
Array of objects (ContentAnalysisCallParticipant)

The list of participants in the call

Array
required
Array of objects (ContentAnalysisParticipantConnection)

A list of connections on the content source for this participant.

Used to identify which participant is present in which recording or transcript.

required
ContentAnalysisUserParticipantData (object) or ContentAnalysisContactParticipantData (object)

The payload containing information about the participant.

The value of this field is dependent on the value of the type field:

  • user: The user data containing their email and other optional fields
  • contact: The contact data containing their phone number in E164 format and other optional fields
displayName
required
string

The display name of the participant.

id
required
string

The ID of the participant in the vendor system.

type
required
string (ContentAnalysisParticipantType)
Enum: "contact" "user"

The type of the participant. One of:

  • user: A user on the vendor system
  • contact: An external contact
passthroughParameters
object

Passthrough parameters to include with the content analysis results. Use passthrough parameters to initiate and trace the analysis from other systems.

Passthrough parameters can only be specified when the content analysis is created.

required
object (ContentAnalysisCallSource)

The source when the content being analyzed originates from a call.

required
object or Call (object)

The call resource from the vendor system.

endedTimestamp
number

Unix timestamp in milliseconds when the source ended

id
required
string

The ID of the source in the vendor system.

product
required
string

The product name provided by the vendor that the source originates from, e.g. Connect (Spoke), Flex (Twilio) etc

startedTimestamp
number

Unix timestamp in milliseconds when the source started

type
required
string
Value: "call"
url
string

The URL to the source in the vendor system

vendor
required
string

The name of the system that provides the source, e.g. Spoke, Twilio, Zoom etc.

Responses

Request samples

Content type
application/json
Example
{
  • "analyzer": {
    • "name": "string"
    },
  • "content": {
    • "recordings": [
      • {
        • "channels": 0,
        • "endedTimestamp": 0,
        • "id": "string",
        • "startedTimestamp": 0,
        • "transcriptionModel": "call",
        • "url": "string"
        }
      ],
    • "transcripts": [
      • {
        • "endedTimestamp": 0,
        • "id": "string",
        • "startedTimestamp": 0,
        • "text": "string"
        }
      ]
    },
  • "participants": [
    • {
      • "connections": [
        • {
          }
        ],
      • "data": {
        • "email": "string",
        • "jobTitle": "string",
        • "location": "string",
        • "managerEmail": "string",
        • "timezone": "string"
        },
      • "displayName": "string",
      • "id": "string",
      • "type": "contact"
      }
    ],
  • "passthroughParameters": { },
  • "source": {
    • "data": { },
    • "endedTimestamp": 0,
    • "id": "string",
    • "product": "string",
    • "startedTimestamp": 0,
    • "type": "call",
    • "url": "string",
    • "vendor": "string"
    }
}

Response samples

Content type
application/json
{
  • "analyzer": {
    • "name": "string",
    • "version": "string"
    },
  • "artifacts": [
    • {
      • "data": { },
      • "schema": "string",
      • "usage": [
        • {
          }
        ]
      }
    ],
  • "failure": {
    • "description": "string",
    • "reason": "contentInaccessible"
    },
  • "id": "string",
  • "request": {
    • "analyzer": {
      • "name": "string"
      },
    • "content": {
      • "recordings": [
        • {
          }
        ],
      • "transcripts": [
        • {
          }
        ]
      },
    • "participants": [
      • {
        • "connections": [
          ],
        • "data": {
          },
        • "displayName": "string",
        • "id": "string",
        • "type": "contact"
        }
      ],
    • "passthroughParameters": { },
    • "source": {
      • "data": { },
      • "endedTimestamp": 0,
      • "id": "string",
      • "product": "string",
      • "startedTimestamp": 0,
      • "type": "call",
      • "url": "string",
      • "vendor": "string"
      }
    },
  • "status": "queued",
  • "transcript": "string"
}

Content Analysis Events

Content analysis related webhook events that you can listen to. For more information about webhooks, see Webhook Events.

content_analysis.completed Webhook

Request Body schema: application/json

Signifies that the content analysis job for the submitted request is completed. The content analysis status indicates whether the job has succeeded or failed. This event will only fire once for each request.

For an example, see the Request Sample in the right sidebar.

For more information about webhooks, see Webhook Events.

created
required
string

UTC timestamp of when the event was emitted

required
object (ContentAnalysisEventData)
required
object (ContentAnalysis)
object (ContentAnalysisAnalyzer)

The analyzer used when analyzing the content. Only populated when the analysis has started.

Array of objects (ContentAnalysisResultArtifact)

The list of artifacts created from the analysis process

object (ContentAnalysisFailure)

Details of the analysis failure. Only provided when the analysis failed.

id
required
string

The ID of the analysis

required
ContentAnalysisCallRequest (object) or ContentAnalysisAgentScorecardsRequest (object) (ContentAnalysisRequest)

The payload containing the content and related information required to be processed and analyzed.

status
required
string (ContentAnalysisStatus)
Enum: "analyzing" "failed" "queued" "succeeded" "transcribing"

The analysis status. One of:

  • queued: The request has been received and queued.
  • transcribing: The recordings provided in the request are being transcribed.
  • analyzing: The content is being analyzed.
  • succeeded: Analysis succeeded and the artifacts are available.
  • failed: Analysis failed. Check the error details for more information.
transcript
string

The transcript content that was analyzed

The source of the value on this field depends whether recordings or transcripts are provided in the request:

  • If recordings are provided, this is the combined transcript created from the recordings.
  • If transcripts are provided, this is the combined transcript from the request.
id
required
string

The ID of the event

organisationId
required
string

The ID of the organisation that the event belongs to

timestamp
required
number

Unix timestamp of when the event was originally emitted

type
required
string
Value: "content_analysis.completed"
version
required
string

Event version number, the version is a YYYY-mm-dd formatted string

Responses

Request samples

Content type
application/json
{
  • "created": "2026-06-05T05:57:18.950Z",
  • "data": {
    • "contentAnalysis": {
      • "analyzer": {
        • "name": "callRecordingAnalysis",
        • "version": "20250610-001"
        },
      • "artifacts": [
        • {
          }
        ],
      • "id": "b9a5152d-faa4-4f67-b221-a6acc26e366d",
      • "request": {
        • "content": {
          },
        • "participants": [
          ],
        • "source": {
          }
        },
      • "status": "succeeded",
      • "transcript": "[JOIN: Alysson Zemlak (0:00)]\n\n[Alysson Zemlak (0:00)]: Alysson Zemlak speaking.\n\n[Grover Schuster (0:02)]: Hi there, Alysson Zemlak.\n\n[Alysson Zemlak (0:04)]: Oh, hello. Hi. How are you?\n\n[Grover Schuster (0:06)]: I'm doing good. I wanted to follow up on that project we discussed last week about the new marketing campaign.\n\n[Alysson Zemlak (0:11)]: Right, yes! I've been working on the initial designs and I think we're on the right track. The client feedback has been pretty positive so far.\n\n[Grover Schuster (0:22)]: That's great to hear. I was wondering if you could send me the latest version by tomorrow morning? We have the stakeholder meeting at 10 AM.\n\n[Alysson Zemlak (0:26)]: Absolutely, I'll have everything ready and sent over by 8 AM. I'll include the revised mockups and the timeline we discussed.\n\n[Grover Schuster (0:30)]: Perfect, that gives us time to review everything before the presentation. I really appreciate you staying on top of this.\n\n[Grover Schuster (0:40)]: That's it. Thanks for your help. Bye.\n\n[Alysson Zemlak (0:41)]: Okay bye. See you.\n\n[LEAVE: Alysson Zemlak (0:41)]"
      }
    },
  • "id": "efbae91a-d6f4-4521-99c1-8fcf212b0ce4",
  • "timestamp": 1780639038950,
  • "type": "content_analysis.completed",
  • "version": "2020-07-15"
}

Webhooks

Webhooks are a way to receive notifications when certain events happen in your Spoke account. For more information about webhooks, see Webhook Events.

List webhooks

List all webhooks in your organisation.

This endpoint supports paging. By default the API will return 100 webhooks, configurable up to a maximum of 1000 webhooks at a time. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

query Parameters
limit
string (limit)

The maximum number of webhooks to return. Default to 100, maximum is 1000

next
string (next)

Optional next token for object pagination

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

required
Array of objects

The list of webhooks. May be empty if no webhooks are found.

Array
createdAt
required
string

Date/Time (UTC - ISO8601 format) when the webhook was created

createdTimestamp
required
number

Unix timestamp when the webhook was created

description
string

The description of the webhook

enabled
required
boolean

Whether the webhook is enabled. Default value is true

events
required
Array of strings

The list of events the webhook is subscribed to

Possible values include:

  • call.started
  • call.answered
  • call.not_answered
  • call.hungup
  • call.ended
  • call.recording.available
  • call.voicemail.available
  • call.note.created
  • call.highlight.created
  • call.highlight.recording_available
  • call.contact_assigned
  • call.contact_assigned_with_add
  • call.contact_assigned_with_update
  • call.form.started
  • call.form.submitted
  • conversation.inactive
  • conversation.closed
  • conversation.message.created
  • user.availability.updated
  • team.availability.updated
  • transcript.created
id
required
string

ID of the webhook

mode
required
string
Enum: "production" "test"

The webhook mode. Default value is production

signingSecret
required
string

Signing secret used to sign the webhook requests

url
required
string

The URL of the webhook. Must be a valid HTTPS URL

Response samples

Content type
application/json
{
  • "meta": {
    • "next": "string"
    },
  • "webhooks": [
    • {
      • "createdAt": "string",
      • "createdTimestamp": 0,
      • "description": "string",
      • "enabled": true,
      • "events": [
        • "string"
        ],
      • "id": "string",
      • "mode": "production",
      • "signingSecret": "string",
      • "url": "string"
      }
    ]
}

Create a webhook

Create a new webhook.

The total number of webhooks cannot exceed your account level limit. By default each account can create up to 10 webhooks. Please contact support with your specific use case to increase the limit.

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the webhook to be created

description
string

The description of the webhook

enabled
boolean

Whether the webhook is enabled. Default value is true

events
required
Array of strings

The list of events the webhook is subscribed to

Possible values include:

  • call.started
  • call.answered
  • call.not_answered
  • call.hungup
  • call.ended
  • call.recording.available
  • call.voicemail.available
  • call.note.created
  • call.highlight.created
  • call.highlight.recording_available
  • call.contact_assigned
  • call.contact_assigned_with_add
  • call.contact_assigned_with_update
  • call.form.started
  • call.form.submitted
  • conversation.inactive
  • conversation.closed
  • conversation.message.created
  • user.availability.updated
  • team.availability.updated
  • transcript.created
mode
string
Enum: "production" "test"

The webhook mode. Default value is production

url
required
string

The URL of the webhook. Must be a valid HTTPS URL

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
createdAt
required
string

Date/Time (UTC - ISO8601 format) when the webhook was created

createdTimestamp
required
number

Unix timestamp when the webhook was created

description
string

The description of the webhook

enabled
required
boolean

Whether the webhook is enabled. Default value is true

events
required
Array of strings

The list of events the webhook is subscribed to

Possible values include:

  • call.started
  • call.answered
  • call.not_answered
  • call.hungup
  • call.ended
  • call.recording.available
  • call.voicemail.available
  • call.note.created
  • call.highlight.created
  • call.highlight.recording_available
  • call.contact_assigned
  • call.contact_assigned_with_add
  • call.contact_assigned_with_update
  • call.form.started
  • call.form.submitted
  • conversation.inactive
  • conversation.closed
  • conversation.message.created
  • user.availability.updated
  • team.availability.updated
  • transcript.created
id
required
string

ID of the webhook

mode
required
string
Enum: "production" "test"

The webhook mode. Default value is production

signingSecret
required
string

Signing secret used to sign the webhook requests

url
required
string

The URL of the webhook. Must be a valid HTTPS URL

Request samples

Content type
application/json
{
  • "description": "string",
  • "enabled": true,
  • "events": [
    • "string"
    ],
  • "mode": "production",
  • "url": "string"
}

Response samples

Content type
application/json
{
  • "createdAt": "string",
  • "createdTimestamp": 0,
  • "description": "string",
  • "enabled": true,
  • "events": [
    • "string"
    ],
  • "id": "string",
  • "mode": "production",
  • "signingSecret": "string",
  • "url": "string"
}

Get webhook

Retrieve the webhook.

path Parameters
id
required
string (id)

The webhook ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
createdAt
required
string

Date/Time (UTC - ISO8601 format) when the webhook was created

createdTimestamp
required
number

Unix timestamp when the webhook was created

description
string

The description of the webhook

enabled
required
boolean

Whether the webhook is enabled. Default value is true

events
required
Array of strings

The list of events the webhook is subscribed to

Possible values include:

  • call.started
  • call.answered
  • call.not_answered
  • call.hungup
  • call.ended
  • call.recording.available
  • call.voicemail.available
  • call.note.created
  • call.highlight.created
  • call.highlight.recording_available
  • call.contact_assigned
  • call.contact_assigned_with_add
  • call.contact_assigned_with_update
  • call.form.started
  • call.form.submitted
  • conversation.inactive
  • conversation.closed
  • conversation.message.created
  • user.availability.updated
  • team.availability.updated
  • transcript.created
id
required
string

ID of the webhook

mode
required
string
Enum: "production" "test"

The webhook mode. Default value is production

signingSecret
required
string

Signing secret used to sign the webhook requests

url
required
string

The URL of the webhook. Must be a valid HTTPS URL

Response samples

Content type
application/json
{
  • "createdAt": "string",
  • "createdTimestamp": 0,
  • "description": "string",
  • "enabled": true,
  • "events": [
    • "string"
    ],
  • "id": "string",
  • "mode": "production",
  • "signingSecret": "string",
  • "url": "string"
}

Update webhook

Update an existing webhook.

path Parameters
id
required
string (id)

The webhook ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the webhook to be updated

description
string

The description of the webhook

enabled
boolean

Whether the webhook is enabled. Default value is true

events
Array of strings

The list of events the webhook is subscribed to

Possible values include:

  • call.started
  • call.answered
  • call.not_answered
  • call.hungup
  • call.ended
  • call.recording.available
  • call.voicemail.available
  • call.note.created
  • call.highlight.created
  • call.highlight.recording_available
  • call.contact_assigned
  • call.contact_assigned_with_add
  • call.contact_assigned_with_update
  • call.form.started
  • call.form.submitted
  • conversation.inactive
  • conversation.closed
  • conversation.message.created
  • user.availability.updated
  • team.availability.updated
  • transcript.created
mode
string
Enum: "production" "test"

The webhook mode. Default value is production

url
string

The URL of the webhook. Must be a valid HTTPS URL

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
createdAt
required
string

Date/Time (UTC - ISO8601 format) when the webhook was created

createdTimestamp
required
number

Unix timestamp when the webhook was created

description
string

The description of the webhook

enabled
required
boolean

Whether the webhook is enabled. Default value is true

events
required
Array of strings

The list of events the webhook is subscribed to

Possible values include:

  • call.started
  • call.answered
  • call.not_answered
  • call.hungup
  • call.ended
  • call.recording.available
  • call.voicemail.available
  • call.note.created
  • call.highlight.created
  • call.highlight.recording_available
  • call.contact_assigned
  • call.contact_assigned_with_add
  • call.contact_assigned_with_update
  • call.form.started
  • call.form.submitted
  • conversation.inactive
  • conversation.closed
  • conversation.message.created
  • user.availability.updated
  • team.availability.updated
  • transcript.created
id
required
string

ID of the webhook

mode
required
string
Enum: "production" "test"

The webhook mode. Default value is production

signingSecret
required
string

Signing secret used to sign the webhook requests

url
required
string

The URL of the webhook. Must be a valid HTTPS URL

Request samples

Content type
application/json
{
  • "description": "string",
  • "enabled": true,
  • "events": [
    • "string"
    ],
  • "mode": "production",
  • "url": "string"
}

Response samples

Content type
application/json
{
  • "createdAt": "string",
  • "createdTimestamp": 0,
  • "description": "string",
  • "enabled": true,
  • "events": [
    • "string"
    ],
  • "id": "string",
  • "mode": "production",
  • "signingSecret": "string",
  • "url": "string"
}

Delete webhook

Delete the specified webhook.

path Parameters
id
required
string (id)

The webhook ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Trunks

Trunks represent SIP Trunks between the Spoke platform and your on-premise or legacy PBX platforms. Trunks can be created via the Spoke Account Portal

List trunks in your organisation

Lists all trunks in your organisation.

This endpoint supports paging. By default the API will return 100 trunks, configurable up to a maximum of 1000 trunks at a time. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

query Parameters
next
string (next)

Optional next token for object pagination

limit
required
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

required
Array of objects (Trunk)
Array
allowSipFromAddress
required
Array of strings

The trunk ip addresses, for traffic from your network into spoke

id
required
string

The id of the trunk

name
required
string

The name of the trunk

region
required
string

The trunk region

sendSipToAddress
required
string

The IP address/FQDN, for traffic from Spoke into your network

sipDomainName
required
string

The trunks sip domain name, this SIP domain uniquely identifies your account on Spoke

Response samples

Content type
application/json
{
  • "meta": {
    • "next": "string"
    },
  • "trunks": [
    • {
      • "allowSipFromAddress": [
        • "string"
        ],
      • "id": "string",
      • "name": "string",
      • "region": "string",
      • "sendSipToAddress": "string",
      • "sipDomainName": "string"
      }
    ]
}

Get a trunk

Retrieve a trunk resource, and its data.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
allowSipFromAddress
required
Array of strings

The trunk ip addresses, for traffic from your network into spoke

id
required
string

The id of the trunk

name
required
string

The name of the trunk

region
required
string

The trunk region

sendSipToAddress
required
string

The IP address/FQDN, for traffic from Spoke into your network

sipDomainName
required
string

The trunks sip domain name, this SIP domain uniquely identifies your account on Spoke

Response samples

Content type
application/json
{
  • "allowSipFromAddress": [
    • "string"
    ],
  • "id": "string",
  • "name": "string",
  • "region": "string",
  • "sendSipToAddress": "string",
  • "sipDomainName": "string"
}

Trunk Devices

Trunk devices usually represent real phones in communal areas, such as a conference phone or lunch room phone.

List trunk devices in a trunk

Lists all trunk devices for a given trunk.

This endpoint supports paging. By default the API will return 100 devices, configurable up to a maximum of 1000 trunk's devices at a time. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

query Parameters
next
string (next)

Optional next token for object pagination

limit
required
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

externalId
string (externalId)

The external ID of the trunk device

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

required
Array of objects (TrunkDevice)
Array
description
string or null

The device's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The device's extension

externalId
required
string

The external ID of the device

id
required
string

The ID of the device

location
string or null

The device's location

model
string or null

The device's model

name
required
string

The device's name

product
string or null

The device's product

sipAddress
required
string

The device's address (SIP)

trunkId
required
string

The trunk ID that the device belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkDevice"

Response samples

Content type
application/json
{
  • "meta": {
    • "next": "string"
    },
  • "trunkDevices": [
    • {
      • "description": "string",
      • "displayName": "string",
      • "extension": "string",
      • "externalId": "string",
      • "id": "string",
      • "location": "string",
      • "model": "string",
      • "name": "string",
      • "product": "string",
      • "sipAddress": "string",
      • "trunkId": "string",
      • "twimlRedirectUrl": "string",
      • "type": "trunkDevice"
      }
    ]
}

Add a new trunk device to a trunk

Creates a new trunk device in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk device to be created

description
string or null

The device's description

extension
required
string

The device's extension

externalId
required
string

The external ID of the device

location
string or null

The device's location

model
string or null

The device's model

name
required
string

The device's name

product
string or null

The device's product

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The device's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The device's extension

externalId
required
string

The external ID of the device

id
required
string

The ID of the device

location
string or null

The device's location

model
string or null

The device's model

name
required
string

The device's name

product
string or null

The device's product

sipAddress
required
string

The device's address (SIP)

trunkId
required
string

The trunk ID that the device belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkDevice"

Request samples

Content type
application/json
{
  • "description": "string",
  • "extension": "string",
  • "externalId": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkDevice"
}

Update a trunk device using external ID

Update a trunk device in the specified trunk by its external ID.

Updating all trunk devices in the specified trunk is currently not supported.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk device to be updated

description
string or null

The device's description

externalId
required
string

The external ID of the device to update

location
string or null

The device's location

model
string or null

The device's model

name
string

The device's name

product
string or null

The device's product

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The device's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The device's extension

externalId
required
string

The external ID of the device

id
required
string

The ID of the device

location
string or null

The device's location

model
string or null

The device's model

name
required
string

The device's name

product
string or null

The device's product

sipAddress
required
string

The device's address (SIP)

trunkId
required
string

The trunk ID that the device belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkDevice"

Request samples

Content type
application/json
{
  • "description": "string",
  • "externalId": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkDevice"
}

Delete a trunk device using external ID.

Delete a trunk device in the specified trunk.

Deleting all trunk devices in the specified trunk is currently not supported.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

query Parameters
externalId
required
string (externalId)

The external ID of the trunk device

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Get a trunk device

Retrieve a trunk device resource, and its data.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkDeviceId
required
string (trunkDeviceId)

The trunk's device ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The device's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The device's extension

externalId
required
string

The external ID of the device

id
required
string

The ID of the device

location
string or null

The device's location

model
string or null

The device's model

name
required
string

The device's name

product
string or null

The device's product

sipAddress
required
string

The device's address (SIP)

trunkId
required
string

The trunk ID that the device belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkDevice"

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkDevice"
}

Update a trunk device

Update a trunk device in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkDeviceId
required
string (trunkDeviceId)

The trunk's device ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk device to be updated

description
string or null

The device's description

location
string or null

The device's location

model
string or null

The device's model

name
string

The device's name

product
string or null

The device's product

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The device's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The device's extension

externalId
required
string

The external ID of the device

id
required
string

The ID of the device

location
string or null

The device's location

model
string or null

The device's model

name
required
string

The device's name

product
string or null

The device's product

sipAddress
required
string

The device's address (SIP)

trunkId
required
string

The trunk ID that the device belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkDevice"

Request samples

Content type
application/json
{
  • "description": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "location": "string",
  • "model": "string",
  • "name": "string",
  • "product": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkDevice"
}

Delete a trunk device

Delete a trunk device in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkDeviceId
required
string (trunkDeviceId)

The trunk's device ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Trunk Queues

Trunk queues usually represent call queues or hunt groups in your phone system.

List trunk queues in a trunk

Lists all trunk queues for a given trunk.

This endpoint supports paging. By default the API will return 100 queues, configurable up to a maximum of 1000 trunk's queues at a time. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

query Parameters
next
string (next)

Optional next token for object pagination

limit
required
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

externalId
string (externalId)

The external ID of the trunk queue

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

required
Array of objects (TrunkQueue)
Array
description
string or null

The queue's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The queue's extension

externalId
required
string

The external ID of the queue

id
required
string

The ID of the queue

name
required
string

The queue's name

sipAddress
required
string

The queue's address (SIP)

trunkId
required
string

The trunk ID that the queue belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkQueue"

Response samples

Content type
application/json
{
  • "meta": {
    • "next": "string"
    },
  • "trunkQueues": [
    • {
      • "description": "string",
      • "displayName": "string",
      • "extension": "string",
      • "externalId": "string",
      • "id": "string",
      • "name": "string",
      • "sipAddress": "string",
      • "trunkId": "string",
      • "twimlRedirectUrl": "string",
      • "type": "trunkQueue"
      }
    ]
}

Add a new trunk queue to a trunk

Creates a new trunk queue in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk queue to be created

description
string or null

The queue's description

extension
required
string

The queue's extension

externalId
required
string

The external ID of the queue

name
required
string

The queue's name

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The queue's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The queue's extension

externalId
required
string

The external ID of the queue

id
required
string

The ID of the queue

name
required
string

The queue's name

sipAddress
required
string

The queue's address (SIP)

trunkId
required
string

The trunk ID that the queue belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkQueue"

Request samples

Content type
application/json
{
  • "description": "string",
  • "extension": "string",
  • "externalId": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "name": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkQueue"
}

Update a trunk queue using external ID

Update a trunk queue in the specified trunk by its external ID.

Updating all trunk queues in the specified trunk is currently not supported.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk queue to be updated

description
string or null

The queue's description

externalId
required
string

The external ID of the queue to update

name
string

The queue's name

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The queue's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The queue's extension

externalId
required
string

The external ID of the queue

id
required
string

The ID of the queue

name
required
string

The queue's name

sipAddress
required
string

The queue's address (SIP)

trunkId
required
string

The trunk ID that the queue belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkQueue"

Request samples

Content type
application/json
{
  • "description": "string",
  • "externalId": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "name": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkQueue"
}

Delete a trunk queue using external ID.

Delete a trunk queue in the specified trunk.

Deleting all trunk queues in the specified trunk is currently not supported.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

query Parameters
externalId
required
string (externalId)

The external ID of the trunk queue

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Get a trunk queue

Retrieve a trunk queue resource, and its data.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkQueueId
required
string (trunkQueueId)

The trunk's queue ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The queue's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The queue's extension

externalId
required
string

The external ID of the queue

id
required
string

The ID of the queue

name
required
string

The queue's name

sipAddress
required
string

The queue's address (SIP)

trunkId
required
string

The trunk ID that the queue belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkQueue"

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "name": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkQueue"
}

Update a trunk queue

Update a trunk queue in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkQueueId
required
string (trunkQueueId)

The trunk's queue ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk queue to be updated

description
string or null

The queue's description

name
string

The queue's name

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
description
string or null

The queue's description

displayName
required
string

The display name of this directory entry.

extension
required
string

The queue's extension

externalId
required
string

The external ID of the queue

id
required
string

The ID of the queue

name
required
string

The queue's name

sipAddress
required
string

The queue's address (SIP)

trunkId
required
string

The trunk ID that the queue belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkQueue"

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "displayName": "string",
  • "extension": "string",
  • "externalId": "string",
  • "id": "string",
  • "name": "string",
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkQueue"
}

Delete a trunk queue

Delete a trunk queue in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkQueueId
required
string (trunkQueueId)

The trunk's queue ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Trunk Users

Trunk users usually represent the individual users in your phone system who may have soft phones or desk phones.

List trunk users in a trunk

Lists all trunk users for a given trunk.

This endpoint supports paging. By default the API will return 100 users, configurable up to a maximum of 1000 trunk's users at a time. If the result from a previous call includes a next value in the result set you can use the value returned as the next parameter in the query string to retrieve the next page of results.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

query Parameters
next
string (next)

Optional next token for object pagination

limit
required
string (limit)

The number of objects fetched per request. Default to 100, maximum is 1000

externalId
string (externalId)

The external ID of the trunk user

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
required
object (ResponseMeta)
next
string or null

Used for result set pagination. If this value is non-null, pass the value as the "next" parameter in the subsequent GET request to retrieve the next page of result data.

required
Array of objects (TrunkUser)
Array
assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

displayName
required
string

The display name of this directory entry.

Array of objects (TrunkUserEmail)

The optional list of emails

extension
required
string

The user's extension

externalId
required
string

The external ID of the user

fullName
required
string

The user's full name

id
required
string

The ID of the user

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

sipAddress
required
string

The users SIP address

trunkId
required
string

The trunk ID that the user belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkUser"

Response samples

Content type
application/json
{
  • "meta": {
    • "next": "string"
    },
  • "trunkUsers": [
    • {
      • "assignToUserEmail": "string",
      • "assignToUserId": "string",
      • "department": "string",
      • "description": "string",
      • "displayName": "string",
      • "emails": [
        • {
          }
        ],
      • "extension": "string",
      • "externalId": "string",
      • "fullName": "string",
      • "id": "string",
      • "jobTitle": "string",
      • "location": "string",
      • "manager": "string",
      • "phoneNumbers": [
        • {
          }
        ],
      • "sipAddress": "string",
      • "trunkId": "string",
      • "twimlRedirectUrl": "string",
      • "type": "trunkUser"
      }
    ]
}

Add a new trunk user to a trunk

Creates a new trunk user in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk user to be created

assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

extension
required
string

The user's extension

externalId
required
string

The external ID of the user

fullName
required
string

The user's full name

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

displayName
required
string

The display name of this directory entry.

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

extension
required
string

The user's extension

externalId
required
string

The external ID of the user

fullName
required
string

The user's full name

id
required
string

The ID of the user

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

sipAddress
required
string

The users SIP address

trunkId
required
string

The trunk ID that the user belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkUser"

Request samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "extension": "string",
  • "externalId": "string",
  • "fullName": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ]
}

Response samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "displayName": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "extension": "string",
  • "externalId": "string",
  • "fullName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ],
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkUser"
}

Update a trunk user using external ID

Update a trunk user in the specified trunk by its external ID.

Updating all trunk users in the specified trunk is currently not supported.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk user to be updated

assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

externalId
required
string

The external ID of the user to update

fullName
string

The user's full name

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

displayName
required
string

The display name of this directory entry.

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

extension
required
string

The user's extension

externalId
required
string

The external ID of the user

fullName
required
string

The user's full name

id
required
string

The ID of the user

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

sipAddress
required
string

The users SIP address

trunkId
required
string

The trunk ID that the user belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkUser"

Request samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "externalId": "string",
  • "fullName": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ]
}

Response samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "displayName": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "extension": "string",
  • "externalId": "string",
  • "fullName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ],
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkUser"
}

Delete a trunk user using external ID.

Delete a trunk user in the specified trunk.

Deleting all trunk users in the specified trunk is currently not supported.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

query Parameters
externalId
required
string (externalId)

The external ID of the trunk user

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Get a trunk user

Retrieve a trunk user resource, and its data.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkUserId
required
string (trunkUserId)

The trunk's user ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

displayName
required
string

The display name of this directory entry.

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

extension
required
string

The user's extension

externalId
required
string

The external ID of the user

fullName
required
string

The user's full name

id
required
string

The ID of the user

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

sipAddress
required
string

The users SIP address

trunkId
required
string

The trunk ID that the user belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkUser"

Response samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "displayName": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "extension": "string",
  • "externalId": "string",
  • "fullName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ],
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkUser"
}

Update a trunk user

Update a trunk user in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkUserId
required
string (trunkUserId)

The trunk's user ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Request Body schema: application/json
optional

Information about the trunk user to be updated

assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

fullName
string

The user's full name

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

Responses

Response Headers
Access-Control-Allow-Origin
string (Access-Control-Allow-Origin)
Default: "*"
Example: "*"

The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin. - MDN Link

Response Schema: application/json
assignToUserEmail
string or null

The email of the Spoke user to assign this trunk user to. Ignored if assignToUserId is provided. Setting this field to null will unassign the current owner.

assignToUserId
string or null

The Spoke user ID of the user to assign this trunk user to. Setting this field to null will unassign the current owner.

department
string or null

The user's department

description
string or null

The user's description

displayName
required
string

The display name of this directory entry.

Array of objects (TrunkUserEmail)

The optional list of emails

Array
emailAddress
required
string

The email address

label
string

The email label e.g. work, personal

extension
required
string

The user's extension

externalId
required
string

The external ID of the user

fullName
required
string

The user's full name

id
required
string

The ID of the user

jobTitle
string or null

The user's job title

location
string or null

The user's location

manager
string or null

The user's manager

Array of objects (TrunkUserPhoneNumber)

The optional list of phone numbers

Array
assignToUser
boolean

Flag to signify whether this phone number can be used by the assigned user in the spoke platform. Setting this flag will automatically create the phone number in the spoke phone numbers table and attach the phone number to the assigned user. This requires either assignToUserEmail or assignToUserId to be provided.

label
string

The number label e.g. work, home

phoneNumber
required
string

The phone number

sipAddress
required
string

The users SIP address

trunkId
required
string

The trunk ID that the user belongs to

twimlRedirectUrl
string

Redirecting an inbound Twilio call to this target url will transfer the call to this entry. Use this URL to send a call to Spoke from Twilio Studio, Flex or your own TwiML application.

You can add additional parameters to this url to control how the call is handled by Spoke. See Routing Twilio Calls into Spoke for more information.

type
required
string
Value: "trunkUser"

Request samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "fullName": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ]
}

Response samples

Content type
application/json
{
  • "assignToUserEmail": "string",
  • "assignToUserId": "string",
  • "department": "string",
  • "description": "string",
  • "displayName": "string",
  • "emails": [
    • {
      • "emailAddress": "string",
      • "label": "string"
      }
    ],
  • "extension": "string",
  • "externalId": "string",
  • "fullName": "string",
  • "id": "string",
  • "jobTitle": "string",
  • "location": "string",
  • "manager": "string",
  • "phoneNumbers": [
    • {
      • "assignToUser": true,
      • "label": "string",
      • "phoneNumber": "string"
      }
    ],
  • "sipAddress": "string",
  • "trunkId": "string",
  • "twimlRedirectUrl": "string",
  • "type": "trunkUser"
}

Delete a trunk user

Delete a trunk user in the specified trunk.

path Parameters
trunkId
required
string (trunkId)

The trunk ID

trunkUserId
required
string (trunkUserId)

The trunk's user ID

header Parameters
Authorization
required
string (Authorization)

Authorization header bearing the access token

Responses