openapi: 3.2.0
info:
title: Sinch Calls API
x-refined-note:
- x-sinch-standards-version differs across the merged source definitions and was not carried
version: '1.0'
description: 'Operations tagged Calls across 5 of this provider''s published API definitions: sinch-elastic-sip-trunking-api-openapi.yaml, sinch-voice-api-openapi.yaml, sinch-voice-api-v2-openapi.yaml, original-sinch-voice-openapi.yml, sinch-voice-api-v2-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://elastic-trunking.api.sinch.com
- url: https://calling.api.sinch.com
description: redirected by Sinch to an appropriate region
- url: https://calling-use1.api.sinch.com
description: United States
- url: https://calling-euc1.api.sinch.com
description: Europe
- url: https://calling-sae1.api.sinch.com
description: South America
- url: https://calling-apse1.api.sinch.com
description: Southeast Asia 1
- url: https://calling-apse2.api.sinch.com
description: Southeast Asia 2
- url: https://voice.api.sinch.com
description: Endpoint which enables consuming the Voice API globally - Redirected by Sinch to the closest region.
- url: https://us1.voice.api.sinch.com
description: North America 1 - East
- url: https://br1.voice.api.sinch.com
description: South America 1 - East
- url: https://eu1.voice.api.sinch.com
description: Europe 1 - Central
- url: https://sg1.voice.api.sinch.com
description: Asia Pacific 1 - Southeast
- url: https://au1.voice.api.sinch.com
description: Australia & Oceania 1 - Southeast
tags:
- name: Calls
description: The `/calls` endpoint has operations that allow you to retrieve call history and details about calls made or received using EST.
paths:
/v1/projects/{projectId}/calls:
get:
summary: Find calls
description: Find calls by query parameters.
operationId: findCalls
tags:
- Calls
parameters:
- $ref: '#/components/parameters/ProjectId'
- name: from
in: query
description: A phone number that you want to use to filter results. You can pass a partial number to get all calls sent to numbers that start with the number you passed.
required: false
schema:
type: string
format: phonenumber
- name: to
in: query
description: Only include calls made to this number or address. You can pass a partial number to get all calls sent to numbers that start with the number you passed.
required: false
schema:
type: string
format: phonenumber
- name: trunkId
in: query
description: Only include calls made from this trunk.
required: false
schema:
type: string
- name: createTime
description: 'Filter calls based on `createTime`. You make the query more precise, fewer results will be returned.
For example, 2021-02-01 will return all calls from the first of February 2021, and 2021-02-01T14:00:00Z will return all calls after 14:00 on the first of February.
This field also supports <= and >= to search for calls in a range ?createTime>=2021-10-01&createTime<=2021-10-30 to get a list if calls for october 2021
It is also possible to submit partial dates for example createTime=2021-02 will return all calls for February
***Defaults to 24 hours***
***Internal notes***
If a customer submits = and not <> we should add min and max for the date range
psueodo sql
```
createTime = 2021-02-01
select * from calls where createTime >= 2021-02-01 and createTime <= 2021-02-01T23:59:59Z
createTime = 2021-02-01T08
select * from calls where createTime >= 2021-02-01T08:00:00 and createTime <= 2021-02-01T08:59:59Z
```
but if they submit < or > we should just use the value they submitted and parse it a complete date'
required: false
in: query
schema:
type: string
example: '2021-02-01'
default: now-24h
- name: callResult
in: query
description: only include calls by on the callResult(s), example callResult=COMPLETED will return all calls which have completed normally.
required: false
schema:
$ref: '#/components/schemas/CallResult'
- name: direction
in: query
description: only include calls by on the direction(s), example direction=INBOUND,OUTBOUND will return all calls that are inbound or outbound.
required: false
schema:
type: string
description: Filter results based on the call direction.
enum:
- INBOUND
- OUTBOUND
x-ga-description: Describes whether the call was `INBOUND` *to* your Sinch number or was `OUTBOUND` and made *from* your Sinch number. An `INBOUND` call can also come from a SIP infrastructure or an application built using the Sinch SDK. An `OUTBOUND` call can be placed to a SIP infrastructure or an application built using the Sinch SDK.
x-enumDescriptions:
INBOUND: Somebody called your Sinch number.
OUTBOUND: You called somebody from your SIP device.
- name: page
in: query
description: The page you want to fetch
schema:
type: string
- name: size
in: query
description: The maximum number of items to return per request. The default is 100 and the maximum is 1000. If you need to export larger amounts and pagination is not suitable for you can use the Export function in the dashboard.
schema:
type: integer
maximum: 1000
minimum: 1
responses:
'200':
description: Call result response
content:
application/json:
schema:
allOf:
- type: object
properties:
calls:
type: array
description: The list of calls that matches the query parameters.
items:
$ref: '#/components/schemas/Call'
- $ref: '#/components/schemas/Pagination'
x-codeSamples:
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n // Replace with a valid 'from' number in your call history\n const fromFilter = '+1781';\n // Replace with one of: 'COMPLETED', 'NO_ANSWER', 'CANCEL', 'BUSY', 'FAILED'\n const callResultFilter = 'FAILED';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n const response = await sinch.elasticSipTrunking.calls.find({\n from: fromFilter,\n callResult: callResultFilter,\n });\n if (response.data.length === 0) {\n console.log('No calls found matching your criteria.');\n return;\n }\n console.log(`✅ Found ${response.data.length} calls.`);\n response.data.forEach((call) => {\n console.log(call);\n });\n } catch (err) {\n console.error('❌ Failed to find calls:');\n console.error(err);\n }\n}\n\nmain();\n"
security:
- Basic: []
- OAuth2.0: []
servers:
- url: https://elastic-trunking.api.sinch.com
/v1/projects/{projectId}/calls/export:
get:
tags:
- Calls
summary: Export call records
description: Export call records for a project. This returns a comma separate value (CSV) response. You can specify which records to export using the query parameters.
operationId: exportCallRecords
parameters:
- $ref: '#/components/parameters/ProjectId'
- name: from
in: query
description: A phone number that you want to use to filter results. You can pass a partial number to get all calls sent to numbers that start with the number you passed.
required: false
schema:
type: string
format: phonenumber
- name: to
in: query
description: Only include calls made to this number or address. You can pass a partial number to get all calls sent to numbers that start with the number you passed.
required: false
schema:
type: string
format: phonenumber
- name: trunkId
in: query
description: Only include calls made from this trunk.
required: false
schema:
type: string
- name: createTime
description: 'Filter calls based on `createTime`. You make the query more precise, fewer results will be returned.
For example, 2021-02-01 will return all calls from the first of February 2021, and 2021-02-01T14:00:00Z will return all calls after 14:00 on the first of February.
This field also supports <= and >= to search for calls in a range ?createTime>=2021-10-01&createTime<=2021-10-30 to get a list if calls for october 2021
It is also possible to submit partial dates for example createTime=2021-02 will return all calls for February
***Defaults to 24 hours***'
required: false
in: query
style: form
explode: true
schema:
type: string
example: '2021-02-01'
default: now-24h
- name: callResult
in: query
description: only include calls by on the callResult(s), example callResult=COMPLETED will return all calls which have completed normally.
required: false
style: form
explode: false
schema:
$ref: '#/components/schemas/CallResult'
- name: direction
in: query
description: only include calls by on the direction(s), example direction=INBOUND,OUTBOUND will return all calls that are inbound or outbound.
required: false
style: form
explode: false
schema:
type: string
description: Filter results based on the call direction. Describes whether the call was `INBOUND` *to* your Sinch number or was `OUTBOUND` and made *from* your Sinch number. An `INBOUND` call can also come from a SIP infrastructure or an application built using the Sinch SDK. An `OUTBOUND` call can be placed to a SIP infrastructure or an application built using the Sinch SDK.
enum:
- INBOUND
- OUTBOUND
x-enumDescriptions:
INBOUND: Somebody called your Sinch number.
OUTBOUND: You called somebody from your SIP device.
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Size'
- name: fromCountryCode
in: query
required: false
description: Set this if you want to filter on the country of the caller phone number.
schema:
type: string
example: US
- name: toCountryCode
in: query
required: false
description: Set this if you want to filter on the country of the callee phone number.
schema:
type: string
example: CA
- name: emergencyOnly
in: query
required: false
description: Set this if you want to filter on emergency calls or not.
schema:
type: string
enum:
- 'true'
- 'false'
x-enumDescriptions:
'true': Include only emergency calls.
'false': Include all calls.
- name: region
in: query
required: false
description: Set this is you want to filter calls based on the region.
schema:
type: string
example: us-east
- name: projectIds
in: query
required: false
description: Set this if you want to include calls from other projects.
schema:
type: string
- name: fileName
in: query
required: false
schema:
type: string
- name: groupId
in: query
required: false
description: Set this if you want to filter calls based on the group ID.
schema:
type: string
example: e234bd85-8uv5-44a2-a973-1f705a0960f5@vp3-i-06a73121dc26a8906.xmpp.vpc
- name: parentId
in: query
required: false
description: Set this if you want to filter calls based on the call's parent ID.
schema:
type: string
example: 9128525b-7273-123f-73ae-0225d0254abb
- name: relationshipType
in: query
required: false
description: The type of relationship the call has, for example, an initial call or a child call.
schema:
type: string
example: initial
- name: hasChildren
in: query
required: false
description: Set this if you want to filter on calls with children or not.
schema:
type: string
enum:
- 'true'
- 'false'
x-enumDescriptions:
'true': Include only calls with children.
'false': Include all calls.
responses:
'200':
description: OK
content:
application/csv:
schema:
type: string
x-codeSamples:
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n // Replace with a valid 'from' number in your call history\n const fromFilter = '+1440';\n // Replace with one of: 'COMPLETED', 'NO_ANSWER', 'CANCEL', 'BUSY', 'FAILED'\n const callResultFilter = 'FAILED';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n const response = await sinch.elasticSipTrunking.calls.export({\n from: fromFilter,\n callResult: callResultFilter,\n });\n console.log('✅ Successfully exported the call records.');\n console.log(response);\n } catch (err) {\n console.error('❌ Failed to export the call records:');\n console.error(err);\n }\n}\n\nmain();\n"
security:
- Basic: []
- OAuth2.0: []
servers:
- url: https://elastic-trunking.api.sinch.com
/v1/projects/{projectId}/calls/records/{pcapId}/pcap:
get:
tags:
- Calls
summary: Get PCAPs by ID
description: Return PCAPs by the PCAP ID. Returns a .pcap file of the requested call to download. You can find the PCAP ID in the response from '/calls' endpoint. PCAPs are only available for calls from within the last 10 days.
operationId: getPcap
parameters:
- $ref: '#/components/parameters/ProjectId'
- name: pcapId
in: path
description: The ID of the PCAP you want to retrieve.
required: true
schema:
type: string
example: 0a81e938-07bd-1240-8487-0ecf41868d11
- name: direction
in: query
description: Request a PCAP for the call leg specified by the direction. If this query parameter is not included, the default behavior is to return OUTBOUND calls.
required: false
schema:
type: string
enum:
- INBOUND
- OUTBOUND
x-enumDescriptions:
INBOUND: Somebody called your Sinch number.
OUTBOUND: You called somebody from your SIP device.
default: OUTBOUND
responses:
'200':
description: The .pcap file.
content:
application/octet-stream: {}
security:
- Basic: []
- OAuth2.0: []
servers:
- url: https://elastic-trunking.api.sinch.com
/calling/v1/calls/id/{callId}:
parameters:
- $ref: '#/components/parameters/callId'
patch:
tags:
- Calls
summary: Update a call in progress
description: 'This method is used to manage ongoing, connected calls. This method uses SVAML in the request body to perform various tasks related to the call. For more information about SVAML, see the Callback API documentation.
This method can only be used for calls that originate from or terminate to PSTN or SIP networks.'
operationId: Calling_UpdateCall
requestBody:
$ref: '#/components/requestBodies/updateCall'
responses:
'204':
description: A success response, or an [Error](https://developers.sinch.com/docs/voice/api-reference/errors/).
x-codeSamples:
- lang: Java
source: "/**\n * Sinch Java Snippet\n *\n *
This snippet is available at https://github.com/sinch/sinch-sdk-java\n *\n *
See https://github.com/sinch/sinch-sdk-java/blob/main/examples/snippets/README.md for details\n */\npackage voice.calls;\n\nimport com.sinch.sdk.SinchClient;\nimport com.sinch.sdk.domains.voice.api.v1.CallsService;\nimport com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangup;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstruction;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstructionSay;\nimport com.sinch.sdk.models.Configuration;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.logging.Logger;\nimport utils.Settings;\n\npublic class Update {\n\n private static final Logger LOGGER = Logger.getLogger(Update.class.getName());\n\n public static void main(String[] args) {\n\n String applicationKey = Settings.getApplicationKey().orElse(\"MY_APPLICATION_KEY\");\n String applicationSecret = Settings.getApplicationSecret().orElse(\"MY_APPLICATION_SECRET\");\n\n // The ID of the call to update\n String callId = \"CALL_ID\";\n // The instruction to be performed\n SvamlInstruction instruction = SvamlInstructionSay.builder().setText(\"Goodbye\").build();\n // The instruction to add to the call\n ManagedCallSvamlAction action = SvamlActionHangup.SVAML_ACTION_HANGUP;\n\n Configuration configuration =\n Configuration.builder()\n .setApplicationKey(applicationKey)\n .setApplicationSecret(applicationSecret)\n .build();\n\n SinchClient client = new SinchClient(configuration);\n\n CallsService callsService = client.voice().v1().calls();\n\n LOGGER.info(String.format(\"Updating call with ID '%s'\", callId));\n\n Collection instructions = Collections.singletonList(instruction);\n\n CallUpdateRequest request =\n CallUpdateRequest.builder().setInstructions(instructions).setAction(action).build();\n\n callsService.update(callId, request);\n\n LOGGER.info(\"Done\");\n }\n}\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const applicationKey = process.env.SINCH_APPLICATION_KEY ?? 'MY_APPLICATION_KEY';\n const applicationSecret = process.env.SINCH_APPLICATION_SECRET ?? 'MY_APPLICATION_SECRET';\n\n // The ID of the call to update\n const callId = 'CALL_ID';\n\n const sinch = new SinchClient({ applicationKey, applicationSecret });\n\n try {\n await sinch.voice.calls.update({\n callId,\n updateCallRequestBody: {\n instructions: [\n {\n name: 'sendDtmf',\n value: '1234#',\n },\n ],\n action: {\n name: 'hangup',\n },\n },\n });\n console.log(`✅ Successfully updated call with ID ${callId}.`);\n } catch (err) {\n console.error(`❌ Failed to update call with ID ${callId}:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- Basic: []
- Signed: []
get:
tags:
- Calls
summary: Get information about a call
description: 'You can retrieve information about an ongoing or completed call using a call ID. You can find the call ID of an ongoing call by viewing the response object from a callout request. You can find the call ID of a completed call by looking at your call logs in your Sinch Dashboard.
Note: You can only use this method for calls that terminate to PSTN or SIP networks from an In-app call.'
operationId: Calling_GetCallResult
responses:
'200':
description: A success response, or an [Error](https://developers.sinch.com/docs/voice/api-reference/errors/).
content:
application/json:
schema:
$ref: '#/components/schemas/getCallResponseObj'
x-codeSamples:
- lang: Java
source: "/**\n * Sinch Java Snippet\n *\n * This snippet is available at https://github.com/sinch/sinch-sdk-java\n *\n *
See https://github.com/sinch/sinch-sdk-java/blob/main/examples/snippets/README.md for details\n */\npackage voice.calls;\n\nimport com.sinch.sdk.SinchClient;\nimport com.sinch.sdk.domains.voice.api.v1.CallsService;\nimport com.sinch.sdk.domains.voice.models.v1.calls.response.CallInformation;\nimport com.sinch.sdk.models.Configuration;\nimport java.util.logging.Logger;\nimport utils.Settings;\n\npublic class Get {\n\n private static final Logger LOGGER = Logger.getLogger(Get.class.getName());\n\n public static void main(String[] args) {\n\n String applicationKey = Settings.getApplicationKey().orElse(\"MY_APPLICATION_KEY\");\n String applicationSecret = Settings.getApplicationSecret().orElse(\"MY_APPLICATION_SECRET\");\n\n // The ID of the call to retrieve\n String callId = \"CALL_ID\";\n\n Configuration configuration =\n Configuration.builder()\n .setApplicationKey(applicationKey)\n .setApplicationSecret(applicationSecret)\n .build();\n\n SinchClient client = new SinchClient(configuration);\n\n CallsService callsService = client.voice().v1().calls();\n\n LOGGER.info(String.format(\"Get information for call with ID '%s'\", callId));\n\n CallInformation response = callsService.get(callId);\n\n LOGGER.info(\"Response: \" + response);\n }\n}\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const applicationKey = process.env.SINCH_APPLICATION_KEY ?? 'MY_APPLICATION_KEY';\n const applicationSecret = process.env.SINCH_APPLICATION_SECRET ?? 'MY_APPLICATION_SECRET';\n\n // The ID of the call to retrieve\n const callId = 'CALL_ID';\n\n const sinch = new SinchClient({ applicationKey, applicationSecret });\n\n try {\n const response = await sinch.voice.calls.get({ callId });\n console.log('✅ Successfully retrieved call.');\n console.log(`Response:\\n${JSON.stringify(response, null, 2)}`);\n } catch (err) {\n console.error(`❌ Failed to retrieve call with ID ${callId}:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- Basic: []
- Signed: []
servers:
- url: https://calling.api.sinch.com
description: redirected by Sinch to an appropriate region
- url: https://calling-use1.api.sinch.com
description: United States
- url: https://calling-euc1.api.sinch.com
description: Europe
- url: https://calling-sae1.api.sinch.com
description: South America
- url: https://calling-apse1.api.sinch.com
description: Southeast Asia 1
- url: https://calling-apse2.api.sinch.com
description: Southeast Asia 2
/calling/v1/calls/id/{callId}/leg/{callLeg}:
parameters:
- $ref: '#/components/parameters/callId'
- $ref: '#/components/parameters/callLeg'
patch:
tags:
- Calls
summary: Manage Call with `callLeg`
description: 'This method is used to manage ongoing, connected calls. This method is only used when using the `PlayFiles` and `Say` instructions in the request body. This method uses SVAML in the request body to perform various tasks related to the call. For more information about SVAML, see the Callback API documentation.
Note: You can only use this method for calls that originate from or terminate to PSTN or SIP networks.'
operationId: Calling_ManageCallWithCallLeg
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PATCHSVAMLRequestBody'
examples:
hangupExample:
value:
instructions:
- name: say
text: Hello, the call is over, hanging up now. Goodbye
locale: en-US
action:
name: hangup
continueExample:
$ref: '#/components/examples/continue'
parkExample:
$ref: '#/components/examples/park'
playFilesExample:
$ref: '#/components/examples/playFiles'
sayExample:
$ref: '#/components/examples/say'
sendDtmfExample:
$ref: '#/components/examples/sendDtmf'
setCookieExample:
$ref: '#/components/examples/setCookie'
answerExample:
$ref: '#/components/examples/answer'
startRecordingExample:
$ref: '#/components/examples/startRecording'
stopRecordingExample:
$ref: '#/components/examples/stopRecording'
ivrExample:
value:
instructions:
- name: playFiles
ids:
- welcome
locale: en-US
action:
name: hangup
responses:
'200':
description: A success response, or an [Error](https://developers.sinch.com/docs/voice/api-reference/errors/).
content:
application/json:
example:
content: 200 Successful response
x-codeSamples:
- lang: Java
source: "/**\n * Sinch Java Snippet\n *\n *
This snippet is available at https://github.com/sinch/sinch-sdk-java\n *\n *
See https://github.com/sinch/sinch-sdk-java/blob/main/examples/snippets/README.md for details\n */\npackage voice.calls;\n\nimport com.sinch.sdk.SinchClient;\nimport com.sinch.sdk.domains.voice.api.v1.CallsService;\nimport com.sinch.sdk.domains.voice.models.v1.calls.request.CallLeg;\nimport com.sinch.sdk.domains.voice.models.v1.calls.request.CallUpdateRequest;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.action.ManagedCallSvamlAction;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.action.SvamlActionHangup;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstruction;\nimport com.sinch.sdk.domains.voice.models.v1.svaml.instruction.SvamlInstructionSay;\nimport com.sinch.sdk.models.Configuration;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.logging.Logger;\nimport utils.Settings;\n\npublic class ManageWithCallLeg {\n\n private static final Logger LOGGER = Logger.getLogger(ManageWithCallLeg.class.getName());\n\n public static void main(String[] args) {\n\n String applicationKey = Settings.getApplicationKey().orElse(\"MY_APPLICATION_KEY\");\n String applicationSecret = Settings.getApplicationSecret().orElse(\"MY_APPLICATION_SECRET\");\n\n // The ID of the call to manage\n String callId = \"CALL_ID\";\n // The call leg to manage\n CallLeg callLeg = CallLeg.CALLEE;\n\n Configuration configuration =\n Configuration.builder()\n .setApplicationKey(applicationKey)\n .setApplicationSecret(applicationSecret)\n .build();\n\n SinchClient client = new SinchClient(configuration);\n\n CallsService callsService = client.voice().v1().calls();\n\n LOGGER.info(String.format(\"Manage call with ID '%s'\", callId));\n\n ManagedCallSvamlAction action = SvamlActionHangup.SVAML_ACTION_HANGUP;\n\n Collection instructions =\n Collections.singletonList(\n SvamlInstructionSay.builder()\n .setText(\"Hello, the call is over, hanging up now. Goodbye\")\n .build());\n\n CallUpdateRequest request =\n CallUpdateRequest.builder().setInstructions(instructions).setAction(action).build();\n\n callsService.manageWithCallLeg(callId, callLeg, request);\n\n LOGGER.info(\"Done\");\n }\n}\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const applicationKey = process.env.SINCH_APPLICATION_KEY ?? 'MY_APPLICATION_KEY';\n const applicationSecret = process.env.SINCH_APPLICATION_SECRET ?? 'MY_APPLICATION_SECRET';\n\n // The ID of the call to manage\n const callId = 'CALL_ID';\n // The call leg to manage: 'caller', 'callee' or 'both\n const callLeg = 'callee';\n\n const sinch = new SinchClient({ applicationKey, applicationSecret });\n\n try {\n await sinch.voice.calls.manageWithCallLeg({\n callId,\n callLeg,\n manageWithCallLegRequestBody: {\n instructions: [\n {\n name: 'say',\n text: 'Hello, the call is over, hanging up now. Goodbye',\n },\n ],\n action: {\n name: 'hangup',\n },\n },\n });\n console.log(`✅ Successfully managed call with ID ${callId} using call leg.`);\n } catch (err) {\n console.error(`❌ Failed to manage call with ID ${callId} using call leg:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- Basic: []
- Signed: []
servers:
- url: https://calling.api.sinch.com
description: redirected by Sinch to an appropriate region
- url: https://calling-use1.api.sinch.com
description: United States
- url: https://calling-euc1.api.sinch.com
description: Europe
- url: https://calling-sae1.api.sinch.com
description: South America
- url: https://calling-apse1.api.sinch.com
description: Southeast Asia 1
- url: https://calling-apse2.api.sinch.com
description: Southeast Asia 2
/v2/projects/{projectId}/calls:
get:
tags:
- Calls
summary: List calls made with Sinch Voice API
description: List and filter calls made with Sinch
operationId: listCalls
parameters:
- $ref: '#/components/parameters/projectId'
- in: query
name: serviceId
description: The ID of the service.
required: false
schema:
$ref: '#/components/schemas/serviceId'
- in: query
name: from
description: Only include calls where `from` matches this origin. For inbound calls, this is the caller; for outbound calls, this is the calling party.
required: false
schema:
type: string
example: '+15551234567'
- in: query
name: to
description: Only include calls where `to` matches this destination. For inbound calls, this is the called party; for outbound calls, this is the callee/recipient.
required: false
schema:
type: string
example: '+15551234568'
- in: query
name: callType
description: 'Only include calls of the specified type.
If omitted, calls of all types are included.'
required: false
schema:
$ref: '#/components/schemas/callType'
- in: query
name: startTime
description: 'Only include calls that started **at or after** `startTime`.
Use a more precise timestamp to narrow the results. For example:
- `2025-02-01` matches calls starting from 2025-02-01T00:00:00Z
- `2025-02-01T14:00:00Z` matches calls starting from 14:00:00Z on 2025-02-01'
required: false
schema:
type: string
format: date-time
example: '2025-02-01T14:00:00Z'
- in: query
name: endTime
description: 'Only include calls that ended **before** `endTime` (exclusive).
Use a more precise timestamp to narrow the results. For example:
- `2025-03-01` matches calls ending up to 2025-03-01T00:00:00Z
- `2025-03-01T14:00:00Z` matches calls ending up to 14:00:00Z on 2025-03-01'
required: false
schema:
type: string
format: date-time
example: '2025-03-01T14:00:00Z'
- in: query
name: callResult
description: 'Filter results to only include calls whose `callResult` matches the specified value.
If omitted, calls with any result are included.'
required: false
schema:
$ref: '#/components/schemas/callResult_2'
- in: query
name: callReason
description: 'Filter results to only include calls whose `callReason` matches the specified value.
If omitted, calls with any reason are included.'
required: false
schema:
$ref: '#/components/schemas/callReason'
- $ref: '#/components/parameters/pageSize'
- $ref: '#/components/parameters/page'
responses:
'200':
description: A list of calls
content:
application/json:
schema:
$ref: '#/components/schemas/callsList'
example:
calls:
- callId: 01ARZ3NDEKTSV4RRFFQ69G5FAA
projectId: 5c5bf2b1-35ae-4825-ab89-457e07bb60e6
serviceId: 6e124178-c29d-46a5-943c-5c2ae544aade
sessionId: 01BX5ZZKBKACTAV9WEVGEMMVRB
direction: OUTBOUND
originationType: SERVER
callType: PHONE
callResult: COMPLETED
callReason: CALLEE_HANGUP
startTime: '2025-02-10T09:00:00Z'
answerTime: '2025-02-10T09:00:05Z'
endTime: '2025-02-10T09:00:47Z'
callDurationSeconds: 42
from:
type: PHONE
phone:
number: '+15551234567'
to:
type: PHONE
phone:
number: '+15551234568'
callRate:
currencyCode: USD
amount: '0.0123'
callResourceUrl: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
- callId: 01BX5ZZKBKACTAV9WEVGEMMVRD
projectId: 5c5bf2b1-35ae-4825-ab89-457e07bb60e6
serviceId: 6e124178-c29d-46a5-943c-5c2ae544aade
sessionId: 01BX5ZZKBKACTAV9WEVGEMMVRE
direction: INBOUND
originationType: PHONE
callType: PHONE
callResult: IN_PROGRESS
startTime: '2025-02-10T09:05:00Z'
answerTime: '2025-02-10T09:05:08Z'
from:
type: PHONE
phone:
number: '+15559876543'
to:
type: PHONE
phone:
number: '+15551234567'
callRate:
currencyCode: USD
amount: '0.0100'
callResourceUrl: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01BX5ZZKBKACTAV9WEVGEMMVRD
links:
first: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=1&pageSize=20
last: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=5&pageSize=20
prev: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=1&pageSize=20
self: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=2&pageSize=20
next: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=3&pageSize=20
meta:
totalCount: 100
pageCount: 5
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
x-codeSamples:
- lang: Python
source: "\"\"\"\nSinch Python Snippet\n\nThis snippet is available at https://github.com/sinch/sinch-sdk-python/tree/main/examples/snippets\n\"\"\"\n\nimport os\n\nfrom dotenv import load_dotenv\n\nfrom sinch import SinchClient\n\nload_dotenv()\n\nsinch_client = SinchClient(\n project_id=os.environ.get(\"SINCH_PROJECT_ID\") or \"MY_PROJECT_ID\",\n key_id=os.environ.get(\"SINCH_KEY_ID\") or \"MY_KEY_ID\",\n key_secret=os.environ.get(\"SINCH_KEY_SECRET\") or \"MY_KEY_SECRET\",\n)\n\ncalls = sinch_client.voice.v2.calls.list()\n\nprint(\"List of calls:\\n\")\nfor call in calls.iterator():\n print(call)\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n const response = await sinch.voice.v2.calls.list();\n if (response.data.length === 0) {\n console.log('No Voice v2 calls found.');\n return;\n }\n console.log(`✅ Found ${response.data.length} Voice v2 calls.`);\n response.data.forEach((call) => {\n console.log(call);\n });\n } catch (err) {\n console.error('❌ Failed to list Voice v2 calls:');\n console.error(err);\n }\n}\n\nmain();\n"
security:
- BasicAuth: []
- SinchOAuth2: []
post:
tags:
- Calls
summary: Create and initiate a new outbound voice call
description: Create a new outbound call associated to the project's default service or to the service specified in the `serviceId` query parameter.
operationId: createCall
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/serviceIdQuery'
- $ref: '#/components/parameters/idempotencyKey'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/callRequest'
examples:
simpleDial:
summary: Outbound call to a phone number
value:
commands:
- command: dial
callName: origin
from:
type: PHONE
phone:
number: '+15551234567'
to:
type: PHONE
phone:
number: '+15559876543'
dialTimeoutDurationSeconds: 30
maxCallDurationSeconds: 3600
events:
onAnswer:
- command: messages
messages:
- type: SAY
say:
text: Hello, your call is now connected.
voiceName: Emma
onHangup:
- command: hangup
dialToStream:
summary: Outbound call to a WebSocket stream endpoint
value:
commands:
- command: dial
callName: origin
from:
type: PHONE
phone:
number: '+15551234567'
to:
type: STREAM
stream:
endpoint: wss://myapp.example.com/audio
streamOptions:
codec: PCM
sampleRate: 16000
dialTimeoutDurationSeconds: 30
events:
onHangup:
- command: hangup
batchDial:
summary: Batch of outbound calls with parameters
value:
commands:
- command: dial
callName: origin
from:
type: PHONE
phone:
number: '+15551234567'
to:
type: PHONE
phone:
number: '@numberB'
dialTimeoutDurationSeconds: 30
events:
onAnswer:
- command: messages
messages:
- type: SAY
say:
text: Hello, this is an automated reminder.
voiceName: Emma
onHangup:
- command: hangup
parameters:
- numberB: '+15559876543'
- numberB: '+15559876544'
- numberB: '+15559876545'
batchOptions:
maxCps: 10
ttlSeconds: 3600
responses:
'201':
description: Call created
content:
application/json:
schema:
$ref: '#/components/schemas/callResponse'
examples:
singleCallCreated:
summary: Single outbound call created
value:
projectId: 5c5bf2b1-35ae-4825-ab89-457e07bb60e6
serviceId: 6e124178-c29d-46a5-943c-5c2ae544aade
sessionId: 01BX5ZZKBKACTAV9WEVGEMMVRB
batchCallCreated:
summary: Batch of outbound calls created
value:
projectId: 5c5bf2b1-35ae-4825-ab89-457e07bb60e6
serviceId: 6e124178-c29d-46a5-943c-5c2ae544aade
sessionId: 01BX5ZZKBKACTAV9WEVGEMMVRB
batchId: 01BX5ZZKBKACTAV9WEVGEMMVRC
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'402':
$ref: '#/components/responses/402'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
x-codeSamples:
- lang: Python
source: "\"\"\"\nSinch Python Snippet\n\nThis snippet is available at https://github.com/sinch/sinch-sdk-python/tree/main/examples/snippets\n\"\"\"\n\nimport os\n\nfrom dotenv import load_dotenv\n\nfrom sinch import SinchClient\n\nload_dotenv()\n\nsinch_client = SinchClient(\n project_id=os.environ.get(\"SINCH_PROJECT_ID\") or \"MY_PROJECT_ID\",\n key_id=os.environ.get(\"SINCH_KEY_ID\") or \"MY_KEY_ID\",\n key_secret=os.environ.get(\"SINCH_KEY_SECRET\") or \"MY_KEY_SECRET\",\n)\n\n# The Sinch phone number to call from\nfrom_phone_number = (\n os.environ.get(\"SINCH_PHONE_NUMBER\") or \"MY_SINCH_PHONE_NUMBER\"\n)\n\n# The phone number of the recipient to call\nto_phone_number = \"RECIPIENT_PHONE_NUMBER\"\n\n# The command dialing out to the recipient\ndial_command = {\n \"command\": \"dial\",\n \"call_name\": \"Python_SDK_Snippet_Call\",\n \"from_\": {\"type\": \"PHONE\", \"phone\": {\"number\": from_phone_number}},\n \"to\": {\"type\": \"PHONE\", \"phone\": {\"number\": to_phone_number}},\n \"events\": {\n \"on_answer\": [\n {\n \"command\": \"messages\",\n \"messages\": [\n {\n \"type\": \"SAY\",\n \"say\": {\n \"text\": \"Hello, your call is now connected.\",\n \"voice_name\": \"Emma\",\n },\n }\n ],\n }\n ],\n \"on_hangup\": [{\"command\": \"hangup\"}],\n },\n}\n\n# The SVAML commands describing the call flow\ncommands = [dial_command]\n\nresponse = sinch_client.voice.v2.calls.start(commands=commands)\n\nprint(f\"Call Successfully started.\\n{response}\")\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n // The phone number to be used as the caller ID, in E.164 format (e.g., +12025550123)\n const sinchPhoneNumber = process.env.SINCH_PHONE_NUMBER || 'MY_SINCH_PHONE_NUMBER';\n // The phone number you want to call, in E.164 format (e.g., +12025550123)\n const recipientPhoneNumber = 'RECIPIENT_PHONE_NUMBER';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n const response = await sinch.voice.v2.calls.start({\n createCallRequestBody: {\n commands: [\n {\n command: 'dial',\n callName: 'Node_SDK_Snippet_Call',\n from: {\n type: 'PHONE',\n phone: {\n number: sinchPhoneNumber,\n },\n },\n to: {\n type: 'PHONE',\n phone: {\n number: recipientPhoneNumber,\n },\n },\n dialTimeoutDurationSeconds: 30,\n events: {\n onAnswer: [\n {\n command: 'messages',\n messages: [\n {\n type: 'SAY',\n say: {\n text: 'Hello, your call is now connected.',\n voiceName: 'Emma',\n },\n },\n ],\n },\n ],\n onHangup: [\n {\n command: 'hangup',\n },\n ],\n },\n },\n ],\n },\n });\n console.log(`✅ Successfully started a Voice v2 call to ${recipientPhoneNumber}.`);\n console.log(`Response:\\n${JSON.stringify(response, null, 2)}`);\n } catch (err) {\n console.error(`❌ Failed to start a Voice v2 call to ${recipientPhoneNumber}:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- BasicAuth: []
- SinchOAuth2: []
servers:
- url: https://voice.api.sinch.com
description: Endpoint which enables consuming the Voice API globally - Redirected by Sinch to the closest region.
- url: https://us1.voice.api.sinch.com
description: North America 1 - East
- url: https://br1.voice.api.sinch.com
description: South America 1 - East
- url: https://eu1.voice.api.sinch.com
description: Europe 1 - Central
- url: https://sg1.voice.api.sinch.com
description: Asia Pacific 1 - Southeast
- url: https://au1.voice.api.sinch.com
description: Australia & Oceania 1 - Southeast
/v2/projects/{projectId}/calls/{callId}:
get:
tags:
- Calls
summary: Retrieve call details by call ID
operationId: getCallById
description: Retrieve detailed information about a specific call using its unique identifier.
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/callId_2'
responses:
'200':
description: A call object
content:
application/json:
schema:
$ref: '#/components/schemas/call'
example:
callId: 01ARZ3NDEKTSV4RRFFQ69G5FAA
projectId: 5c5bf2b1-35ae-4825-ab89-457e07bb60e6
serviceId: 6e124178-c29d-46a5-943c-5c2ae544aade
sessionId: 01BX5ZZKBKACTAV9WEVGEMMVRB
callName: origin
direction: OUTBOUND
originationType: SERVER
callType: PHONE
callResult: COMPLETED
callReason: CALLEE_HANGUP
startTime: '2025-02-10T09:00:00Z'
answerTime: '2025-02-10T09:00:05Z'
endTime: '2025-02-10T09:00:47Z'
callDurationSeconds: 42
from:
type: PHONE
phone:
number: '+15551234567'
to:
type: PHONE
phone:
number: '+15559876543'
callRate:
currencyCode: USD
amount: '0.0123'
callResourceUrl: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
x-codeSamples:
- lang: Python
source: "\"\"\"\nSinch Python Snippet\n\nThis snippet is available at https://github.com/sinch/sinch-sdk-python/tree/main/examples/snippets\n\"\"\"\n\nimport os\n\nfrom dotenv import load_dotenv\n\nfrom sinch import SinchClient\n\nload_dotenv()\n\nsinch_client = SinchClient(\n project_id=os.environ.get(\"SINCH_PROJECT_ID\") or \"MY_PROJECT_ID\",\n key_id=os.environ.get(\"SINCH_KEY_ID\") or \"MY_KEY_ID\",\n key_secret=os.environ.get(\"SINCH_KEY_SECRET\") or \"MY_KEY_SECRET\",\n)\n\n# The ID of the call to retrieve\ncall_id = \"CALL_ID\"\n\nresponse = sinch_client.voice.v2.calls.get(call_id=call_id)\n\nprint(f\"Successfully retrieved call details.\\n{response}\")\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n // The ID of the call to retrieve\n const callId = 'CALL_ID';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n const response = await sinch.voice.v2.calls.get({\n callId,\n });\n console.log(`✅ Successfully retrieved the Voice v2 call with ID ${callId}.`);\n console.log(`Response:\\n${JSON.stringify(response, null, 2)}`);\n } catch (err) {\n console.error(`❌ Failed to retrieve the Voice v2 call with ID ${callId}:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- BasicAuth: []
- SinchOAuth2: []
patch:
tags:
- Calls
summary: Patch an ongoing call by call ID
description: Interact with an ongoing call by submitting a set of SVAML commands. Use this to force disconnect, play messages, bridge with another call, or perform other call control actions.
operationId: patchCallById
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/callId_2'
- $ref: '#/components/parameters/idempotencyKey'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/callPatchRequest'
responses:
'202':
description: Commands accepted for processing.
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
x-codeSamples:
- lang: Python
source: "\"\"\"\nSinch Python Snippet\n\nThis snippet is available at https://github.com/sinch/sinch-sdk-python/tree/main/examples/snippets\n\"\"\"\n\nimport os\n\nfrom dotenv import load_dotenv\n\nfrom sinch import SinchClient\n\nload_dotenv()\n\nsinch_client = SinchClient(\n project_id=os.environ.get(\"SINCH_PROJECT_ID\") or \"MY_PROJECT_ID\",\n key_id=os.environ.get(\"SINCH_KEY_ID\") or \"MY_KEY_ID\",\n key_secret=os.environ.get(\"SINCH_KEY_SECRET\") or \"MY_KEY_SECRET\",\n)\n\n# The ID of the ongoing call to interact with\ncall_id = \"CALL_ID\"\n\n# The SVAML commands to interact with the ongoing call\ncommands = [{\"command\": \"hangup\"}]\n\nsinch_client.voice.v2.calls.interact_by_call_id(\n call_id=call_id, commands=commands\n)\n\nprint(\"Successfully submitted commands to the call.\")\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n // The ID of the ongoing call to interact with\n const callId = 'CALL_ID';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n await sinch.voice.v2.calls.interactByCallId({\n callId,\n callPatchRequestBody: {\n commands: [\n {\n command: 'hangup',\n },\n ],\n },\n });\n console.log(`✅ Successfully submitted SVAML commands for the Voice v2 call with ID ${callId}.`);\n } catch (err) {\n console.error(`❌ Failed to interact with the Voice v2 call with ID ${callId}:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- BasicAuth: []
- SinchOAuth2: []
servers:
- url: https://voice.api.sinch.com
description: Endpoint which enables consuming the Voice API globally - Redirected by Sinch to the closest region.
- url: https://us1.voice.api.sinch.com
description: North America 1 - East
- url: https://br1.voice.api.sinch.com
description: South America 1 - East
- url: https://eu1.voice.api.sinch.com
description: Europe 1 - Central
- url: https://sg1.voice.api.sinch.com
description: Asia Pacific 1 - Southeast
- url: https://au1.voice.api.sinch.com
description: Australia & Oceania 1 - Southeast
/v2/projects/{projectId}/sessions/{sessionId}/calls/{callName}:
patch:
tags:
- Calls
summary: Patch an ongoing call by session ID and call name
description: Interact with an ongoing call identified by its session and call name by submitting a set of SVAML commands. Use this to force disconnect, play messages, bridge with another call, or perform other call control actions.
operationId: patchCallBySessionAndName
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/sessionId'
- $ref: '#/components/parameters/idempotencyKey'
- name: callName
in: path
required: true
description: The name of the call leg within the session, as assigned by the `callName` property in the `dial` command.
schema:
type: string
example: origin
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/callPatchRequest'
responses:
'202':
description: Commands accepted for processing.
'400':
$ref: '#/components/responses/400'
'401':
$ref: '#/components/responses/401'
'403':
$ref: '#/components/responses/403'
'404':
$ref: '#/components/responses/404'
'429':
$ref: '#/components/responses/429'
'500':
$ref: '#/components/responses/500'
x-codeSamples:
- lang: Python
source: "\"\"\"\nSinch Python Snippet\n\nThis snippet is available at https://github.com/sinch/sinch-sdk-python/tree/main/examples/snippets\n\"\"\"\n\nimport os\n\nfrom dotenv import load_dotenv\n\nfrom sinch import SinchClient\n\nload_dotenv()\n\nsinch_client = SinchClient(\n project_id=os.environ.get(\"SINCH_PROJECT_ID\") or \"MY_PROJECT_ID\",\n key_id=os.environ.get(\"SINCH_KEY_ID\") or \"MY_KEY_ID\",\n key_secret=os.environ.get(\"SINCH_KEY_SECRET\") or \"MY_KEY_SECRET\",\n)\n\n# The ID of the session the call leg belongs to\nsession_id = \"SESSION_ID\"\n\n# The name of the call leg within the session\ncall_name = \"CALL_NAME\"\n\n# The SVAML commands to interact with the ongoing call\ncommands = [{\"command\": \"hangup\"}]\n\nsinch_client.voice.v2.calls.interact_by_call_name(\n session_id=session_id, call_name=call_name, commands=commands\n)\n\nprint(\"Successfully submitted commands to the call.\")\n"
- lang: Node.js
source: "/**\n * Sinch Node.js Snippet\n * See: https://github.com/sinch/sinch-sdk-node/examples/snippets\n */\nimport { SinchClient } from '@sinch/sdk-core';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n const projectId = process.env.SINCH_PROJECT_ID ?? 'MY_PROJECT_ID';\n const keyId = process.env.SINCH_KEY_ID ?? 'MY_KEY_ID';\n const keySecret = process.env.SINCH_KEY_SECRET ?? 'MY_KEY_SECRET';\n\n // The ID of the session that contains the call\n const sessionId = 'SESSION_ID';\n // The name of the call leg within the session, as assigned by the `callName` property in the `dial` command\n const callName = 'CALL_NAME';\n\n const sinch = new SinchClient({ projectId, keyId, keySecret });\n\n try {\n await sinch.voice.v2.calls.interactByCallName({\n sessionId,\n callName,\n callPatchRequestBody: {\n commands: [\n {\n command: 'hangup',\n },\n ],\n },\n });\n console.log(`✅ Successfully submitted SVAML commands for the Voice v2 call named ${callName} in session ${sessionId}.`);\n } catch (err) {\n console.error(`❌ Failed to interact with the Voice v2 call named ${callName} in session ${sessionId}:`);\n console.error(err);\n }\n}\n\nmain();\n"
security:
- BasicAuth: []
- SinchOAuth2: []
servers:
- url: https://voice.api.sinch.com
description: Endpoint which enables consuming the Voice API globally - Redirected by Sinch to the closest region.
- url: https://us1.voice.api.sinch.com
description: North America 1 - East
- url: https://br1.voice.api.sinch.com
description: South America 1 - East
- url: https://eu1.voice.api.sinch.com
description: Europe 1 - Central
- url: https://sg1.voice.api.sinch.com
description: Asia Pacific 1 - Southeast
- url: https://au1.voice.api.sinch.com
description: Australia & Oceania 1 - Southeast
/calling/v1/calls/id/{call_id}:
get:
operationId: getCall
summary: Get Call Information
description: Returns information about a specific call identified by the call ID.
tags:
- Calls
parameters:
- $ref: '#/components/parameters/CallId'
responses:
'200':
description: Call details
content:
application/json:
schema:
$ref: '#/components/schemas/CallInformation'
'401':
description: Unauthorized
'404':
description: Call not found
security:
- basicAuth: []
patch:
operationId: updateCall
summary: Update a Call
description: Updates an ongoing call with SVAML instructions. Can be used to play prompts, connect calls, or hang up.
tags:
- Calls
parameters:
- $ref: '#/components/parameters/CallId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SVAMLControl'
responses:
'200':
description: Call updated
'401':
description: Unauthorized
'404':
description: Call not found
security:
- basicAuth: []
servers:
- url: https://calling.api.sinch.com
description: Global Production Server
components:
schemas:
Pagination:
type: object
readOnly: true
properties:
totalItems:
type: integer
readOnly: true
format: int32
description: Total size of the result.
example: 10000
pageNumber:
readOnly: true
type: string
description: The token to be used for listing the next page
example: '1'
size:
type: integer
readOnly: true
format: int32
description: The number of items per page. default is 1000
example: 2000
CallResult:
description: The result of the call.
readOnly: true
type: string
example: COMPLETED
enum:
- COMPLETED
- NO_ANSWER
- CANCEL
- BUSY
- FAILED
x-enumDescriptions:
COMPLETED: The call was completed successfully.
NO_ANSWER: The call timeout before the recipient answered.
CANCEL: The call was canceled.
BUSY: The recipient was busy.
FAILED: The call failed.
Call:
description: The call resource represents an inbound or outbound connection between Sinch and a supported device
type: object
properties:
callId:
type: string
description: The unique identifier of the call.
format: ULID
to:
x-version: 1
x-PII: true
type: string
description: 'For `INBOUND` calls, this is the Sinch number the phone dialed.
For `OUTBOUND` calls, this is the phone number you want to make a call to.
Formatted according e164 format.'
from:
x-version: 1
x-PII: true
x-v1: breaking
type: string
x-mvp-description: 'The call''s origination, formatted according to the call''s `callType`. For calls to the telephone network, this is a phone number in [E.164](https://community.sinch.com/t5/Glossary/E-164/ta-p/7537) format, including the leading `+`.
Note: If you do not include the `from` property, the call is made from the number or identifier configured as the default for your application or service.'
description: 'For `INBOUND` calls, this is the number of the person calling. When making an outbound call set this to the your Sinch number you want to show up as Caller Id.
The call''s origination, formatted according to the call''s `callType`. For calls in the telephone network,
this is a phone number in [E.164](https://community.sinch.com/t5/Glossary/E-164/ta-p/7537) format, including the leading `+`.'
format: phoneNumber
example: '+14155553434'
direction:
x-version: 1
type: string
enum:
- INBOUND
- OUTBOUND
readOnly: true
x-PII: false
x-v1: false
description: Describes whether the call was `INBOUND` *to* your Sinch number or was `OUTBOUND` and made *from* your Sinch number.
x-enumDescriptions:
INBOUND: Someone called your Sinch number.
OUTBOUND: Someone called from your SIP device.
answerTime:
x-version: 1
readOnly: true
x-PII: false
x-V1: breaking
type: string
format: date-time
description: Time when call was answered
example: '2021-11-01T23:26:50Z'
endTime:
x-version: 1
readOnly: true
type: string
format: date-time
x-PII: false
x-V1: breaking
description: The time the call ended
example: '2021-11-01T23:29:50Z'
durationSeconds:
x-version: 1
x-PII: false
x-V1: breaking
description: The duration of the call in seconds. For inbound calls, this is the time from when the call started until the call ended. For outbound calls, this is the time from when the call was answered until the call ended.
readOnly: true
type: integer
example: 45
callResult:
$ref: '#/components/schemas/CallResult'
pricePerMinute:
description: The price per minute for this call.
allOf:
- $ref: '#/components/schemas/Money'
readOnly: true
billingDurationSeconds:
x-version: 1
readOnly: true
description: The duration of the call adjusted with the billing period.
type: integer
example: 60
price:
x-version: 1
description: The total price for this call. This field is populated when the call ends.
allOf:
- $ref: '#/components/schemas/Money'
readOnly: true
createTime:
x-version: 1
readOnly: true
x-PII: false
x-v1: true
type: string
format: date-time
description: The time the call was created.
example: '2021-11-01T23:20:50Z'
projectId:
x-version: 1
type: string
description: The ID of the project that the call belongs to.
trunkId:
x-version: 1
example: dFeDe67-09d5-49d5-b469-e1fc2cb163c7
type: string
description: The ID of the trunk that the call was made through.
pcapId:
type: string
description: The ID of the PCAP that can be retrieved. PCAPs are only stored for 10 days.
example: 0a81e938-07bd-1240-8487-0ecf41868d11
Money:
type: object
readOnly: true
properties:
currencyCode:
readOnly: true
description: The 3-letter currency code defined in ISO 4217.
type: string
example: USD
amount:
readOnly: true
description: The amount with 4 decimals and decimal delimiter `.`.
type: string
example: '0.0040'
destinationMxp:
type: object
description: The type of device and number or endpoint to call.
required:
- type
- endpoint
properties:
type:
$ref: '#/components/schemas/mxpDestination'
endpoint:
type: string
description: For type `userName` the value is the username for a data endpoint.
format: user name
example: myUserName
svaml.instruction:
type: object
description: Instructions allow an application to play a message or file, start recording, and various other tasks. For more information about instructions, see the [SVAML](https://developers.sinch.com/docs/voice/api-reference/svaml/) documentation.
anyOf:
- $ref: '#/components/schemas/svaml.instruction.playFiles'
- $ref: '#/components/schemas/svaml.instruction.say'
- $ref: '#/components/schemas/svaml.instruction.sendDtmf'
- $ref: '#/components/schemas/svaml.instruction.setCookie'
- $ref: '#/components/schemas/svaml.instruction.answer'
- $ref: '#/components/schemas/svaml.instruction.startRecording'
- $ref: '#/components/schemas/svaml.instruction.stopRecording'
discriminator:
propertyName: name
mapping:
playFiles: '#/components/schemas/svaml.instruction.playFiles'
say: '#/components/schemas/svaml.instruction.say'
sendDtmf: '#/components/schemas/svaml.instruction.sendDtmf'
setCookie: '#/components/schemas/svaml.instruction.setCookie'
answer: '#/components/schemas/svaml.instruction.answer'
startRecording: '#/components/schemas/svaml.instruction.startRecording'
stopRecording: '#/components/schemas/svaml.instruction.stopRecording'
pstnDestination:
type: string
description: Type `number` used for PSTN endpoints.
x-enumDescriptions:
number: A e.164 formatted number for PSTN endpoints.
Number: A e.164 formatted number for PSTN endpoints.
enum:
- number
- Number
example: number
svaml.action.park:
type: object
description: Parks the call and places the caller on hold. The caller is placed into a loop, listening to an IVR prompt (either a pre-recorded audio file or generated by text to speech). If the call is unparked, prompts will stop playing immediately. If the max duration is reached, the last prompt will be fully played until the call ends.
required:
- name
properties:
name:
type: string
description: The name property. Must have the value `park`.
x-enumDescriptions:
park: The `park` action.
enum:
- park
default: park
locale:
type: string
description: The voice and language you want to use for the text-to-speech message. This can either be defined by the ISO 639 locale and language code or by specifying a particular voice. Supported languages and voices are detailed [here](https://developers.sinch.com/docs/voice/api-reference/voice-locales).
example: en-US
introPrompt:
type: string
description: That prompt that is played when the call is first answered. You can use text-to-speech using the `#tts[]` element, SSML commands using the `#ssml[]` element.
example: '#tts[Welcome]'
holdPrompt:
type: string
description: The prompt that is played on repeat until the call is unparked or the until the `maxDuration` value is reached. You can use text-to-speech using the `#tts[]` element, SSML commands using the `#ssml[]` element.
example: '#tts[Thank you for your patience, your call is very important to us.]'
maxDuration:
type: integer
description: The maximum amount of time in seconds that the `holdPrompt` will be played.
example: 180
callResult:
type: string
x-enumDescriptions:
N/A: Not applicable
ANSWERED: The call was answered.
BUSY: The line called was busy.
NOANSWER: The line called failed to answer.
FAILED: The call failed.
enum:
- N/A
- ANSWERED
- BUSY
- NOANSWER
- FAILED
description: Contains the result of a call.
example: ANSWERED
svaml.action.hangup:
type: object
description: Hangs up a call. Available to use in a response to an [Incoming Call Event](https://developers.sinch.com/docs/voice/api-reference/voice/callbacks/ice) callback or an [Answered Call Event](https://developers.sinch.com/docs/voice/api-reference/voice/callbacks/ace) callback.
required:
- name
properties:
name:
type: string
description: The name property. Must have the value `hangup`.
x-enumDescriptions:
hangup: The `hangup` action.
enum:
- hangup
default: hangup
svaml.instruction.startRecordingOptions:
type: object
properties:
destinationUrl:
type: string
credentials:
type: string
format:
type: string
notificationEvents:
type: boolean
transcriptionOptions:
type: object
properties:
enabled:
type: boolean
locale:
type: string
svaml.action.continue:
type: object
description: Continues to set up a call. Available to use in a response to an [Answered Call Event](https://developers.sinch.com/docs/voice/api-reference/voice/callbacks/ace) callback.
required:
- name
properties:
name:
type: string
description: The name property. Must have the value `continue`.
x-enumDescriptions:
continue: The `continue` action.
enum:
- continue
default: continue
price:
type: object
properties:
currencyId:
type:
- string
- 'null'
amount:
type: number
format: float
svaml.instruction.say:
type: object
description: Plays a synthesized text-to-speech message to the end user. The message is provided in the text field.
required:
- name
properties:
name:
type: string
description: The `name` property. Must have the value `say`.
x-enumDescriptions:
say: The `say` instruction.
enum:
- say
default: say
text:
type: string
description: Contains the message that will be spoken. Default maximum length is 600 characters. To change this limit, please contact support.
example: Hello, thank you for calling Sinch!
locale:
type: string
description: The voice and language you want to use for the text-to-speech message. This can either be defined by the ISO 639 locale and language code or by specifying a particular voice. Supported languages and voices are detailed [here](https://developers.sinch.com/docs/voice/api-reference/voice-locales).
example: en-US
svaml.instruction.startRecording:
type: object
description: Starts a recording of the call.
required:
- name
properties:
name:
type: string
description: The `name` property. Must have the value `startRecording`.
x-enumDescriptions:
startRecording: The `startRecording` instruction.
enum:
- startRecording
default: startRecording
options:
$ref: '#/components/schemas/svaml.instruction.startRecordingOptions'
destinationSip:
type: object
description: The type of device and number or endpoint to call.
required:
- type
- endpoint
properties:
type:
$ref: '#/components/schemas/sipDestination'
endpoint:
type: string
description: For type `sip` the value is the SIP address for a SIP endpoint.
format: sip address
example: +19876543210@example.sip.sinch.com
sipDestination:
type: string
description: Type `sip` for SIP infrastructures.
x-enumDescriptions:
sip: A SIP address for SIP infrastructures.
enum:
- sip
example: sip
destinationPstn:
type: object
description: The type of device and number or endpoint to call.
required:
- type
- endpoint
properties:
type:
$ref: '#/components/schemas/pstnDestination'
endpoint:
type: string
description: If the type is `number` the value of the endpoint is a phone number.
format: e164 for numbers
example: '+12125550123'
svaml.instruction.setCookie:
type: object
required:
- name
description: Creates a cookie for the duration of the call.
properties:
name:
type: string
description: The `name` property. Must have the value `setCookie`.
x-enumDescriptions:
setCookie: The `setCookie` instruction.
enum:
- setCookie
default: setCookie
key:
type: string
description: The name of the cookie you want to set.
example: cookie_name
value:
type: string
description: The value of the cookie you want to set.
example: cookie_value
svaml.instruction.playFiles:
type: object
description: Plays Interactive Voice Response (IVR) files for the supported locale or SSML commands at the Sinch backend. An IVR message is played only on the caller's side.
required:
- name
- ids
properties:
name:
type: string
description: The `name` property. Must have the value `playFiles`.
x-enumDescriptions:
playFiles: The `playFiles` instruction.
enum:
- playFiles
default: playFiles
ids:
type: array
description: The IDs of the files which will be played. These can be a URL to a file, SSML commands using the `#ssml[]` element, or text using the `#tts[]` element.
items:
type: string
example:
- '#ssml[Thank you for calling Sinch!]'
locale:
type: string
description: If using SSML or TTS, this is a required field. The voice and language you want to use for the text-to-speech message. This can either be defined by the ISO 639 locale and language code or by specifying a particular voice. Supported languages and voices are detailed [here](https://developers.sinch.com/docs/voice/api-reference/voice-locales).
example: en-US
PATCHSVAMLRequestBody:
type: object
description: SVAML is a call control markup language. When a server receives a callback event from the Sinch platform, it can respond with a SVAML object to control the voice call. The following is an example of a SVAML object type and its contents.
properties:
instructions:
type: array
description: The collection of instructions that can perform various tasks during the call. You can include as many instructions as necessary.
items:
$ref: '#/components/schemas/svaml.instruction'
action:
$ref: '#/components/schemas/svaml.action.patch'
svaml.action.patch:
type: object
description: The action that will control the call. Each SVAML object can only include one action.
oneOf:
- $ref: '#/components/schemas/svaml.action.hangup'
- $ref: '#/components/schemas/svaml.action.continue'
- $ref: '#/components/schemas/svaml.action.park'
discriminator:
propertyName: name
mapping:
hangup: '#/components/schemas/svaml.action.hangup'
continue: '#/components/schemas/svaml.action.continue'
park: '#/components/schemas/svaml.action.park'
svaml.instruction.answer:
type: object
description: Forces the callee to answer the call.
required:
- name
properties:
name:
type: string
description: The `name` property. Must have the value `answer`.
x-enumDescriptions:
answer: The `answer` instruction.
enum:
- answer
default: answer
getCallResponseObj:
type: object
properties:
from:
oneOf:
- $ref: '#/components/schemas/destinationMxp'
- $ref: '#/components/schemas/destinationPstn'
- $ref: '#/components/schemas/destinationSip'
to:
oneOf:
- $ref: '#/components/schemas/destinationMxp'
- $ref: '#/components/schemas/destinationPstn'
- $ref: '#/components/schemas/destinationSip'
domain:
type: string
x-enumDescriptions:
pstn: The Public Switched Telephone Network, or a normal phone call.
enum:
- pstn
description: Must be `pstn` for PSTN.
example: pstn
callId:
type: string
description: The unique identifier of the call.
duration:
type: integer
description: The duration of the call in seconds.
status:
type: string
x-enumDescriptions:
ONGOING: Call status is `ONGOING`
FINAL: Call status is `FINAL`
enum:
- ONGOING
- FINAL
description: The status of the call. Either `ONGOING` or `FINAL`
example: ONGOING
result:
$ref: '#/components/schemas/callResult'
reason:
type: string
x-enumDescriptions:
N/A: Not available.
TIMEOUT: Timed out.
CALLERHANGUP: Caller hung up.
CALLEEHANGUP: Callee hung up.
BLOCKED: The call was blocked.
NOCREDITPARTNER: No credit available.
MANAGERHANGUP: The Sinch server ended the call.
CANCEL: Call was canceled.
GENERALERROR: A general error.
INVALIDSVAMLACTION: Call could not be completed due to invalid SVAML response.
enum:
- N/A
- TIMEOUT
- CALLERHANGUP
- CALLEEHANGUP
- BLOCKED
- NOCREDITPARTNER
- MANAGERHANGUP
- CANCEL
- GENERALERROR
- INVALIDSVAMLACTION
description: Contains the reason why a call ended.
timestamp:
type: string
format: date-time
description: The date and time of the call.
custom:
type: string
description: A string that can be used to pass custom information related to the call.
userRate:
$ref: '#/components/schemas/price'
debit:
$ref: '#/components/schemas/price'
svaml.instruction.stopRecording:
type: object
description: Stops the recording of the call.
required:
- name
properties:
name:
type: string
description: The `name` property. Must have the value `stopRecording`.
x-enumDescriptions:
stopRecording: The `stopRecording` instruction.
enum:
- stopRecording
default: stopRecording
svaml.instruction.sendDtmf:
type: object
description: Plays DTMF tones in the call.
required:
- name
properties:
name:
type: string
description: The `name` property. Must have the value `sendDtmf`.
x-enumDescriptions:
sendDtmf: The `sendDtmf` instruction.
enum:
- sendDtmf
default: sendDtmf
value:
type: string
description: 'A string that determines the DTMF tones to play to the callee when the call is picked up.
Valid characters are: `0-9`, `#`, and `w`. `w` renders a 500ms pause. For example, the string `ww1234#w#`, plays a 1 second pause, the DTMF tones for `1`, `2`, `3`, `4`, and `#`, followed by a 500ms pause and finally the `#` tone.
This is useful if the callout destination requires a conference PIN code or an extension. If there is a calling party, it will hear progress while the DTMF is sent.'
example: ww1234#w#
mxpDestination:
type: string
description: Type `userName` used for data endpoints.
x-enumDescriptions:
username: A username for data endpoints.
Username: A username for data endpoints.
enum:
- username
- Username
example: username
problemDetails:
title: Problem Details
description: Base error response schema following [RFC 9457](https://www.rfc-editor.org/rfc/rfc9457) (Problem Details for HTTP APIs). All error responses use this structure.
x-category: response
x-usage: http-response
type: object
additionalProperties: false
required:
- type
- title
- detail
- instance
properties:
type:
type: string
description: URI that identifies the problem type and links to the corresponding error documentation.
title:
type: string
description: Human-readable short summary of the problem type.
detail:
type: string
description: Human-readable explanation of the specific problem occurrence.
instance:
type: string
description: URI reference that identifies the specific occurrence of the problem (typically the request path).
callResult_2:
title: Call Result
description: 'The outcome/state of the call.
This field includes both **transitional** states (during call setup and execution) and **final** states (when the call has ended).'
type: string
enum:
- QUEUED
- INITIATED
- IN_PROGRESS
- COMPLETED
- REJECTED
- NO_ANSWER
- CANCEL
- BUSY
- FAILED
x-enumDescriptions:
QUEUED: The call is queued for initiation. This is a transitional state.
INITIATED: The call is connecting but the recipient has not yet answered. This is a transitional state.
IN_PROGRESS: The call has been answered and is in progress. This is a transitional state.
COMPLETED: The call was answered and is ended. This is a final state.
REJECTED: The call was rejected by the recipient.
NO_ANSWER: The call was not answered by the recipient.
CANCEL: The call was cancelled.
BUSY: The call was not answered because the recipient was busy.
FAILED: The call could not be completed.
examples:
- IN_PROGRESS
callResponse:
x-category: call
x-usage: call
type: object
additionalProperties: false
title: Callout response
description: 'Response returned after initiating an outbound call or a batch of call sessions.
Contains identifiers for the created session and associated project/service. `batchId` is included only when the request started a batch operation.'
required:
- projectId
- serviceId
- sessionId
properties:
projectId:
$ref: '#/components/schemas/projectId'
serviceId:
$ref: '#/components/schemas/serviceId'
sessionId:
$ref: '#/components/schemas/sessionId'
batchId:
$ref: '#/components/schemas/batchId'
sip:
type: object
additionalProperties: false
title: SIP Endpoint
required:
- type
- sip
properties:
type:
type: string
const: SIP
description: Routes the call to a SIP (Session Initiation Protocol) endpoint.
sip:
type: object
additionalProperties: false
required:
- endpoint
properties:
endpoint:
type: string
description: SIP URI of the destination endpoint. Both `sip:` (unencrypted) and `sips:` (TLS-encrypted) schemes are supported.
format: uri
maxLength: 256
pattern: '^sips?:'
transport:
type: string
description: 'Transport protocol to use for the SIP signalling channel.
If omitted, the platform selects a default based on the URI scheme: `UDP` for `sip:` and `TLS` for `sips:`. Setting this explicitly overrides that default — for example, to force `TCP` for a `sip:` URI or to use `TLS` without switching to the `sips:` scheme.'
enum:
- UDP
- TCP
- TLS
x-enumDescriptions:
UDP: Connectionless transport. Lowest overhead; suitable for most standard SIP deployments.
TCP: Connection-oriented transport. More reliable for large SIP messages or NAT traversal scenarios.
TLS: Encrypted transport. Provides confidentiality and integrity for SIP signalling.
callHeaders:
$ref: '#/components/schemas/sipCallHeaders'
examples:
- type: SIP
sip:
endpoint: sip:user@example.com
transport: TCP
callHeaders:
- key: X-Correlation-Id
value: '12345'
- key: X-Call-Routing
value: forwarded
messages:
type: object
additionalProperties: false
title: Messages
description: "Plays one or more messages on the call. Multiple messages in the array are played sequentially in order.\n\nThis is a non-blocking command — the next command in the sequence executes immediately while messages play in parallel. \nPlayback outcomes are handled via the `events` property. The `onFinish` event can be used to run a command after all messages complete."
required:
- command
- messages
properties:
command:
type: string
const: messages
description: Command to play a message on the channel
messagesName:
type: string
description: 'Name of the message for identification and reference within the call session.
This name is used to uniquely identify the message and must be unique within the current call session.
This name can be referenced in other commands (e.g., `stopMessages`) to control this specific message.'
minLength: 1
maxLength: 32
pattern: ^\S+$
example: my-messages
messages:
$ref: '#/components/schemas/typesOfMessages'
events:
$ref: '#/components/schemas/messageEvents'
examples:
- command: messages
messagesName: greeting-sequence
messages:
- type: SAY
say:
text: Hello! Your call is being connected.
voiceName: Emma
- type: PLAY
play:
url: https://example.com/audio/hold-music.mp3
- type: SAY
say:
text: Thank you for waiting.
format: SSML
voiceName: Emma
serviceId:
title: Service ID
type: string
format: uuid
description: The ID of the service used.
examples:
- 6e124178-c29d-46a5-943c-5c2ae544aade
requestParameters:
type: array
title: Command Parameter Sets
description: 'An array of parameter objects that define values for dynamic placeholders in commands. Each object represents a set of parameters for a single queued call.
Use these parameters to inject customer-defined values into your SVAML commands, enabling personalized call flows without modifying the base command structure.'
items:
$ref: '#/components/schemas/requestParameter'
messageEvents:
type: object
additionalProperties: false
title: Message Events
description: 'SVAML commands to execute based on message playback outcomes.
'
properties:
onFinish:
description: 'Commands to execute when all messages in the sequence have finished playing.
'
$ref: '#/components/schemas/svamlCommands'
menuPrompt:
type: object
additionalProperties: false
title: Menu Prompt
description: Prompt configuration for menu playback, including prompt messages and barge-in behavior.
required:
- messages
properties:
allowBargeIn:
type: boolean
description: 'Controls whether input can interrupt prompt playback.
When enabled, playback stops as soon as input is detected and the input is evaluated immediately if matching conditions are met.
When disabled, input is still collected during playback and evaluated after playback finishes.'
default: true
messages:
$ref: '#/components/schemas/typesOfMessages'
recordingDestination:
title: Recording Destination
type: string
description: Select target service to receive recorded and transcribed files
enum:
- AWS
- GCP
- AZURE
x-enumDescriptions:
AWS: Store recordings in Amazon Web Services S3 bucket. Use `s3` as schema for the URL.
GCP: Store recordings in Google Cloud Platform Storage. Use `gs` as schema for the URL.
AZURE: Store recordings in Microsoft Azure Blob Storage. Use `azure` as schema for the URL.
default: AWS
examples:
- AWS
webhookFallbackUrl:
title: Webhook Fallback URL
type: string
format: uri
description: 'Fallback webhook URL used when the primary webhook URL fails.
A failed request is re-sent to this URL immediately. After repeated consecutive failures of the primary URL, requests are sent only here until the primary URL recovers.
See *Timeouts and failover* in the **Webhooks** section for the authoritative algorithm.'
examples:
- https://example.com/fallback
callId:
title: Call ID
type: string
format: ulid
description: The `Id`` of the call.
examples:
- 01ARZ3NDEKTSV4RRFFQ69G5FAA
call:
type: object
additionalProperties: false
title: Call Resource
description: Call details
required:
- callId
- projectId
- serviceId
- sessionId
- direction
- originationType
- callType
- callResult
- startTime
- callRate
- callResourceUrl
properties:
callId:
$ref: '#/components/schemas/callId'
projectId:
$ref: '#/components/schemas/projectId'
serviceId:
$ref: '#/components/schemas/serviceId'
sessionId:
$ref: '#/components/schemas/sessionId'
callName:
type: string
minLength: 1
maxLength: 32
pattern: ^\S+$
description: 'The name identifying this call leg within the session, as assigned by the `callName` property in the `dial` command or in the SVAML response to an incoming call webhook.
Omitted for calls that were not assigned a name.'
example: origin
bridgeName:
type: string
description: The name of the bridge the call belongs to. Omitted for calls not assigned to any bridge.
example: my-bridge
batchId:
$ref: '#/components/schemas/batchId'
from:
$ref: '#/components/schemas/from'
to:
$ref: '#/components/schemas/to'
startTime:
type: string
format: date-time
description: Timestamp (RFC 3339) indicating when the call was created and call setup was initiated (start of the call attempt).
example: '2025-01-01 00:00:00+00:00'
updateTime:
type: string
format: date-time
description: 'Timestamp (RFC 3339) indicating when the call was last updated.
Omitted if no updates were performed on this call.'
example: '2025-01-01 00:00:00+00:00'
callType:
$ref: '#/components/schemas/callType'
direction:
$ref: '#/components/schemas/callDirection'
answerTime:
type: string
format: date-time
description: 'Timestamp (RFC 3339) indicating when the call was answered.
Omitted if the call was not answered.'
example: '2025-01-01 00:00:00+00:00'
endTime:
type: string
format: date-time
description: 'Timestamp (RFC 3339) indicating when the call ended.
Omitted for ongoing calls.'
example: '2025-01-01 00:00:00+00:00'
callDurationSeconds:
type: integer
description: Duration of the call in seconds
example: 42
callResult:
$ref: '#/components/schemas/callResult_2'
callReason:
$ref: '#/components/schemas/callReason'
originationType:
$ref: '#/components/schemas/originationType'
callRate:
$ref: '#/components/schemas/money'
description: The rate charged for this call, expressed as a monetary amount **per minute** in the specified currency.
callResourceUrl:
type: string
format: uri
description: Absolute URI to this call resource. Use this URL to retrieve the call details
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01AN4Z07BY79KA1307SR9X4MV3
recordingEvents:
type: object
additionalProperties: false
title: Recording Events
description: 'SVAML commands to execute based on recording lifecycle outcomes.
'
properties:
onFinish:
description: 'Commands to execute when the recording is successfully stopped. Note that this does not mean that the file is delivered to the configured destination yet.
'
$ref: '#/components/schemas/svamlCommands'
onFailure:
description: 'Commands to execute if the recording fails to start. If omitted, failures are silently ignored and the call flow continues.
'
$ref: '#/components/schemas/svamlCommands'
gotoMenu:
type: object
additionalProperties: false
title: Goto Menu
description: 'Switches execution to another menu within the current menu context. The menu name must be a menu defined in the `menu` command. This is a blocking command — execution waits for the menu to complete before proceeding to the next command.
**Important**: this command can only be called within a menu execution context.'
required:
- command
- menuName
properties:
command:
type: string
const: gotoMenu
description: Switch execution to another menu within the current menu context.
menuName:
type: string
description: Name of the target menu to execute next. Must match a key in menus.
minLength: 1
maxLength: 16
callsList:
type: object
additionalProperties: false
title: Calls List Response
description: List of calls.
x-category: response
x-usage: call
required:
- calls
- links
- meta
properties:
calls:
type: array
description: Array of call resources
items:
$ref: '#/components/schemas/call'
links:
$ref: '#/components/schemas/paginationLinks'
meta:
$ref: '#/components/schemas/paginationMeta'
sessionId:
title: Session ID
type: string
format: ulid
description: The ID of the session.
examples:
- 01BX5ZZKBKACTAV9WEVGEMMVRB
messageSay:
type: object
title: Say Message
description: A text-to-speech (TTS) message item. The platform synthesizes the provided text into speech and plays it on the call.
additionalProperties: false
required:
- type
- say
properties:
type:
type: string
const: SAY
description: Text-to-speech message to be played during the call.
say:
type: object
additionalProperties: false
title: Say
required:
- text
- voiceName
properties:
text:
type: string
description: 'The text to be synthesized into speech.
If `format` is `TEXT` (default), provide plain text.
If `format` is `SSML`, provide a valid SSML document (for example, `...`).'
maxLength: 600
example: Hello world
format:
type: string
description: Format of the message
enum:
- TEXT
- SSML
x-enumDescriptions:
TEXT: Plain text format for the message.
SSML: Speech Synthesis Markup Language format for advanced text-to-speech control.
default: TEXT
voiceName:
description: The name of the voice to use for text-to-speech synthesis.
$ref: '#/components/schemas/voiceName'
examples:
- type: SAY
say:
text: Hello, this is a test message
voiceName: Emma
- type: SAY
say:
text: Hello, this is a test message
format: SSML
voiceName: Brian
recordingOptions:
title: Recording Options
type: object
additionalProperties: false
description: Recording options for this recording.
required:
- destination
- destinationUrl
- credentials
properties:
format:
$ref: '#/components/schemas/recordingFormat'
recordingType:
$ref: '#/components/schemas/recordingType'
destination:
$ref: '#/components/schemas/recordingDestination'
destinationUrl:
type: string
description: Destination URL for the recording.
example: s3://voice-recordings-prod/calls
credentials:
type: string
description: Credentials to third party storage.
example: accessKeyId:secretAccessKey:eu-central-1
transcriptionOptions:
$ref: '#/components/schemas/transcriptionOptions'
amdEvents:
type: object
additionalProperties: false
title: AMD Events
description: SVAML commands to execute based on the answering machine detection result. These events define different call flows depending on whether a human, machine, beep, or unknown entity answers the call.
properties:
onHuman:
description: SVAML commands to be executed when a human is detected
$ref: '#/components/schemas/svamlCommands'
onMachine:
description: SVAML commands to be executed when a machine is detected
$ref: '#/components/schemas/svamlCommands'
onBeep:
description: SVAML commands to be executed when a beep is detected
$ref: '#/components/schemas/svamlCommands'
onUnknown:
description: SVAML commands to be executed when an unknown event is detected
$ref: '#/components/schemas/svamlCommands'
typesOfMessages:
type: array
title: Message List
description: Ordered list of messages to play.
minItems: 1
maxItems: 10
items:
$ref: '#/components/schemas/message'
originationType:
title: Origination Type
x-category: call
x-usage: call
type: string
description: 'Indicates the origin/source of the call.
This describes **how the call was initiated** (PSTN or via the API).'
enum:
- PHONE
- SIP
- SERVER
x-enumDescriptions:
PHONE: The call originated from the telephone network (PSTN).
SIP: The call originated from a SIP trunk.
SERVER: The call originated through the Sinch API.
examples:
- PHONE
menu:
type: object
additionalProperties: false
title: Run menus
description: 'Defines a set of named menus and executes them starting from startMenu. This is a blocking command — execution waits for the menu to complete before proceeding to the next command.
Each menu item configures prompts, input collection, timeout handling, and repeat behavior.'
required:
- command
- startMenu
- menus
properties:
command:
type: string
const: menu
description: Executes menu-based input collection using the configured menu definitions.
startMenu:
type: string
minLength: 1
maxLength: 16
description: Name of the menu to execute first. Must match a key in menus.
menus:
type: object
propertyNames:
type: string
maxLength: 16
description: Map of menu definitions keyed by menu name.
additionalProperties:
$ref: '#/components/schemas/menuItem'
examples:
- command: menu
startMenu: main
menus:
main:
prompt:
allowBargeIn: true
messages:
- type: SAY
say:
text: Press 1 for sales or 2 for support.
voiceName: Emma
repeatPrompt:
allowBargeIn: true
messages:
- type: SAY
say:
text: Invalid option. Press 1 for sales or 2 for support.
voiceName: Emma
inputTimeoutDurationSeconds: 5
repeatCount: 2
minimumInputLength: 1
maximumInputLength: 1
inputMethods:
- DTMF
matches:
'1':
- command: messages
messages:
- type: SAY
say:
text: Connecting to sales.
voiceName: Emma
- command: dial
callName: sales
to:
type: PHONE
phone:
number: '+15551234567'
'2':
- command: messages
messages:
- type: SAY
say:
text: Connecting to support.
voiceName: Emma
- command: dial
callName: support
to:
type: PHONE
phone:
number: '+15557654321'
onFail:
- command: messages
messages:
- type: SAY
say:
text: Sorry, no valid selection was received.
voiceName: Emma
- command: hangup
money:
title: Money
description: A monetary amount with an associated currency code.
type: object
additionalProperties: false
required:
- currencyCode
- amount
properties:
currencyCode:
type: string
description: The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html).
example: USD
amount:
type: string
pattern: ^\d+(\.\d{1,4})?$
description: The monetary amount as a string to preserve precision. Supports up to 4 decimal places (e.g., "10.5000", "0.9999").
example: '0.0123'
paginationLinks:
type: object
additionalProperties: false
required:
- first
- last
- self
title: Pagination Links
description: 'Pagination links for navigating through pages of results in a paginated list response.
Available link properties:
- `first` - Absolute URI of the first page
- `last` - Absolute URI of the last page
- `next` - Absolute URI of the next page (omitted if this is the last page)
- `prev` - Absolute URI of the previous page (omitted if this is the first page)
- `self` - Absolute URI of the current page
'
properties:
first:
type: string
format: uri
description: Absolute URI of the first page.
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=1&pageSize=20
last:
type: string
format: uri
description: Absolute URI of the last page.
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=5&pageSize=20
next:
type: string
format: uri
description: Absolute URI of the next page (omitted if this is the last page).
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=3&pageSize=20
prev:
type: string
format: uri
description: Absolute URI of the previous page (omitted if this is the first page).
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=1&pageSize=20
self:
type: string
format: uri
description: Absolute URI of the current page.
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls?page=2&pageSize=20
callReason:
title: Call Reason
description: 'Reason explaining **why** the call ended in the given `callResult`.
`callResult` describes **what** happened (state/outcome). `callReason` provides additional context about the
underlying cause (for example, who terminated the call, routing issues, or validation errors).'
type: string
enum:
- OK
- NOT_AVAILABLE
- CALLER_HANGUP
- CALLEE_HANGUP
- MANAGER_HANGUP
- DID_NOT_FOUND
- INVALID_SCRIPT
- UNKNOWN_PRODUCT
- NO_MORE_ROUTES
- ERROR
x-enumDescriptions:
OK: The call was completed successfully.
NOT_AVAILABLE: The callee was not available.
CALLER_HANGUP: The caller hung up the call.
CALLEE_HANGUP: The callee hung up the call.
MANAGER_HANGUP: The call was ended by the call manager.
DID_NOT_FOUND: The DID number was not found.
INVALID_SCRIPT: The SVAML script was invalid.
UNKNOWN_PRODUCT: The product associated with the call is unknown.
NO_MORE_ROUTES: There are no more routes to complete the call.
ERROR: An error occurred during the call.
examples:
- OK
recordingFormat:
title: Recording Format
description: Audio format for this recording.
type: string
enum:
- MP3
- WAV
x-enumDescriptions:
MP3: MPEG Audio Layer III compressed audio format.
WAV: Waveform Audio File Format, uncompressed audio.
default: MP3
examples:
- MP3
callRequest:
x-category: call
x-usage: call
type: object
additionalProperties: false
title: Callout requests
description: 'Request payload to initiate an outbound call or a batch of outbound call sessions.
If parameters are provided a batch of call sessions will be initiated. BatchOptions are only valid in that mode. If not provided, default values of each batch option will be used.'
required:
- commands
properties:
commands:
$ref: '#/components/schemas/svamlCommands'
parameters:
$ref: '#/components/schemas/requestParameters'
batchOptions:
$ref: '#/components/schemas/batchOptions'
examples:
- commands:
- command: dial
callName: origin
from:
type: PHONE
phone:
number: '+4673522480'
to:
type: PHONE
phone:
number: '+4673522488'
dialTimeoutDurationSeconds: 45
maxCallDurationSeconds: 3600
events:
onAnswer:
- command: messages
messages:
- type: SAY
say:
text: Hello, you are going to be connected to our Echo service. Say something and you should be able to hear yourself.
format: TEXT
voiceName: Brian
- command: bridgeCall
bridgeName: bridge
- command: dial
callName: destination
to:
type: STREAM
stream:
endpoint: ws://echo/
dialTimeoutDurationSeconds: 45
maxCallDurationSeconds: 60
events:
onAnswer:
- command: bridgeCall
bridgeName: bridge
onHangup:
- command: hangup
callName: origin
onHangup:
- command: hangup
callName: destination
phoneNumber:
title: Phone Number
type: string
pattern: ^\+[1-9]\d{1,14}$
minLength: 3
maxLength: 16
description: E.164 Phone number
examples:
- '+4673522488'
from:
description: Call origin - Phone Number or SIP endpoint
oneOf:
- $ref: '#/components/schemas/phone'
- $ref: '#/components/schemas/sipFrom'
discriminator:
propertyName: type
mapping:
PHONE: '#/components/schemas/phone'
SIP: '#/components/schemas/sipFrom'
tooManyRequests:
title: Too Many Requests
description: Returned when the request rate limit has been exceeded. Retry after the duration indicated in the `Retry-After` response header.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/too-many-requests
title:
const: Too Many Requests
detail:
example: Rate limit exceeded. Please slow down your request rate and retry after the indicated period.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls
transcriptionOptions:
title: Transcription Options
description: Configuration for automatic speech-to-text transcription of the recording.
type: object
additionalProperties: false
required:
- isEnabled
properties:
isEnabled:
type: boolean
description: If true, the recording will be transcribed to text.
example: true
locale:
type: string
description: Language code in BCP-47 format.
default: en-US
example: en-US
answer:
type: object
additionalProperties: false
title: Answer
description: Answers an inbound call leg. This is a non-blocking command — execution continues to the next command in the sequence immediately after the answer is initiated.
required:
- command
properties:
command:
type: string
const: answer
description: Answer call
examples:
- command: answer
requestParameter:
type: object
maxProperties: 10000
propertyNames:
type: string
minLength: 1
maxLength: 32
additionalProperties:
type: string
title: Request Parameters
description: Dictionary of customer-defined parameters to be passed to the commands.
examples:
- numberA: '+4564973655'
numberB: '+4564973657'
sipFrom:
type: object
additionalProperties: false
title: SIP Origin
required:
- type
- sip
properties:
type:
type: string
const: SIP
description: Indicates the call originated from a SIP (Session Initiation Protocol) endpoint.
sip:
type: object
additionalProperties: false
required:
- endpoint
properties:
endpoint:
type: string
description: SIP URI of the originating endpoint. Both `sip:` (unencrypted) and `sips:` (TLS-encrypted) schemes are supported.
format: uri
pattern: '^sips?:'
maxLength: 192
displayName:
type: string
description: Display name presented to the called party as the caller identity. Transmitted as the display name part of the SIP `From` header (for example, `Alice `).
maxLength: 64
example: Alice
examples:
- type: SIP
sip:
endpoint: sip:user@example.com
displayName: Alice
to:
title: To
description: Call destination - Phone Number or Stream URI
oneOf:
- $ref: '#/components/schemas/phone'
- $ref: '#/components/schemas/sip'
- $ref: '#/components/schemas/stream'
- $ref: '#/components/schemas/voiceRelay'
discriminator:
propertyName: type
mapping:
PHONE: '#/components/schemas/phone'
SIP: '#/components/schemas/sip'
STREAM: '#/components/schemas/stream'
VOICE_RELAY: '#/components/schemas/voiceRelay'
notFound:
title: Not Found
description: Returned when the requested resource does not exist.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/not-found
title:
const: Not Found
detail:
example: The requested resource was not found.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
stream:
type: object
additionalProperties: false
title: Stream
description: Routes the call to a WebSocket stream endpoint for real-time audio processing.
required:
- type
- stream
properties:
type:
type: string
const: STREAM
description: Routes the call to a WebSocket stream endpoint for real-time audio processing.
stream:
type: object
additionalProperties: false
required:
- endpoint
properties:
endpoint:
type: string
description: WebSocket endpoint that will accept the incoming connection for real-time audio streaming. Must be a valid WebSocket URL using either `ws://` or `wss://` (recommended). The URL must be reachable from the public internet and capable of handling the negotiated stream protocol.
example: wss://example.com
streamOptions:
type: object
additionalProperties: false
properties:
version:
type: integer
description: Defines the version of the stream protocol.
default: 1
example: 1
codec:
type: string
const: PCM
description: 'Defines the audio codec/format used for the stream audio payload.
Currently, only `PCM` is supported (uncompressed raw audio). Use `sampleRate` to configure the sampling rate for the stream.'
sampleRate:
type: integer
description: "Defines the audio sampling rate (Hz) used for the stream.\n\nFor calls that traverse the PSTN, audio is typically sampled at 8 kHz, so using a higher value will not improve perceived quality. \nHigher sample rates can be useful for non-PSTN scenarios (for example, SIP/streaming paths), but will increase bandwidth usage and processing load."
enum:
- 8000
- 16000
- 24000
- 44100
- 48000
- 96000
x-enumDescriptions:
'8000': 8 kHz (standard for PSTN calls)
'16000': 16 kHz (wideband audio)
'24000': 24 kHz (super-wideband audio)
'44100': 44.1 kHz (CD quality audio)
'48000': 48 kHz (professional audio quality)
'96000': 96 kHz (high-resolution audio)
default: 8000
example: 16000
callHeaders:
$ref: '#/components/schemas/callHeaders'
examples:
- endpoint: wss://example.com
streamOptions:
version: 1
codec: PCM
sampleRate: 8000
callHeaders:
- key: my-key
value: my-key-value
examples:
- type: STREAM
stream:
endpoint: wss://example.com
streamOptions:
version: 1
codec: PCM
sampleRate: 16000
callHeaders:
- key: my-key
value: my-key-value
svamlCommands:
type: array
title: SVAML Commands
description: 'An ordered list of SVAML v2 (Sinch Voice Application Markup Language) commands that describe a call flow. Commands are executed sequentially in the order they are defined.
**Blocking vs. non-blocking:** Some commands block execution until they complete (`pause`, `webhook`, `menu`, `gotoMenu`), while others return immediately and run in parallel (`dial`, `messages`, `amd`, `answer`, `hangup`, `startRecording`, `stopRecording`, `bridgeCall`, `stopMessages`). Each command''s description specifies its behavior.
**Nesting scope:** Commands that appear inside event handlers (e.g., `dial.events.onAnswer`, `messages.events.onFinish`) form independent sequences and execute in their own context — they are not continuations of the parent sequence.'
items:
$ref: '#/components/schemas/svamlCommand'
badRequest:
title: Bad Request
description: Returned when the request is malformed or contains invalid parameters.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/bad-request
title:
const: Bad Request
detail:
example: The request body is invalid or malformed.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
amd:
type: object
additionalProperties: false
title: Answering Machine Detection
description: 'AMD (Answering Machine Detection) command to detect what answered the call. Possible outcomes are: human, machine, beep, or unknown.
This is a non-blocking command — the next command in the sequence executes immediately while detection runs in parallel. Results are delivered via the `events` property.'
required:
- command
properties:
command:
type: string
const: amd
description: Command to run Answering Machine Detection on the call
events:
$ref: '#/components/schemas/amdEvents'
examples:
- command: amd
events:
onHuman:
- command: pause
durationMilliseconds: 1000
- command: bridgeCall
bridgeName: my-bridge
onBeep:
- command: messages
messagesName: my-amd-messages
messages:
- type: SAY
say:
text: Hello, this is a test message
voiceName: Emma
menuItem:
type: object
additionalProperties: false
title: Menu Item
description: 'Defines a single menu step, including prompts, input handling rules, input-to-command matches, and failure handling.
Each collected input is matched against the values in the `matches` property.
If no match succeeds, the `onFail` commands are executed.
If neither `matches` nor `onFail` is defined and the service call behavior is set to `WEBHOOK`, a webhook request is sent including the collected input.'
properties:
prompt:
$ref: '#/components/schemas/menuPrompt'
description: 'Prompt played when this menu starts.
This prompt is also used as the repeat prompt when repeatPrompt is not defined for the menu.'
repeatPrompt:
$ref: '#/components/schemas/menuPrompt'
description: 'Prompt played when the menu is repeated.
Repeats occur when input times out or when the provided input does not match any menu match item.'
inputTimeoutDurationSeconds:
type: integer
description: Maximum number of seconds to wait for user input before the input attempt times out.
minimum: 1
maximum: 60
default: 5
example: 10
repeatCount:
type: integer
description: 'Maximum number of times the menu is repeated.
A repeat occurs when input times out or when the provided input does not match any menu match item.'
minimum: 0
maximum: 10
default: 2
example: 3
minimumInputLength:
type: integer
description: Minimum number of input characters required before the menu evaluates the collected input.
minimum: 1
maximum: 100
default: 1
example: 3
maximumInputLength:
type: integer
description: Maximum number of input characters that triggers the menu to evaluate the collected input.
minimum: 1
maximum: 100
default: 1
example: 10
terminatingSequence:
type: string
pattern: ^[0-9*#]+$
description: 'Character sequence that signals the end of input and triggers immediate evaluation.
Useful when variable-length input is allowed and shorter valid options should be submitted without waiting for timeout or maximum length.
The terminating sequence value is included in the evaluated input.'
maxLength: 10
inputMethods:
type: array
description: Input methods accepted for this menu when collecting user input.
default:
- DTMF
items:
type: string
enum:
- DTMF
x-enumDescriptions:
DTMF: Collect input from keypad tones (Dual-Tone Multi-Frequency).
matches:
type: object
description: 'Items matched against the collected input. Maximum number of allowed match expressions is 50.
Defined as a dictionary where each property name is a literal or a regular expression string.
Values are evaluated in the order they are defined.'
maxProperties: 50
propertyNames:
type: string
minLength: 1
maxLength: 256
description: 'A regular expression or literal string to match against the collected user input. Must not be empty.
Property keys are evaluated sequentially in the order defined. The first key that matches the input will trigger its associated SVAML commands.
**Note**: Use `\\*` to match the DTMF star tone (*).'
additionalProperties:
$ref: '#/components/schemas/svamlCommands'
onFail:
$ref: '#/components/schemas/svamlCommands'
description: 'SVAML commands executed when the menu fails to collect a matching input.
This handler runs after the repeat limit is reached without any input matching a menu match item.'
voiceName:
type: string
description: Sinch Voice Name to use for text-to-speech. Each voice is tied to a specific language variant, gender, and pricing model (Free/Standard or Paid/Generative). See [https://developers.sinch.com/docs/voice-2.0/api-reference/text-to-speech-voices#text-to-speech-voices](https://developers.sinch.com/docs/voice-2.0/api-reference/text-to-speech-voices#currently-available-languages) for details
example: Emma
enum:
- Aarav
- Aarav_2
- Aarohi
- Aarti
- Aarti_2
- Aarti_3
- Aashi
- Abbi
- Abdullah
- Abeo
- Abril
- Achara
- Ada
- Ada_2
- Adam
- Adam_2
- Aditi
- Adri
- Adriano
- Agnieszka
- Ahmet
- Aigul
- Ainhoa
- Alain
- Alba
- Aled
- Aleksandar
- Alessio
- Alessio_2
- Alex
- Alfie
- Ali
- Alina
- Alloy
- Alloy_2
- Alonso
- Alvaro
- Amal
- Amala
- Amanda
- Amany
- Amber
- Ambre
- Ameha
- Amina
- Amy
- Amy_2
- Amy_3
- Ana
- Anahit
- Ananya
- Ananya_2
- Anbu
- Ander
- Andre
- Andre_2
- Andrea
- Andres
- Andrew
- Andrew_2
- Andrew_3
- Andrew_4
- Angelo
- Anila
- Annette
- Antoine
- Antonin
- Antonio
- Anu
- Aoi
- Arabella
- Ardi
- Aria
- Aria_2
- Ariane
- Arjun
- Arjun_2
- Arjun_3
- Arlet
- Arnau
- Arnaud
- Arthur
- Arya
- Arya_2
- Asad
- Ashley
- Asilia
- Astrid
- Athina
- Ava
- Ava_2
- Ava_3
- Avri
- Ayanda
- Ayanda_2
- Aysha
- Babek
- Banu
- Bashkar
- Bassel
- Bataa
- Beatrice
- Beatriz
- Belkys
- Bella
- Benigno
- Bernd
- Bianca
- Bianca_2
- Bianca_3
- Blessica
- BongJin
- Borislav
- Brandon
- Brandon_2
- Bree
- Brenda
- Brian
- Brian_2
- Brian_3
- Brigitte
- Bryan
- Bryan_2
- Bryan_3
- Burcu
- Calimero
- Camila
- Camilla
- Camilla_2
- Camilla_3
- Candela
- Carla
- Carlos
- Carlota
- Carly
- Carmen
- Cataldo
- Catalina
- Cecilio
- Celeste
- Celine
- Celine_2
- Chantal
- Chanthavong
- Charline
- Chilemba
- Christel
- Christoph
- Christopher
- Christopher_2
- Clara
- Claude
- Colette
- Colm
- Conchita
- Connor
- Conrad
- Cora
- Cora_2
- Coralie
- Cristiano
- Daichi
- Dalia
- Dalia_2
- Daniel
- Daniel_2
- Danielle
- Danielle_2
- Dario
- Dariya
- Darren
- Daudi
- Daulet
- Davis
- Davis_2
- Davis_3
- Dena
- Denise
- Derek
- Dhwani
- Diego
- Dilara
- Dimas
- Dmitry
- Donato
- Dora
- Duarte
- Duncan
- Dustin
- Echo
- Eka
- Elena
- Elias
- Elimu
- Elin
- Elizabeth
- Elke
- Elliot
- Eloise
- Elsa
- Elsie
- Elvira
- Elza
- Emel
- Emil
- Emilio
- Emily
- Emma
- Emma_2
- Emma_3
- Emma_4
- Enric
- Enrique
- Eric
- Estrella
- Ethan
- Evelyn
- Everita
- Ewa
- Ewa_2
- Ezinne
- Fabio
- Fabiola
- Fable
- Fabrice
- Fahed
- Farid
- Fatima
- Federico
- Fenna
- Fernanda
- Fiamma
- Filiz
- Finn
- Florian
- Florian_2
- Florin
- Francisca
- Freya
- Gabrielle
- Gabrielle_2
- Gabrijela
- Gadis
- Gagan
- Gemma
- Gemma_2
- Geraint
- Gerard
- Gerardo
- Gianni
- Giorgi
- Giorgio
- Giovanna
- Gisela
- Giuseppe
- Giuseppe_2
- Gonzalo
- GookMin
- Goran
- Grace
- Gregory
- Gudrun
- Gul
- GulNawaz
- Gunnar
- Guy
- Gwyneth
- Hala
- Hamdan
- Hamed
- Hannah
- Hannah_2
- Hans
- Harri
- Hayk
- Hedi
- Hemkala
- Henri
- Hila
- Hillevi
- HiuGaai
- Hiujin
- HiuMaan
- HoaiMy
- Hollie
- HsiaoChen
- HsiaoYu
- Humberto
- Hyunsu
- Hyunsu_2
- Hyunsu_3
- Ida
- Ilir
- Iman
- Imani
- Imelda
- Ines
- Ines_2
- Ingrid
- InJoon
- Irene
- Irma
- Isabella
- Isabella_2
- Isabella_3
- Isabelle
- Isabelle_2
- Iselin
- Isidora
- Ismael
- Ivy
- Ivy_2
- Jacek
- Jacob
- Jacqueline
- Jajang
- Jamal
- James
- Jan
- Jane
- Jane_2
- Jann
- Jasmine
- Jasmine_2
- Jason
- Javier
- Jean
- Jenny
- Jenny_2
- Jenny_3
- Jeppe
- Jerome
- Jihye
- JiMin
- Jimmie
- Jitka
- Joana
- Joanna
- Joanna_2
- Joanna_3
- Joanne
- Joey
- Joey_2
- Jonas
- Jorge
- Jorge_2
- Joseph
- Josephine
- Juan
- Julio
- Justin
- Justin_2
- Kai
- Kajal
- Kajal_2
- Kalina
- Kani
- Karina
- Karl
- Karla
- Kasper
- Katja
- Kavya
- Kavya_2
- Kazuha
- Keita
- Ken
- Kendra
- Kendra_2
- Keomany
- Kert
- Kevin
- Killian
- Kim
- Kimberly
- Kimberly_2
- Klarissa
- Klaus
- Kumar
- Kunal
- Kunal_2
- Laia
- Laila
- Laith
- Larissa
- Latifa
- Laura
- Laura_2
- Layla
- Lea
- Lea_2
- Lea_3
- Leah
- Leila
- Leni
- Lennart
- Leonas
- Leticia
- Lewis
- Lia
- Liam
- Lian
- Lian_2
- Libby
- Liberto
- Lisa
- Lisa_2
- Lisandro
- Liv
- Livia
- Livia_2
- Lola
- Lorena
- Lorenzio
- Lorenzo
- Lotte
- Louisa
- Lucia
- Lucia_2
- Lucia_3
- Luciano
- Lucien
- Luis
- Lukas
- Luke
- Luna
- Luna_2
- Lupe
- Lupe_2
- Lupe_3
- Maarten
- Macerio
- Macerio_2
- Madhur
- Madina
- Mads
- Maisie
- Maja
- Manohar
- Manuel
- Manuela
- Marcello
- Marcelo
- Marek
- Margarita
- Maria
- Marija
- Marina
- Mario
- Marlene
- Marta
- Maryam
- Masaru
- Mateo
- Mathieu
- Matthew
- Matthew_2
- Matthew_3
- Mattias
- Maurice
- Maxim
- Maya
- Mayu
- Mekdes
- Mia
- Mia_2
- Mia_3
- Michelle
- Midhun
- Miguel
- Mitchell
- Mizuki
- Moaz
- Mohan
- Molly
- Monica
- Mouna
- Muuse
- Nabanita
- Naja
- NamMinh
- Nanami
- Nanami_2
- Nancy
- Nancy_2
- Naoki
- Natasha
- Neerja
- Neerja_2
- Neil
- Nestoras
- Nia
- Niamh
- Niamh_2
- Nicholas
- Nicholas_2
- Nicolau
- Nicole
- Nil
- Nilar
- Nils
- Niranjan
- Niwat
- Noah
- Noemi
- Noora
- Noura
- Nova
- Nova_2
- Nuria
- Ojas
- Ola
- Ola_2
- Oliver
- Olivia
- Ollie
- Ollie_2
- Omar
- Ona
- Onyx
- Orla
- Osman
- Ostap
- Pallavi
- Palmira
- Paloma
- Paola
- Pedro
- Pedro_2
- Pelayo
- Penelope
- Pernille
- Petra
- Phoebe
- Phoebe_2
- Pierina
- Piseth
- Polina
- Prabhat
- Prabhat_2
- Pradeep
- Premwadee
- Priyom
- Rafiki
- Ralf
- Rami
- Ramona
- Rana
- Raquel
- Raveena
- Reem
- Rehaan
- Rehaan_2
- Rehema
- Remi
- Remi_2
- Remy
- Remy_2
- Renata
- Ricardo
- Rinaldo
- Roberto
- Rodrigo
- Roger
- Roi
- Rok
- Rosa
- Ruben
- Russell
- Ruth
- Ruth_2
- Ryan
- Ryan_2
- Sabela
- Sabrina
- Sabrina_2
- Sagar
- Saleh
- Salli
- Salli_2
- Salli_3
- Salma
- Salman
- Salome
- Sam
- Sameera
- Samuel
- Sana
- Sapna
- Sara
- Saranya
- Sardor
- Saul
- Sebastian
- Selma
- SeoHyeon
- Seoyeon
- Seoyeon_2
- Seoyeon_3
- Seraphina
- Seraphina_2
- Serena
- Serena_2
- Sergio
- Sergio_2
- Shakir
- Shimmer
- Shiori
- Shruti
- Siqiniq
- Siqiniq_2
- Siti
- Sobhana
- Soffie
- Sofia
- Sofie
- Sonia
- SoonBok
- Sophie
- Sophie_2
- Srecko
- Sreymom
- Steffan
- Steffan_2
- Steffan_3
- Stephen
- Stephen_2
- Subhasini
- Sukant
- SunHi
- SunHi_2
- Surya
- Suvi
- Svetlana
- Swara
- Sylvie
- Sylvie_2
- Taim
- Takumi
- Takumi_2
- Tamas
- Tania
- Tanishaa
- Tanja
- Taqqiq
- Taqqiq_2
- Tatyana
- Teo
- Teresa
- Thalita
- Thalita_2
- Thalita_3
- Thando
- Themba
- Thiago
- Thierry
- Thierry_2
- Thiha
- Thilini
- Thomas
- Tiana
- Tiffany
- Tim
- Tina
- Tomas
- Tomoko
- Tony
- Triana
- Tristan
- Tristan_ES
- Tristan_ES_2
- Tuti
- Tyler
- Ubax
- Uzma
- Vaani
- Valentina
- Valerio
- Valluvar
- Venba
- Vera
- Vesna
- Vicki
- Vicki_2
- Vicki_3
- Victor
- Viktoria
- Vitoria
- Vitoria_2
- Vivienne
- Vivienne_2
- Vlasta
- WanLung
- Wayne
- Willem
- William
- William_2
- Xiaochen
- Xiaochen_2
- Xiaochen_3
- Xiaochen_4
- Xiaohan
- Xiaohan_2
- Xiaomeng
- XiaoMin
- Xiaomo
- Xiaoqiu
- Xiaorou
- Xiaorui
- Xiaoshuang
- Xiaoshuang_2
- Xiaoshuang_3
- Xiaotong
- Xiaoxiao
- Xiaoxiao_2
- Xiaoxiao_3
- Xiaoxiao_4
- Xiaoxiao_5
- Xiaoyan
- Xiaoyi
- Xiaoyi_2
- Xiaoyou
- Xiaoyou_2
- Xiaoyou_3
- Xiaoyu
- Xiaoyu_2
- Xiaozhen
- Ximena
- Ximena_ES
- Ximena_ES_2
- Ximena_ES_3
- Yago
- Yan
- Yara
- Yashica
- Yasmin
- Yesui
- Yolanda
- YuJin
- Yundeng
- Yunfan
- Yunfan_2
- Yunfeng
- Yunhan
- Yunhao
- YunJhe
- Yunjian
- Yunjie
- YunSong
- Yunxi
- Yunxi_2
- Yunxia
- Yunxia_2
- Yunxiang
- Yunxiao
- Yunxiao_2
- Yunyang
- Yunye
- Yunye_2
- Yunyi
- Yunyi_2
- Yunze
- Yunzhe
- Yves
- Yvette
- Zariyah
- Zayd
- Zeina
- Zhiyu
- Zhiyu_2
- Zofia
- Zuri
x-enumDescriptions:
Aarav: Male voice for Hindi (India) (Free voice)
Aarav_2: Male voice for English (India) (Free voice)
Aarohi: Female voice for Marathi (India) (Free voice)
Aarti: Female voice for Hindi (India) (Free voice)
Aarti_2: Female voice for English (India) (Free voice)
Aarti_3: Female voice for English (India) (Free voice)
Aashi: Female voice for English (India) (Free voice)
Abbi: Female voice for English (United Kingdom) (Free voice)
Abdullah: Male voice for Arabic (Oman) (Free voice)
Abeo: Male voice for English (Nigeria) (Free voice)
Abril: Female voice for Spanish (Spain) (Free voice)
Achara: Female voice for Thai (Thailand) (Free voice)
Ada: Female voice for English (United Kingdom) (Free voice)
Ada_2: Female voice for English (United Kingdom) (Paid voice)
Adam: Male voice for English (United States) (Free voice)
Adam_2: Male voice for English (United States) (Paid voice)
Aditi: Female voice for English (India) (Free voice)
Adri: Female voice for Afrikaans (South Africa) (Free voice)
Adriano: Male voice for Italian (Italy) (Free voice)
Agnieszka: Female voice for Polish (Poland) (Free voice)
Ahmet: Male voice for Turkish (Türkiye) (Free voice)
Aigul: Female voice for Kazakh (Kazakhstan) (Free voice)
Ainhoa: Female voice for Basque (Free voice)
Alain: Male voice for French (France) (Free voice)
Alba: Female voice for Catalan (Free voice)
Aled: Male voice for Welsh (United Kingdom) (Free voice)
Aleksandar: Male voice for Macedonian (North Macedonia) (Free voice)
Alessio: Male voice for Italian (Italy) (Free voice)
Alessio_2: Male voice for Italian (Italy) (Paid voice)
Alex: Male voice for Spanish (Peru) (Free voice)
Alfie: Male voice for English (United Kingdom) (Free voice)
Ali: Male voice for Arabic (Bahrain) (Free voice)
Alina: Female voice for Romanian (Romania) (Free voice)
Alloy: Male voice for English (United States) (Free voice)
Alloy_2: Male voice for English (United States) (Paid voice)
Alonso: Male voice for Spanish (United States) (Free voice)
Alvaro: Male voice for Spanish (Spain) (Free voice)
Amal: Female voice for Arabic (Qatar) (Free voice)
Amala: Female voice for German (Germany) (Free voice)
Amanda: Female voice for English (United States) (Free voice)
Amany: Female voice for Arabic (Syria) (Free voice)
Amber: Female voice for English (United States) (Free voice)
Ambre: Female voice for French (France) (Paid voice)
Ameha: Male voice for Amharic (Ethiopia) (Free voice)
Amina: Female voice for Arabic (Algeria) (Free voice)
Amy: Female voice for English (United Kingdom) (Free voice)
Amy_2: Female voice for English (United Kingdom) (Free voice)
Amy_3: Female voice for English (United Kingdom) (Paid voice)
Ana: Female voice for English (United States) (Free voice)
Anahit: Female voice for Armenian (Armenia) (Free voice)
Ananya: Female voice for Hindi (India) (Free voice)
Ananya_2: Female voice for English (India) (Free voice)
Anbu: Male voice for Tamil (Singapore) (Free voice)
Ander: Male voice for Basque (Free voice)
Andre: Male voice for Spanish (Mexico) (Free voice)
Andre_2: Male voice for Spanish (Mexico) (Paid voice)
Andrea: Female voice for Spanish (Ecuador) (Free voice)
Andres: Male voice for Spanish (Guatemala) (Free voice)
Andrew: Male voice for English (United States) (Free voice)
Andrew_2: Male voice for English (United States) (Free voice)
Andrew_3: Male voice for English (United States) (Paid voice)
Andrew_4: Male voice for English (United States) (Paid voice)
Angelo: Male voice for Filipino (Philippines) (Free voice)
Anila: Female voice for Albanian (Albania) (Free voice)
Annette: Female voice for English (Australia) (Free voice)
Antoine: Male voice for French (Canada) (Free voice)
Antonin: Male voice for Czech (Czechia) (Free voice)
Antonio: Male voice for Portuguese (Brazil) (Free voice)
Anu: Female voice for Estonian (Estonia) (Free voice)
Aoi: Female voice for Japanese (Japan) (Free voice)
Arabella: Female voice for Spanish (Spain) (Free voice)
Ardi: Male voice for Indonesian (Indonesia) (Free voice)
Aria: Female voice for English (United States) (Free voice)
Aria_2: Female voice for English (United States) (Paid voice)
Ariane: Female voice for French (Switzerland) (Free voice)
Arjun: Male voice for English (India) (Free voice)
Arjun_2: Male voice for English (India) (Free voice)
Arjun_3: Male voice for Hindi (India) (Free voice)
Arlet: Female voice for Catalan (Free voice)
Arnau: Male voice for Spanish (Spain) (Free voice)
Arnaud: Male voice for Dutch (Belgium) (Free voice)
Arthur: Male voice for English (United Kingdom) (Free voice)
Arya: Female voice for English (New Zealand) (Free voice)
Arya_2: Female voice for English (New Zealand) (Paid voice)
Asad: Male voice for Urdu (Pakistan) (Free voice)
Ashley: Female voice for English (United States) (Free voice)
Asilia: Female voice for English (Kenya) (Free voice)
Astrid: Female voice for Swedish (Sweden) (Free voice)
Athina: Female voice for Greek (Greece) (Free voice)
Ava: Female voice for English (United States) (Free voice)
Ava_2: Female voice for English (United States) (Free voice)
Ava_3: Female voice for English (United States) (Paid voice)
Avri: Male voice for Hebrew (Israel) (Free voice)
Ayanda: Female voice for English (South Africa) (Free voice)
Ayanda_2: Female voice for English (South Africa) (Paid voice)
Aysha: Female voice for Arabic (Oman) (Free voice)
Babek: Male voice for Azerbaijani (Latin, Azerbaijan) (Free voice)
Banu: Female voice for Azerbaijani (Latin, Azerbaijan) (Free voice)
Bashkar: Male voice for Bengali (India) (Free voice)
Bassel: Male voice for Arabic (Iraq) (Free voice)
Bataa: Male voice for Mongolian (Mongolia) (Free voice)
Beatrice: Female voice for Italian (Italy) (Paid voice)
Beatriz: Female voice for Spanish (Mexico) (Free voice)
Belkys: Female voice for Spanish (Cuba) (Free voice)
Bella: Female voice for English (United Kingdom) (Free voice)
Benigno: Male voice for Italian (Italy) (Free voice)
Bernd: Male voice for German (Germany) (Free voice)
Bianca: Female voice for Italian (Italy) (Free voice)
Bianca_2: Female voice for Italian (Italy) (Free voice)
Bianca_3: Female voice for Italian (Italy) (Paid voice)
Blessica: Female voice for Filipino (Philippines) (Free voice)
BongJin: Male voice for Korean (Korea) (Free voice)
Borislav: Male voice for Bulgarian (Bulgaria) (Free voice)
Brandon: Male voice for English (United States) (Free voice)
Brandon_2: Male voice for English (United States) (Free voice)
Bree: Female voice for English (United States) (Paid voice)
Brenda: Female voice for Portuguese (Brazil) (Free voice)
Brian: Male voice for English (United States) (Free voice)
Brian_2: Male voice for English (United States) (Free voice)
Brian_3: Male voice for English (United States) (Paid voice)
Brigitte: Female voice for French (France) (Free voice)
Bryan: Male voice for English (United Kingdom) (Free voice)
Bryan_2: Male voice for English (United Kingdom) (Free voice)
Bryan_3: Male voice for English (United Kingdom) (Paid voice)
Burcu: Female voice for Turkish (Türkiye) (Free voice)
Calimero: Male voice for Italian (Italy) (Free voice)
Camila: Female voice for Spanish (Peru) (Free voice)
Camilla: Female voice for Portuguese (Brazil) (Free voice)
Camilla_2: Female voice for Portuguese (Brazil) (Free voice)
Camilla_3: Female voice for Portuguese (Brazil) (Paid voice)
Candela: Female voice for Spanish (Mexico) (Free voice)
Carla: Female voice for Italian (Italy) (Free voice)
Carlos: Male voice for Spanish (Honduras) (Free voice)
Carlota: Female voice for Spanish (Mexico) (Free voice)
Carly: Female voice for English (Australia) (Free voice)
Carmen: Female voice for Romanian (Romania) (Free voice)
Cataldo: Male voice for Italian (Italy) (Free voice)
Catalina: Female voice for Spanish (Chile) (Free voice)
Cecilio: Male voice for Spanish (Mexico) (Free voice)
Celeste: Female voice for French (France) (Free voice)
Celine: Female voice for French (France) (Free voice)
Celine_2: Female voice for French (France) (Paid voice)
Chantal: Female voice for French (Canada) (Free voice)
Chanthavong: Male voice for Lao (Laos) (Free voice)
Charline: Female voice for French (Belgium) (Free voice)
Chilemba: Male voice for English (Kenya) (Free voice)
Christel: Female voice for Danish (Denmark) (Free voice)
Christoph: Male voice for German (Germany) (Free voice)
Christopher: Male voice for English (United States) (Free voice)
Christopher_2: Male voice for English (United States) (Free voice)
Clara: Female voice for English (Canada) (Free voice)
Claude: Male voice for French (France) (Free voice)
Colette: Female voice for Dutch (Netherlands) (Free voice)
Colm: Male voice for Irish (Ireland) (Free voice)
Conchita: Female voice for Spanish (Castilian) (Free voice)
Connor: Male voice for English (Ireland) (Free voice)
Conrad: Male voice for German (Germany) (Free voice)
Cora: Female voice for English (United States) (Free voice)
Cora_2: Female voice for English (United States) (Free voice)
Coralie: Female voice for French (France) (Free voice)
Cristiano: Male voice for Portuguese (Brazil) (Free voice)
Daichi: Male voice for Japanese (Japan) (Free voice)
Dalia: Female voice for Spanish (Mexico) (Free voice)
Dalia_2: Female voice for Spanish (Mexico) (Free voice)
Daniel: Male voice for German (Germany) (Free voice)
Daniel_2: Male voice for German (Germany) (Paid voice)
Danielle: Female voice for English (United States) (Free voice)
Danielle_2: Female voice for English (United States) (Paid voice)
Dario: Male voice for Spanish (Spain) (Free voice)
Dariya: Female voice for Russian (Russia) (Free voice)
Darren: Male voice for English (Australia) (Free voice)
Daudi: Male voice for Swahili (Tanzania) (Free voice)
Daulet: Male voice for Kazakh (Kazakhstan) (Free voice)
Davis: Male voice for English (United States) (Free voice)
Davis_2: Male voice for English (United States) (Free voice)
Davis_3: Male voice for English (United States) (Paid voice)
Dena: Female voice for Dutch (Belgium) (Free voice)
Denise: Female voice for French (France) (Free voice)
Derek: Male voice for English (United States) (Free voice)
Dhwani: Female voice for Gujarati (India) (Free voice)
Diego: Male voice for Italian (Italy) (Free voice)
Dilara: Female voice for Persian (Iran) (Free voice)
Dimas: Male voice for Javanese (Latin, Indonesia) (Free voice)
Dmitry: Male voice for Russian (Russia) (Free voice)
Donato: Male voice for Portuguese (Brazil) (Free voice)
Dora: Female voice for Icelandic (Iceland) (Free voice)
Duarte: Male voice for Portuguese (Portugal) (Free voice)
Duncan: Male voice for English (Australia) (Free voice)
Dustin: Male voice for English (United States) (Free voice)
Echo: Male voice for English (United States) (Free voice)
Eka: Female voice for Georgian (Georgia) (Free voice)
Elena: Female voice for Spanish (Argentina) (Free voice)
Elias: Male voice for Spanish (Spain) (Free voice)
Elimu: Male voice for English (Tanzania) (Free voice)
Elin: Female voice for Swedish (Sweden) (Free voice)
Elizabeth: Female voice for English (United States) (Free voice)
Elke: Female voice for German (Germany) (Free voice)
Elliot: Male voice for English (United Kingdom) (Free voice)
Eloise: Female voice for French (France) (Free voice)
Elsa: Female voice for Italian (Italy) (Free voice)
Elsie: Female voice for English (Australia) (Free voice)
Elvira: Female voice for Spanish (Spain) (Free voice)
Elza: Female voice for Portuguese (Brazil) (Free voice)
Emel: Female voice for Turkish (Türkiye) (Free voice)
Emil: Male voice for Romanian (Romania) (Free voice)
Emilio: Male voice for Spanish (Dominican Republic) (Free voice)
Emily: Female voice for English (Ireland) (Free voice)
Emma: Female voice for English (United States) (Free voice)
Emma_2: Female voice for English (United States) (Free voice)
Emma_3: Female voice for English (United States) (Paid voice)
Emma_4: Female voice for English (United States) (Paid voice)
Enric: Male voice for Catalan (Free voice)
Enrique: Male voice for Spanish (Castilian) (Free voice)
Eric: Male voice for English (United States) (Free voice)
Estrella: Female voice for Spanish (Spain) (Free voice)
Ethan: Male voice for English (United Kingdom) (Free voice)
Evelyn: Female voice for English (United States) (Free voice)
Everita: Female voice for Latvian (Latvia) (Free voice)
Ewa: Female voice for Polish (Poland) (Free voice)
Ewa_2: Female voice for Polish (Poland) (Paid voice)
Ezinne: Female voice for English (Nigeria) (Free voice)
Fabio: Male voice for Portuguese (Brazil) (Free voice)
Fabiola: Female voice for Italian (Italy) (Free voice)
Fable: Neutral voice for English (United States) (Free voice)
Fabrice: Male voice for French (Switzerland) (Free voice)
Fahed: Male voice for Arabic (Kuwait) (Free voice)
Farid: Male voice for Persian (Iran) (Free voice)
Fatima: Female voice for Arabic (United Arab Emirates) (Free voice)
Federico: Male voice for Spanish (Nicaragua) (Free voice)
Fenna: Female voice for Dutch (Netherlands) (Free voice)
Fernanda: Female voice for Portuguese (Portugal) (Free voice)
Fiamma: Female voice for Italian (Italy) (Free voice)
Filiz: Female voice for Turkish (Türkiye) (Free voice)
Finn: Male voice for Norwegian (Norway) (Free voice)
Florian: Male voice for German (Germany) (Free voice)
Florian_2: Male voice for German (Germany) (Paid voice)
Florin: Male voice for French (France) (Paid voice)
Francisca: Female voice for Portuguese (Brazil) (Free voice)
Freya: Female voice for English (Australia) (Free voice)
Gabrielle: Female voice for French (Canada) (Free voice)
Gabrielle_2: Female voice for French (Canada) (Paid voice)
Gabrijela: Female voice for Croatian (Croatia) (Free voice)
Gadis: Female voice for Indonesian (Indonesia) (Free voice)
Gagan: Male voice for Kannada (India) (Free voice)
Gemma: Female voice for English (United Kingdom) (Free voice)
Gemma_2: Female voice for English (United Kingdom) (Free voice)
Geraint: Male voice for Welsh (United Kingdom) (Free voice)
Gerard: Male voice for French (Belgium) (Free voice)
Gerardo: Male voice for Spanish (Mexico) (Free voice)
Gianni: Male voice for Italian (Italy) (Free voice)
Giorgi: Male voice for Georgian (Georgia) (Free voice)
Giorgio: Male voice for Italian (Italy) (Free voice)
Giovanna: Female voice for Portuguese (Brazil) (Free voice)
Gisela: Female voice for German (Germany) (Free voice)
Giuseppe: Male voice for Italian (Italy) (Free voice)
Giuseppe_2: Male voice for Italian (Italy) (Free voice)
Gonzalo: Male voice for Spanish (Colombia) (Free voice)
GookMin: Male voice for Korean (Korea) (Free voice)
Goran: Male voice for Bosnian (Bosnia and Herzegovina) (Free voice)
Grace: Female voice for Maltese (Malta) (Free voice)
Gregory: Male voice for English (United States) (Free voice)
Gudrun: Female voice for Icelandic (Iceland) (Free voice)
Gul: Female voice for Urdu (India) (Free voice)
GulNawaz: Male voice for Pashto (Afghanistan) (Free voice)
Gunnar: Male voice for Icelandic (Iceland) (Free voice)
Guy: Male voice for English (United States) (Free voice)
Gwyneth: Female voice for Welsh (United Kingdom) (Free voice)
Hala: Female voice for Arabic (Saudi Arabia) (Free voice)
Hamdan: Male voice for Arabic (United Arab Emirates) (Free voice)
Hamed: Male voice for Arabic (Saudi Arabia) (Free voice)
Hannah: Female voice for German (Austria) (Free voice)
Hannah_2: Female voice for German (Austria) (Paid voice)
Hans: Male voice for German (Germany) (Free voice)
Harri: Male voice for Finnish (Finland) (Free voice)
Hayk: Male voice for Armenian (Armenia) (Free voice)
Hedi: Male voice for Arabic (Tunisia) (Free voice)
Hemkala: Female voice for Nepali (Nepal) (Free voice)
Henri: Male voice for French (France) (Free voice)
Hila: Female voice for Hebrew (Israel) (Free voice)
Hillevi: Female voice for Swedish (Sweden) (Free voice)
HiuGaai: Female voice for Chinese (Cantonese, Traditional) (Free voice)
Hiujin: Female voice for Chinese (Cantonese) (Free voice)
HiuMaan: Female voice for Chinese (Cantonese, Traditional) (Free voice)
HoaiMy: Female voice for Vietnamese (Vietnam) (Free voice)
Hollie: Female voice for English (United Kingdom) (Free voice)
HsiaoChen: Female voice for Chinese (Taiwanese Mandarin, Traditional) (Free voice)
HsiaoYu: Female voice for Chinese (Taiwanese Mandarin, Traditional) (Free voice)
Humberto: Male voice for Portuguese (Brazil) (Free voice)
Hyunsu: Male voice for Korean (Korea) (Free voice)
Hyunsu_2: Male voice for Korean (Korea) (Free voice)
Hyunsu_3: Male voice for Korean (Korea) (Paid voice)
Ida: Female voice for Norwegian (Norway) (Free voice)
Ilir: Male voice for Albanian (Albania) (Free voice)
Iman: Female voice for Arabic (Libya) (Free voice)
Imani: Female voice for English (Tanzania) (Free voice)
Imelda: Female voice for Italian (Italy) (Free voice)
Ines: Female voice for Portuguese (Brazil) (Free voice)
Ines_2: Female voice for Portuguese (Brazil) (Free voice)
Ingrid: Female voice for German (Austria) (Free voice)
InJoon: Male voice for Korean (Korea) (Free voice)
Irene: Female voice for Spanish (Spain) (Free voice)
Irma: Female voice for Italian (Italy) (Free voice)
Isabella: Female voice for Italian (Italy) (Free voice)
Isabella_2: Female voice for Italian (Italy) (Free voice)
Isabella_3: Female voice for Italian (Italy) (Paid voice)
Isabelle: Female voice for French (Belgium) (Free voice)
Isabelle_2: Female voice for French (Belgium) (Paid voice)
Iselin: Female voice for Norwegian (Norway) (Free voice)
Isidora: Female voice for Spanish (Spain) (Free voice)
Ismael: Male voice for Arabic (Algeria) (Free voice)
Ivy: Female voice for English (United States) (Free voice)
Ivy_2: Female voice for English (United States) (Free voice)
Jacek: Male voice for Polish (Poland) (Free voice)
Jacob: Male voice for English (United States) (Free voice)
Jacqueline: Female voice for French (France) (Free voice)
Jajang: Male voice for Sundanese (Indonesia) (Free voice)
Jamal: Male voice for Arabic (Morocco) (Free voice)
James: Male voice for English (Philippines) (Free voice)
Jan: Male voice for German (Switzerland) (Free voice)
Jane: Female voice for English (United States) (Free voice)
Jane_2: Female voice for English (United States) (Paid voice)
Jann: Male voice for Polish (Poland) (Free voice)
Jasmine: Female voice for English (Singapore) (Free voice)
Jasmine_2: Female voice for English (Singapore) (Paid voice)
Jason: Male voice for English (United States) (Free voice)
Javier: Male voice for Spanish (Equatorial Guinea) (Free voice)
Jean: Male voice for French (Canada) (Free voice)
Jenny: Female voice for English (United States) (Free voice)
Jenny_2: Female voice for English (United States) (Free voice)
Jenny_3: Female voice for English (United States) (Paid voice)
Jeppe: Male voice for Danish (Denmark) (Free voice)
Jerome: Male voice for French (France) (Free voice)
Jihye: Female voice for Korean (Korea) (Free voice)
JiMin: Female voice for Korean (Korea) (Free voice)
Jimmie: Male voice for English (United States) (Free voice)
Jitka: Female voice for Czech (Czechia) (Free voice)
Joana: Female voice for Catalan (Free voice)
Joanna: Female voice for English (United States) (Free voice)
Joanna_2: Female voice for English (United States) (Free voice)
Joanna_3: Female voice for English (United States) (Paid voice)
Joanne: Female voice for English (Australia) (Free voice)
Joey: Male voice for English (United States) (Free voice)
Joey_2: Male voice for English (United States) (Free voice)
Jonas: Male voice for German (Austria) (Free voice)
Jorge: Male voice for Spanish (Mexico) (Free voice)
Jorge_2: Male voice for Spanish (Mexico) (Free voice)
Joseph: Male voice for Maltese (Malta) (Free voice)
Josephine: Female voice for French (France) (Free voice)
Juan: Male voice for Spanish (Costa Rica) (Free voice)
Julio: Male voice for Portuguese (Brazil) (Free voice)
Justin: Male voice for English (United States) (Free voice)
Justin_2: Male voice for English (United States) (Free voice)
Kai: Male voice for English (United States) (Free voice)
Kajal: Female voice for English (India) (Free voice)
Kajal_2: Female voice for English (India) (Paid voice)
Kalina: Female voice for Bulgarian (Bulgaria) (Free voice)
Kani: Female voice for Tamil (Malaysia) (Free voice)
Karina: Female voice for Spanish (Puerto Rico) (Free voice)
Karl: Male voice for Icelandic (Iceland) (Free voice)
Karla: Female voice for Spanish (Honduras) (Free voice)
Kasper: Male voice for German (Germany) (Free voice)
Katja: Female voice for German (Germany) (Free voice)
Kavya: Female voice for Hindi (India) (Free voice)
Kavya_2: Female voice for English (India) (Free voice)
Kazuha: Female voice for Japanese (Japan) (Free voice)
Keita: Male voice for Japanese (Japan) (Free voice)
Ken: Male voice for English (Australia) (Free voice)
Kendra: Female voice for English (United States) (Free voice)
Kendra_2: Female voice for English (United States) (Free voice)
Keomany: Female voice for Lao (Laos) (Free voice)
Kert: Male voice for Estonian (Estonia) (Free voice)
Kevin: Male voice for English (United States) (Free voice)
Killian: Male voice for German (Germany) (Free voice)
Kim: Female voice for English (Australia) (Free voice)
Kimberly: Female voice for English (United States) (Free voice)
Kimberly_2: Female voice for English (United States) (Free voice)
Klarissa: Female voice for German (Germany) (Free voice)
Klaus: Male voice for German (Germany) (Free voice)
Kumar: Male voice for Tamil (Sri Lanka) (Free voice)
Kunal: Male voice for Hindi (India) (Free voice)
Kunal_2: Male voice for English (India) (Free voice)
Laia: Female voice for Spanish (Spain) (Free voice)
Laila: Female voice for Arabic (Bahrain) (Free voice)
Laith: Male voice for Arabic (Syria) (Free voice)
Larissa: Female voice for Spanish (Mexico) (Free voice)
Latifa: Female voice for Pashto (Afghanistan) (Free voice)
Laura: Female voice for Dutch (Netherlands) (Free voice)
Laura_2: Female voice for Dutch (Netherlands) (Paid voice)
Layla: Female voice for Arabic (Lebanon) (Free voice)
Lea: Female voice for French (France) (Free voice)
Lea_2: Female voice for French (France) (Free voice)
Lea_3: Female voice for French (France) (Paid voice)
Leah: Female voice for English (South Africa) (Free voice)
Leila: Female voice for Portuguese (Brazil) (Free voice)
Leni: Female voice for German (Switzerland) (Free voice)
Lennart: Male voice for German (Germany) (Paid voice)
Leonas: Male voice for Lithuanian (Lithuania) (Free voice)
Leticia: Female voice for Portuguese (Brazil) (Free voice)
Lewis: Male voice for English (United States) (Free voice)
Lia: Female voice for Spanish (Spain) (Free voice)
Liam: Male voice for English (Canada) (Free voice)
Lian: Male voice for French (Canada) (Free voice)
Lian_2: Male voice for French (Canada) (Paid voice)
Libby: Female voice for English (United Kingdom) (Free voice)
Liberto: Male voice for Spanish (Mexico) (Free voice)
Lisa: Female voice for Dutch (Belgium) (Free voice)
Lisa_2: Female voice for Dutch (Belgium) (Paid voice)
Lisandro: Male voice for Italian (Italy) (Free voice)
Liv: Female voice for Norwegian (Norway) (Free voice)
Livia: Female voice for English (Australia) (Free voice)
Livia_2: Female voice for English (Australia) (Paid voice)
Lola: Female voice for English (United States) (Free voice)
Lorena: Female voice for Spanish (El Salvador) (Free voice)
Lorenzio: Male voice for Italian (Italy) (Paid voice)
Lorenzo: Male voice for Spanish (Chile) (Free voice)
Lotte: Female voice for Dutch (Netherlands) (Free voice)
Louisa: Female voice for German (Germany) (Free voice)
Lucia: Female voice for Spanish (Castilian) (Free voice)
Lucia_2: Female voice for Spanish (Castilian) (Free voice)
Lucia_3: Female voice for Spanish (Castilian) (Paid voice)
Luciano: Male voice for Spanish (Mexico) (Free voice)
Lucien: Male voice for French (France) (Free voice)
Luis: Male voice for Spanish (Ecuador) (Free voice)
Lukas: Male voice for Slovak (Slovakia) (Free voice)
Luke: Male voice for English (South Africa) (Free voice)
Luna: Female voice for English (Singapore) (Free voice)
Luna_2: Female voice for English (United States) (Free voice)
Lupe: Female voice for Spanish (United States) (Free voice)
Lupe_2: Female voice for Spanish (United States) (Free voice)
Lupe_3: Female voice for Spanish (United States) (Paid voice)
Maarten: Male voice for Dutch (Netherlands) (Free voice)
Macerio: Male voice for Portuguese (Brazil) (Free voice)
Macerio_2: Male voice for Portuguese (Brazil) (Paid voice)
Madhur: Male voice for Hindi (India) (Free voice)
Madina: Female voice for Uzbek (Latin, Uzbekistan) (Free voice)
Mads: Male voice for Danish (Denmark) (Free voice)
Maisie: Female voice for English (United Kingdom) (Free voice)
Maja: Female voice for German (Germany) (Free voice)
Manohar: Male voice for Marathi (India) (Free voice)
Manuel: Male voice for Spanish (Cuba) (Free voice)
Manuela: Female voice for Portuguese (Brazil) (Free voice)
Marcello: Male voice for Italian (Italy) (Free voice)
Marcelo: Male voice for Spanish (Bolivia) (Free voice)
Marek: Male voice for Polish (Poland) (Free voice)
Margarita: Female voice for Spanish (Panama) (Free voice)
Maria: Female voice for Spanish (Costa Rica) (Free voice)
Marija: Female voice for Macedonian (North Macedonia) (Free voice)
Marina: Female voice for Spanish (Mexico) (Free voice)
Mario: Male voice for Spanish (Paraguay) (Free voice)
Marlene: Female voice for German (Germany) (Free voice)
Marta: Female voice for Spanish (Guatemala) (Free voice)
Maryam: Female voice for Arabic (Yemen) (Free voice)
Masaru: Male voice for Japanese (Japan) (Paid voice)
Mateo: Male voice for Spanish (Uruguay) (Free voice)
Mathieu: Male voice for French (France) (Free voice)
Matthew: Male voice for English (United States) (Free voice)
Matthew_2: Male voice for English (United States) (Free voice)
Matthew_3: Male voice for English (United States) (Paid voice)
Mattias: Male voice for Swedish (Sweden) (Free voice)
Maurice: Male voice for French (France) (Free voice)
Maxim: Male voice for Russian (Russia) (Free voice)
Maya: Female voice for Polish (Poland) (Free voice)
Mayu: Female voice for Japanese (Japan) (Free voice)
Mekdes: Female voice for Amharic (Ethiopia) (Free voice)
Mia: Female voice for Spanish (Mexico) (Free voice)
Mia_2: Female voice for Spanish (Mexico) (Free voice)
Mia_3: Female voice for Spanish (Mexico) (Paid voice)
Michelle: Female voice for English (United States) (Free voice)
Midhun: Male voice for Malayalam (India) (Free voice)
Miguel: Male voice for Spanish (United States) (Free voice)
Mitchell: Male voice for English (New Zealand) (Free voice)
Mizuki: Female voice for Japanese (Japan) (Free voice)
Moaz: Male voice for Arabic (Qatar) (Free voice)
Mohan: Male voice for Telugu (India) (Free voice)
Molly: Female voice for English (New Zealand) (Free voice)
Monica: Female voice for English (United States) (Free voice)
Mouna: Female voice for Arabic (Morocco) (Free voice)
Muuse: Male voice for Somali (Somalia) (Free voice)
Nabanita: Female voice for Bangla (Bangladesh) (Free voice)
Naja: Female voice for Danish (Denmark) (Free voice)
NamMinh: Male voice for Vietnamese (Vietnam) (Free voice)
Nanami: Female voice for Japanese (Japan) (Free voice)
Nanami_2: Female voice for Japanese (Japan) (Paid voice)
Nancy: Female voice for English (United States) (Free voice)
Nancy_2: Female voice for English (United States) (Free voice)
Naoki: Male voice for Japanese (Japan) (Free voice)
Natasha: Female voice for English (Australia) (Free voice)
Neerja: Female voice for English (India) (Free voice)
Neerja_2: Female voice for English (India) (Free voice)
Neil: Male voice for English (Australia) (Free voice)
Nestoras: Male voice for Greek (Greece) (Free voice)
Nia: Female voice for Welsh (United Kingdom) (Free voice)
Niamh: Female voice for English (Ireland) (Free voice)
Niamh_2: Female voice for English (Ireland) (Paid voice)
Nicholas: Male voice for Serbian (Cyrillic, Serbia) (Free voice)
Nicholas_2: Male voice for Serbian (Latin, Serbia) (Free voice)
Nicolau: Male voice for Portuguese (Brazil) (Free voice)
Nicole: Female voice for English (Australia) (Free voice)
Nil: Male voice for Spanish (Spain) (Free voice)
Nilar: Female voice for Burmese (Myanmar) (Free voice)
Nils: Male voice for Latvian (Latvia) (Free voice)
Niranjan: Male voice for Gujarati (India) (Free voice)
Niwat: Male voice for Thai (Thailand) (Free voice)
Noah: Male voice for English (United Kingdom) (Free voice)
Noemi: Female voice for Hungarian (Hungary) (Free voice)
Noora: Female voice for Finnish (Finland) (Free voice)
Noura: Female voice for Arabic (Kuwait) (Free voice)
Nova: Female voice for English (United States) (Free voice)
Nova_2: Female voice for English (United States) (Paid voice)
Nuria: Female voice for Spanish (Mexico) (Free voice)
Ojas: Male voice for Punjabi (India) (Free voice)
Ola: Female voice for Polish (Poland) (Free voice)
Ola_2: Female voice for Polish (Poland) (Paid voice)
Oliver: Male voice for English (United Kingdom) (Free voice)
Olivia: Female voice for English (United Kingdom) (Free voice)
Ollie: Male voice for English (United Kingdom) (Free voice)
Ollie_2: Male voice for English (United Kingdom) (Paid voice)
Omar: Male voice for Arabic (Libya) (Free voice)
Ona: Female voice for Lithuanian (Lithuania) (Free voice)
Onyx: Male voice for English (United States) (Free voice)
Orla: Female voice for Irish (Ireland) (Free voice)
Osman: Male voice for Malay (Malaysia) (Free voice)
Ostap: Male voice for Ukrainian (Ukraine) (Free voice)
Pallavi: Female voice for Tamil (India) (Free voice)
Palmira: Female voice for Italian (Italy) (Free voice)
Paloma: Female voice for Spanish (United States) (Free voice)
Paola: Female voice for Spanish (Venezuela) (Free voice)
Pedro: Male voice for Spanish (United States) (Free voice)
Pedro_2: Male voice for Spanish (United States) (Paid voice)
Pelayo: Male voice for Spanish (Mexico) (Free voice)
Penelope: Female voice for Spanish (United States) (Free voice)
Pernille: Female voice for Norwegian (Norway) (Free voice)
Petra: Female voice for Slovenian (Slovenia) (Free voice)
Phoebe: Female voice for English (United States) (Free voice)
Phoebe_2: Female voice for English (United States) (Paid voice)
Pierina: Female voice for Italian (Italy) (Free voice)
Piseth: Male voice for Khmer (Cambodia) (Free voice)
Polina: Female voice for Ukrainian (Ukraine) (Free voice)
Prabhat: Male voice for English (India) (Free voice)
Prabhat_2: Male voice for English (India) (Free voice)
Pradeep: Male voice for Bangla (Bangladesh) (Free voice)
Premwadee: Female voice for Thai (Thailand) (Free voice)
Priyom: Male voice for Assamese (India) (Free voice)
Rafiki: Male voice for Swahili (Kenya) (Free voice)
Ralf: Male voice for German (Germany) (Free voice)
Rami: Male voice for Arabic (Lebanon) (Free voice)
Ramona: Female voice for Spanish (Dominican Republic) (Free voice)
Rana: Female voice for Arabic (Iraq) (Free voice)
Raquel: Female voice for Portuguese (Portugal) (Free voice)
Raveena: Female voice for English (India) (Free voice)
Reem: Female voice for Arabic (Tunisia) (Free voice)
Rehaan: Male voice for Hindi (India) (Free voice)
Rehaan_2: Male voice for English (India) (Free voice)
Rehema: Female voice for Swahili (Tanzania) (Free voice)
Remi: Male voice for French (France) (Free voice)
Remi_2: Male voice for French (France) (Paid voice)
Remy: Male voice for French (France) (Free voice)
Remy_2: Male voice for French (France) (Paid voice)
Renata: Female voice for Spanish (Mexico) (Free voice)
Ricardo: Male voice for Portuguese (Brazil) (Free voice)
Rinaldo: Male voice for Italian (Italy) (Free voice)
Roberto: Male voice for Spanish (Panama) (Free voice)
Rodrigo: Male voice for Spanish (El Salvador) (Free voice)
Roger: Male voice for English (United States) (Free voice)
Roi: Male voice for Galician (Free voice)
Rok: Male voice for Slovenian (Slovenia) (Free voice)
Rosa: Female voice for English (Philippines) (Free voice)
Ruben: Male voice for Dutch (Netherlands) (Free voice)
Russell: Male voice for English (Australia) (Free voice)
Ruth: Female voice for English (United States) (Free voice)
Ruth_2: Female voice for English (United States) (Paid voice)
Ryan: Male voice for English (United States) (Free voice)
Ryan_2: Male voice for English (United Kingdom) (Free voice)
Sabela: Female voice for Galician (Free voice)
Sabrina: Female voice for German (Switzerland) (Free voice)
Sabrina_2: Female voice for German (Switzerland) (Paid voice)
Sagar: Male voice for Nepali (Nepal) (Free voice)
Saleh: Male voice for Arabic (Yemen) (Free voice)
Salli: Female voice for English (United States) (Free voice)
Salli_2: Female voice for English (United States) (Free voice)
Salli_3: Female voice for English (United States) (Paid voice)
Salma: Female voice for Arabic (Egypt) (Free voice)
Salman: Male voice for Urdu (India) (Free voice)
Salome: Female voice for Spanish (Colombia) (Free voice)
Sam: Male voice for English (Hong Kong SAR) (Free voice)
Sameera: Male voice for Sinhala (Sri Lanka) (Free voice)
Samuel: Male voice for English (United States) (Free voice)
Sana: Female voice for Arabic (Jordan) (Free voice)
Sapna: Female voice for Kannada (India) (Free voice)
Sara: Female voice for English (United States) (Free voice)
Saranya: Female voice for Tamil (Sri Lanka) (Free voice)
Sardor: Male voice for Uzbek (Latin, Uzbekistan) (Free voice)
Saul: Male voice for Spanish (Spain) (Free voice)
Sebastian: Male voice for Spanish (Venezuela) (Free voice)
Selma: Female voice for Finnish (Finland) (Free voice)
SeoHyeon: Female voice for Korean (Korea) (Free voice)
Seoyeon: Female voice for Korean (Korea) (Free voice)
Seoyeon_2: Female voice for Korean (Korea) (Free voice)
Seoyeon_3: Female voice for Korean (Korea) (Paid voice)
Seraphina: Female voice for German (Germany) (Free voice)
Seraphina_2: Female voice for German (Germany) (Paid voice)
Serena: Female voice for English (United States) (Free voice)
Serena_2: Female voice for English (United States) (Paid voice)
Sergio: Male voice for Spanish (Castilian) (Free voice)
Sergio_2: Male voice for Spanish (Castilian) (Paid voice)
Shakir: Male voice for Arabic (Egypt) (Free voice)
Shimmer: Female voice for English (United States) (Free voice)
Shiori: Female voice for Japanese (Japan) (Free voice)
Shruti: Female voice for Telugu (India) (Free voice)
Siqiniq: Female voice for Inuktitut (Syllabics, Canada) (Free voice)
Siqiniq_2: Female voice for Inuktitut (Latin, Canada) (Free voice)
Siti: Female voice for Javanese (Latin, Indonesia) (Free voice)
Sobhana: Female voice for Malayalam (India) (Free voice)
Soffie: Female voice for Danish (Denmark) (Free voice)
Sofia: Female voice for Spanish (Bolivia) (Free voice)
Sofie: Female voice for Swedish (Sweden) (Free voice)
Sonia: Female voice for English (United Kingdom) (Free voice)
SoonBok: Female voice for Korean (Korea) (Free voice)
Sophie: Female voice for Serbian (Cyrillic, Serbia) (Free voice)
Sophie_2: Female voice for Serbian (Latin, Serbia) (Free voice)
Srecko: Male voice for Croatian (Croatia) (Free voice)
Sreymom: Female voice for Khmer (Cambodia) (Free voice)
Steffan: Male voice for English (United States) (Free voice)
Steffan_2: Male voice for English (United States) (Free voice)
Steffan_3: Male voice for English (United States) (Paid voice)
Stephen: Male voice for English (United States) (Free voice)
Stephen_2: Male voice for English (United States) (Paid voice)
Subhasini: Female voice for Odia (India) (Free voice)
Sukant: Male voice for Odia (India) (Free voice)
SunHi: Female voice for Korean (Korea) (Free voice)
SunHi_2: Female voice for Korean (Korea) (Paid voice)
Surya: Male voice for Tamil (Malaysia) (Free voice)
Suvi: Female voice for Finnish (Finland) (Free voice)
Svetlana: Female voice for Russian (Russia) (Free voice)
Swara: Female voice for Hindi (India) (Free voice)
Sylvie: Female voice for French (Canada) (Free voice)
Sylvie_2: Female voice for French (Canada) (Paid voice)
Taim: Male voice for Arabic (Jordan) (Free voice)
Takumi: Male voice for Japanese (Japan) (Free voice)
Takumi_2: Male voice for Japanese (Japan) (Free voice)
Tamas: Male voice for Hungarian (Hungary) (Free voice)
Tania: Female voice for Spanish (Paraguay) (Free voice)
Tanishaa: Female voice for Bengali (India) (Free voice)
Tanja: Female voice for German (Germany) (Free voice)
Taqqiq: Male voice for Inuktitut (Syllabics, Canada) (Free voice)
Taqqiq_2: Male voice for Inuktitut (Latin, Canada) (Free voice)
Tatyana: Female voice for Russian (Russia) (Free voice)
Teo: Male voice for Spanish (Spain) (Free voice)
Teresa: Female voice for Spanish (Equatorial Guinea) (Free voice)
Thalita: Female voice for Portuguese (Brazil) (Free voice)
Thalita_2: Female voice for Portuguese (Brazil) (Free voice)
Thalita_3: Female voice for Portuguese (Brazil) (Paid voice)
Thando: Female voice for Zulu (South Africa) (Free voice)
Themba: Male voice for Zulu (South Africa) (Free voice)
Thiago: Male voice for Portuguese (Brazil) (Free voice)
Thierry: Male voice for French (Canada) (Free voice)
Thierry_2: Male voice for French (Canada) (Paid voice)
Thiha: Male voice for Burmese (Myanmar) (Free voice)
Thilini: Female voice for Sinhala (Sri Lanka) (Free voice)
Thomas: Male voice for English (United Kingdom) (Free voice)
Tiana: Female voice for English (United States) (Free voice)
Tiffany: Female voice for English (United States) (Paid voice)
Tim: Male voice for English (Australia) (Free voice)
Tina: Female voice for English (Australia) (Free voice)
Tomas: Male voice for Spanish (Argentina) (Free voice)
Tomoko: Female voice for Japanese (Japan) (Free voice)
Tony: Male voice for English (United States) (Free voice)
Triana: Female voice for Spanish (Spain) (Free voice)
Tristan: Male voice for Spanish (Mexico) (Paid voice)
Tristan_ES: Male voice for Spanish (Spain) (Free voice)
Tristan_ES_2: Male voice for Spanish (Spain) (Paid voice)
Tuti: Female voice for Sundanese (Indonesia) (Free voice)
Tyler: Male voice for English (United States) (Free voice)
Ubax: Female voice for Somali (Somalia) (Free voice)
Uzma: Female voice for Urdu (Pakistan) (Free voice)
Vaani: Female voice for Punjabi (India) (Free voice)
Valentina: Female voice for Spanish (Uruguay) (Free voice)
Valerio: Male voice for Portuguese (Brazil) (Free voice)
Valluvar: Male voice for Tamil (India) (Free voice)
Venba: Female voice for Tamil (Singapore) (Free voice)
Vera: Female voice for Spanish (Spain) (Free voice)
Vesna: Female voice for Bosnian (Bosnia and Herzegovina) (Free voice)
Vicki: Female voice for German (Germany) (Free voice)
Vicki_2: Female voice for German (Germany) (Free voice)
Vicki_3: Female voice for German (Germany) (Paid voice)
Victor: Male voice for Spanish (Puerto Rico) (Free voice)
Viktoria: Female voice for Slovak (Slovakia) (Free voice)
Vitoria: Female voice for Portuguese (Brazil) (Free voice)
Vitoria_2: Female voice for Portuguese (Brazil) (Free voice)
Vivienne: Female voice for French (France) (Free voice)
Vivienne_2: Female voice for French (France) (Paid voice)
Vlasta: Female voice for Czech (Czechia) (Free voice)
WanLung: Male voice for Chinese (Cantonese, Traditional) (Free voice)
Wayne: Male voice for English (Singapore) (Free voice)
Willem: Male voice for Afrikaans (South Africa) (Free voice)
William: Male voice for English (Australia) (Free voice)
William_2: Male voice for English (Australia) (Free voice)
Xiaochen: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaochen_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaochen_3: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaochen_4: Female voice for Chinese (Mandarin, Simplified) (Paid voice)
Xiaohan: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaohan_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaomeng: Female voice for Chinese (Mandarin, Simplified) (Free voice)
XiaoMin: Female voice for Chinese (Cantonese, Simplified) (Free voice)
Xiaomo: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoqiu: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaorou: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaorui: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoshuang: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoshuang_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoshuang_3: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaotong: Female voice for Chinese (Wu, Simplified) (Free voice)
Xiaoxiao: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoxiao_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoxiao_3: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoxiao_4: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoxiao_5: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyan: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyi: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyi_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyou: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyou_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyou_3: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyu: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaoyu_2: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Xiaozhen: Female voice for Chinese (Mandarin, Simplified) (Free voice)
Ximena: Female voice for Spanish (Mexico) (Paid voice)
Ximena_ES: Female voice for Spanish (Spain) (Free voice)
Ximena_ES_2: Female voice for Spanish (Spain) (Free voice)
Ximena_ES_3: Female voice for Spanish (Spain) (Paid voice)
Yago: Male voice for Spanish (Mexico) (Free voice)
Yan: Female voice for English (Hong Kong SAR) (Free voice)
Yara: Female voice for Portuguese (Brazil) (Free voice)
Yashica: Female voice for Assamese (India) (Free voice)
Yasmin: Female voice for Malay (Malaysia) (Free voice)
Yesui: Female voice for Mongolian (Mongolia) (Free voice)
Yolanda: Female voice for Spanish (Nicaragua) (Free voice)
YuJin: Female voice for Korean (Korea) (Free voice)
Yundeng: Male voice for Chinese (Zhongyuan Mandarin Henan, Simplified) (Free voice)
Yunfan: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunfan_2: Male voice for Chinese (Mandarin, Simplified) (Paid voice)
Yunfeng: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunhan: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunhao: Male voice for Chinese (Mandarin, Simplified) (Free voice)
YunJhe: Male voice for Chinese (Taiwanese Mandarin, Traditional) (Free voice)
Yunjian: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunjie: Male voice for Chinese (Mandarin, Simplified) (Free voice)
YunSong: Male voice for Chinese (Cantonese, Simplified) (Free voice)
Yunxi: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunxi_2: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunxia: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunxia_2: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunxiang: Male voice for Chinese (Jilu Mandarin, Simplified) (Free voice)
Yunxiao: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunxiao_2: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunyang: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunye: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunye_2: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunyi: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunyi_2: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunze: Male voice for Chinese (Mandarin, Simplified) (Free voice)
Yunzhe: Male voice for Chinese (Wu, Simplified) (Free voice)
Yves: Male voice for French (France) (Free voice)
Yvette: Female voice for French (France) (Free voice)
Zariyah: Female voice for Arabic (Saudi Arabia) (Free voice)
Zayd: Male voice for Arabic (Saudi Arabia) (Free voice)
Zeina: Female voice for Arabic (Saudi Arabia) (Free voice)
Zhiyu: Female voice for Chinese (Mandarin) (Free voice)
Zhiyu_2: Female voice for Chinese (Mandarin) (Free voice)
Zofia: Female voice for Polish (Poland) (Free voice)
Zuri: Female voice for Swahili (Kenya) (Free voice)
callType:
title: Call Type
x-category: call
x-usage: call
type: string
description: 'The type of channel used for the call.
This value indicates what kind of endpoint the call is connected to (PSTN phone number or WebSocket stream).'
enum:
- PHONE
- SIP
- STREAM
- VOICE_RELAY
x-enumDescriptions:
PHONE: A call from or to the telephone network.
SIP: A call from or to a SIP endpoint.
STREAM: A call to a stream.
VOICE_RELAY: A call to voice relay service.
examples:
- PHONE
svamlCommand:
title: SVAML Command
type: object
description: 'A single SVAML (Sinch Voice Application Markup Language) command that controls call behavior.
The `command` property acts as a discriminator and determines which command schema applies. When multiple commands appear in a `svamlCommands` array, they execute sequentially in order.
**Available commands:**
- `dial` — Initiate an outbound call leg within the session.
- `messages` — Play one or more TTS or audio messages on the call.
- `stopMessages` — Stop a currently playing message sequence.
- `webhook` — Trigger a mid-call webhook to the application backend for dynamic call control.
- `amd` — Detect whether the call was answered by a human or an answering machine.
- `hangup` — End the call or a specific call leg within the session.
- `answer` — Explicitly answer an incoming call leg before executing further commands.
- `pause` — Delay script execution without affecting call audio.
- `startRecording` — Begin recording the call.
- `stopRecording` — Stop an active call recording.
- `bridgeCall` — Add the call to a named bridge for multi-party audio.
- `menu` — Run menu-based input collection and route the call based on collected input.
- `gotoMenu` — Switch execution to another named menu within the current menu context.'
oneOf:
- $ref: '#/components/schemas/amd'
- $ref: '#/components/schemas/dial'
- $ref: '#/components/schemas/messages'
- $ref: '#/components/schemas/stopMessages'
- $ref: '#/components/schemas/webhook'
- $ref: '#/components/schemas/hangup'
- $ref: '#/components/schemas/answer'
- $ref: '#/components/schemas/pause'
- $ref: '#/components/schemas/startRecording'
- $ref: '#/components/schemas/stopRecording'
- $ref: '#/components/schemas/bridgeCall'
- $ref: '#/components/schemas/menu'
- $ref: '#/components/schemas/gotoMenu'
discriminator:
propertyName: command
mapping:
amd: '#/components/schemas/amd'
dial: '#/components/schemas/dial'
messages: '#/components/schemas/messages'
stopMessages: '#/components/schemas/stopMessages'
webhook: '#/components/schemas/webhook'
hangup: '#/components/schemas/hangup'
answer: '#/components/schemas/answer'
pause: '#/components/schemas/pause'
startRecording: '#/components/schemas/startRecording'
stopRecording: '#/components/schemas/stopRecording'
bridgeCall: '#/components/schemas/bridgeCall'
menu: '#/components/schemas/menu'
gotoMenu: '#/components/schemas/gotoMenu'
batchOptions:
title: Batch Options
type: object
additionalProperties: false
description: Options for batch dialing
properties:
maxCps:
type: integer
minimum: 1
maximum: 1000
default: 1000
description: 'Requested maximum call initiation rate, in calls per second (CPS), for this batch.
Actual CPS may be lower depending on routing, carrier, and platform capacity, as well as account limitations.'
ttlSeconds:
type: integer
minimum: 1
maximum: 10800
default: 10800
description: 'Batch time-to-live (TTL). The maximum amount of time the platform will keep attempting to start queued call sessions in this batch.
When the TTL expires, any call sessions that have not yet been initiated will stop being processed (calls already in progress are not affected).'
examples:
- maxCps: 5
ttlSeconds: 90
sipCallHeaders:
type: array
description: Custom SIP headers to be sent in the call setup.
maxItems: 16
items:
type: object
additionalProperties: false
required:
- key
properties:
key:
type: string
minLength: 1
maxLength: 255
pattern: ^[-A-Za-z0-9.!%*_+`'~]+$
description: Name of the SIP header.
example: X-Correlation-Id
value:
type: string
maxLength: 255
description: Value of the SIP header.
example: '12345'
examples:
- - key: X-Correlation-Id
value: '12345'
- key: X-Call-Routing
value: forwarded
callEvents:
type: object
additionalProperties: false
title: Call Events Webhook
description: Webhook to handle call events, used when callBehaviors are set to WEBHOOK
properties:
onAnswer:
description: SVAML commands to be executed when the call is answered
$ref: '#/components/schemas/svamlCommands'
onBusy:
description: SVAML commands to be executed when the call is busy
$ref: '#/components/schemas/svamlCommands'
onReject:
description: SVAML commands to be executed when the call is rejected
$ref: '#/components/schemas/svamlCommands'
onTimeout:
description: SVAML commands to be executed when the call is timed out
$ref: '#/components/schemas/svamlCommands'
onHangup:
description: SVAML commands to be executed when the call is hung up
$ref: '#/components/schemas/svamlCommands'
onFailure:
description: SVAML commands to be executed when the call fails
$ref: '#/components/schemas/svamlCommands'
unauthorized:
title: Unauthorized
description: Returned when authentication fails — the token is missing, invalid, or expired.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/unauthorized
title:
const: Unauthorized
detail:
example: The token is missing, invalid, or has expired.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
stopMessages:
type: object
additionalProperties: false
title: Stop Messages
description: 'Stops a message sequence started by a `messages` command. It will also cancel any messages with specified `messagesName` that will appear in the call session in the future.
This is a non-blocking command.'
required:
- command
- messagesName
properties:
command:
type: string
const: stopMessages
description: Command to stop playing messages
messagesName:
type: string
description: Name of the message sequence to stop, as set by `messagesName` in the `messages` command.
minLength: 1
maxLength: 32
pattern: ^\S+$
examples:
- command: stopMessages
messagesName: my-messages
projectId:
title: Project ID
type: string
format: uuid
description: The `Id` of the project associated with the call.
examples:
- 5c5bf2b1-35ae-4825-ab89-457e07bb60e6
stopRecording:
type: object
additionalProperties: false
title: Stop Recording
description: Stops a recording previously started by a `startRecording` command. This is a non-blocking command — execution continues to the next command in the sequence immediately after the stop is initiated.
required:
- command
- recordingName
properties:
command:
type: string
const: stopRecording
description: Command to stop recording on the channel
recordingName:
type: string
description: Name of the recording to stop, as set by `recordingName` in the `startRecording` command.
minLength: 1
maxLength: 32
pattern: ^\S+$
example: my-recording
batchId:
title: Batch ID
type: string
format: ulid
description: The ID of the batch.
examples:
- 01BX5ZZKBKACTAV9WEVGEMMVRC
voiceRelay:
type: object
additionalProperties: false
title: Voice Relay
description: Routes the call through the Voice Relay service, enabling real-time speech-to-text (STT) and text-to-speech (TTS) via a WebSocket connection to the application backend.
required:
- type
- voiceRelay
properties:
type:
type: string
const: VOICE_RELAY
description: Connects to the Voice Relay service to enable STT and TTS services...
voiceRelay:
type: object
additionalProperties: false
required:
- endpoint
- ttsVoice
- sttLanguage
properties:
endpoint:
type: string
format: uri
description: URL to the server that will accept the web-socket request
example: wss://acme.com/agent
enableInterruptions:
type: boolean
description: 'Allow "barge-in" during text-to-speech (TTS) playback.
When `true`, TTS playback is interrupted as soon as inbound speech is detected, unless the currently playing content is marked as uninterruptible.
When `false`, TTS playback continues uninterrupted, but an interruption signal is still sent over the WebSocket so the client application can choose to stop playback manually if needed.'
default: true
example: true
ttsVoice:
description: "Name of the voice to be used when synthesizing speech. \n\nThis is the default voice used, if no override voice is provided in the web-socket TTS message."
$ref: '#/components/schemas/voiceName'
sttLanguage:
type: string
pattern: ^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$
description: 'BCP-47 language tag used for speech-to-text transcription of the inbound audio.
This value determines which language model is used for transcription.'
example: en-US
callHeaders:
$ref: '#/components/schemas/callHeaders'
examples:
- type: VOICE_RELAY
voiceRelay:
endpoint: wss://acme.com/agent
enableInterruptions: true
ttsVoice: Emma
sttLanguage: en-US
callHeaders:
- key: my-key
value: my-key-value
message:
type: object
title: Message
description: A single message item. The required payload depends on `type`.
oneOf:
- $ref: '#/components/schemas/messageSay'
- $ref: '#/components/schemas/messagePlay'
discriminator:
propertyName: type
mapping:
SAY: '#/components/schemas/messageSay'
PLAY: '#/components/schemas/messagePlay'
phone:
type: object
additionalProperties: false
title: Phone
description: Routes the call to a phone number on the Public Switched Telephone Network (PSTN).
required:
- type
- phone
properties:
type:
type: string
const: PHONE
description: Routes the call to a phone number on the Public Switched Telephone Network (PSTN). The number must be in E.164 format.
phone:
type: object
additionalProperties: false
required:
- number
properties:
number:
$ref: '#/components/schemas/phoneNumber'
examples:
- type: PHONE
phone:
number: '+4673522488'
forbidden:
title: Forbidden
description: Returned when the authenticated identity does not have permission to perform the requested operation.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/forbidden
title:
const: Forbidden
detail:
example: The request was rejected.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
recordingType:
title: Recording Type
description: The type of recording to perform.
type: string
enum:
- COMBINED
- INBOUND
- OUTBOUND
x-enumDescriptions:
COMBINED: Record inbound and outbound voice streams.
INBOUND: Record inbound voice stream only.
OUTBOUND: Record outbound voice stream only.
default: COMBINED
paginationMeta:
type: object
additionalProperties: false
required:
- totalCount
- pageCount
title: Pagination Metadata
description: 'Metadata about the paginated list response.
'
properties:
totalCount:
type: integer
description: Total number of items across all pages.
example: 100
pageCount:
type: integer
description: Total number of pages.
example: 5
paymentRequired:
title: Payment Required
description: Returned when the account has insufficient balance or credit to complete the request.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/payment-required
title:
const: Account Suspended
detail:
example: No available balance/credit for this billing account.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
pause:
type: object
additionalProperties: false
title: Pause
description: 'Delays execution of the next command in the sequence for a specified duration. This is a blocking command — no further commands execute until the pause completes.
The pause does not affect call audio; the call remains connected and audio continues uninterrupted.'
required:
- command
- durationMilliseconds
properties:
command:
type: string
const: pause
description: Pause execution.
durationMilliseconds:
type: integer
minimum: 1
description: Duration of the pause in milliseconds.
example: 1000
examples:
- command: pause
durationMilliseconds: 1500
dial:
type: object
additionalProperties: false
title: Dial
description: 'Initiates a new outbound call leg within the current session.
This is a non-blocking command — the next command in the sequence executes immediately while the call is being established in parallel. Call lifecycle events (answer, busy, reject, timeout, hangup, failure) are handled via the `events` property.
The `from` and `to` endpoint types should ideally match. If they differ, the platform attempts to convert the `from` value to be compatible with the `to` type. For example, PSTN supports only E.164 phone numbers, so a SIP address such as `sip:46701234567@acme.se` can be converted to an E.164 number. If the `from` value cannot be converted, it defaults to null (anonymous).'
required:
- command
- to
properties:
command:
type: string
const: dial
description: Command to initiate a new call
callName:
type: string
minLength: 1
maxLength: 32
pattern: ^\S+$
example: outgoing
description: 'Identifier for this call leg within the session. Must be unique across all active call legs in the session.
Other commands (e.g., `hangup`) can reference this name to target this specific leg.'
from:
$ref: '#/components/schemas/from'
to:
$ref: '#/components/schemas/to'
dialTimeoutDurationSeconds:
type: integer
minimum: 1
maximum: 60
description: Maximum time in seconds to wait for the call to be answered. If the timeout expires without an answer, the `onTimeout` event is triggered.
example: 15
maxCallDurationSeconds:
type: integer
minimum: 1
maximum: 14400
description: Maximum duration of the call in seconds. The call is terminated automatically when this limit is reached.
example: 3600
events:
$ref: '#/components/schemas/callEvents'
examples:
- command: dial
callName: destination
from:
type: PHONE
phone:
number: '+15551234567'
to:
type: PHONE
phone:
number: '+15559876543'
dialTimeoutDurationSeconds: 30
maxCallDurationSeconds: 3600
events:
onAnswer:
- command: messages
messages:
- type: SAY
say:
text: Your call has connected.
voiceName: Emma
bridgeCall:
type: object
additionalProperties: false
title: Add call to bridge
description: 'Adds the current call to a bridge, enabling bidirectional audio communication with other calls in the same session. This is a non-blocking command — execution continues to the next command in the sequence immediately after the call joins the bridge.
Bridges are created automatically when referenced by name. If a bridge with the specified name already exists, the call joins that bridge; otherwise, a new bridge is created.'
required:
- command
- bridgeName
properties:
command:
type: string
const: bridgeCall
description: Command to add the call to a bridge
bridgeName:
type: string
minLength: 1
maxLength: 32
pattern: ^\S+$
description: Name of the bridge to join. If no bridge with this name exists in the session, a new one is created automatically.
examples:
- command: bridgeCall
bridgeName: my_bridge
callHeaders:
type: array
description: Custom headers to be sent in the call setup.
maxItems: 16
items:
type: object
additionalProperties: false
required:
- key
properties:
key:
type: string
minLength: 1
maxLength: 255
pattern: '[\x20-\x7e\t]+$'
description: Name of the header.
example: headerKey
value:
type: string
maxLength: 255
pattern: '[\x20-\x7e\t]*$'
description: Value of the header.
example: headerValue
examples:
- - key: headerKey
value: headerValue
- key: anotherKey
value: anotherValue
webhook:
type: object
additionalProperties: false
title: Webhook
description: 'Triggers a mid-call webhook to the application backend, allowing it to return a new set of SVAML commands that control the remainder of the call flow.
This is a blocking command — execution pauses until a response is received from the webhook endpoint. The next command in the sequence runs only after the backend responds. Webhook requests use a 5-second timeout. If a `fallbackUrl` is provided, a failed request is re-sent to it — see *Timeouts and failover* in the **Webhooks** section for the authoritative algorithm.'
required:
- command
- webhookName
- url
properties:
command:
type: string
const: webhook
description: Command to trigger a mid-call webhook
webhookName:
type: string
minLength: 1
maxLength: 64
pattern: ^\S+$
description: 'Name for this webhook event. When triggered, the webhook request''s `event` property will contain this name prepended with `call.webhook.`.
For example, if `webhookName` is set to `"my.custom.event"`, the event will be delivered as `"call.webhook.my.custom.event"`.'
url:
type: string
description: URL of the webhook endpoint to send the mid-call event to.
format: uri
fallbackUrl:
$ref: '#/components/schemas/webhookFallbackUrl'
examples:
- command: webhook
webhookName: my.custom.event
url: https://example.com/webhook
fallbackUrl: https://example.com/fallback
callDirection:
title: Call Direction
type: string
description: Indicates the direction of the call.
enum:
- INBOUND
- OUTBOUND
x-enumDescriptions:
INBOUND: A call initiated towards the Sinch Calling Platform.
OUTBOUND: A call initiated from the Sinch Calling Platform.
examples:
- OUTBOUND
startRecording:
type: object
additionalProperties: false
title: Start Recording
required:
- command
- recordingOptions
description: Starts recording the call. This is a non-blocking command — execution continues to the next command in the sequence immediately after recording begins.
properties:
command:
type: string
const: startRecording
description: Command to start recording on the channel
recordingName:
type: string
description: 'Identifier for this recording within the session. Must be unique across active recordings in the session.
Other commands (e.g., `stopRecording`) reference this name to target a specific recording.
Setting the recording name is useful for stopping the recording using the `stopRecording` command. If name is not set, recording can only be stopped when the call is disconnected.'
minLength: 1
maxLength: 32
pattern: ^\S+$
example: my-recording
recordingOptions:
$ref: '#/components/schemas/recordingOptions'
events:
$ref: '#/components/schemas/recordingEvents'
examples:
- command: startRecording
recordingName: customer-support-recording
recordingOptions:
format: MP3
recordingType: COMBINED
destination: AWS
destinationUrl: s3://voice-recordings-prod/calls
credentials: accessKeyId:secretAccessKey:eu-central-1
transcriptionOptions:
isEnabled: true
locale: en-US
events:
onFinish:
- command: hangup
onFailure:
- command: messages
messages:
- type: SAY
say:
text: Recording could not be started for this call.
voiceName: Emma
messagePlay:
type: object
title: Play Message
description: An audio file playback message item. The platform fetches and plays the audio file at the provided URL on the call.
additionalProperties: false
required:
- type
- play
properties:
type:
type: string
const: PLAY
description: Audio file playback during the call.
play:
type: object
additionalProperties: false
title: Play
required:
- url
properties:
url:
type: string
description: URL of the media to send
examples:
- type: PLAY
play:
url: https://example.com/media.mp3
callPatchRequest:
x-category: call
x-usage: call
type: object
additionalProperties: false
title: Call Patch Request
description: Request body for patching an ongoing call with SVAML commands.
required:
- commands
properties:
commands:
$ref: '#/components/schemas/svamlCommands'
examples:
- commands:
- command: hangup
hangup:
type: object
additionalProperties: false
description: 'Ends a call leg. This is a non-blocking command — execution continues to the next command in the sequence even though the call has been ended. The `onHangup` event is triggered for the call leg that was ended.
Any subsequent commands that target the ended call leg (such as `messages` or other media commands) are valid but will not be executed. Commands that operate independently — such as initiating a new call with `dial` — will execute normally. This makes it possible, for example, to end one call and immediately start another within the same sequence.'
title: Hangup
required:
- command
properties:
command:
type: string
const: hangup
description: Hangup call
callName:
type: string
description: 'Name of the call leg to end, as set by `callName` in the `dial` command.
If omitted, the current call leg is ended.'
minLength: 1
maxLength: 32
pattern: ^\S+$
example: origin
examples:
- command: hangup
callName: origin
internalServerError:
title: Internal Server Error
description: Returned when an unexpected error occurs on the server.
allOf:
- $ref: '#/components/schemas/problemDetails'
- type: object
properties:
type:
const: https://api.sinch.com/docs/errors/internal-server-error
title:
const: Internal Server Error
detail:
example: An unexpected error occurred on the server.
instance:
example: /v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01ARZ3NDEKTSV4RRFFQ69G5FAA
CallInformation:
type: object
properties:
from:
type: string
description: The caller number
to:
type: string
description: The callee number
domain:
type: string
description: The call domain
callId:
type: string
description: The unique call identifier
duration:
type: integer
description: The call duration in seconds
status:
type: string
description: The current call status
result:
type: string
description: The call result
reason:
type: string
description: The reason for call disconnection
timestamp:
type: string
format: date-time
description: When the call was initiated
userRate:
$ref: '#/components/schemas/Price'
debit:
$ref: '#/components/schemas/Price'
Price:
type: object
properties:
currencyId:
type: string
description: The currency code
amount:
type: number
description: The amount
SVAMLControl:
type: object
properties:
action:
type: object
description: The SVAML action to execute
properties:
name:
type: string
description: The action name
instructions:
type: array
description: List of SVAML instructions
items:
type: object
properties:
name:
type: string
description: The instruction name
callResult_3:
title: Call Result
description: 'The outcome/state of the call.
This field includes both **transitional** states (during call setup and execution) and **final** states (when the call has ended).'
type: string
enum:
- QUEUED
- INITIATED
- IN_PROGRESS
- COMPLETED
- REJECTED
- NO_ANSWER
- CANCEL
- BUSY
- FAILED
x-enumDescriptions:
QUEUED: The call is queued for initiation. This is a transitional state.
INITIATED: The call is connecting but the recipient has not yet answered. This is a transitional state.
IN_PROGRESS: The call has been answered and is in progress. This is a transitional state.
COMPLETED: The call was answered and is ended. This is a final state.
REJECTED: The call was rejected by the recipient.
NO_ANSWER: The call was not answered by the recipient.
CANCEL: The call was cancelled.
BUSY: The call was not answered because the recipient was busy.
FAILED: The call could not be completed.
examples:
- IN_PROGRESS
call_2:
type: object
additionalProperties: false
title: Call Resource
description: Call details
required:
- callId
- projectId
- serviceId
- sessionId
- direction
- originationType
- callType
- callResult
- startTime
- callRate
- callResourceUrl
properties:
callId:
$ref: '#/components/schemas/callId'
projectId:
$ref: '#/components/schemas/projectId'
serviceId:
$ref: '#/components/schemas/serviceId'
sessionId:
$ref: '#/components/schemas/sessionId'
callName:
type: string
minLength: 1
maxLength: 32
pattern: ^\S+$
description: 'The name identifying this call leg within the session, as assigned by the `callName` property in the `dial` command or in the SVAML response to an incoming call webhook.
Omitted for calls that were not assigned a name.'
example: origin
bridgeName:
type: string
description: The name of the bridge the call belongs to. Omitted for calls not assigned to any bridge.
example: my-bridge
batchId:
$ref: '#/components/schemas/batchId'
from:
$ref: '#/components/schemas/from'
to:
$ref: '#/components/schemas/to'
startTime:
type: string
format: date-time
description: Timestamp (RFC 3339) indicating when the call was created and call setup was initiated (start of the call attempt).
example: '2025-01-01 00:00:00+00:00'
updateTime:
type: string
format: date-time
description: 'Timestamp (RFC 3339) indicating when the call was last updated.
Omitted if no updates were performed on this call.'
example: '2025-01-01 00:00:00+00:00'
callType:
$ref: '#/components/schemas/callType'
direction:
$ref: '#/components/schemas/callDirection'
answerTime:
type: string
format: date-time
description: 'Timestamp (RFC 3339) indicating when the call was answered.
Omitted if the call was not answered.'
example: '2025-01-01 00:00:00+00:00'
endTime:
type: string
format: date-time
description: 'Timestamp (RFC 3339) indicating when the call ended.
Omitted for ongoing calls.'
example: '2025-01-01 00:00:00+00:00'
callDurationSeconds:
type: integer
description: Duration of the call in seconds
example: 42
callResult:
$ref: '#/components/schemas/callResult_3'
callReason:
$ref: '#/components/schemas/callReason'
originationType:
$ref: '#/components/schemas/originationType'
callRate:
$ref: '#/components/schemas/money'
description: The rate charged for this call, expressed as a monetary amount **per minute** in the specified currency.
callResourceUrl:
type: string
format: uri
description: Absolute URI to this call resource. Use this URL to retrieve the call details
example: https://voice.api.sinch.com/v2/projects/5c5bf2b1-35ae-4825-ab89-457e07bb60e6/calls/01AN4Z07BY79KA1307SR9X4MV3
parameters:
Page:
in: query
name: page
description: The page you want to fetch, can set to 1 for first page, or omitted for first page
schema:
type: integer
default: 1
ProjectId:
name: projectId
in: path
required: true
description: The `projectId` is a required parameter you must include when making any API calls. You can find your project ID on your [Build dashboard](https://dashboard.sinch.com).
schema:
type: string
example: 3acb7ae1-cf3d-4112-ba5e-3a9d8c71cd47
Size:
in: query
name: size
description: The size of each page to fetch
schema:
type: integer
default: 500
minimum: 1
maximum: 500
callLeg:
name: callLeg
in: path
schema:
type: string
enum:
- caller
- callee
- both
x-enumDescriptions:
caller: The outgoing call line.
callee: The receiving call line.
both: Both lines.
required: true
description: Specifies which part of the call will be managed. This option is used only by the `PlayFiles` and `Say` instructions to indicate which channel the sound will be played on. Valid options are `caller`, `callee` or `both`. If not specified, the default value is `caller`.
The `callLeg` identifier is ignored for calls that are part of a conference and calls initiated using the Callout API.
example: caller
callId:
in: path
name: callId
schema:
type: string
required: true
description: The unique identifier of the call. This value is generated by the system.
example: 4398599d1ba84ef3bde0a82dfb61abed
page:
in: query
name: page
description: Page number (1-based)
required: false
schema:
type: integer
minimum: 1
default: 1
pageSize:
in: query
name: pageSize
description: Number of items to be returned on each page.
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
sessionId:
name: sessionId
description: The ID of the session.
in: path
required: true
schema:
$ref: '#/components/schemas/sessionId'
idempotencyKey:
name: Idempotency-Key
in: header
schema:
type: string
minLength: 16
maxLength: 128
required: false
description: Client-generated idempotency key to safely retry requests. The server uses this key to recognize retries of the same request. If a request with the same key is received within 10 minutes, the server returns the cached response from the original request. Using a random UUID (v4) is strongly recommended.
serviceIdQuery:
name: serviceId
description: The ID of the service.
in: query
required: false
schema:
$ref: '#/components/schemas/serviceId'
projectId:
name: projectId
description: The ID of the project.
in: path
required: true
schema:
$ref: '#/components/schemas/projectId'
callId_2:
name: callId
description: The ID of the call.
in: path
required: true
schema:
$ref: '#/components/schemas/callId'
CallId:
name: call_id
in: path
required: true
description: The unique call identifier
schema:
type: string
callId_3:
name: callId
description: The ID of the call.
in: path
required: true
schema:
$ref: '#/components/schemas/callId'
examples:
stopRecording:
summary: stopRecording example
description: The `stopRecording` instruction.
value:
instructions:
- name: stopRecording
park:
summary: park example
description: The `park` action.
value:
action:
name: park
introPrompt: '#tts[Welcome]'
holdPrompt: '#tts[Thank you for your patience, your call is very important to us.]'
maxDuration: 180
setCookie:
summary: setCookie example
description: The `setCookie` instruction.
value:
instructions:
- name: setCookie
key: cookie_name
value: cookie_value
answer:
summary: answer example
description: The `answer` instruction.
value:
instructions:
- name: answer
playFiles:
summary: playFiles example
description: The `playFiles` instruction.
value:
instructions:
- name: playFiles
ids:
- '#tts[Welcome]'
locale: en-US
continue:
summary: continue example
description: The `continue` action.
value:
action:
name: continue
say:
summary: say example
description: The `say` instruction.
value:
instructions:
- name: say
text: Hello, this is a text-to-speech message.
locale: en-US
startRecording:
summary: startRecording example
description: The `startRecording` instruction.
value:
instructions:
- name: startRecording
options:
destination: s3://my-bucket/
credentials: REDACTED_AWS_ACCESS_KEY_ID:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY:eu-central-1
notificationEvents: true
hangupExample:
summary: Hang up a call
value:
instructions:
- name: sendDtmf
value: 1234#
action:
name: hangup
sendDtmf:
summary: sendDtmf example
description: The `sendDtmf` instruction.
value:
instructions:
- name: sendDtmf
value: 1234#
requestBodies:
updateCall:
content:
application/json:
schema:
$ref: '#/components/schemas/PATCHSVAMLRequestBody'
examples:
hangupExample:
$ref: '#/components/examples/hangupExample'
continueExample:
$ref: '#/components/examples/continue'
parkExample:
$ref: '#/components/examples/park'
playFilesExample:
$ref: '#/components/examples/playFiles'
sayExample:
$ref: '#/components/examples/say'
sendDtmfExample:
$ref: '#/components/examples/sendDtmf'
setCookieExample:
$ref: '#/components/examples/setCookie'
answerExample:
$ref: '#/components/examples/answer'
startRecordingExample:
$ref: '#/components/examples/startRecording'
stopRecordingExample:
$ref: '#/components/examples/stopRecording'
responses:
'401':
description: Authentication failed — token missing, invalid, or expired.
headers:
WWW-Authenticate:
description: RFC 7235 challenge. Indicates the required authentication scheme and, for expired tokens, provides an error hint.
schema:
type: string
example: Bearer realm="sinch", error="invalid_token", error_description="Token has expired"
content:
application/problem+json:
schema:
$ref: '#/components/schemas/unauthorized'
'400':
description: Invalid request parameters.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/badRequest'
'402':
description: Payment required
content:
application/problem+json:
schema:
$ref: '#/components/schemas/paymentRequired'
'404':
description: Resource not found.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/notFound'
'500':
description: Internal server error occurred.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/internalServerError'
'403':
description: Forbidden.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/forbidden'
'429':
description: Too many requests — rate limit exceeded.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
required: false
schema:
type: integer
example: 60
content:
application/problem+json:
schema:
$ref: '#/components/schemas/tooManyRequests'
securitySchemes:
Basic:
type: http
description: To use basic authentication, use your Access Key ID as your username and your Access Key Secret as your password. To read about more basic authentication, see the [Basic Authentication](https://developers.sinch.com/docs/est/api-reference/est#basic) section.
scheme: basic
OAuth2.0:
type: oauth2
description: To use OAuth 2.0 authentication, use your Access Key ID and Access Key Secret to obtain your bearer token. For detailed instructions on how to do this, see the [OAuth Authentication](https://developers.sinch.com/docs/est/api-reference/est#oauth) section.
flows:
clientCredentials:
tokenUrl: https://auth.sinch.com/oauth2/token
scopes: {}
Signed:
type: apiKey
in: header
name: Authorization
description: For more information about signed request authentication, see [Request Signing](https://developers.sinch.com/docs/voice/api-reference/authentication/signed-request).
BasicAuth:
type: http
scheme: basic
description: 'Use HTTP Basic authentication.
- **Username**: the **Access Key ID**
- **Password**: the **Access Key Secret**
Send credentials in the `Authorization` header:
`Authorization: Basic `
Create and manage access keys in the Dashboard:
https://dashboard.sinch.com/settings/access-keys'
SinchOAuth2:
type: oauth2
description: 'OAuth 2.0 **Client Credentials** grant (recommended for production).
Exchange the **Access Key ID** (`client_id`) and **Access Key Secret**
(`client_secret`) for a short-lived Bearer token.
Tokens typically expire after **3600 seconds**. When the token expires,
request a new one using the same `tokenUrl`. There is no separate
refresh token in the client credentials flow — simply re-authenticate.
Access keys are managed in the Dashboard: https://dashboard.sinch.com/settings/access-keys'
flows:
clientCredentials:
tokenUrl: https://auth.sinch.com/oauth2/token
refreshUrl: https://auth.sinch.com/oauth2/token
scopes: {}
basicAuth:
type: http
scheme: basic
description: Application key and secret used for HTTP basic authentication. Application-signed requests are also supported.
externalDocs:
description: Sinch Voice API Documentation
url: https://developers.sinch.com/docs/voice
x-refined-from:
- sinch-elastic-sip-trunking-api-openapi.yaml
- sinch-voice-api-openapi.yaml
- sinch-voice-api-v2-openapi.yaml
- original-sinch-voice-openapi.yml
- sinch-voice-api-v2-openapi.yml
x-explorer-enabled: false
x-samples-languages:
- curl
- java
- csharp
- node
- php
x-original-swagger-version: '2.0'