# Call webhook

Receives webhook notifications for call events from the Voice Platform.
### Request signing
Every webhook request is signed by the Voice Platform so that the receiving
endpoint can verify that the request was sent by Sinch and was not altered in
transit.
The signature is carried in the `Authorization` header, using the `service`
authentication scheme. The header value is the service identifier and the
signature, separated by a colon:

```
Authorization: service <serviceId>:<signature>
```
| Element | Description |
|  --- | --- |
| `<serviceId>` | Identifier of the service the webhook belongs to. Matches the `serviceId` segment of the `ce-source` header and the `call.serviceId` field of the request body. |
| `<signature>` | Base64-encoded HMAC-SHA256 hash of the canonical request string, keyed with the service secret. |

#### Signature

```
signature = Base64( HMAC-SHA256( secretBytes, UTF8(stringToSign) ) )
```
`secretBytes` is the 16-byte binary value of the service secret, and the signed
message is the UTF-8 encoding of `stringToSign`.
The service secret is issued as a Base64 string, for example
`F5wrP9SKYU6w8sbZXkp7GA==`. Base64-decoding it yields the 16 bytes of
`secretBytes`. The decoded bytes are used as the HMAC key — signing with the
characters of the Base64 string instead produces a different, invalid signature.
#### Canonical string
`stringToSign` is the concatenation of five parts. Each of the first four parts
is terminated by a single line feed (`\n`); the last part is not followed by a
line feed.

```
POST
{contentMd5}
{contentType}
x-timestamp:{timestamp}
{path}
```
| Part | Value |
|  --- | --- |
| Method | The HTTP method, always `POST` for webhook requests. |
| `{contentMd5}` | `Base64( MD5( UTF8(body) ) )` — the Base64-encoded MD5 digest of the raw request body. Empty when the request carries no body. |
| `{contentType}` | The full value of the `Content-Type` header, including its parameters, for example `application/json; charset=utf-8`. Empty when the request carries no body. |
| `{timestamp}` | The verbatim value of the `x-timestamp` request header, an ISO 8601 UTC timestamp with seven fractional-second digits, for example `2026-04-01T12:00:00.0000000Z`. The literal prefix `x-timestamp:` is part of the canonical string. |
| `{path}` | The absolute path of the configured webhook URL, without scheme, host, query string or fragment, for example `/voice-webhooks`. |

The MD5 digest acts as a checksum of the body inside the canonical string. The
integrity and authenticity guarantee is provided by the HMAC-SHA256 signature
computed over that string.
The CloudEvents (`ce-*`) headers are not covered by the signature.
#### Example
A request delivered to `https://example.com/voice-webhooks` with the body

```json
{"event":"call.incoming","call":{"callId":"01AN4Z07BY79KA1307SR9X4MV3"}}
```
`Content-Type: application/json; charset=utf-8` and
`x-timestamp: 2026-04-01T12:00:00.0000000Z` produces the canonical string

```
POST
CH5/FnzqzRJ81QlTLGAhAw==
application/json; charset=utf-8
x-timestamp:2026-04-01T12:00:00.0000000Z
/voice-webhooks
```
With the service secret `F5wrP9SKYU6w8sbZXkp7GA==`, the resulting header is

```
Authorization: service a74b1566-0f18-4f8e-9c23-8e6b5df8fd3e:EWFtVTrykdhMTdyYSbn40GBJpf5UBeggO9T99sdwLyY=
```
#### Verification
1. Split the
`Authorization`
 header value into the service identifier and the

signature.
2. Rebuild
`stringToSign`
 from the received request, using the raw request body

exactly as delivered, before any parsing, re-serialization or whitespace

normalization.
3. Recompute the signature with the secret of the identified service and compare

it to the received value using a constant-time comparison.
4. Reject the request when the two values differ.
5. Reject requests whose
`x-timestamp`
 lies outside an accepted clock-skew

window, to limit replay of previously valid requests.

Endpoint: POST call.webhook
Version: 2.0.59
Security: BasicAuth, SinchOAuth2

## Description:

  - `Request signing` ()
    Every webhook request is signed by the Voice Platform so that the receiving
endpoint can verify that the request was sent by Sinch and was not altered in
transit. The signature is carried in the `Authorization` header, using the `service`
authentication scheme. The header value is the service identifier and the
signature, separated by a colon: ```
Authorization: service <serviceId>:<signature>
``` | Element | Description |
|  --- | --- |
| `<serviceId>` | Identifier of the service the webhook belongs to. Matches the `serviceId` segment of the `ce-source` header and the `call.serviceId` field of the request body. |
| `<signature>` | Base64-encoded HMAC-SHA256 hash of the canonical request string, keyed with the service secret. |

  - `Signature` ()
    ```
signature = Base64( HMAC-SHA256( secretBytes, UTF8(stringToSign) ) )
``` `secretBytes` is the 16-byte binary value of the service secret, and the signed
message is the UTF-8 encoding of `stringToSign`. The service secret is issued as a Base64 string, for example
`F5wrP9SKYU6w8sbZXkp7GA==`. Base64-decoding it yields the 16 bytes of
`secretBytes`. The decoded bytes are used as the HMAC key — signing with the
characters of the Base64 string instead produces a different, invalid signature.

  - `Canonical string` ()
    `stringToSign` is the concatenation of five parts. Each of the first four parts
is terminated by a single line feed (`\n`); the last part is not followed by a
line feed. ```
POST
{contentMd5}
{contentType}
x-timestamp:{timestamp}
{path}
``` | Part | Value |
|  --- | --- |
| Method | The HTTP method, always `POST` for webhook requests. |
| `{contentMd5}` | `Base64( MD5( UTF8(body) ) )` — the Base64-encoded MD5 digest of the raw request body. Empty when the request carries no body. |
| `{contentType}` | The full value of the `Content-Type` header, including its parameters, for example `application/json; charset=utf-8`. Empty when the request carries no body. |
| `{timestamp}` | The verbatim value of the `x-timestamp` request header, an ISO 8601 UTC timestamp with seven fractional-second digits, for example `2026-04-01T12:00:00.0000000Z`. The literal prefix `x-timestamp:` is part of the canonical string. |
| `{path}` | The absolute path of the configured webhook URL, without scheme, host, query string or fragment, for example `/voice-webhooks`. | The MD5 digest acts as a checksum of the body inside the canonical string. The
integrity and authenticity guarantee is provided by the HMAC-SHA256 signature
computed over that string. The CloudEvents (`ce-*`) headers are not covered by the signature.

  - `Example` ()
    A request delivered to `https://example.com/voice-webhooks` with the body ```json
{"event":"call.incoming","call":{"callId":"01AN4Z07BY79KA1307SR9X4MV3"}}
``` `Content-Type: application/json; charset=utf-8` and
`x-timestamp: 2026-04-01T12:00:00.0000000Z` produces the canonical string ```
POST
CH5/FnzqzRJ81QlTLGAhAw==
application/json; charset=utf-8
x-timestamp:2026-04-01T12:00:00.0000000Z
/voice-webhooks
``` With the service secret `F5wrP9SKYU6w8sbZXkp7GA==`, the resulting header is ```
Authorization: service a74b1566-0f18-4f8e-9c23-8e6b5df8fd3e:EWFtVTrykdhMTdyYSbn40GBJpf5UBeggO9T99sdwLyY=
```

  - `Verification` ()
    1. Split the
`Authorization`
 header value into the service identifier and the

signature.
2. Rebuild
`stringToSign`
 from the received request, using the raw request body

exactly as delivered, before any parsing, re-serialization or whitespace

normalization.
3. Recompute the signature with the secret of the identified service and compare

it to the received value using a constant-time comparison.
4. Reject the request when the two values differ.
5. Reject requests whose
`x-timestamp`
 lies outside an accepted clock-skew

window, to limit replay of previously valid requests.

## Security:

  - `BasicAuth` (unknown)
    http basic

  - `SinchOAuth2` (unknown)
    oauth2

## Header parameters:

  - `ce-specversion` (string, required)
    CloudEvents specification version.

  - `ce-type` (string, required)
    CloudEvents event type.

  - `ce-source` (string, required)
    URI identifying the context where the event originated. Format: `projects/{projectId}/services/{serviceId}`.

  - `ce-id` (string, required)
    Unique identifier for this event instance. Use together with `ce-source` for deduplication.

  - `ce-time` (string, required)
    Timestamp (RFC 3339) when the event occurred.

  - `x-timestamp` (string, required)
    Timestamp (ISO 8601, UTC) applied by the Voice Platform when the request was signed. Covered by the `Authorization` signature and required to recompute it.

## Request fields (application/json):

  - `event` (any, required)
    Identifies the type of call event that triggered this webhook notification.
Call-related webhook events always start with `call.` followed by the type of event that triggered them. Events triggered by the `webhook` SVAML command are dynamic and follow the pattern `call.webhook.<webhookName>`.
    Example: call.incoming

  - `call` (object, required)
    Call details

  - `call.callId` (string, required)
    The `Id`` of the call.

  - `call.projectId` (string, required)
    The `Id` of the project associated with the call.

  - `call.serviceId` (string, required)
    The ID of the service used.

  - `call.sessionId` (string, required)
    The ID of the session.

  - `call.callName` (string)
    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

  - `call.bridgeName` (string)
    The name of the bridge the call belongs to. Omitted for calls not assigned to any bridge.
    Example: my-bridge

  - `call.batchId` (string)
    The ID of the batch.

  - `call.from` (any)
    Call origin - Phone Number or SIP endpoint

  - `call.from.type` (string, required)
    Routes the call to a phone number on the Public Switched Telephone Network (PSTN). The number must be in E.164 format.
    Enum: "PHONE"

  - `call.from.phone` (object, required)

  - `call.from.phone.number` (string, required)
    E.164 Phone number

  - `call.from.type` (string, required)
    Indicates the call originated from a SIP (Session Initiation Protocol) endpoint.
    Enum: "SIP"

  - `call.from.sip` (object, required)

  - `call.from.sip.endpoint` (string, required)
    SIP URI of the originating endpoint. Both `sip:` (unencrypted) and `sips:` (TLS-encrypted) schemes are supported.

  - `call.from.sip.displayName` (string)
    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 <sip:alice@example.com>`).
    Example: Alice

  - `call.to` (any)
    Call destination - Phone Number or Stream URI

  - `call.to.type` (string, required)
    Routes the call to a SIP (Session Initiation Protocol) endpoint.
    Enum: "SIP"

  - `call.to.sip` (object, required)

  - `call.to.sip.endpoint` (string, required)
    SIP URI of the destination endpoint. Both `sip:` (unencrypted) and `sips:` (TLS-encrypted) schemes are supported.

  - `call.to.sip.transport` (string)
    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"

  - `call.to.sip.callHeaders` (array)
    Custom SIP headers to be sent in the call setup.

  - `call.to.sip.callHeaders.key` (string, required)
    Name of the SIP header.
    Example: X-Correlation-Id

  - `call.to.sip.callHeaders.value` (string)
    Value of the SIP header.
    Example: 12345

  - `call.to.type` (string, required)
    Routes the call to a WebSocket stream endpoint for real-time audio processing.
    Enum: "STREAM"

  - `call.to.stream` (object, required)

  - `call.to.stream.endpoint` (string, required)
    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

  - `call.to.stream.streamOptions` (object)

  - `call.to.stream.streamOptions.version` (integer)
    Defines the version of the stream protocol, which determines the format of the binary audio messages exchanged over the WebSocket connection.
Currently, only version `1` is supported: binary messages contain only audio data, and audio received from the WebSocket server is played as soon as it is received.
    Enum: "1"

  - `call.to.stream.streamOptions.codec` (string)
    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.
    Enum: "PCM"

  - `call.to.stream.streamOptions.sampleRate` (integer)
    Defines the audio sampling rate (Hz) used for the stream.

For calls that traverse the PSTN, audio is typically sampled at 8 kHz, so using a higher value will not improve perceived quality. 
Higher 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"

  - `call.to.stream.callHeaders` (array)
    Custom headers to be sent in the call setup.

  - `call.to.stream.callHeaders.key` (string, required)
    Name of the header. No leading or trailing whitespaces allowed.
    Example: headerKey

  - `call.to.stream.callHeaders.value` (string)
    Value of the header. No leading or trailing whitespaces allowed.
    Example: headerValue

  - `call.to.type` (string, required)
    Connects to the Voice Relay service to enable STT and TTS services...
    Enum: "VOICE_RELAY"

  - `call.to.voiceRelay` (object, required)

  - `call.to.voiceRelay.endpoint` (string, required)
    URL to the server that will accept the web-socket request
    Example: wss://acme.com/agent

  - `call.to.voiceRelay.enableInterruptions` (boolean)
    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.
    Example: true

  - `call.to.voiceRelay.ttsVoice` (string, required)
    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
    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", "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", "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_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_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"

  - `call.to.voiceRelay.sttLanguage` (string, required)
    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

  - `call.startTime` (string, required)
    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

  - `call.updateTime` (string)
    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

  - `call.callType` (string, required)
    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"

  - `call.direction` (string, required)
    Indicates the direction of the call.
    Enum: "INBOUND", "OUTBOUND"

  - `call.answerTime` (string)
    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

  - `call.endTime` (string)
    Timestamp (RFC 3339) indicating when the call ended.

Omitted for ongoing calls.
    Example: 2025-01-01 00:00:00+00:00

  - `call.callDurationSeconds` (integer)
    Duration of the call in seconds
    Example: 42

  - `call.callResult` (string, required)
    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).
    Enum: "QUEUED", "INITIATED", "IN_PROGRESS", "COMPLETED", "REJECTED", "NO_ANSWER", "CANCEL", "BUSY", "FAILED"

  - `call.callReason` (string)
    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).
    Enum: "OK", "NOT_AVAILABLE", "CALLER_HANGUP", "CALLEE_HANGUP", "MANAGER_HANGUP", "DID_NOT_FOUND", "INVALID_SCRIPT", "UNKNOWN_PRODUCT", "NO_MORE_ROUTES", "ERROR"

  - `call.originationType` (string, required)
    Indicates the origin/source of the call.
This describes **how the call was initiated** (PSTN or via the API).
    Enum: "PHONE", "SIP", "SERVER"

  - `call.callRate` (object, required)
    A monetary amount with an associated currency code.

  - `call.callRate.currencyCode` (string, required)
    The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html).
    Example: USD

  - `call.callRate.amount` (string, required)
    The monetary amount as a string to preserve precision. Supports up to 4 decimal places (e.g., "10.5000", "0.9999").
    Example: 0.0123

  - `call.callResourceUrl` (string, required)
    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

  - `menu` (object)
    Information about the menu interaction that triggered the webhook, including the menu name and the input sequence received from the user.
This property is also included for webhooks triggered by the `webhook` command within a menu context.

  - `menu.menuName` (string, required)
    The name of the menu that triggered this webhook event.

  - `menu.input` (string, required)
    The input sequence gathered from the user by the menu.

## Request examples:

  - `Inbound call arriving on the service` (unknown)

  - `Outbound call answered by the recipient` (unknown)

  - `Outbound call recipient was busy` (unknown)

  - `Outbound call rejected by the recipient` (unknown)

  - `Outbound call not answered within the dial timeout` (unknown)

  - `Call ended after being answered` (unknown)

  - `Call could not be set up` (unknown)

  - `Mid-call event triggered by the webhook SVAML command` (unknown)

## Response 200:

  - `200` (unknown)
    Success. A SVAML document returned in response to a webhook.
**Note:** `callName` and `events` only take effect in responses to webhooks triggered by an incoming call. In responses to other webhook types, they are ignored.

## Response 200 fields (application/json):

  - `commands` (array, required)
    The ordered list of SVAML commands to execute. Contains at least one command.

  - `commands.command` (string, required)
    Command to run Answering Machine Detection on the call
    Enum: "amd"

  - `commands.events` (object)
    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, or whether a machine answered without a beep being detected.

  - `commands.command` (string, required)
    Command to initiate a new call
    Enum: "dial"

  - `commands.callName` (string)
    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.
    Example: outgoing

  - `commands.from` (any)
    Call origin - Phone Number or SIP endpoint

  - `commands.from.type` (string, required)
    Routes the call to a phone number on the Public Switched Telephone Network (PSTN). The number must be in E.164 format.
    Enum: "PHONE"

  - `commands.from.phone` (object, required)

  - `commands.from.phone.number` (string, required)
    E.164 Phone number

  - `commands.from.type` (string, required)
    Indicates the call originated from a SIP (Session Initiation Protocol) endpoint.
    Enum: "SIP"

  - `commands.from.sip` (object, required)

  - `commands.from.sip.endpoint` (string, required)
    SIP URI of the originating endpoint. Both `sip:` (unencrypted) and `sips:` (TLS-encrypted) schemes are supported.

  - `commands.from.sip.displayName` (string)
    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 <sip:alice@example.com>`).
    Example: Alice

  - `commands.to` (any, required)
    Call destination - Phone Number or Stream URI

  - `commands.to.type` (string, required)
    Routes the call to a SIP (Session Initiation Protocol) endpoint.
    Enum: "SIP"

  - `commands.to.sip` (object, required)

  - `commands.to.sip.endpoint` (string, required)
    SIP URI of the destination endpoint. Both `sip:` (unencrypted) and `sips:` (TLS-encrypted) schemes are supported.

  - `commands.to.sip.transport` (string)
    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"

  - `commands.to.sip.callHeaders` (array)
    Custom SIP headers to be sent in the call setup.

  - `commands.to.sip.callHeaders.key` (string, required)
    Name of the SIP header.
    Example: X-Correlation-Id

  - `commands.to.sip.callHeaders.value` (string)
    Value of the SIP header.
    Example: 12345

  - `commands.to.type` (string, required)
    Routes the call to a WebSocket stream endpoint for real-time audio processing.
    Enum: "STREAM"

  - `commands.to.stream` (object, required)

  - `commands.to.stream.endpoint` (string, required)
    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

  - `commands.to.stream.streamOptions` (object)

  - `commands.to.stream.streamOptions.version` (integer)
    Defines the version of the stream protocol, which determines the format of the binary audio messages exchanged over the WebSocket connection.
Currently, only version `1` is supported: binary messages contain only audio data, and audio received from the WebSocket server is played as soon as it is received.
    Enum: "1"

  - `commands.to.stream.streamOptions.codec` (string)
    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.
    Enum: "PCM"

  - `commands.to.stream.streamOptions.sampleRate` (integer)
    Defines the audio sampling rate (Hz) used for the stream.

For calls that traverse the PSTN, audio is typically sampled at 8 kHz, so using a higher value will not improve perceived quality. 
Higher 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"

  - `commands.to.stream.callHeaders` (array)
    Custom headers to be sent in the call setup.

  - `commands.to.stream.callHeaders.key` (string, required)
    Name of the header. No leading or trailing whitespaces allowed.
    Example: headerKey

  - `commands.to.stream.callHeaders.value` (string)
    Value of the header. No leading or trailing whitespaces allowed.
    Example: headerValue

  - `commands.to.type` (string, required)
    Connects to the Voice Relay service to enable STT and TTS services...
    Enum: "VOICE_RELAY"

  - `commands.to.voiceRelay` (object, required)

  - `commands.to.voiceRelay.endpoint` (string, required)
    URL to the server that will accept the web-socket request
    Example: wss://acme.com/agent

  - `commands.to.voiceRelay.enableInterruptions` (boolean)
    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.
    Example: true

  - `commands.to.voiceRelay.ttsVoice` (string, required)
    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
    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", "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", "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_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_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"

  - `commands.to.voiceRelay.sttLanguage` (string, required)
    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

  - `commands.dialTimeoutDurationSeconds` (integer)
    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

  - `commands.maxCallDurationSeconds` (integer)
    Maximum duration of the call in seconds. The call is terminated automatically when this limit is reached.
    Example: 3600

  - `commands.events` (object)
    Webhook to handle call events, used when callBehaviors are set to WEBHOOK

  - `commands.command` (string, required)
    Command to play a message on the channel
    Enum: "messages"

  - `commands.messagesName` (string)
    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.
    Example: my-messages

  - `commands.messages` (array, required)
    Ordered list of messages to play.

  - `commands.messages.type` (string, required)
    Text-to-speech message to be played during the call.
    Enum: "SAY"

  - `commands.messages.say` (object, required)

  - `commands.messages.say.text` (string, required)
    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, `<speak>...</speak>`).
    Example: Hello world

  - `commands.messages.say.format` (string)
    Format of the message
    Enum: "TEXT", "SSML"

  - `commands.messages.type` (string, required)
    Audio file playback during the call.
    Enum: "PLAY"

  - `commands.messages.play` (object, required)

  - `commands.messages.play.url` (string, required)
    URL of the media to send

  - `commands.events` (object)
    SVAML commands to execute based on message playback outcomes.

  - `commands.command` (string, required)
    Command to stop playing messages
    Enum: "stopMessages"

  - `commands.messagesName` (string, required)
    Name of the message sequence to stop, as set by `messagesName` in the `messages` command.

  - `commands.command` (string, required)
    Command to trigger a mid-call webhook
    Enum: "webhook"

  - `commands.webhookName` (string, required)
    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"`.

  - `commands.url` (string, required)
    URL of the webhook endpoint to send the mid-call event to.

  - `commands.fallbackUrl` (string)
    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.

  - `commands.command` (string, required)
    Hangup call
    Enum: "hangup"

  - `commands.callName` (string)
    Name of the call leg to end, as set by `callName` in the `dial` command.
If omitted, the current call leg is ended.
    Example: origin

  - `commands.command` (string, required)
    Answer call
    Enum: "answer"

  - `commands.command` (string, required)
    Pause execution.
    Enum: "pause"

  - `commands.durationMilliseconds` (integer, required)
    Duration of the pause in milliseconds.
    Example: 1000

  - `commands.command` (string, required)
    Command to start recording on the channel
    Enum: "startRecording"

  - `commands.recordingName` (string)
    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.
    Example: my-recording

  - `commands.recordingOptions` (object, required)
    Recording options for this recording.

  - `commands.recordingOptions.format` (string)
    Audio format for this recording.
    Enum: "MP3", "WAV"

  - `commands.recordingOptions.recordingType` (string)
    The type of recording to perform.
    Enum: "COMBINED", "INBOUND", "OUTBOUND"

  - `commands.recordingOptions.destination` (string, required)
    Select target service to receive recorded and transcribed files
    Enum: "AWS", "GCP", "AZURE"

  - `commands.recordingOptions.destinationUrl` (string, required)
    Destination URL for the recording.
    Example: s3://voice-recordings-prod/calls

  - `commands.recordingOptions.credentials` (string, required)
    Credentials to third party storage. The format depends on the scheme of `destinationUrl`:
- `s3`
 (Amazon S3):
`accessKeyId:secretAccessKey:region`
.
`accessKeyId`
 and
`secretAccessKey`
 are an AWS access key pair of an IAM user that is allowed to upload objects to the bucket.
`region`
 is the AWS region code of the bucket, for example
`eu-central-1`
. Access keys are created in the AWS Management Console under
**IAM**
 >
**Users**
 >
**Security credentials**
.
- `gs`
 (Google Cloud Storage):
`accessKey:secret`
.
`accessKey`
 and
`secret`
 are a Cloud Storage HMAC key of a service account that is allowed to create objects in the bucket. HMAC keys are created in the Google Cloud console under
**Cloud Storage**
 >
**Settings**
 >
**Interoperability**
.
- `azure`
 (Azure Blob Storage):
`accountKey`
.
`accountKey`
 is an access key of the storage account named in
`destinationUrl`
, which has the form
`azure://{storageAccountName}/{containerName}/{path}`
. Account keys are listed in the Azure portal under
**Security + networking**
 >
**Access keys**
 of the storage account. Shared access signature (SAS) tokens and connection strings are not supported as credentials.
    Example: accessKeyId:secretAccessKey:eu-central-1

  - `commands.recordingOptions.transcriptionOptions` (object)
    Configuration for automatic speech-to-text transcription of the recording.

  - `commands.recordingOptions.transcriptionOptions.isEnabled` (boolean, required)
    If true, the recording will be transcribed to text.
    Example: true

  - `commands.recordingOptions.transcriptionOptions.locale` (string)
    Language code in BCP-47 format.
    Example: en-US

  - `commands.events` (object)
    SVAML commands to execute based on recording lifecycle outcomes.

  - `commands.command` (string, required)
    Command to stop recording on the channel
    Enum: "stopRecording"

  - `commands.recordingName` (string, required)
    Name of the recording to stop, as set by `recordingName` in the `startRecording` command.
    Example: my-recording

  - `commands.command` (string, required)
    Command to add the call to a bridge
    Enum: "bridgeCall"

  - `commands.bridgeName` (string, required)
    Name of the bridge to join. If no bridge with this name exists in the session, a new one is created automatically.

  - `commands.command` (string, required)
    Executes menu-based input collection using the configured menu definitions.
    Enum: "menu"

  - `commands.startMenu` (string, required)
    Name of the menu to execute first. Must match a key in menus.

  - `commands.menus` (object, required)
    Map of menu definitions keyed by menu name.

  - `commands.command` (string, required)
    Switch execution to another menu within the current menu context.
    Enum: "gotoMenu"

  - `commands.menuName` (string, required)
    Name of the target menu to execute next. Must match a key in menus.

  - `callName` (string)
    Name of the call.
    Example: incoming

  - `events` (object)
    Commands to execute on specific events for this call.

## Response 200 examples:

  - `Accept an incoming call and play a greeting (call.incoming), then hangup` (unknown)

  - `Play a message then hang up (call.answered)` (unknown)

