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:
/conversationMessages endpoint. The messages will be automatically added to the user's conversations in the Spoke application./contentAnalysis endpoint.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:
Either account will allow you to get started and provides access to full production functionality.
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
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:
For more details on the OAuth 2.0 client credentials flow, see the overview at https://auth0.com/docs/flows/concepts/client-credentials
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.
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.
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/jsonbody, however this content type is deprecated in favour ofapplication/x-www-form-urlencoded.
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 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.
The API is RESTful. All requests should be made over HTTPS, and accessed from https://integration.spokephone.com.
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.
The success or failure of an HTTP request is returned as a standard HTTP status code:
2xx code for success4xx or 5xx code for failureThe response body will always be encoded in JSON format. No other data format (e.g. XML) is supported.
The Spoke Phone API uses a cursor based model for paging of large result sets. Paging support is available for the following endpoints:
GET /phonebooksGET /phonebooks/{id}/contactsGET /callsGET /trunksGET /trunks/{trunkId}/trunkDevicesGET /trunks/{trunkId}/trunkQueuesGET /trunks/{trunkId}/trunkUsersAll 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 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.
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.
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.
In general for any date/time or timestamp types, this API will provide two fields:
{fieldName}At: This is an ISO8601 formatted date/time. All date/times are UTC.{fieldName}Timestamp: This is a numeric timestamp in milliseconds since the Unix epoch.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.
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.
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.
In Spoke, a User can have multiple callable endpoints, for example:
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.
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 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.
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.
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
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.
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.
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
twimlRedirectUrlfor each directory entry that includes the correctextensionandorganisationIdparameters.
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.
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:
returnTo/returnToId are provided, then the call will be returned to the target defined by returnToId as described in the section Returning unanswered calls belowreturnTo/returnToId are not provided, the call will silently end. Due to this behaviour, we recommend that returnTo and returnToId are always providedIt 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.
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:
User extension, the call will go the user's voicemailTeam 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 numberTo 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-Signatureheader. 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.
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:
Note : As noted above, only
UserandTeamextensions currently support voicemail.
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.
User or a Device, this is the number of seconds Spoke will ring the user or the device.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.Team, this is the number of the seconds Spoke will wait for someone to answer the call before returning or forwarding the call.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.
If a valid value is provided as the priority, then Spoke will use it to:
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 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.
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.
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.
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.
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:
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.
userWithAvailability, teamWithAvailability etc) of the directory entryYou 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.
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.
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.
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:
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.returnTo and returnToId parameters to return the call to your flow if the call goes unanswered in Spoke.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 Microsoft Power Automate to Dynamics 365 samples
Download the postman collection of sample Spoke webhook events
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.
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.
A request is considered valid based on the following conditions:
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.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;
}
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.
Spoke will retry delivering a webhook event if the request fails and your endpoint responds with any of the following status codes:
5xx429408Failed 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.
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.
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.
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.
/contentAnalysis request payload to support analyzing aggregated agent scorecardslicenses attribute to the UserWithAvailability typeGET /users, GET /users/{id}, GET /directory, GET /directory/{entryId}, the user.availability.updated webhook event, and the team.availability.updated webhook eventPOST /conversationMessages endpointPOST /messages and POST /teamMessages endpoints as deprecatedPOST /conversationMessages and will be removed in a future version of the APIemail to GET /users endpointnotifyUsers attribute to:POST /messages request payloadPOST /teamMessages request payloadreturnToId, when returnTo is set to postEndpointpreferences field to the Insights Data Action Response/calls/{id}/contentAnalysis endpoint/contentAnalysis endpointusage property to artifacts in:/contentAnalysis/{id}content_analysis.completed eventconversation.contact_assigned eventPOST /messageslocation to User in Call and Conversation typesmedia to Message type in conversation webhook eventsmedia.vendorResourceUrl is populated for BYOT accounts/contentAnalysis endpointtranscriptionModel attribute to recordings of content in POST /contentAnalysis request payload/contentAnalysis endpointanalyzer attribute to ContentAnalysis type/contentAnalysis endpoint for submitting a content analysis request/contentAnalysis/{id} endpoint for getting a content analysiscontent_analysis.completed event/phonebooks/{id} and /phonebooks/{id}/contacts/* endpointsid parameter to refer to the user's personal phonebookcall.transcription_completed eventtext attribute of Transcript typeLEAVE and JOIN speaker events for call recordingsvendorCallIds attribute to dials attribute of parties in the Call typemanager field to user fields/users endpoint response/users/{id} endpoint response/directory endpoint responsesendAsUser attribute to messageContent in Send Team SMS message request payloadcall.transcript.created eventtranscript attribute to call Recording type/transcripts endpoint for list transcripts/transcripts/{transcriptId} endpoint for getting a transcript/transcripts/{transcriptId} endpoint for deleting a transcript/transcripts/{transcriptId}/segments endpoint for getting a transcript's segmentstranscript.created eventInbound Conversations data actionSend a new SMS message and Send a new Team SMS message APIsOutbound Call and Team Call data actionsdial deep link routedial documentationpassthroughParameters field to the Call type, which applies to the call resource and call webhook event datacall, dial and message deep link routes for the Spoke Phone appspoke://call/{callId} - Navigates to the details of the specified callspoke://call/{callId}/insight - Navigates to the insight for the specified callspoke://dial?contactNumber={contactNumber}&callerId={callerId} - Dials a contact number using a specified caller IDspoke://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 bodyspoke://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/call/{callId}/recordings/{recordingId} endpoint for getting a call recording/call/{callId}/recordings/{recordingId} endpoint for deleting a call recordingid, callId and fileSize attributes to call Recording typeid can be used to delete the call recording via the DELETE endpoint abovemimeType and channels attributes to call Recording typeorganisationId attribute webhook event dataspoke.precall request origin for Call Insights Data Action requests from the Spoke Phone app's incoming callspriority to Team Call Data Action Response Payloadtimezone attribute to parties attribute of Call typeusercards in the new payload.spoke.callhistory request origin for Call Insights Data Action requests from the Spoke Phone app's call historycontactEmail and contactId for Call Insights Data Action request parameters for internal calls to a Spoke userAfter 30 days should be P30D not PT30D.closeTimer to /messages endpointcloseTimer to Inbound Conversations Data Action Response PayloadcloseTimer to /teamMessages endpoint/webhooks endpoint for listing existing webhooks with pagination/webhooks endpoint for creating a new webhook/webhooks/{id} endpoint for getting an existing webhook/webhooks/{id} endpoint for updating an existing webhook/webhooks/{id} endpoint for deleting an existing webhookdesktopEnrolledReleaseChannel attribute to UserWithAvailability typewhatsApp channel to Inbound Conversations Data Action request payloadcompanyAddress and contactAddress are updated to support the new whatsApp channelvendor, vendorConversationId, initiatedBy, companyNumberOwner and name fields to Conversation typeinitiatedBy and companyNumberOwner fields will only be populated for conversations created after 2 October 2023vendorMessageId and isApiCreated fields to Message TypeclaimRule to Inbound Conversations Data Action response payload/teamMessages API to send messages on behalf of team using team assigned DDIloginStatus and isDirectorySynced attributes to UserWithAvailability typeCall Group to Team inline with changes to Spoke admin and application user interfacesreturnTo and returnToId parameters are provided
overriddenDisplayName attribute to assignedCallGroup and directoryTarget attributes of Call typeteam's the display name is overridden via Call Group Data ActiondeviceId, deviceAddress and deviceExtension to Outbound Call Data Action request parametersincludeHiddenCallGroups to /directory endpointtrue, return all directory entries, including hidden call groups.isHidden attribute to TeamWithAvailability typeassignedCallGroup attribute to Call typeid, displayName, type, and extensiondirectoryTarget field on the CallGroupDataActionRequestPayload object has been deprecated in favour of assignedCallGroup.extension, email and dials attributes to each party in parties attribute of Call typedials contains a list of dial attempts to the call party with a reason for each dialjoinedAt and leftAt attributes to each connection in connections attribute of Call typetwimlRedirectUrlblocked call status and blocked outcome to Call typereason 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.outcome attribute to Call typereason field, which identifies the reason
a call was abandoned or missed.tariff attribute to Call type, and new call.tariffed eventcall.tariffed event is emittedincludeSuspendedUsers to /directory endpointtrue, return all directory entries, including suspended users.UserWithAvailability.status is now one of invited, active or suspendeddirectoryTarget attribute to Call typecall.answered / call.not_answeredid, displayName, type, extension and emailwaitTime and waitTimeText attributes to Call typewaitTime is calculated as the millisecond difference between startedAt and answeredAt fields.waitTime is equivalent to the value of duration.waitTimeText field is a human readable version of the waitTime field, similar to durationText/directory/{entryId} endpoint./phonebooks/{id}/contacts/{contactId} endpoint.excludeEmpty query parameter to the GET /phonebooks endpoint.sortOrder and contactNumber query parameters to GET /calls endpoint.call.started, call.answered, call.not_answered, call.hungup eventtwimlRedirectUrlvendor and vendorCallId fields to UserWithAvailability and Call typesvendorCallId contains the callSid of the parent callUserWithAvailability type, these fields will be populated (along with callId)
when the user's availability status is busy and notAvailableRule is busyOnACalluser.availability.updated eventteam.availability.updated eventsipAddress field to Device object for /directory endpointtrunkUsers, trunkDevices and trunkQueues which are returned by /trunks and /directorydisplayName - Display name of the directory entrytype - Directory typetwimlRedirectUrl - Redirecting an inbound Twilio call to this target url will transfer the call to this entrytrunkUsers, trunkDevices and trunkQueues to the list of entries returned by /directory endpointmobile field of User and UserWithAvailability objectstwimlRedirectUrl field to TeamWithAvailability, UserWithAvailability and Device object for/directory endpoint/users endpoint/directory endpoint. Lists or finds directory entries. Supports optional search parameters.users, teams and devices. Future revisions will include trunkUsers, trunkDevices and trunkQueuesextension, ivrKey or phoneNumber/users endpoint:phoneNumbers - List of phone numbers of the userdisplayName - Display name of the usertype - Directory typeavailability.availabilitySummary - Describes the current availability of the userfrom parameter allows you to specify either the user's SMS enabled DDI or their email addressconversation.message.created event will be fired when the message is created.conversation.inactiveconversation.closedconversation.message.created/trunks/{trunkId}/trunkUsers/* endpoint.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./phonebooks endpoints can include additional nullable fields in the body: countryIso/phonebooks and /contacts endpoints with contact can include additional nullable fields in the body: firstName, lastName and jobTitle/trunks/{trunkId}/trunkDevices/* endpoints can include additional nullable fields in the body: description, location, model and product/trunks/{trunkId}/trunkQueues/* endpoints can include additional nullable fields in the body: description/trunks/{trunkId}/trunkUsers/* endpoints can include additional nullable fields in the body: department, description, jobTitle, location and managerYou 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:
/trunks endpoint. Lists all SIP Trunks in the organisation. Trunks must be created via the Spoke account portal and will required additional network configuration./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./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./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./users endpoint. Lists all Spoke users in the organisation. This list is equivalent to the list of Users in Spoke application "Internal" directory view.GET /users and GET /users/{id}. Future versions may support PUT methods to enable external control of availabilityextensions, phone_numbers, teams/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.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")initiator and recipient fields on the Call object have been deprecated in favour of contactNumber and companyNumber./calls endpoints now include a notes type./calls endpoint:before, since parameters) and/or last modified timestamp (modified parameter)./phonebook & /phonebook/{id}/contact) in favour of plural endpoints./phonebooks, /phonebooks/{id}, /calls)nextContact query string parameter with next parameter as the standard parameter for response result set paging across all endpointsSpoke 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.
A request is considered valid based on the following conditions:
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.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>.<request data> depends on the HTTP method used:GET requests, it is the request URL including the query parametersPOST requests, it is the raw request bodyA 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;
}
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.
The Inbound Conversations Data Action allows you to programmatically handle the creation of a new conversation, including:
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.
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:
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.
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.
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.
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.
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.
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.
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:
| channel required | string The channel of the inbound conversation. The value for this field will always be 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. | ||||
| 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. | ||||
| 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 | ||||
| |||||
| vendorConversationId required | string The vendor's identifier for the conversation | ||||
{- "channel": "sms",
- "companyAddress": "string",
- "contactAddress": "string",
- "contactDisplayName": "string",
- "contactId": "string",
- "conversationId": "string",
- "messageContent": {
- "body": "string",
- "media": [
- {
- "fileSize": 0,
- "mimeType": "string",
- "tempUrl": "string"
}
]
}, - "vendorConversationId": "string"
}| assignUsers | Array of strings List of users to be added to the conversation. Required when 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 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. | |||||
| |||||
| 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:
| ||||
| 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:
The following are the minimum and maximum values for the field:
| ||||
| 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 The maximum size of passthrough parameters is 1000 bytes. Example:
| |||||
object (ConversationPassthroughParametersResponse) If specified, stores the passthrough parameters against the conversation. Each passthrough parameter key must start with the prefix The maximum size of passthrough parameters is 1000 bytes. Example:
| |||||
| routingAction | string Enum: "assign" "donotroute" How the conversation should be handled -
| ||||
{- "assignUsers": [
- "string"
], - "autoResponseContent": {
- "author": "string",
- "body": "string"
}, - "claimRule": "claimable",
- "closeTimer": "string",
- "name": "string",
- "passthroughParameters": { },
- "routingAction": "assign"
}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.
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.
Spoke Phone app users can view Insights for other Spoke users from the internal directory or phonebook contacts from the external directory.
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:
| 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. 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:
Value: "spoke.contactlookup" |
| userEmail required | string Email of the user that is requesting Insights. |
{- "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.
Spoke Phone app users can view Insights for calls from the call screen Insights tab.
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:
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:
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:
|
| 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. The contactSource field will match the phonebook name as listed in the Spoke Account Portal integrations page. This field will be null when |
| direction required | string (CallDirection) Enum: "inbound" "outbound" Call direction. One of the following values:
|
| 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 |
| 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:
|
| 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).
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
Spoke app users can view primary party's Insights for conversations from the conversation screen pop up menu or the conversation settings screen.
![]() |
![]() |
![]() |
![]() |
Spoke app users can also view any selected party's Insights for conversations from the participant pop up menu of the conversation settings screen.
![]() |
![]() |
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 |
| 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 |
| contactSource | string or null The name of the phonebook that the contact who originated or received the conversation
belongs to (e.g. The contactSource field will match the phonebook name as listed in the Spoke Account Portal integrations page. This field will be null when |
| 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:
|
| 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 |
| requestOrigin required | string A concatenation of which Spoke app and where in the app the data is being requested. Possible values:
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"
}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 | |||||||||||||
Any of Array
| |||||||||||||
InsightContext (object) or (any or null) Insights Summary that will be displayed above the Insights Cards No Insights Summary will be displayed if | |||||||||||||
Any of
| |||||||||||||
InsightPreferences (object) or (any or null) Preferences for the Insights response. | |||||||||||||
Any of
| |||||||||||||
{- "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"
}
}
}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 |
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.
Call Summary (call history → select a call)
Only the context is shown. The context from the Insights Response is displayed as specified by preferredSource.
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.
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.
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.
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.
The status column on the table refers to the response from the configured URL. There are 3 status types:
successfailurenoDataIt 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:
success will be added if:
failed will be added if a network error is encountered
noData when the response is empty (i.e. if there is no payload) or an empty array is returned
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:
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".
Overrides the caller ID for any outbound call made.
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.
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.
| 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"
}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
| 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:
|
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 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:
| |
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 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:
| |
{- "callerId": "string",
- "dialPermission": "allowed",
- "passthroughParameters": { }
}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.
Overrides the display name of the team the call will be offered to. This overridden name will be displayed in following areas:
Note: This field is ignored for internal calls.
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.
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.
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.
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.
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.
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.
required | object (CallGroupDirectoryEntry) Contains directory entry of the team which the call was offered to. | ||||||||
| |||||||||
| 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 | ||||||||
| 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:
| ||||||||
required | object (DeprecatedDirectoryTarget) ** DEPRECATED ** Use the | ||||||||
| |||||||||
| 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. | ||||||||
| |||||||||
| 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"
}| 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:
| ||||||
object (OverrideCallGroupOfferConfig) Configuration that overrides how the call will be offered to the team. | |||||||
| |||||||
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 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:
| |||||||
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 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:
| |||||||
| priority | number If specified, overrides the priority of the call. Use this to prioritise or deprioritise a call. Priority is used:
The supported range of values for | ||||||
{- "callGroupDisplayName": "string",
- "offerConfig": {
- "nextOfferTimeout": 0,
- "timeout": 0,
- "users": {
- "group1": [
- "string"
], - "group2": [
- "string"
]
}
}, - "passthroughParameters": { },
- "priority": 0
}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:
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:
The following examples illustrate when data action requests will be made during the lifecycle of a call.
Request for Reception DeskRequest for SalesRequest for Customer SupportRequest for Reception DeskRequest for Regional SalesRequest for Global SalesDeep 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
Each URL must be URI-encoded before use to ensure correct parsing.
spoke://call/{callId}
Navigates to the details of the specified call.
callId is invalid or not provided, or the call does not exist, the app will redirect to the user's Call History list.spoke://call/e814fb79-3f4f-4cf3-94ed-f88a5c15cb9e
spoke://dial?contactNumber={contactNumber}&callerId={callerId}
Dials a contact number using a specified caller ID.
contactNumber is not provided, the app will open the Dial Pad.contactNumber is invalid, it will be prefilled in the Dial Pad, allowing the user to edit it.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.callerId is valid but contactNumber is invalid, the valid callerId will be preselected in the Dial Pad.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.
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:
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 numbercontactNumber MUST be a valid +E164 numberspoke://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.
contactAddress is invalid or not provided, the app will navigate to the Messages tab.contactAddress exists, the user will be directed to that conversation; otherwise a new SMS conversation will be created.companyAddress must be a phone number from the user's list of available SMS-capable numbers.companyAddress is invalid, the user will be prompted to select a valid phone number from the list of available SMS sender IDs.body should be URI-encoded to ensure correct parsing.body is not provided, the message input will be empty.spoke://message/sms?contactAddress=%2B64221112222&companyAddress=%2B14341112222&body=Hi%20Bob%2C%20this%20is%20Alice
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.
whatsapp:+64221112222contactAddress is invalid or not provided, the app will navigate to the Messages tab.contactAddress exists, the user will be directed to that conversation; otherwise a new WhatsApp conversation will be created.whatsapp:+14341112222companyAddress must be a WhatsApp-capable number from the user's list of available WhatsApp-capable numbers.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 must match the friendly name of the WhatsApp-approved content template on Twilio.templateName is not provided, the user will be prompted to select a template from the list of available templates.templateName is invalid, the message input will be empty.spoke://message/whatsapp?contactAddress=whatsapp%3A%2B64221112222&companyAddress=whatsapp%3A%2B14341112222&templateName=WelcomeMessage
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.
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.
| 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 |
| 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 |
| ivrKey | string (ivrKey) Returns directory filtered by IVR key. Exact match only. This parameter is incompatible with |
| 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 If By default, this flag is false and hidden call groups are excluded from the response. |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
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 | ||||||||||||||
Array Any of
| |||||||||||||||
required | object (ResponseMeta) | ||||||||||||||
| |||||||||||||||
{- "entries": [
- {
- "deviceType": "deskPhone",
- "displayName": "string",
- "extension": "string",
- "id": "string",
- "sipAddress": "string",
- "twimlRedirectUrl": "string",
- "type": "device"
}
], - "meta": {
- "next": "string"
}
}Retrieves a directory entry
| entryId required | string (entryId) The directory entry ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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" |
{- "deviceType": "deskPhone",
- "displayName": "string",
- "extension": "string",
- "id": "string",
- "sipAddress": "string",
- "twimlRedirectUrl": "string",
- "type": "device"
}Users are the individual Spoke Users in your account. You can query this API to get all active users and their current system availability.
This API endpoint lists all users in your organisation and their current availability.
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. |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
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:
|
| displayName required | string User’s name as it appears in the Spoke Directory |
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 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 |
| 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" |
[- {
- "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"
}
]Retrieve a user resource, and its data.
| id required | string (id) The user ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
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:
| ||||||||||||||||||||||||
| displayName required | string User’s name as it appears in the Spoke Directory | ||||||||||||||||||||||||
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 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 | ||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||
| status required | string The current registration status of the user. Will be one of | ||||||||||||||||||||||||
| 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" | ||||||||||||||||||||||||
{- "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-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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) | ||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "numberE164": "+16853256261",
- "numberLocal": "(999) 593-9782",
- "numberDisplay": "+1 103-558-1135"
}, - {
- "numberE164": "+10988821315",
- "numberLocal": "(189) 392-9922",
- "numberDisplay": "+1 264-731-6374"
}
], - "status": "active",
- "teams": [
- "Business-focused interactive attitude",
- "Extended directional array",
- "Monitored data-driven frame"
], - "type": "user"
}
}, - "id": "d934f06b-518e-47a8-993a-a40ecbcacf9a",
- "timestamp": 1780639038942,
- "type": "user.availability.updated",
- "version": "2020-07-15"
}Team-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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) | ||||||||||||||||||||||||
| |||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||
{- "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": [
- {
- "id": "986418db-0ea6-44bc-a43a-2665dba47706",
- "displayName": "Geraldine Dietrich",
- "phoneNumbers": [ ],
- "type": "user",
- "extension": 8030784,
- "firstName": "Kristine",
- "lastName": "Harvey",
- "mobile": null,
- "email": "Willie.Kshlerin10@yahoo.com",
- "jobTitle": "National Infrastructure Executive",
- "location": "Aureliaworth",
- "status": "active",
- "isDirectorySynced": false,
- "licenses": [
- "essentials"
], - "loginStatus": "loggedOut",
- "teams": [
- "Ergonomic secondary internet solution"
], - "availability": {
- "status": "offline",
- "statusTimestamp": 1780639038946,
- "statusAt": "2026-06-05T05:57:18.946Z",
- "timezone": "Pacific/Kosrae",
- "availabilitySummary": "Offline"
}, - "desktopEnrolledReleaseChannel": "stable"
}, - {
- "id": "1a49cd88-f47f-4571-8904-b184cfd554ef",
- "displayName": "Clementina Morar",
- "phoneNumbers": [
- {
- "numberE164": "+11597171089",
- "numberLocal": "(340) 711-7148",
- "numberDisplay": "+1 127-773-9444"
}
], - "type": "user",
- "extension": "12622",
- "firstName": "Ricky",
- "lastName": "Mosciski",
- "mobile": null,
- "email": "Isabella.Deckow43@gmail.com",
- "jobTitle": "Forward Functionality Director",
- "location": null,
- "status": "active",
- "isDirectorySynced": false,
- "licenses": [
- "proCx",
- "enlightenPro"
], - "loginStatus": "loggedIn",
- "desktopEnrolledReleaseChannel": "stable",
- "teams": [
- "Open-source content-based paradigm",
- "Upgradable full-range attitude"
], - "availability": {
- "availabilitySummary": "Gwen is on another call",
- "callId": "090be6fa-407f-4257-bec6-4eb97cf94ace",
- "vendor": "twilio",
- "vendorCallId": "CAA934976AFE6F4E9E9011FB02144B4919",
- "notAvailableReason": "On another call",
- "notAvailableRule": "busyOnACall",
- "status": "busy",
- "statusAt": "2026-06-05T05:57:18.946Z",
- "statusTimestamp": 1780639038946,
- "timezone": "Pacific/Pitcairn"
}
}, - {
- "id": "f05a8a59-e55f-474f-b833-cbf1a3c93819",
- "displayName": "Clifford Schinner",
- "phoneNumbers": [
- {
- "numberE164": "+17669331909",
- "numberLocal": "(951) 904-5860",
- "numberDisplay": "+1 953-127-7632"
}, - {
- "numberE164": "+14231300414",
- "numberLocal": "(442) 969-5027",
- "numberDisplay": "+1 318-210-4257"
}
], - "type": "user",
- "extension": 7160845,
- "firstName": "Lawrence",
- "lastName": "Brekke",
- "mobile": "+19830652137",
- "email": "Perry61@hotmail.com",
- "jobTitle": "Regional Directives Assistant",
- "location": "West Adrienne",
- "status": "active",
- "isDirectorySynced": false,
- "licenses": [
- "proCx",
- "enlightenEssentials",
- "callHub10Pack"
], - "loginStatus": "loggedIn",
- "desktopEnrolledReleaseChannel": "beta",
- "teams": [
- "Upgradable logistical challenge"
], - "availability": {
- "status": "available",
- "statusTimestamp": 1780639038946,
- "statusAt": "2026-06-05T05:57:18.946Z",
- "timezone": "Asia/Yakutsk",
- "availabilitySummary": "Available"
}
}, - {
- "id": "e523afae-ccbc-4d01-83b9-fb7bc5aadcd5",
- "displayName": "Lionel Grady",
- "phoneNumbers": [ ],
- "type": "user",
- "extension": 4953276,
- "firstName": "Brooke",
- "lastName": "Shields",
- "mobile": null,
- "email": "Saul.Swift30@yahoo.com",
- "jobTitle": "Lead Branding Liaison",
- "location": null,
- "status": "invited",
- "isDirectorySynced": false,
- "licenses": [ ],
- "loginStatus": "loggedOut",
- "teams": [
- "Ergonomic next generation project"
], - "desktopEnrolledReleaseChannel": "stable"
}
], - "type": "team"
}
}, - "id": "4824cc26-8c72-4bb9-8535-d180fafa7fd6",
- "timestamp": 1780639038944,
- "type": "team.availability.updated",
- "version": "2020-07-15"
}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 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.
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
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:
When accessed via the Spoke API, this value will always be |
| name required | string The name of the phonebook |
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) |
| ownerId required | string ** DEPRECATED **. Refer to |
| sourceId | string ID of the phonebook's source |
| uploaded required | number UTC timestamp of the latest upload time |
[- {
- "contacts": [
- {
- "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"
}
}
], - "description": "string",
- "id": "string",
- "managedBy": "organisation",
- "name": "string",
- "owner": {
- "id": "string",
- "type": "organisation"
}, - "ownerId": "string",
- "sourceId": "string",
- "uploaded": 0
}
]Create a new phonebook and populates it with the provided contacts.
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the phonebook to be created
Array of objects (ContactInput) The list of contacts belonging to this phonebook | |||||||||||||||
Array
| |||||||||||||||
| 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 | ||||||||||||||
| Access-Control-Allow-Origin |
| 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:
When accessed via the Spoke API, this value will always be | ||||
| name required | string The name of the phonebook | ||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||
Any of
| |||||
| ownerId required | string ** DEPRECATED **. Refer to | ||||
| sourceId | string ID of the phonebook's source | ||||
| uploaded required | number UTC timestamp of the latest upload time | ||||
{- "contacts": [
- {
- "companyName": "string",
- "emails": [
- {
- "label": "string",
- "value": "string"
}
], - "firstName": "string",
- "id": "string",
- "jobTitle": "string",
- "lastName": "string",
- "phoneNumbers": [
- {
- "label": "string",
- "value": "string"
}
]
}
], - "countryIso": "string",
- "description": "string",
- "name": "string"
}{- "description": "string",
- "id": "string",
- "managedBy": "organisation",
- "name": "string",
- "owner": {
- "id": "string",
- "type": "organisation"
}, - "ownerId": "string",
- "sourceId": "string",
- "uploaded": 0
}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.
| id required | string (id) The phonebook ID |
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | Array of objects (Contact) The list of contacts belonging to the phonebook. May be empty if no matched contacts are found. | ||||||||||||||||||||||
Array
| |||||||||||||||||||||||
| 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:
When accessed via the Spoke API, this value will always be | ||||||||||||||||||||||
object (ResponseMeta) | |||||||||||||||||||||||
| |||||||||||||||||||||||
| name required | string The name of the phonebook | ||||||||||||||||||||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||||||||||||||||||||
Any of
| |||||||||||||||||||||||
| ownerId required | string ** DEPRECATED **. Refer to | ||||||||||||||||||||||
| sourceId | string ID of the phonebook's source | ||||||||||||||||||||||
| uploaded required | number UTC timestamp of the latest upload time | ||||||||||||||||||||||
{- "contacts": [
- {
- "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"
}
}
], - "description": "string",
- "id": "string",
- "managedBy": "organisation",
- "meta": {
- "next": "string"
}, - "name": "string",
- "owner": {
- "id": "string",
- "type": "organisation"
}, - "ownerId": "string",
- "sourceId": "string",
- "uploaded": 0
}Update an existing phonebook and replace its contacts with the provided contacts.
| id required | string (id) The phonebook ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the phonebook to be updated
Array of objects (ContactInput) The list of contacts belonging to this phonebook | |||||||||||||||
Array
| |||||||||||||||
| 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 | ||||||||||||||
| Access-Control-Allow-Origin |
| 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:
When accessed via the Spoke API, this value will always be | ||||
| name required | string The name of the phonebook | ||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||
Any of
| |||||
| ownerId required | string ** DEPRECATED **. Refer to | ||||
| sourceId | string ID of the phonebook's source | ||||
| uploaded required | number UTC timestamp of the latest upload time | ||||
{- "contacts": [
- {
- "companyName": "string",
- "emails": [
- {
- "label": "string",
- "value": "string"
}
], - "firstName": "string",
- "id": "string",
- "jobTitle": "string",
- "lastName": "string",
- "phoneNumbers": [
- {
- "label": "string",
- "value": "string"
}
]
}
], - "countryIso": "string",
- "description": "string",
- "name": "string"
}{- "description": "string",
- "id": "string",
- "managedBy": "organisation",
- "name": "string",
- "owner": {
- "id": "string",
- "type": "organisation"
}, - "ownerId": "string",
- "sourceId": "string",
- "uploaded": 0
}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.
| id required | string (id) The phonebook ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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.
required | object (Email) The email of the user that the personal phonebook is owned by |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the personal phonebook to be created or updated
Array of objects (ContactInput) The list of contacts belonging to this phonebook | |||||||||||||||
Array
| |||||||||||||||
| 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 | ||||||||||||||
| Access-Control-Allow-Origin |
| 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:
When accessed via the Spoke API, this value will always be | ||||
| name required | string The name of the phonebook | ||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||
Any of
| |||||
| ownerId required | string ** DEPRECATED **. Refer to | ||||
| sourceId | string ID of the phonebook's source | ||||
| uploaded required | number UTC timestamp of the latest upload time | ||||
{- "contacts": [
- {
- "companyName": "string",
- "emails": [
- {
- "label": "string",
- "value": "string"
}
], - "firstName": "string",
- "id": "string",
- "jobTitle": "string",
- "lastName": "string",
- "phoneNumbers": [
- {
- "label": "string",
- "value": "string"
}
]
}
], - "countryIso": "string",
- "description": "string",
- "name": "string"
}{- "description": "string",
- "id": "string",
- "managedBy": "organisation",
- "name": "string",
- "owner": {
- "id": "string",
- "type": "organisation"
}, - "ownerId": "string",
- "sourceId": "string",
- "uploaded": 0
}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 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.
| id required | string (id) The phonebook ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
New contacts to add and required metadata
required | object (ContactInput) | ||||||||||||||
| |||||||||||||||
| countryIso | string or null Country ISO code for formatting local phone numbers | ||||||||||||||
| Access-Control-Allow-Origin |
| companyName | string or null Optional company name of the contact | ||||||||
Array of objects (Email) Optional list of emails of the contact | |||||||||
Array
| |||||||||
| 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
| |||||||||
| 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:
When accessed via the Spoke API, this value will always be | ||||||||
| phonebookName | string The name of the phonebook this contact belongs to | ||||||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||||||
Any of
| |||||||||
{- "contact": {
- "companyName": "string",
- "emails": [
- {
- "label": "string",
- "value": "string"
}
], - "firstName": "string",
- "id": "string",
- "jobTitle": "string",
- "lastName": "string",
- "phoneNumbers": [
- {
- "label": "string",
- "value": "string"
}
]
}, - "countryIso": "string"
}{- "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"
}
}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.
| id required | string (id) The phonebook ID |
| contactId required | string (contactId) The contact ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| companyName | string or null Optional company name of the contact | ||||||||
Array of objects (Email) Optional list of emails of the contact | |||||||||
Array
| |||||||||
| 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
| |||||||||
| 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:
When accessed via the Spoke API, this value will always be | ||||||||
| phonebookName | string The name of the phonebook this contact belongs to | ||||||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||||||
Any of
| |||||||||
{- "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 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.
| id required | string (id) The phonebook ID |
| contactId required | string (contactId) The contact ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the contact to be updated
required | object (ContactInput) | ||||||||||||||
| |||||||||||||||
| countryIso | string or null Country ISO code for formatting local phone numbers | ||||||||||||||
| Access-Control-Allow-Origin |
| companyName | string or null Optional company name of the contact | ||||||||
Array of objects (Email) Optional list of emails of the contact | |||||||||
Array
| |||||||||
| 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
| |||||||||
| 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:
When accessed via the Spoke API, this value will always be | ||||||||
| phonebookName | string The name of the phonebook this contact belongs to | ||||||||
required | OrganisationPhonebookOwner (object) or UserPhonebookOwner (object) (PhonebookOwner) | ||||||||
Any of
| |||||||||
{- "contact": {
- "companyName": "string",
- "emails": [
- {
- "label": "string",
- "value": "string"
}
], - "firstName": "string",
- "id": "string",
- "jobTitle": "string",
- "lastName": "string",
- "phoneNumbers": [
- {
- "label": "string",
- "value": "string"
}
]
}, - "countryIso": "string"
}{- "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 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.
| id required | string (id) The phonebook ID |
| contactId required | string (contactId) The contact ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Contact-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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.
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.
| 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:
By default, the results will be sorted in |
| contactNumber | string (contactNumber) Only return calls where the Use this parameter to find calls for a given external party such as a customer. |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | Array of objects (Call) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
required | object (ResponseMeta) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "calls": [
- {
- "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": {
- "displayName": "string",
- "email": "string",
- "id": "string"
}, - "mobile": "string",
- "userId": "string"
}
}
], - "highlights": [
- {
- "createdAt": "string",
- "createdByUser": {
- "email": "string",
- "firstName": "string",
- "jobTitle": "string",
- "lastName": "string",
- "location": "string",
- "manager": {
- "displayName": "string",
- "email": "string",
- "id": "string"
}, - "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": {
- "displayName": "string",
- "email": "string",
- "id": "string"
}, - "mobile": "string",
- "userId": "string"
}, - "createdTimestamp": 0,
- "id": "string",
- "locale": "string",
- "noteContents": [
- {
- "content": "string",
- "edited": { },
- "transcribedAt": "string",
- "transcribedTimestamp": 0,
- "transcriptionConfidence": 0
}
], - "noteText": "string"
}
], - "outcome": {
- "reason": "dataAction",
- "status": "abandoned"
}, - "parties": [
- {
- "connections": [
- {
- "durationSec": 0,
- "joinedAt": "string",
- "joinedTimestamp": 0,
- "leftAt": "string",
- "leftTimestamp": 0,
- "vendorCallId": "string"
}
], - "dials": [
- {
- "dialAt": "string",
- "dialTimestamp": 0,
- "reason": "callGroup",
- "vendorCallIds": [
- "string"
]
}
], - "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": {
- "contextId": "string",
- "id": "string",
- "type": "call"
}, - "speakers": [
- {
- "displayName": "string",
- "email": "string",
- "id": "string",
- "numberE164": "string"
}
], - "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"
}
], - "meta": {
- "next": "string"
}
}Get a call resource by ID.
| id required | string (id) The call ID |
| 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. |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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
| |||||||||||||||||||||||||
AssignedContact (object) or (any or null) The phonebook contact (if any) associated with the external party on the call. | |||||||||||||||||||||||||
Any of
| |||||||||||||||||||||||||
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 | ||||||||||||||||||||||||
| 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 Possible values:
| ||||||||||||||||||||||||
| direction required | string (CallDirection) Enum: "inbound" "outbound" Call direction. One of the following values:
| ||||||||||||||||||||||||
object (CallDirectoryEntry) For 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 | |||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||
Array of objects (Highlight) A list of highlights for this call. A It is possible to have multiple | |||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||
| id required | string The id of the call | ||||||||||||||||||||||||
| initiator required | string ** DEPRECATED **. Use the | ||||||||||||||||||||||||
| isConference required | boolean Indicates whether the call was a Spoke conference call. Webhook events | ||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||
| 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 It is possible to store multiple | |||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||
object (CallOutcome) The final outcome of the call. Populated for all calls, once the call has ended. For For | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
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 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 | |||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||
| 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.
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 | ||||||||||||||||||||||||
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
| |||||||||||||||||||||||||
| 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:
| ||||||||||||||||||||||||
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:
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:
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
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:
| ||||||||||||||||||||||||
| vendorCallId | string The vendor's identifier for the call. The value of this field is dependent
on the value of the
| ||||||||||||||||||||||||
object (Voicemail)
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 If the call was answered, this field is calculated as the time difference between 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 | ||||||||||||||||||||||||
{- "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": {
- "displayName": "string",
- "email": "string",
- "id": "string"
}, - "mobile": "string",
- "userId": "string"
}
}
], - "highlights": [
- {
- "createdAt": "string",
- "createdByUser": {
- "email": "string",
- "firstName": "string",
- "jobTitle": "string",
- "lastName": "string",
- "location": "string",
- "manager": {
- "displayName": "string",
- "email": "string",
- "id": "string"
}, - "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": {
- "displayName": "string",
- "email": "string",
- "id": "string"
}, - "mobile": "string",
- "userId": "string"
}, - "createdTimestamp": 0,
- "id": "string",
- "locale": "string",
- "noteContents": [
- {
- "content": "string",
- "edited": { },
- "transcribedAt": "string",
- "transcribedTimestamp": 0,
- "transcriptionConfidence": 0
}
], - "noteText": "string"
}
], - "outcome": {
- "reason": "dataAction",
- "status": "abandoned"
}, - "parties": [
- {
- "connections": [
- {
- "durationSec": 0,
- "joinedAt": "string",
- "joinedTimestamp": 0,
- "leftAt": "string",
- "leftTimestamp": 0,
- "vendorCallId": "string"
}
], - "dials": [
- {
- "dialAt": "string",
- "dialTimestamp": 0,
- "reason": "callGroup",
- "vendorCallIds": [
- "string"
]
}
], - "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": {
- "contextId": "string",
- "id": "string",
- "type": "call"
}, - "speakers": [
- {
- "displayName": "string",
- "email": "string",
- "id": "string",
- "numberE164": "string"
}
], - "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 recource by ID
| id required | string (id) The call ID |
| recordingId required | string (recordingId) The call recording ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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:
| ||||||||||
| 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:
| ||||||||||
| 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 If the query parameter | ||||||||||
{- "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"
}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.
| id required | string (id) The call ID |
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | Array of objects (ContentAnalysis) The content analyses matching the filters provided as query params | ||||||||||||||
Array
| |||||||||||||||
required | object (ResponseMeta) | ||||||||||||||
| |||||||||||||||
{- "contentAnalysis": [
- {
- "analyzer": {
- "name": "string",
- "version": "string"
}, - "artifacts": [
- {
- "data": { },
- "schema": "string",
- "usage": [
- {
- "resource": "string",
- "unit": "string",
- "value": 0
}
]
}
], - "failure": {
- "description": "string",
- "reason": "contentInaccessible"
}, - "id": "string",
- "request": {
- "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": [
- {
- "joinedTimestamp": 0,
- "leftTimestamp": 0,
- "recordingChannel": 0
}
], - "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"
}
}, - "status": "analyzing",
- "transcript": "string"
}
], - "meta": {
- "next": "string"
}
}Call-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "id": "+14505251398",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.894Z",
- "joinedTimestamp": 1780639038894,
- "vendorCallId": "CA0BA3203C2120439599223DEE8089CE24"
}
], - "displayValue": "+1 795-148-3457"
}, - {
- "id": "603e04ab-4cb3-4c3a-811e-db76256ad7a1",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.894Z",
- "joinedTimestamp": 1780639038894,
- "vendorCallId": "CA9A1A7D67660F432EA50A81546675D819"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038894,
- "dialAt": "2026-06-05T05:57:18.894Z",
- "reason": "directDial"
}
], - "extension": 7190787,
- "email": "Ann83@yahoo.com",
- "displayValue": "Mireya Hayes V",
- "timezone": "America/Recife"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.914Z",
- "data": {
- "call": {
- "answeredAt": "2026-06-05T05:57:18.915Z",
- "assignedContact": {
- "companyName": "Beer and Sons",
- "emails": [
- {
- "email": null,
- "label": "work"
}
], - "firstName": "John",
- "id": "67bd4ae2-7982-4788-af04-08d7179a0872",
- "jobTitle": null,
- "lastName": "Abbott",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "18558036821",
- "numberE164": "+12661222680",
- "numberDisplay": "+1 391-858-9684"
}, - {
- "label": "mobile",
- "numberRaw": "15313867740",
- "numberE164": "+13371406556",
- "numberDisplay": "+1 754-154-5881"
}
], - "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": [
- {
- "id": "51051e2c-197e-4067-b30c-f6e5b0bf47f4",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.915Z",
- "joinedTimestamp": 1780639038915,
- "vendorCallId": "CA676BDEECA8A54548871317CBF2DF5C15"
}
], - "extension": 8154501,
- "email": "Randy.Miller18@yahoo.com",
- "displayValue": "Jessie Predovic",
- "timezone": "Asia/Taipei"
}, - {
- "id": "+13850265478",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.915Z",
- "joinedTimestamp": 1780639038915,
- "vendorCallId": "CAB0134888245B4B298B9F63EB2FD9E4B3"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038915,
- "dialAt": "2026-06-05T05:57:18.915Z",
- "reason": "directDial"
}
], - "displayValue": "Ms. Kelly Langosh V"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "email": "Holly_Leannon41@yahoo.com"
}
], - "firstName": "Shelia",
- "lastName": "Ferry",
- "phoneNumbers": [
- {
- "numberRaw": "12707588590",
- "numberE164": "+18687807267",
- "numberDisplay": "+1 361-904-3888"
}
]
}, - "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": [
- {
- "id": "+15623615510",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.917Z",
- "joinedTimestamp": 1780639038917,
- "leftAt": "2026-06-05T05:57:18.917Z",
- "leftTimestamp": 1780639038917,
- "durationSec": 59,
- "vendorCallId": "CA12E17F6F52F049A2B68E4E207EE4BC85"
}
], - "displayValue": "+1 567-857-9093"
}, - {
- "id": "57d5cd45-900b-4f05-896a-473461e7fa73",
- "type": "user",
- "isInternal": true,
- "dials": [
- {
- "dialTimestamp": 1780639038917,
- "dialAt": "2026-06-05T05:57:18.917Z",
- "reason": "callGroup"
}
], - "extension": 4706536,
- "email": "Jan23@yahoo.com",
- "displayValue": "Darwin Pfeffer",
- "timezone": "Asia/Riyadh"
}, - {
- "id": "37ced5f2-e62f-4b42-9714-648e8eda43d8",
- "type": "user",
- "isInternal": true,
- "dials": [
- {
- "dialTimestamp": 1780639038917,
- "dialAt": "2026-06-05T05:57:18.917Z",
- "reason": "callGroup"
}
], - "extension": 1018491,
- "email": "Sylvia_Runte@hotmail.com",
- "displayValue": "Kelvin Ziemann",
- "timezone": "Australia/Eucla"
}, - {
- "id": "6689cbc1-0fc3-4ecb-b1d8-1819a4573ea8",
- "type": "user",
- "isInternal": true,
- "dials": [
- {
- "dialTimestamp": 1780639038917,
- "dialAt": "2026-06-05T05:57:18.917Z",
- "reason": "callGroup"
}
], - "extension": 5519597,
- "email": "Kurt44@yahoo.com",
- "displayValue": "Johnny Prohaska",
- "timezone": "Pacific/Pago_Pago"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.917Z",
- "data": {
- "call": {
- "answeredAt": "2026-06-05T05:57:18.918Z",
- "assignedContact": {
- "companyName": "White - Huels",
- "emails": [
- {
- "email": "Sheryl_Hilll@gmail.com",
- "label": "work"
}
], - "firstName": "Zula",
- "id": "f0236a19-a1c9-4e80-926d-7830bf418504",
- "jobTitle": "Corporate Interactions Assistant",
- "lastName": "Klocko",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "15059815229",
- "numberE164": "+16529702923",
- "numberDisplay": "+1 387-489-0006"
}, - {
- "numberRaw": "18034893220",
- "numberE164": "+13750542124",
- "numberDisplay": "+1 886-840-8205"
}
], - "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": [
- {
- "id": "+13315298850",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.919Z",
- "joinedTimestamp": 1780639038919,
- "leftAt": "2026-06-05T05:57:18.919Z",
- "leftTimestamp": 1780639038919,
- "durationSec": 63,
- "vendorCallId": "CA84DA5D4089CA4E2286922BD99721E062"
}
], - "displayValue": "+1 876-858-4645"
}, - {
- "id": "fd7a7c68-5d2f-40ae-95b9-028084b00f39",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.919Z",
- "joinedTimestamp": 1780639038919,
- "leftAt": "2026-06-05T05:57:18.919Z",
- "leftTimestamp": 1780639038919,
- "durationSec": 20,
- "vendorCallId": "CA224C35C1959D43ECAA330BA1EAD845B9"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038919,
- "dialAt": "2026-06-05T05:57:18.919Z",
- "reason": "directDial"
}
], - "extension": 8773790,
- "email": "Jake.Gislason@gmail.com",
- "displayValue": "Rebecca Tillman IV",
- "timezone": "Antarctica/Vostok"
}, - {
- "id": "074957a6-dc6e-491d-8234-81a19c6cd70b",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.919Z",
- "joinedTimestamp": 1780639038919,
- "leftAt": "2026-06-05T05:57:18.919Z",
- "leftTimestamp": 1780639038919,
- "durationSec": 8,
- "vendorCallId": "CAD4C453D9F1DF4EBFAA660AC7C5D8B3BD"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038919,
- "dialAt": "2026-06-05T05:57:18.919Z",
- "reason": "transfer"
}
], - "extension": 2215681,
- "email": "Tommie.Koss99@gmail.com",
- "displayValue": "Kurt Rosenbaum",
- "timezone": "Antarctica/Mawson"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.901Z",
- "data": {
- "call": {
- "answeredAt": "2026-06-05T05:57:18.902Z",
- "assignedContact": {
- "companyName": "Kulas - Dickinson",
- "emails": [
- {
- "email": null,
- "label": "work"
}
], - "firstName": "Presley",
- "id": "1f0211a3-f089-4e21-a050-db291aa2b91f",
- "jobTitle": null,
- "lastName": "Ebert-Ledner",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "15760238926",
- "numberE164": "+18471441709",
- "numberDisplay": "+1 998-438-2355"
}, - {
- "label": "mobile",
- "numberRaw": "11753933972",
- "numberE164": "+11346494312",
- "numberDisplay": "+1 402-346-7645"
}
], - "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": [
- {
- "id": "16b5d808-1c9d-4533-8fd3-b0596ff59169",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.902Z",
- "joinedTimestamp": 1780639038902,
- "leftAt": "2026-06-05T05:57:18.902Z",
- "leftTimestamp": 1780639038902,
- "durationSec": 76,
- "vendorCallId": "CA5CC3BB1DBCEB4B1D942041FF67923874"
}
], - "extension": 3406658,
- "email": "Alene78@hotmail.com",
- "displayValue": "Mr. Sidney Jerde",
- "timezone": "Asia/Urumqi"
}, - {
- "id": "+19092755564",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.902Z",
- "joinedTimestamp": 1780639038902,
- "leftAt": "2026-06-05T05:57:18.902Z",
- "leftTimestamp": 1780639038902,
- "durationSec": 70,
- "vendorCallId": "CA3FB4F725EB654070BA69091CA70A2691"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038902,
- "dialAt": "2026-06-05T05:57:18.902Z",
- "reason": "directDial"
}
], - "displayValue": "Shemar Hodkiewicz-Klocko"
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "id": "79d3fbd5-74c9-4c35-a47c-5e3fad84e6ef",
- "user": {
- "mobile": "+17794770050",
- "firstName": "Lizzie",
- "lastName": "Quitzon",
- "userId": "584b3ef6-ba76-4006-b678-e57df7f5feeb",
- "email": "Inez97@hotmail.com",
- "jobTitle": "Customer Operations Specialist"
}, - "name": "ultio studio",
- "description": null,
- "reference": "corporis",
- "type": "conversation",
- "status": "started",
- "startedAt": "2026-06-05T05:57:18.920Z",
- "startedTimestamp": 1780639038920
}
], - "highlights": [
- {
- "recordingStartedTimestamp": 1780639038921,
- "duration": 30,
- "createdAt": "2026-06-05T05:57:18.921Z",
- "durationText": "0:30",
- "createdByUser": {
- "mobile": "+16790747462",
- "firstName": "Jimmie",
- "lastName": "Ziemann",
- "userId": "3665fc99-84d3-42bd-9782-359019a964c7",
- "email": "Miriam_Sanford@gmail.com",
- "jobTitle": "Chief Web Orchestrator"
}, - "recordingStartedAt": "2026-06-05T05:57:18.921Z",
- "createdTimestamp": 1780639038921,
- "id": "9e75ebff-c726-4601-8e48-cc48612b482d",
- "tags": [
- "ullam"
]
}, - {
- "recordingStartedTimestamp": 1780639038921,
- "duration": 30,
- "createdAt": "2026-06-05T05:57:18.921Z",
- "durationText": "0:30",
- "createdByUser": {
- "mobile": "+14905059046",
- "firstName": "Milan",
- "lastName": "Altenwerth",
- "userId": "f2d31f0b-edd8-499d-b0f0-c02ac5dd8d12",
- "email": "Bethany_Yundt3@yahoo.com",
- "jobTitle": "District Tactics Assistant"
}, - "recordingStartedAt": "2026-06-05T05:57:18.921Z",
- "createdTimestamp": 1780639038921,
- "id": "c5839129-5b75-4c46-bc5f-194e48da105c",
- "tags": [
- "textilis"
]
}
], - "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": [
- {
- "id": "+12738981444",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.921Z",
- "joinedTimestamp": 1780639038921,
- "leftAt": "2026-06-05T05:57:18.921Z",
- "leftTimestamp": 1780639038921,
- "durationSec": 71,
- "vendorCallId": "CA4E5D2359EBF241B88C17DFFDE313A491"
}
], - "displayValue": "+1 173-407-2372"
}, - {
- "id": "b1eecc0c-eb2d-4890-adff-cc723c2374c4",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.921Z",
- "joinedTimestamp": 1780639038921,
- "leftAt": "2026-06-05T05:57:18.921Z",
- "leftTimestamp": 1780639038921,
- "durationSec": 55,
- "vendorCallId": "CAC6A2D0985843456C85233AC98067A1CF"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038921,
- "dialAt": "2026-06-05T05:57:18.921Z",
- "reason": "directDial"
}
], - "extension": 8967686,
- "email": "Jeannie_Sporer-Kihn36@hotmail.com",
- "displayValue": "Ms. Hilda Waters",
- "timezone": "America/Cuiaba"
}
], - "recipient": "f2954e18-a785-4ee8-a70a-4456d9f16e6b",
- "recordings": [
- {
- "id": "ba1cf210-419f-403b-b0c6-d8429ce250aa",
- "callId": "463435e3-868e-407d-a563-5e89f2a64d74",
- "fileSize": 464,
- "duration": 487,
- "startedAt": "2026-06-05T05:57:18.921Z",
- "mimeType": "audio/wav",
- "channels": 2
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+12769936016",
- "recipient": "+16618025536",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CAFE53DA98D9C14B699B5265C1BCC14DED",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:ef308f47_27bc_4e30_b077_4acbe5c115fc",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CAD7CC3BBAABAE4FEFB16867EB917FAA1B",
- "direction": "outbound"
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "id": "6c446417-9cf4-439e-8de2-371497bc2373",
- "user": {
- "mobile": "+15311438181",
- "firstName": "Mason",
- "lastName": "Schimmel",
- "userId": "01cd8cca-5341-4db1-91f5-83ebc448cbc0",
- "email": "Marianne.McGlynn58@yahoo.com",
- "jobTitle": "Customer Tactics Manager"
}, - "name": "clementia volubilis",
- "description": null,
- "reference": "subvenio",
- "type": "conversation",
- "status": "started",
- "startedAt": "2026-06-05T05:57:18.922Z",
- "startedTimestamp": 1780639038922,
- "submittedAt": "2026-06-05T05:57:18.922Z",
- "submittedTimestamp": 1780639038922,
- "formData": {
- "firstName": "Ethan",
- "lastName": "Bauch",
- "phoneNumber": "+17531203256",
- "accidentDate": "2024-02-01",
- "accidentTime": "08:25:00",
- "accidentDesc": "Denuo consuasor verecundia commodi utpote quod. Canonicus depraedor coma tendo angulus advenio curis. Undique ipsa sapiente. Nulla decumbo utrimque.",
- "mainDriver": "Yes",
- "accidentCarLocation": [
- "Rear"
], - "repairsEstimate": "$100000"
}
}
], - "highlights": [
- {
- "recordingStartedTimestamp": 1780639038923,
- "duration": 30,
- "createdAt": "2026-06-05T05:57:18.923Z",
- "durationText": "0:30",
- "createdByUser": {
- "mobile": "+15537133336",
- "firstName": "Dimitri",
- "lastName": "Marvin",
- "userId": "cba90a69-9a74-4b57-9621-dedddd401813",
- "email": "Tina.Hudson@hotmail.com",
- "jobTitle": "District Tactics Planner"
}, - "recordingStartedAt": "2026-06-05T05:57:18.923Z",
- "createdTimestamp": 1780639038923,
- "id": "916a8e83-1c53-4496-88f1-360017d7e66b",
- "tags": [
- "compono"
]
}, - {
- "recordingStartedTimestamp": 1780639038923,
- "duration": 30,
- "createdAt": "2026-06-05T05:57:18.923Z",
- "durationText": "0:30",
- "createdByUser": {
- "mobile": "+13926883666",
- "firstName": "Raymundo",
- "lastName": "Jones",
- "userId": "d5b88dbb-5c78-4ced-818d-ed337b1a7f81",
- "email": "Dora_Dickinson@gmail.com",
- "jobTitle": "International Web Director"
}, - "recordingStartedAt": "2026-06-05T05:57:18.923Z",
- "createdTimestamp": 1780639038923,
- "id": "b969d821-38cc-4e19-ac4e-51d08520ac12",
- "tags": [
- "adicio"
]
}
], - "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": [
- {
- "id": "+10516662721",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.923Z",
- "joinedTimestamp": 1780639038923,
- "leftAt": "2026-06-05T05:57:18.923Z",
- "leftTimestamp": 1780639038923,
- "durationSec": 71,
- "vendorCallId": "CA34D15BB78F804BA5A6F5F9954F5EC5AE"
}
], - "displayValue": "+1 439-465-9966"
}, - {
- "id": "97aea57f-cd46-41d3-a6eb-a381e5758ad3",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.923Z",
- "joinedTimestamp": 1780639038923,
- "leftAt": "2026-06-05T05:57:18.923Z",
- "leftTimestamp": 1780639038923,
- "durationSec": 55,
- "vendorCallId": "CABB1EF6A99D50412C82EC4AA134AA2EF9"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038923,
- "dialAt": "2026-06-05T05:57:18.923Z",
- "reason": "directDial"
}
], - "extension": 4420789,
- "email": "Herman_Muller@gmail.com",
- "displayValue": "Maiya Kshlerin",
- "timezone": "Asia/Jayapura"
}
], - "recipient": "12b39c0a-71ef-43d3-9293-55d5250dc79c",
- "recordings": [
- {
- "id": "46bd8c7c-4be5-45f7-b9a1-899807058b2c",
- "callId": "efa7c0c0-3524-4891-b5eb-ee22932c9c45",
- "fileSize": 624,
- "duration": 649,
- "startedAt": "2026-06-05T05:57:18.923Z",
- "mimeType": "audio/mpeg",
- "channels": 2
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+18353581501",
- "recipient": "+15066712215",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CAB243B4900DA14B15B112ACF3CE7265A3",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:f076c26e_fe6f_411a_9653_5450c466b515",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CA1809D3C71BFF4FAE8AE4FB2AC5DF0A04",
- "direction": "outbound"
}
], - "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": [
- "Rear"
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "createdAt": "2026-06-05T05:57:18.910Z",
- "id": "e61789d5-1900-40e2-af8b-1f515049ab26",
- "createdByUser": {
- "userId": "6ee08d72-f9d3-4da9-bb03-cefb84d313f2",
- "firstName": "Andres",
- "lastName": "Reichel",
- "mobile": "+17346624428",
- "email": "Sheri_Koch1@hotmail.com",
- "jobTitle": "Future Brand Director"
}, - "createdTimestamp": 1780639038910,
- "tags": [
- "attero"
]
}, - {
- "id": "e911cc18-22d8-4cc0-8c12-063c4df92150",
- "createdAt": "2026-06-05T05:57:18.909Z",
- "createdTimestamp": 1780639038909,
- "createdByUser": {
- "userId": "1b5e37fa-8f18-4a80-bb5f-b0634252799d",
- "firstName": "Conrad",
- "lastName": "Bahringer",
- "mobile": "+16795557085",
- "email": "Donna.Predovic@yahoo.com",
- "jobTitle": "Forward Communications Director"
}, - "tags": [
- "corpus"
]
}
], - "id": "1aab1db3-d80a-4fb0-853f-f464e47fcc38",
- "initiator": "+13295875637",
- "isConference": false,
- "isInternal": false,
- "lastModifiedAt": "2026-06-05T05:57:18.910Z",
- "lastModifiedTimestamp": 1780639038910,
- "parties": [
- {
- "id": "+12713496216",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.910Z",
- "joinedTimestamp": 1780639038910,
- "vendorCallId": "CAF3B4CD2A5FBD4D238848D64F8C391D69"
}
], - "displayValue": "+1 161-751-4058"
}, - {
- "id": "7a977ce7-aab8-4e29-85ac-d14b5aac8a78",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.910Z",
- "joinedTimestamp": 1780639038910,
- "vendorCallId": "CA0CDCFDFDBE014B05A3CC417D80393EE6"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038910,
- "dialAt": "2026-06-05T05:57:18.910Z",
- "reason": "directDial"
}
], - "extension": 2493504,
- "email": "Timothy_Schmidt@yahoo.com",
- "displayValue": "James Trantow",
- "timezone": "America/Port-au-Prince"
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "recordingStartedTimestamp": 1780639038911,
- "duration": 30,
- "createdAt": "2026-06-05T05:57:18.911Z",
- "durationText": "0:30",
- "createdByUser": {
- "mobile": "+18399116781",
- "firstName": "Felicia",
- "lastName": "Glover",
- "userId": "462399ec-a2f2-4f15-8de5-3dfe6046f4bf",
- "email": "Sheryl81@hotmail.com",
- "jobTitle": "International Implementation Administrator"
}, - "recordingStartedAt": "2026-06-05T05:57:18.912Z",
- "createdTimestamp": 1780639038912,
- "id": "7acfdecf-9195-49c8-8951-b7300a946945",
- "tags": [
- "delectus"
]
}, - {
- "id": "17691247-8979-4a8f-9fd8-fbf0d127825e",
- "createdByUser": {
- "mobile": "+18075480620",
- "firstName": "Isabell",
- "lastName": "Quigley",
- "userId": "3e843ebf-7b01-4395-9878-e296746d4447",
- "email": "Justyn97@yahoo.com",
- "jobTitle": "Principal Mobility Analyst"
}, - "createdAt": "2026-06-05T05:57:18.912Z",
- "createdTimestamp": 1780639038912,
- "tags": [
- "sollicito"
]
}
], - "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": [
- {
- "id": "+10083663094",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.912Z",
- "joinedTimestamp": 1780639038912,
- "leftAt": "2026-06-05T05:57:18.912Z",
- "leftTimestamp": 1780639038912,
- "durationSec": 71,
- "vendorCallId": "CAEF1330B8807E476790E5D3EA9C145016"
}
], - "displayValue": "+1 531-893-4087"
}, - {
- "id": "7e60c3b6-f1af-4857-be12-85502a9f7138",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.912Z",
- "joinedTimestamp": 1780639038912,
- "leftAt": "2026-06-05T05:57:18.912Z",
- "leftTimestamp": 1780639038912,
- "durationSec": 55,
- "vendorCallId": "CA5DD376C0460B409EBA6CB35D3106725C"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038912,
- "dialAt": "2026-06-05T05:57:18.912Z",
- "reason": "directDial"
}
], - "extension": 53415,
- "email": "Stuart_Hammes@gmail.com",
- "displayValue": "Dora Maggio",
- "timezone": "America/St_Vincent"
}
], - "recipient": "775f148c-4d18-4f89-aa6b-3fc80b36472c",
- "recordings": [
- {
- "id": "fdcee380-6e2c-4f44-9cfc-ec4c1a2aae65",
- "callId": "958fab00-d5b0-425b-ab60-08a56d2fc957",
- "fileSize": 351,
- "duration": 965,
- "startedAt": "2026-06-05T05:57:18.912Z",
- "mimeType": "audio/wav",
- "channels": 1
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+17820027213",
- "recipient": "+14337278682",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CA1F96F55412A04B8C83E1457B718D0AB2",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:176ec32c_cfe6_434e_978a_b52cd60ff404",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CA43049A2BECDA41F5853B845A46F74FFF",
- "direction": "outbound"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.898Z",
- "data": {
- "call": {
- "answeredAt": "2026-06-05T05:57:18.899Z",
- "assignedContact": {
- "companyName": "Weissnat and Sons",
- "emails": [
- {
- "email": null,
- "label": "work"
}
], - "firstName": "Shari",
- "id": "490ad4fc-5894-4324-aa24-11e28e97bda6",
- "jobTitle": null,
- "lastName": "Aufderhar",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "12073037451",
- "numberE164": "+13202757184",
- "numberDisplay": "+1 489-702-4534"
}, - {
- "label": "mobile",
- "numberRaw": "11168019835",
- "numberE164": "+13449262417",
- "numberDisplay": "+1 547-856-9040"
}
], - "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": [
- {
- "id": "61a2854c-be9a-4dc7-8cb0-42f8c3b673b4",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.900Z",
- "joinedTimestamp": 1780639038900,
- "leftAt": "2026-06-05T05:57:18.900Z",
- "leftTimestamp": 1780639038900,
- "durationSec": 77,
- "vendorCallId": "CAF7819BD4945C4F8383D599782565CDE0"
}
], - "extension": 8164952,
- "email": "Mona_Mills14@gmail.com",
- "displayValue": "Dr. Clark Rolfson",
- "timezone": "Europe/Zurich"
}, - {
- "id": "+15200112373",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.900Z",
- "joinedTimestamp": 1780639038900,
- "leftAt": "2026-06-05T05:57:18.900Z",
- "leftTimestamp": 1780639038900,
- "durationSec": 70,
- "vendorCallId": "CAB797394D9A0D428BA32C248BB5F7F345"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038900,
- "dialAt": "2026-06-05T05:57:18.900Z",
- "reason": "directDial"
}
], - "displayValue": "Lorraine Rath"
}
], - "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"
}Occurs whenever a call goes unanswered:
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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "id": "+14462381770",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.896Z",
- "joinedTimestamp": 1780639038896,
- "vendorCallId": "CA589DEF75458F49AF97182613316EF675"
}
], - "displayValue": "+1 647-254-4437"
}, - {
- "id": "c06809ed-9aad-4a72-b882-93555b476d3e",
- "type": "user",
- "isInternal": true,
- "dials": [
- {
- "dialTimestamp": 1780639038896,
- "dialAt": "2026-06-05T05:57:18.896Z",
- "reason": "directDial"
}
], - "extension": 2582868,
- "email": "Alana26@hotmail.com",
- "displayValue": "Ms. Russel Collins",
- "timezone": "Pacific/Kanton"
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "email": null,
- "label": "work"
}, - {
- "email": null,
- "label": "personal"
}
], - "firstName": "Eunice",
- "id": "c2908add-9f76-4e66-819d-7ba2fefe2e0f",
- "jobTitle": null,
- "lastName": "Monahan",
- "phoneNumbers": [
- {
- "numberRaw": "10091846590",
- "label": "work",
- "numberE164": "+14349634143",
- "numberDisplay": "+1 007-340-1879"
}
], - "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": [
- {
- "id": "bb9f1182-b4ed-4979-8f07-9af16f34a92c",
- "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.",
- "noteContents": [
- {
- "transcribedAt": "2026-06-05T05:57:18.908Z",
- "transcribedTimestamp": 1780639038908,
- "transcriptionConfidence": 1,
- "content": "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."
}
], - "createdByUser": {
- "mobile": null,
- "firstName": "Julius",
- "lastName": "Purdy",
- "userId": "576aed21-79e0-47c0-adc2-8c311617c620",
- "email": "Janet_Farrell@hotmail.com",
- "jobTitle": "Customer Accountability Strategist"
}, - "createdAt": "2026-06-05T05:57:18.908Z",
- "createdTimestamp": 1780639038908
}
], - "outcome": {
- "status": "answered"
}, - "parties": [
- {
- "isInternal": true,
- "displayValue": "Mr. Josefina Bauch",
- "extension": 4156701,
- "id": "f8c176b9-4569-43e7-bb45-51c616bf1f16",
- "type": "user",
- "connections": [
- {
- "joinedTimestamp": 1780639038908,
- "leftAt": "2026-06-05T05:57:18.908Z",
- "leftTimestamp": 1780639038908,
- "durationSec": 39,
- "vendorCallId": "CABA8AEC7D1972438FB8886B1F0E696C6A",
- "joinedAt": "2026-06-05T05:57:18.908Z"
}
], - "email": "Tina79@hotmail.com",
- "timezone": "Pacific/Marquesas"
}, - {
- "isInternal": false,
- "displayValue": "Terrell Graham",
- "dials": [
- {
- "dialTimestamp": 1780639038908,
- "reason": "directDial",
- "dialAt": "2026-06-05T05:57:18.908Z"
}
], - "id": "+18893716471",
- "type": "phone",
- "connections": [
- {
- "joinedTimestamp": 1780639038908,
- "leftAt": "2026-06-05T05:57:18.908Z",
- "leftTimestamp": 1780639038908,
- "durationSec": 36,
- "vendorCallId": "CA165A947D44BC4D5C836AB1E60FCA195E",
- "joinedAt": "2026-06-05T05:57:18.908Z"
}
]
}
], - "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": [
- {
- "transcribedAt": "2026-06-05T05:57:18.908Z",
- "transcribedTimestamp": 1780639038908,
- "transcriptionConfidence": 1,
- "content": "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."
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "createdAt": "2026-06-05T05:57:18.904Z",
- "id": "06278dbf-f904-4fba-b381-ede6761b38db",
- "createdByUser": {
- "mobile": "+16447613165",
- "firstName": "Mary",
- "lastName": "Smith",
- "userId": "daa071bb-e2c3-491f-aa77-8f556ba2180c",
- "email": "Gerard_Bartoletti37@yahoo.com",
- "jobTitle": "Corporate Data Planner"
}, - "createdTimestamp": 1780639038904,
- "tags": [
- "texo"
]
}, - {
- "createdAt": "2026-06-05T05:57:18.904Z",
- "id": "b85b586c-ffdf-48a2-8971-a070a028cc9d",
- "createdByUser": {
- "mobile": "+12124996344",
- "firstName": "Lorena",
- "lastName": "Friesen",
- "userId": "302ef7d1-b4b3-4cad-b3f9-e8e24e2e69fd",
- "email": "Ryan.Shanahan99@gmail.com",
- "jobTitle": "Human Tactics Supervisor"
}, - "createdTimestamp": 1780639038904,
- "tags": [
- "dolorem"
]
}
], - "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": [
- {
- "id": "+18465980798",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.904Z",
- "joinedTimestamp": 1780639038904,
- "leftAt": "2026-06-05T05:57:18.904Z",
- "leftTimestamp": 1780639038904,
- "durationSec": 71,
- "vendorCallId": "CAB37BAB6D124A4C8D9700EFF3B36DC912"
}
], - "displayValue": "+1 687-890-2240"
}, - {
- "id": "bd247bf0-7fcc-4e00-9acd-dd74e19329c0",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.904Z",
- "joinedTimestamp": 1780639038904,
- "leftAt": "2026-06-05T05:57:18.904Z",
- "leftTimestamp": 1780639038904,
- "durationSec": 55,
- "vendorCallId": "CADD9FC6A5A7DA468CB8C2309036C508EC"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038904,
- "dialAt": "2026-06-05T05:57:18.904Z",
- "reason": "directDial"
}
], - "extension": 2931879,
- "email": "Jovanny48@yahoo.com",
- "displayValue": "Dr. Adrian King Jr.",
- "timezone": "America/Porto_Velho"
}
], - "recipient": "80ccdcd6-c83d-4b24-aa4e-0979c0c32cad",
- "recordings": [
- {
- "id": "11cc5b94-0a33-4c1f-90f6-1a46a9c29cb1",
- "callId": "9613706c-b7e2-46ea-b4e9-43584c9a3bdc",
- "fileSize": 439,
- "duration": 732,
- "startedAt": "2026-06-05T05:57:18.904Z",
- "mimeType": "audio/mpeg",
- "channels": 2
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+18261353549",
- "recipient": "+17361954987",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CA1FBF06A1F9CF4AB8A9DC9C90B6475A69",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:5624d943_cf6d_412c_8025_23c837e39501",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CAB9F4370CBEA54868BC4788485264D411",
- "direction": "outbound"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "id": "+15926795831",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.890Z",
- "joinedTimestamp": 1780639038890,
- "vendorCallId": "CA7102E5EC46D546D883AECA2428043AF0"
}
], - "displayValue": "+1 619-718-9933"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "isInternal": false,
- "displayValue": "+1 093-777-8444",
- "id": "+14053816227",
- "type": "phone",
- "connections": [
- {
- "joinedTimestamp": 1780639038924,
- "leftAt": "2026-06-05T05:57:18.924Z",
- "leftTimestamp": 1780639038924,
- "durationSec": 71,
- "vendorCallId": "CAFAA6E833C1714430876092E76361F971",
- "joinedAt": "2026-06-05T05:57:18.924Z"
}
]
}, - {
- "isInternal": true,
- "displayValue": "Nettie Considine",
- "dials": [
- {
- "dialTimestamp": 1780639038925,
- "reason": "directDial",
- "dialAt": "2026-06-05T05:57:18.925Z"
}
], - "extension": 5918468,
- "id": "32d36212-8239-4964-80fd-456daeb38754",
- "type": "user",
- "connections": [
- {
- "joinedTimestamp": 1780639038925,
- "leftAt": "2026-06-05T05:57:18.925Z",
- "leftTimestamp": 1780639038925,
- "durationSec": 55,
- "vendorCallId": "CAFCF78CAF404C4A7294C1CF953975DCF2",
- "joinedAt": "2026-06-05T05:57:18.925Z"
}
], - "email": "Delphia_Johns35@gmail.com",
- "timezone": "Asia/Phnom_Penh"
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+17175370296",
- "recipient": "+16007115012",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CA9ABC5AF326574BF48F8BF05CC15353B1",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:47e70492_0357_42c0_a928_a9c0bba45f09",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CA051A388A278D42EC9D23A81A3650AD22",
- "direction": "outbound"
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "createdAt": "2026-06-05T05:57:18.927Z",
- "id": "5b41a141-950c-46e5-937f-263a63292802",
- "createdByUser": {
- "mobile": "+17234548206",
- "firstName": "Milford",
- "lastName": "Bogan",
- "userId": "781c2655-0a7a-49e3-8735-774aec3dc3b2",
- "email": "Beryl.Ferry@yahoo.com",
- "jobTitle": "Customer Integration Administrator"
}, - "createdTimestamp": 1780639038927,
- "tags": [
- "temporibus"
]
}, - {
- "createdAt": "2026-06-05T05:57:18.927Z",
- "id": "9462e7dd-a336-4e39-bf67-4f5de00a672f",
- "createdByUser": {
- "mobile": "+14035638496",
- "firstName": "Lula",
- "lastName": "Bednar",
- "userId": "dbd9af96-2b76-4763-9b4e-bbe88f40a5cf",
- "email": "James76@yahoo.com",
- "jobTitle": "Senior Data Analyst"
}, - "createdTimestamp": 1780639038927,
- "tags": [
- "theologus"
]
}
], - "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": [
- {
- "id": "+14157941861",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.927Z",
- "joinedTimestamp": 1780639038927,
- "leftAt": "2026-06-05T05:57:18.927Z",
- "leftTimestamp": 1780639038927,
- "durationSec": 71,
- "vendorCallId": "CAAFED78EFD4E045E8A45570B205DE9884"
}
], - "displayValue": "+1 838-190-9162"
}, - {
- "id": "a9b830c8-5d77-42a1-be23-8c94571a24ee",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.927Z",
- "joinedTimestamp": 1780639038927,
- "leftAt": "2026-06-05T05:57:18.927Z",
- "leftTimestamp": 1780639038927,
- "durationSec": 55,
- "vendorCallId": "CA0456581E406E4A9DB1DAB494E45FF117"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038927,
- "dialAt": "2026-06-05T05:57:18.927Z",
- "reason": "directDial"
}
], - "extension": 3988591,
- "email": "Heber_Nolan12@gmail.com",
- "displayValue": "Clifton Cummings",
- "timezone": "Pacific/Auckland"
}
], - "recipient": "1232dc12-f6c1-4d3c-af2f-d25ec129ad59",
- "recordings": [
- {
- "id": "0794a761-5192-4d51-9ea0-c2134f7305e2",
- "callId": "940e47a9-c4f6-40d5-8252-99f3b247c786",
- "fileSize": 691,
- "duration": 779,
- "startedAt": "2026-06-05T05:57:18.927Z",
- "mimeType": "audio/wav",
- "channels": 1,
- "transcript": {
- "id": "3f0b575b-b355-45ee-865b-69689acf5ac4",
- "createdAt": 1780639038926,
- "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.",
- "speakers": [
- {
- "displayName": "Rene Keebler",
- "id": "+10599048324",
- "numberE164": "+10599048324"
}
], - "source": {
- "id": "0794a761-5192-4d51-9ea0-c2134f7305e2",
- "type": "call",
- "contextId": "940e47a9-c4f6-40d5-8252-99f3b247c786"
}
}
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+10882680249",
- "recipient": "+15675544846",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CA9A6FC16C67D649BB9D0EBA3FB8B3B8C3",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:00d36a2c_3294_4b98_a9ae_e1785c68eaec",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CAEA80CA07C55B409AAA0C4BF9FE8E980C",
- "direction": "outbound"
}
], - "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": [
- {
- "displayName": "Rene Keebler",
- "id": "+10599048324",
- "numberE164": "+10599048324"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "createdAt": "2026-06-05T05:57:18.930Z",
- "id": "387abefd-fdf3-4344-82b3-613dd9a64444",
- "createdByUser": {
- "mobile": "+19338469750",
- "firstName": "Krystina",
- "lastName": "Weber",
- "userId": "8e5c244d-87c2-439d-acd2-1a0bc4e5e4f2",
- "email": "Rochelle_Hettinger36@hotmail.com",
- "jobTitle": "Investor Data Coordinator"
}, - "createdTimestamp": 1780639038930,
- "tags": [
- "clibanus"
]
}, - {
- "createdAt": "2026-06-05T05:57:18.930Z",
- "id": "14666ef3-d4b2-48bc-a918-5d852b6d70e4",
- "createdByUser": {
- "mobile": "+15533316925",
- "firstName": "Pedro",
- "lastName": "Smith",
- "userId": "aa3c2691-2470-4686-8995-fe065f6f5131",
- "email": "Pascale.Leffler89@gmail.com",
- "jobTitle": "Future Data Facilitator"
}, - "createdTimestamp": 1780639038930,
- "tags": [
- "nulla"
]
}
], - "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": [
- {
- "id": "+11588894460",
- "type": "phone",
- "isInternal": false,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.930Z",
- "joinedTimestamp": 1780639038930,
- "leftAt": "2026-06-05T05:57:18.930Z",
- "leftTimestamp": 1780639038930,
- "durationSec": 71,
- "vendorCallId": "CA256CE23F82974483A0050A1CAE7B9FB6"
}
], - "displayValue": "+1 241-331-3238"
}, - {
- "id": "0ef7bb2c-1df7-44a6-88a0-a64bea4f3148",
- "type": "user",
- "isInternal": true,
- "connections": [
- {
- "joinedAt": "2026-06-05T05:57:18.930Z",
- "joinedTimestamp": 1780639038930,
- "leftAt": "2026-06-05T05:57:18.930Z",
- "leftTimestamp": 1780639038930,
- "durationSec": 55,
- "vendorCallId": "CA280713417BD9491BB475F95F4118B103"
}
], - "dials": [
- {
- "dialTimestamp": 1780639038930,
- "dialAt": "2026-06-05T05:57:18.930Z",
- "reason": "directDial"
}
], - "extension": 6590521,
- "email": "Laura49@gmail.com",
- "displayValue": "Dariana Borer",
- "timezone": "Africa/Blantyre"
}
], - "recipient": "ea7b9f7a-e62c-40d9-ab9b-431a6bb131ab",
- "recordings": [
- {
- "id": "28e4a49b-4cd1-4276-8ed3-bf85d97a027f",
- "callId": "a98988a8-bf0b-4b45-aa5f-3f52ab49846c",
- "fileSize": 648,
- "duration": 648,
- "startedAt": "2026-06-05T05:57:18.929Z",
- "mimeType": "audio/mpeg",
- "channels": 1,
- "transcript": {
- "id": "e3509f83-08c2-41ec-af0a-efb5c06976ea",
- "createdAt": 1780639038929,
- "text": "Acerbitas decimus conqueror vos turbo tricesimus viriliter ascisco. Uredo voro voveo brevis cogo via ultio quod. Ulciscor talis villa tener vulgivagus. Despecto damno verbera. Vesper atrox commodi termes nihil. Virgo aggero trado varius curia delinquo abduco neque. Repudiandae conqueror clarus sodalitas appositus vere velum. Praesentium surgo arbustum. Amicitia claudeo vulgaris soleo adficio tenetur. Suspendo quaerat eius caterva delectus. Cur vinculum vere vulnus. Tyrannus repellat vere. Suggero thymbra cernuus venia votum stillicidium. Color subvenio aspernatur solus urbs capillus cupiditate repudiandae. Supellex vulnus vulgus curtus. Viscus considero vitiosus clam virtus. Denego consequatur ullam aiunt viscus acer vetus excepturi. Voluptatibus decet atqui. Animi tenuis utique aequus comis. Ater clamo decipio dignissimos comminor laboriosam acidus coniecto totus terreo. Coruscus verus basium. Vesco constans textus angelus amoveo temptatio thesaurus celo cubitum. Via turbo crinis subnecto non suggero atrocitas. Conculco eum ea aequitas vilicus. Ars aequus impedit virtus. Supellex absum verus solum aperio aegrus. Undique cubo tibi voluptas. Tempora adhuc magni demitto venia coerceo caelestis. Crur aer tempus ventito officiis aut attero mollitia. Testimonium tremo auxilium somniculosus animus doloribus basium rem arguo bellicus. Culpa spectaculum coniecto. Bonus consequuntur corona defero quasi utroque usque fugiat impedit. Provident comparo tendo velut. Undique placeat alius commemoro illo turba sophismata. Natus tendo quia. Cultellus numquam aqua ulciscor auctor. Molestiae nostrum tenetur depono. Despecto aut totidem pel ambulo a agnosco super derelinquo. Vesco tego cotidie. Decor ipsum demum ulterius aiunt. Tersus solus conturbo aetas tribuo spiritus aedificium coniecto cumque damnatio. Praesentium adaugeo timidus voluptatem. Ater amet balbus xiphias cicuta campana decimus voco canonicus agnitio. Vacuus ars acceptus suscipit carpo vos. Iusto maxime repellendus abduco sui. In dolores callide summa perspiciatis cinis convoco adulatio defendo ullus. Tondeo pecus debeo spiritus consequatur aspernatur. Impedit tredecim accusator aperio vito suggero. Teres tepidus voro terra comedo eveniet currus. Tardus despecto vulnero confugo voluptatibus vindico.",
- "speakers": [
- {
- "displayName": "Shad Huels-Labadie",
- "id": "+14193854347",
- "numberE164": "+14193854347"
}
], - "source": {
- "id": "28e4a49b-4cd1-4276-8ed3-bf85d97a027f",
- "type": "call",
- "contextId": "a98988a8-bf0b-4b45-aa5f-3f52ab49846c"
}
}
}, - {
- "id": "793b4d85-eb6a-4c9f-bdf5-7983058cfa26",
- "callId": "a98988a8-bf0b-4b45-aa5f-3f52ab49846c",
- "fileSize": 16,
- "duration": 456,
- "startedAt": "2026-06-05T05:57:18.929Z",
- "mimeType": "audio/wav",
- "channels": 1,
- "transcript": {
- "id": "40514d3a-4b60-4b26-bedd-e8b5e482f373",
- "createdAt": 1780639038929,
- "text": "Crapula pecco umquam vesco maxime blanditiis asporto. Totus usus ago caelum molestiae supellex allatus. Crustulum agnitio quae teres dolore cena. Vulticulus angustus sufficio tubineus conforto. Appositus studio versus coepi caste aestus stabilis. Reprehenderit vulgivagus tergiversatio statua adduco. Trucido currus decet tempore admoveo adopto. Curriculum ascisco vinum abbas vero decerno defaeco cicuta. Vulgo perspiciatis ait ver fuga ex deputo. Quidem voluptatem statim tenus molestiae aperio. Curia cernuus sollicito video. Somniculosus saepe quibusdam nemo avaritia modi soleo. Trepide tero temptatio calco corporis admoneo. Demonstro aurum laudantium adsum recusandae testimonium. Numquam acies crebro cetera adficio clamo arcus. Subseco infit voluptatibus accusator teneo. Ad capto defleo spiritus vociferor turbo patria crebro. Casus ipsam necessitatibus. Caste corpus uxor. Utor vivo creta vilis tardus peior alii desidero abundans. Utor vilicus delectatio avarus ager denuo crastinus sortitus. Adimpleo cervus testimonium abeo attonbitus angustus cerno calco. Cubitum thymbra uxor tandem verbera textilis demum tolero. Cerno super quo. Auctus infit excepturi spero. Tricesimus at nihil uredo. Degusto tutis delicate abscido delectus ultio velit terreo porro. Aro cribro tot. Adduco tenuis verumtamen vis spiculum ciminatio. Stillicidium cribro molestias ago ver valeo admitto. Ascit denego tepidus. Eligendi coaegresco tergiversatio cursus. Tamquam damnatio dicta. Tutamen decipio venustas assumenda barba surgo adflicto. Carcer cavus degenero. Commemoro laboriosam sublime clarus decumbo conicio vicinus terra comparo. Depopulo arcesso creber super avarus ab delicate arma. Terror aranea quibusdam. Cado statim tam quidem demitto sapiente crur iusto bellicus. Cedo tribuo tempus. Creo virga adiuvo cariosus pax reprehenderit. Conculco timor video temporibus. Corpus tepidus aetas confugo vilis voluntarius sumo constans veritatis aeneus. Denuo corona cedo video cornu quas cenaculum. Inflammatio exercitationem sollicito voco nemo. Tamquam coniuratio cibus cornu. Video crudelis audentia. Nesciunt uredo commodi cotidie viduo consuasor auctus admiratio. Aegre centum omnis. Quidem chirographum vomica bene terminatio allatus impedit.",
- "speakers": [
- {
- "displayName": "Ms. Magali Deckow",
- "id": "+16213913683",
- "numberE164": "+16213913683"
}
], - "source": {
- "id": "793b4d85-eb6a-4c9f-bdf5-7983058cfa26",
- "type": "call",
- "contextId": "a98988a8-bf0b-4b45-aa5f-3f52ab49846c"
}
}
}
], - "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": [
- {
- "amount": 0,
- "total": 0,
- "quantity": 2,
- "initiator": "+14765213381",
- "recipient": "+12803574267",
- "routeDescription": "Unmatched Call Route - Zero Tariff",
- "transport": "carrier",
- "durationSec": 70.141,
- "vendorCallId": "CA3CEAE356962241D69522E60BD31E7882",
- "direction": null
}, - {
- "amount": 0,
- "total": 0,
- "quantity": 1,
- "initiator": "SYSTEM",
- "recipient": "client:f03f81fe_fd3c_4083_80b5_85fe77854d3c",
- "recipientCountry": null,
- "routeDescription": "High-volume customer - Inbound call surcharge",
- "transport": "voip",
- "durationSec": 56.001,
- "vendorCallId": "CA2ABBB32999E34C389ACBD32539539B5A",
- "direction": "outbound"
}
], - "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"
}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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "isInternal": false,
- "displayValue": "+1 737-720-3304",
- "id": "+19372107671",
- "type": "phone",
- "connections": [
- {
- "joinedTimestamp": 1780639038906,
- "leftAt": "2026-06-05T05:57:18.906Z",
- "leftTimestamp": 1780639038906,
- "durationSec": 38,
- "vendorCallId": "CA7F11F502ED1E4CBD93FADAEB7FE6529D",
- "joinedAt": "2026-06-05T05:57:18.906Z"
}
]
}, - {
- "isInternal": true,
- "displayValue": "Dr. Talia Schaden",
- "dials": [
- {
- "dialTimestamp": 1780639038906,
- "reason": "directDial",
- "dialAt": "2026-06-05T05:57:18.906Z"
}
], - "extension": 1291519,
- "id": "23139607-2163-4e98-a801-bf3a248118fe",
- "type": "user",
- "email": "Alberto_Hoppe@gmail.com",
- "timezone": "Africa/Nouakchott"
}
], - "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",
- "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 represent long-running message threads between a Spoke user with an SMS enabled DDI and a customer of your organisation.
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.
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the message
| assignUsers | Array of strings Required if routingAction is
| ||||||
| 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:
The following are the minimum and maximum values for the field:
| ||||||
| 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) | ||||||
| |||||||
| notificationMode | string Enum: "notify_unread" "silent_read" "silent_unread" Controls notification and unread indicators for API-delivered messages. Defaults to Values:
| ||||||
| 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 Example:
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:
| ||||||
required | CreateConversationMessageE164Sender (object) or CreateConversationMessageUserEmailSender (object) (CreateConversationMessageSender) Identifies which phone number the message is sent from. | ||||||
Any of
| |||||||
| Access-Control-Allow-Origin |
| hasExistingConversation required | boolean Indicates whether the conversation already existed before this message was sent.
If |
| vendor required | string Value: "twilio" The CPaaS vendor that carried the message. One of the following values:
|
| 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
|
| vendorMessageId | string The vendor's identifier of the message that was created. The value of this field is dependent
on the value of the
This field will be undefined if a new Group MMS conversation was created for this message.
In this case, you should subscribe to the |
{- "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"
}
}{- "hasExistingConversation": true,
- "vendor": "twilio",
- "vendorConversationId": "string",
- "vendorMessageId": "string"
}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.
| Authorization required | string (Authorization) Authorization header bearing the access token |
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:
The following are the minimum and maximum values for the field:
|
| 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 |
| 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 Example:
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 |
| Access-Control-Allow-Origin |
| success required | boolean |
{- "body": "string",
- "closeTimer": "string",
- "conversationName": "string",
- "from": "string",
- "notifyUsers": true,
- "passthroughParameters": { },
- "to": "string"
}{- "success": true
}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.
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the message
Array of strings or (any or null) Required if routingAction is
| |||||||
Any of Array string | |||||||
| channel | string The type of the conversation channel. This field is optional and defaults to the | ||||||
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:
The following are the minimum and maximum values for the field:
| ||||||
| 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) | ||||||
| |||||||
| 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 | ||||||
| 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 Example:
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. | |||||||
| Access-Control-Allow-Origin |
| hasExistingConversation required | boolean Indicates whether the conversation already existed before this message was sent.
If |
| vendor required | string Value: "twilio" The CPaaS vendor that carried the message. One of the following values:
|
| 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
|
| 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
This field will be undefined if a new Group MMS conversation was created for this message.
In this case, you should subscribe to the |
{- "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"
}{- "hasExistingConversation": true,
- "vendor": "twilio",
- "vendorConversationId": "string",
- "vendorMessageId": "string"
}Conversation-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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) | ||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||
{- "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": [
- {
- "label": "phone",
- "numberRaw": "13511404781",
- "numberDisplay": "+1 258-511-4685",
- "numberE164": "+11116308809"
}
], - "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": [
- {
- "type": "user",
- "displayName": "Demarco Mueller",
- "id": "25ec3951-a0b9-4413-b89d-e01a383578fa",
- "email": "Stuart_Casper85@hotmail.com"
}, - {
- "type": "contact",
- "address": "+19374490612",
- "displayName": "Ms. Molly Berge",
- "id": "954933c8-0957-4180-9cb8-8a027f13a902",
- "phonebookId": "ae8a3672-80d9-4d8d-977e-5e48e9a3561f"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.940Z",
- "data": {
- "conversation": {
- "assignedContact": {
- "companyName": "Hickle - Orn",
- "emails": [
- {
- "label": "work",
- "email": null
}, - {
- "label": "personal",
- "email": null
}
], - "firstName": "Ben",
- "id": "0d386068-fd8e-450d-aea0-94c1d04a3733",
- "jobTitle": null,
- "lastName": "Leuschke",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "16000217092",
- "numberDisplay": "+1 648-205-1320",
- "numberE164": "+18953213301"
}
], - "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": [
- {
- "type": "user",
- "displayName": "Wade Block-Funk",
- "id": "bb562dd6-ab56-42ff-b2f2-b857fe6d09fb",
- "email": "Orville.Glover@hotmail.com"
}, - {
- "type": "contact",
- "address": "+13953821239",
- "displayName": "Miss Hector Hoppe",
- "id": "00ded018-b779-441a-bafb-2c93c5751447",
- "phonebookId": "34176e3f-8f7f-4714-9845-fab5665f183d"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.932Z",
- "data": {
- "conversation": {
- "assignedContact": {
- "companyName": "Gorczany, Mills and Stoltenberg",
- "emails": [
- {
- "label": "work",
- "email": "Casey_Dickinson45@gmail.com"
}, - {
- "label": "personal",
- "email": null
}
], - "firstName": "Geoffrey",
- "id": "666144b1-c20d-4bb6-80e2-80612f9fa696",
- "jobTitle": "National Optimization Orchestrator",
- "lastName": "Mann",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "14658942371",
- "numberDisplay": "+1 025-635-9896",
- "numberE164": "+12314123846"
}
], - "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": [
- {
- "id": "0386b0e0-dde3-4d28-b67a-e4b2ee2e6aa4",
- "vendorMessageId": "IMF1D36DA6E6A9439FA33E4AA1F37B6EBB",
- "conversationId": "607bde5f-6c9d-41eb-8d65-f94922670b50",
- "body": "Thymum tergum tepesco vulnus vomer clam thesaurus tribuo tabesco. Arca sol animadverto tolero deprecator.",
- "author": {
- "type": "user",
- "displayName": "Mr. Amaya Ortiz",
- "id": "ebd04c66-2e3f-4352-a514-c365fbf8e934",
- "email": "Lane_Konopelski99@gmail.com"
}, - "user": {
- "lastName": "Casper",
- "firstName": "Leon",
- "jobTitle": null,
- "mobile": null,
- "userId": "26557e5d-fce2-4d62-803a-6f558a240e05",
- "email": "Leonie.Romaguera-Kozey37@hotmail.com"
}, - "assignedContact": {
- "id": "666144b1-c20d-4bb6-80e2-80612f9fa696",
- "phonebookId": "6958cee2-677d-4287-89b3-1a1f8e0decc0",
- "firstName": "Geoffrey",
- "lastName": "Mann",
- "companyName": "Gorczany, Mills and Stoltenberg",
- "jobTitle": "National Optimization Orchestrator",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "14658942371",
- "numberDisplay": "+1 025-635-9896",
- "numberE164": "+12314123846"
}
], - "emails": [
- {
- "label": "work",
- "email": "Casey_Dickinson45@gmail.com"
}, - {
- "label": "personal",
- "email": null
}
], - "phonebookName": "Reduced contextually-based policy"
}, - "direction": "outbound",
- "isAutoResponse": false,
- "isApiCreated": false,
- "sentAt": "2026-06-05T05:57:18.935Z",
- "sentAtTimestamp": 1780639038935
}, - {
- "id": "a13dc2a4-008d-497d-a0ec-2347efa48563",
- "vendorMessageId": "IM358B858CF29C4C88B12AF8E866D9765A",
- "conversationId": "529bb731-6c27-435e-96d1-9d5c14063ef4",
- "body": "Vulariter ater cohors balbus condico tabgo quaerat bellum iusto umquam. Supplanto aqua crapula a antiquus capto tandem adinventitias.",
- "author": {
- "type": "contact",
- "address": "+11675103056",
- "displayName": "Marco Ward",
- "id": "7a6cfdcb-a08f-46b8-bd0d-b8728c93a31d",
- "phonebookId": "e5985c09-7bd2-4f80-a220-3c1fe535e4a1"
}, - "user": {
- "lastName": "Farrell",
- "firstName": "Yoshiko",
- "jobTitle": null,
- "mobile": null,
- "userId": "4c6f52a9-44a5-4b1c-8405-935d687aa541",
- "email": "Eduardo.Lockman30@gmail.com"
}, - "assignedContact": {
- "id": "666144b1-c20d-4bb6-80e2-80612f9fa696",
- "phonebookId": "6958cee2-677d-4287-89b3-1a1f8e0decc0",
- "firstName": "Geoffrey",
- "lastName": "Mann",
- "companyName": "Gorczany, Mills and Stoltenberg",
- "jobTitle": "National Optimization Orchestrator",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "14658942371",
- "numberDisplay": "+1 025-635-9896",
- "numberE164": "+12314123846"
}
], - "emails": [
- {
- "label": "work",
- "email": "Casey_Dickinson45@gmail.com"
}, - {
- "label": "personal",
- "email": null
}
], - "phonebookName": "Reduced contextually-based policy"
}, - "direction": "inbound",
- "isAutoResponse": false,
- "isApiCreated": false,
- "sentAt": "2026-06-05T05:57:18.935Z",
- "sentAtTimestamp": 1780639038935
}, - {
- "id": "6730fe17-636c-4a73-956c-b904e3159c67",
- "vendorMessageId": "IM61DA375B10DD4F88B0972EF957E6A9CE",
- "conversationId": "3b21ef39-f17d-4319-99c2-28066b71b9f5",
- "body": null,
- "author": {
- "type": "user",
- "displayName": "Mr. Amaya Ortiz",
- "id": "ebd04c66-2e3f-4352-a514-c365fbf8e934",
- "email": "Lane_Konopelski99@gmail.com"
}, - "user": {
- "lastName": "Orn",
- "firstName": "Courtney",
- "jobTitle": null,
- "mobile": null,
- "userId": "5da56181-041b-46b9-af71-732d8ae952fb",
- "email": "Rashad.Lakin62@gmail.com"
}, - "assignedContact": {
- "id": "666144b1-c20d-4bb6-80e2-80612f9fa696",
- "phonebookId": "6958cee2-677d-4287-89b3-1a1f8e0decc0",
- "firstName": "Geoffrey",
- "lastName": "Mann",
- "companyName": "Gorczany, Mills and Stoltenberg",
- "jobTitle": "National Optimization Orchestrator",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "14658942371",
- "numberDisplay": "+1 025-635-9896",
- "numberE164": "+12314123846"
}
], - "emails": [
- {
- "label": "work",
- "email": "Casey_Dickinson45@gmail.com"
}, - {
- "label": "personal",
- "email": null
}
], - "phonebookName": "Reduced contextually-based policy"
}, - "direction": "outbound",
- "isAutoResponse": false,
- "isApiCreated": false,
- "sentAt": "2026-06-05T05:57:18.935Z",
- "sentAtTimestamp": 1780639038935
}
], - "participants": [
- {
- "type": "user",
- "displayName": "Stephen Botsford",
- "id": "eaa6a623-54b1-4584-b765-6acf0e160125",
- "email": "Gerardo43@hotmail.com"
}, - {
- "type": "user",
- "displayName": "Mr. Amaya Ortiz",
- "id": "ebd04c66-2e3f-4352-a514-c365fbf8e934",
- "email": "Lane_Konopelski99@gmail.com"
}, - {
- "type": "contact",
- "address": "+11675103056",
- "displayName": "Marco Ward",
- "id": "7a6cfdcb-a08f-46b8-bd0d-b8728c93a31d",
- "phonebookId": "e5985c09-7bd2-4f80-a220-3c1fe535e4a1"
}
], - "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"
}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) | ||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||
{- "created": "2026-06-05T05:57:18.937Z",
- "data": {
- "conversation": {
- "assignedContact": {
- "companyName": "Grant, Kassulke and Paucek",
- "emails": [
- {
- "label": "work",
- "email": null
}, - {
- "label": "personal",
- "email": null
}
], - "firstName": "Constance",
- "id": "aaf9b438-6a26-4ac4-b4a0-0fc2b1247d67",
- "jobTitle": null,
- "lastName": "Jaskolski",
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "15801163881",
- "numberDisplay": "+1 505-861-2755",
- "numberE164": "+10907152989"
}
], - "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": [
- {
- "id": "81b52317-39bf-43f7-8556-e7da23b0e4d6",
- "vendorMessageId": "IM18A919E381A84D1BA1CC25C542165995",
- "conversationId": "47b574c7-79e4-4266-843d-fc23f1d4e3db",
- "author": {
- "type": "user",
- "displayName": "Preston Schaden",
- "id": "fde29bab-cf9b-44a3-bf63-4125ab4dfd5b",
- "email": "Lew_Batz@gmail.com"
}, - "user": {
- "lastName": "Legros",
- "firstName": "Cecilia",
- "jobTitle": null,
- "mobile": null,
- "userId": "40153980-77ba-4f63-8d7a-f6aa9df1dbed",
- "email": "Yvonne.Herzog47@yahoo.com"
}, - "assignedContact": {
- "id": "889cbd1c-e75d-41fd-9060-53176b9a439b",
- "phonebookId": "2eb0d7da-ae3f-402a-bebf-a80efab382cd",
- "firstName": "Brandi",
- "lastName": "Jacobs",
- "companyName": "Corkery - Mueller",
- "jobTitle": null,
- "phoneNumbers": [
- {
- "label": "work",
- "numberRaw": "15720882423",
- "numberDisplay": "+1 249-094-9184",
- "numberE164": "+17743333036"
}
], - "emails": [
- {
- "label": "work",
- "email": null
}, - {
- "label": "personal",
- "email": null
}
], - "phonebookName": "Immersive analyzing hub"
}, - "direction": "outbound",
- "isAutoResponse": false,
- "isApiCreated": false,
- "sentAt": "2026-06-05T05:57:18.939Z",
- "sentAtTimestamp": 1780639038939
}
], - "participants": [
- {
- "type": "user",
- "displayName": "Preston Schaden",
- "id": "fde29bab-cf9b-44a3-bf63-4125ab4dfd5b",
- "email": "Lew_Batz@gmail.com"
}, - {
- "type": "contact",
- "address": "+17151851626",
- "displayName": "Justin Kub",
- "id": "a90c00cc-9f77-4dd3-a6f9-8d97a082488b",
- "phonebookId": "04d91d6f-b428-4a0f-8cae-3be1f6f8541d"
}
], - "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 represent written versions of audio content, typically transcribed from call or voicemail recordings made or received on the Spoke platform.
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.
| 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 |
| sourceContextId | string (sourceContextId) Only return transcripts where the |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object (ResponseMeta) | ||||||||||
| |||||||||||
required | Array of objects (Transcript) | ||||||||||
Array
| |||||||||||
{- "meta": {
- "next": "string"
}, - "transcripts": [
- {
- "createdAt": 0,
- "id": "string",
- "source": {
- "contextId": "string",
- "id": "string",
- "type": "call"
}, - "speakers": [
- {
- "displayName": "string",
- "email": "string",
- "id": "string",
- "numberE164": "string"
}
], - "text": "string"
}
]
}Get a transcript resource by ID.
| id required | string (id) The transcript ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object (TranscriptLinks) The URLs for resources associated with the transcript | ||||||||||
| |||||||||||
required | object (Transcript) The transcript | ||||||||||
| |||||||||||
{- "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"
}
}Get associated transcript segments of a transcript by its ID.
| id required | string (id) The transcript ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | Array of objects (TranscriptSegment) | ||||||||||
Array
| |||||||||||
{- "segments": [
- {
- "endTime": 0,
- "speakerId": "string",
- "startTime": 0,
- "text": "string",
- "words": [
- {
- "endTime": 0,
- "startTime": 0,
- "text": "string"
}
]
}
]
}Transcript-related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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) | ||||
| |||||
| 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 | ||||
{- "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": [
- {
- "displayName": "Nellie Mills",
- "id": "+15545995719",
- "numberE164": "+15545995719"
}
], - "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"
}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 resource by ID.
| id required | string (id) The content analysis ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
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 | |||||||||||
Array
| |||||||||||
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. | ||||||||||
Any of
| |||||||||||
| status required | string (ContentAnalysisStatus) Enum: "analyzing" "failed" "queued" "succeeded" "transcribing" The analysis status. One of:
| ||||||||||
| transcript | string The transcript content that was analyzed The source of the value on this field depends whether
| ||||||||||
{- "analyzer": {
- "name": "string",
- "version": "string"
}, - "artifacts": [
- {
- "data": { },
- "schema": "string",
- "usage": [
- {
- "resource": "string",
- "unit": "string",
- "value": 0
}
]
}
], - "failure": {
- "description": "string",
- "reason": "contentInaccessible"
}, - "id": "string",
- "request": {
- "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": [
- {
- "joinedTimestamp": 0,
- "leftTimestamp": 0,
- "recordingChannel": 0
}
], - "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"
}
}, - "status": "analyzing",
- "transcript": "string"
}Delete a content analysis by ID. This will abort the content analysis and delete its associated data.
| id required | string (id) The content analysis ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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).
| 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 |
| artifact | string (artifact) Get all content analysis data which contains an artifact of the given schema name, e.g. "generalSummary" |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | Array of objects (ContentAnalysis) The content analyses matching the filters provided as query params | ||||||||||||||
Array
| |||||||||||||||
required | object (ResponseMeta) | ||||||||||||||
| |||||||||||||||
{- "contentAnalysis": [
- {
- "analyzer": {
- "name": "string",
- "version": "string"
}, - "artifacts": [
- {
- "data": { },
- "schema": "string",
- "usage": [
- {
- "resource": "string",
- "unit": "string",
- "value": 0
}
]
}
], - "failure": {
- "description": "string",
- "reason": "contentInaccessible"
}, - "id": "string",
- "request": {
- "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": [
- {
- "joinedTimestamp": 0,
- "leftTimestamp": 0,
- "recordingChannel": 0
}
], - "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"
}
}, - "status": "analyzing",
- "transcript": "string"
}
], - "meta": {
- "next": "string"
}
}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.
| Authorization required | string (Authorization) Authorization header bearing the access token |
The payload containing the content and related information required to be processed and analyzed.
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 | ||||||||||||||||
Array
| |||||||||||||||||
| 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. | ||||||||||||||||
| |||||||||||||||||
{- "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": [
- {
- "joinedTimestamp": 0,
- "leftTimestamp": 0,
- "recordingChannel": 0
}
], - "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"
}
}{- "analyzer": {
- "name": "string",
- "version": "string"
}, - "artifacts": [
- {
- "data": { },
- "schema": "string",
- "usage": [
- {
- "resource": "string",
- "unit": "string",
- "value": 0
}
]
}
], - "failure": {
- "description": "string",
- "reason": "contentInaccessible"
}, - "id": "string",
- "request": {
- "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": [
- {
- "joinedTimestamp": 0,
- "leftTimestamp": 0,
- "recordingChannel": 0
}
], - "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"
}
}, - "status": "queued",
- "transcript": "string"
}Content analysis related webhook events that you can listen to. For more information about webhooks, see Webhook Events.
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) | ||||||||||||||||||
| |||||||||||||||||||
| 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 | ||||||||||||||||||
{- "created": "2026-06-05T05:57:18.950Z",
- "data": {
- "contentAnalysis": {
- "analyzer": {
- "name": "callRecordingAnalysis",
- "version": "20250610-001"
}, - "artifacts": [
- {
- "schema": "preProcessor",
- "data": {
- "processDecision": "DO_NOT_PROCESS",
- "reasonCode": "REASON_CODE_UNWANTED_CALL",
- "reasonDescription": "Credo porro conventus nesciunt. Vulariter alius ascit bos placeat colligo eaque comedo somniculosus.",
- "detailedReasoning": "Deprecator summa amet adipisci. Vulgus id convoco nam volo calco eum curvo addo."
}
}
], - "id": "b9a5152d-faa4-4f67-b221-a6acc26e366d",
- "request": {
- "content": {
- "recordings": [
- {
- "id": "5b2a3bcf-2898-44a5-b295-48a6311601a0",
- "endedTimestamp": 1780639038951,
- "channels": 2,
- "startedTimestamp": 1780639038951
}
]
}, - "participants": [
- {
- "id": "+13563849851",
- "type": "contact",
- "data": {
- "numberE164": "+15997283652"
}, - "displayName": "Alysson Zemlak",
- "connections": [
- {
- "joinedTimestamp": 1780639038951,
- "leftTimestamp": 1780639038951,
- "recordingChannel": 0
}
]
}, - {
- "id": "d52ac4ac-0266-43a6-b60d-5c655ebb8353",
- "type": "user",
- "data": {
- "email": "Cedrick4@hotmail.com"
}, - "displayName": "Grover Schuster",
- "connections": [
- {
- "joinedTimestamp": 1780639038951,
- "leftTimestamp": 1780639038951,
- "recordingChannel": 1
}
]
}
], - "source": {
- "data": {
- "answeredAt": "2026-06-05T05:57:18.950Z",
- "assignedContact": { },
- "assignedUser": {
- "email": "Duncan4@yahoo.com",
- "firstName": "Jazlyn",
- "jobTitle": "Regional Program Associate",
- "lastName": "Kunde",
- "mobile": "+18255166422",
- "userId": "3cc732d2-1210-48d3-ac9f-04d7f78317fb"
}, - "companyNumber": "+12012680631",
- "contactNumber": "+19698620153",
- "direction": "inbound",
- "directoryTarget": {
- "displayName": "Carroll Marquardt",
- "email": "Amelie.Kerluke@gmail.com",
- "extension": 4157396,
- "id": "7c7d545c-0b42-449c-a498-b848c986c756",
- "type": "user"
}, - "duration": 70779,
- "durationText": "a minute",
- "endedAt": "2026-06-05T05:57:18.951Z",
- "id": "371429e1-286e-4ab0-bb9e-5b89259a780d",
- "initiator": "+13528975578",
- "isConference": false,
- "isInternal": false,
- "lastModifiedAt": "2026-06-05T05:57:18.951Z",
- "lastModifiedTimestamp": 1780639038951,
- "outcome": {
- "status": "answered"
}, - "recipient": "aff6ee47-4f0e-4aaf-a097-59a2f1014584",
- "startedAt": "2026-06-05T05:57:18.951Z",
- "startedTimestamp": 1780639038951,
- "status": "ended",
- "summary": {
- "companyNumberDescription": "Called in to +19543514369",
- "contactNumberDescription": "Called in from +12173063100",
- "header": "Inbound call from +18892708698 to Christine Walker",
- "outcome": "Spoke for a minute"
}, - "user": {
- "email": "Jessie71@gmail.com",
- "firstName": "Eileen",
- "jobTitle": "Investor Mobility Director",
- "lastName": "Schinner",
- "mobile": "+19301189566",
- "userId": "f5842fc4-6676-40dd-b543-562aba779e6d"
}, - "vendor": "twilio",
- "vendorCallId": "CA4FA83EF1201F4C319D7C572719425329",
- "waitTime": 13937,
- "waitTimeText": "a few seconds"
}, - "endedTimestamp": 1780639038951,
- "id": "371429e1-286e-4ab0-bb9e-5b89259a780d",
- "product": "connect",
- "startedTimestamp": 1780639038951,
- "type": "call",
- "vendor": "spoke"
}
}, - "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 are a way to receive notifications when certain events happen in your Spoke account. For more information about webhooks, see Webhook Events.
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.
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object | ||||||||||||||||||
| |||||||||||||||||||
required | Array of objects The list of webhooks. May be empty if no webhooks are found. | ||||||||||||||||||
Array
| |||||||||||||||||||
{- "meta": {
- "next": "string"
}, - "webhooks": [
- {
- "createdAt": "string",
- "createdTimestamp": 0,
- "description": "string",
- "enabled": true,
- "events": [
- "string"
], - "id": "string",
- "mode": "production",
- "signingSecret": "string",
- "url": "string"
}
]
}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.
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the webhook to be created
| description | string The description of the webhook |
| enabled | boolean Whether the webhook is enabled. Default value is |
| events required | Array of strings The list of events the webhook is subscribed to Possible values include:
|
| mode | string Enum: "production" "test" The webhook mode. Default value is |
| url required | string The URL of the webhook. Must be a valid HTTPS URL |
| Access-Control-Allow-Origin |
| 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 |
| events required | Array of strings The list of events the webhook is subscribed to Possible values include:
|
| id required | string ID of the webhook |
| mode required | string Enum: "production" "test" The webhook mode. Default value is |
| 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 |
{- "description": "string",
- "enabled": true,
- "events": [
- "string"
], - "mode": "production",
- "url": "string"
}{- "createdAt": "string",
- "createdTimestamp": 0,
- "description": "string",
- "enabled": true,
- "events": [
- "string"
], - "id": "string",
- "mode": "production",
- "signingSecret": "string",
- "url": "string"
}Retrieve the webhook.
| id required | string (id) The webhook ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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 |
| events required | Array of strings The list of events the webhook is subscribed to Possible values include:
|
| id required | string ID of the webhook |
| mode required | string Enum: "production" "test" The webhook mode. Default value is |
| 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 |
{- "createdAt": "string",
- "createdTimestamp": 0,
- "description": "string",
- "enabled": true,
- "events": [
- "string"
], - "id": "string",
- "mode": "production",
- "signingSecret": "string",
- "url": "string"
}Update an existing webhook.
| id required | string (id) The webhook ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the webhook to be updated
| description | string The description of the webhook |
| enabled | boolean Whether the webhook is enabled. Default value is |
| events | Array of strings The list of events the webhook is subscribed to Possible values include:
|
| mode | string Enum: "production" "test" The webhook mode. Default value is |
| url | string The URL of the webhook. Must be a valid HTTPS URL |
| Access-Control-Allow-Origin |
| 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 |
| events required | Array of strings The list of events the webhook is subscribed to Possible values include:
|
| id required | string ID of the webhook |
| mode required | string Enum: "production" "test" The webhook mode. Default value is |
| 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 |
{- "description": "string",
- "enabled": true,
- "events": [
- "string"
], - "mode": "production",
- "url": "string"
}{- "createdAt": "string",
- "createdTimestamp": 0,
- "description": "string",
- "enabled": true,
- "events": [
- "string"
], - "id": "string",
- "mode": "production",
- "signingSecret": "string",
- "url": "string"
}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
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.
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object (ResponseMeta) | ||||||||||||
| |||||||||||||
required | Array of objects (Trunk) | ||||||||||||
Array
| |||||||||||||
{- "meta": {
- "next": "string"
}, - "trunks": [
- {
- "allowSipFromAddress": [
- "string"
], - "id": "string",
- "name": "string",
- "region": "string",
- "sendSipToAddress": "string",
- "sipDomainName": "string"
}
]
}Retrieve a trunk resource, and its data.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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 |
{- "allowSipFromAddress": [
- "string"
], - "id": "string",
- "name": "string",
- "region": "string",
- "sendSipToAddress": "string",
- "sipDomainName": "string"
}Trunk devices usually represent real phones in communal areas, such as a conference phone or lunch room phone.
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.
| trunkId required | string (trunkId) The trunk ID |
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object (ResponseMeta) | ||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
required | Array of objects (TrunkDevice) | ||||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||||
{- "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"
}
]
}Creates a new trunk device in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "extension": "string",
- "externalId": "string",
- "location": "string",
- "model": "string",
- "name": "string",
- "product": "string"
}{- "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 in the specified trunk by its external ID.
Updating all trunk devices in the specified trunk is currently not supported.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "externalId": "string",
- "location": "string",
- "model": "string",
- "name": "string",
- "product": "string"
}{- "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 in the specified trunk.
Deleting all trunk devices in the specified trunk is currently not supported.
| trunkId required | string (trunkId) The trunk ID |
| externalId required | string (externalId) The external ID of the trunk device |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Retrieve a trunk device resource, and its data.
| trunkId required | string (trunkId) The trunk ID |
| trunkDeviceId required | string (trunkDeviceId) The trunk's device ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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" |
{- "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 in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| trunkDeviceId required | string (trunkDeviceId) The trunk's device ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "location": "string",
- "model": "string",
- "name": "string",
- "product": "string"
}{- "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 in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| trunkDeviceId required | string (trunkDeviceId) The trunk's device ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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.
| trunkId required | string (trunkId) The trunk ID |
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object (ResponseMeta) | ||||||||||||||||||||
| |||||||||||||||||||||
required | Array of objects (TrunkQueue) | ||||||||||||||||||||
Array
| |||||||||||||||||||||
{- "meta": {
- "next": "string"
}, - "trunkQueues": [
- {
- "description": "string",
- "displayName": "string",
- "extension": "string",
- "externalId": "string",
- "id": "string",
- "name": "string",
- "sipAddress": "string",
- "trunkId": "string",
- "twimlRedirectUrl": "string",
- "type": "trunkQueue"
}
]
}Creates a new trunk queue in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "extension": "string",
- "externalId": "string",
- "name": "string"
}{- "description": "string",
- "displayName": "string",
- "extension": "string",
- "externalId": "string",
- "id": "string",
- "name": "string",
- "sipAddress": "string",
- "trunkId": "string",
- "twimlRedirectUrl": "string",
- "type": "trunkQueue"
}Update a trunk queue in the specified trunk by its external ID.
Updating all trunk queues in the specified trunk is currently not supported.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "externalId": "string",
- "name": "string"
}{- "description": "string",
- "displayName": "string",
- "extension": "string",
- "externalId": "string",
- "id": "string",
- "name": "string",
- "sipAddress": "string",
- "trunkId": "string",
- "twimlRedirectUrl": "string",
- "type": "trunkQueue"
}Delete a trunk queue in the specified trunk.
Deleting all trunk queues in the specified trunk is currently not supported.
| trunkId required | string (trunkId) The trunk ID |
| externalId required | string (externalId) The external ID of the trunk queue |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Retrieve a trunk queue resource, and its data.
| trunkId required | string (trunkId) The trunk ID |
| trunkQueueId required | string (trunkQueueId) The trunk's queue ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "displayName": "string",
- "extension": "string",
- "externalId": "string",
- "id": "string",
- "name": "string",
- "sipAddress": "string",
- "trunkId": "string",
- "twimlRedirectUrl": "string",
- "type": "trunkQueue"
}Update a trunk queue in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| trunkQueueId required | string (trunkQueueId) The trunk's queue ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Information about the trunk queue to be updated
| description | string or null The queue's description |
| name | string The queue's name |
| Access-Control-Allow-Origin |
| 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" |
{- "description": "string",
- "name": "string"
}{- "description": "string",
- "displayName": "string",
- "extension": "string",
- "externalId": "string",
- "id": "string",
- "name": "string",
- "sipAddress": "string",
- "trunkId": "string",
- "twimlRedirectUrl": "string",
- "type": "trunkQueue"
}Delete a trunk queue in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| trunkQueueId required | string (trunkQueueId) The trunk's queue ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Trunk users usually represent the individual users in your phone system who may have soft phones or desk phones.
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.
| trunkId required | string (trunkId) The trunk ID |
| 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 |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
required | object (ResponseMeta) | ||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||
required | Array of objects (TrunkUser) | ||||||||||||||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||||||||||||||
{- "meta": {
- "next": "string"
}, - "trunkUsers": [
- {
- "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"
}
]
}Creates a new trunk user in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| Access-Control-Allow-Origin |
| assignToUserEmail | string or null The email of the Spoke user to assign this trunk user to.
Ignored if | ||||||
| assignToUserId | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| 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" | ||||||
{- "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"
}
]
}{- "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 in the specified trunk by its external ID.
Updating all trunk users in the specified trunk is currently not supported.
| trunkId required | string (trunkId) The trunk ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| Access-Control-Allow-Origin |
| assignToUserEmail | string or null The email of the Spoke user to assign this trunk user to.
Ignored if | ||||||
| assignToUserId | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| 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" | ||||||
{- "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"
}
]
}{- "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 in the specified trunk.
Deleting all trunk users in the specified trunk is currently not supported.
| trunkId required | string (trunkId) The trunk ID |
| externalId required | string (externalId) The external ID of the trunk user |
| Authorization required | string (Authorization) Authorization header bearing the access token |
Retrieve a trunk user resource, and its data.
| trunkId required | string (trunkId) The trunk ID |
| trunkUserId required | string (trunkUserId) The trunk's user ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
| Access-Control-Allow-Origin |
| assignToUserEmail | string or null The email of the Spoke user to assign this trunk user to.
Ignored if | ||||||
| assignToUserId | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| 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" | ||||||
{- "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 in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| trunkUserId required | string (trunkUserId) The trunk's user ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |
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 | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| Access-Control-Allow-Origin |
| assignToUserEmail | string or null The email of the Spoke user to assign this trunk user to.
Ignored if | ||||||
| assignToUserId | string or null The Spoke user ID of the user to assign this trunk user to.
Setting this field to | ||||||
| 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
| |||||||
| 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
| |||||||
| 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" | ||||||
{- "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"
}
]
}{- "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 in the specified trunk.
| trunkId required | string (trunkId) The trunk ID |
| trunkUserId required | string (trunkUserId) The trunk's user ID |
| Authorization required | string (Authorization) Authorization header bearing the access token |