CtrlK
BlogDocsLog inGet started
Tessl Logo

sinch-partnerships-ecosystems/sinch-skills

Official Sinch API skills for AI coding agents — SMS, Voice, Verification, Numbers, Mailgun email, and more.

71

Quality

89%

Does it follow best practices?

Impact

No eval scenarios have been run

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

svaml.mdskills/sinch-voice-api/references/

SVAML Reference

Contents

  • Actions by Callback
  • Instructions by Callback
  • Action Reference: hangup, continue, connectPstn, connectMxp, connectConf, connectSip, connectStream, runMenu, park
  • Instruction Reference: playFiles, say, sendDtmf, setCookie, answer, startRecording, stopRecording
  • Prompt Formats

SVAML (Sinch Voice Application Markup Language) controls call flow. Every SVAML response contains:

  • instructions (array): Zero or more tasks executed in order
  • action (object): Exactly ONE routing/control action
{
  "instructions": [ ... ],
  "action": { "name": "actionName", ... }
}

Actions by Callback

Not all actions are available in every callback response:

ActionICEACEPIE
hangup
continue
connectPstn
connectMxp
connectConf
connectSip
connectStream
runMenu
park

Instructions by Callback

InstructionICEACEPIE
playFiles
say
sendDtmf
setCookie
answer
startRecording
stopRecording

Action Reference

hangup

Terminates the call.

{ "action": { "name": "hangup" } }

continue

Continues call setup without rerouting. ACE/PIE only.

{ "action": { "name": "continue" } }

connectPstn

Connects to a PSTN number.

PropertyTypeRequiredDescription
namestringYesMust be "connectPstn"
numberstringNoE.164 number to connect to. If omitted, uses the called extension
clistringNoOverride caller ID. Use "private" to withhold
maxDurationintegerNoMax call duration in seconds (max 14400)
dialTimeoutintegerNoMax seconds to wait for answer before TIMEOUT
localestringNoTTS locale (default: "en-US")
dtmfstringNoDTMF tones to play when answered. 0-9, #, w (500ms pause)
suppressCallbacksbooleanNoSuppress ACE and DiCE callbacks
indicationsstringNoCountry code for ringback tone (e.g., "us", "se", "uk")
amdobjectNoAnswering Machine Detection. { "enabled": true }
{
  "action": {
    "name": "connectPstn",
    "number": "+461234567890",
    "cli": "+460987654321",
    "maxDuration": 3000,
    "dialTimeout": 10,
    "locale": "en-US",
    "amd": { "enabled": true }
  }
}

connectMxp

Connects to a Sinch SDK (in-app) endpoint.

PropertyTypeRequiredDescription
namestringYesMust be "connectMxp"
destinationobjectYes{ "type": "username", "endpoint": "userId" }
callHeadersarrayNoCustom headers: [{ "key": "k", "value": "v" }]
{
  "action": {
    "name": "connectMxp",
    "destination": { "type": "username", "endpoint": "johndoe" },
    "callHeaders": [{ "key": "foo", "value": "bar" }]
  }
}

connectConf

Connects to a conference room.

PropertyTypeRequiredDescription
namestringYesMust be "connectConf"
conferenceIdstringYesConference identifier (max 64 chars)
conferenceDtmfOptionsobjectNoDTMF handling: `{ "mode": "ignore"
mohstringNoMusic on hold for first participant: "ring"
{
  "action": {
    "name": "connectConf",
    "conferenceId": "myConference",
    "moh": "ring"
  }
}

connectSip

Connects to a SIP endpoint.

PropertyTypeRequiredDescription
namestringYesMust be "connectSip"
destinationobjectYes{ "type": "Sip", "endpoint": "user@sip.example.com" }
maxDurationintegerNoMax call duration in seconds (max 14400)
clistringNoOverride caller ID. Use "private" to withhold
transportstringNo"UDP" (default), "TCP", or "TLS"
suppressCallbacksbooleanNoSuppress ACE and DiCE callbacks
callHeadersarrayNoPrivate SIP headers
mohstringNoMusic on hold if SIP call is placed on hold
{
  "action": {
    "name": "connectSip",
    "destination": { "type": "Sip", "endpoint": "46708000000@sip.foo.com" },
    "maxDuration": 3000,
    "transport": "tls"
  }
}

connectStream

Connects to a WebSocket server for real-time audio streaming.

PropertyTypeRequiredDescription
namestringYesMust be "connectStream"
destinationobjectYes{ "type": "Websocket", "endpoint": "wss://..." }
streamingOptionsobjectNo{ "version": 1, "sampleRate": 44100 }
maxDurationintegerNoMax duration in seconds (max 14400)
callHeadersarrayNoCustom headers sent in initial WebSocket message
{
  "action": {
    "name": "connectStream",
    "destination": { "type": "Websocket", "endpoint": "wss://yourcompany.com/ws" },
    "streamingOptions": { "version": 1, "sampleRate": 44100 },
    "maxDuration": 3600
  }
}

runMenu

IVR menu with DTMF/voice input collection. Triggers PIE callback on input.

PropertyTypeRequiredDescription
namestringYesMust be "runMenu"
bargebooleanNoAllow input during prompt playback (default: true)
localestringNoTTS locale. Required if enableVoice is true
mainMenustringNoID of the first menu to play
enableVoicebooleanNoEnable speech input in addition to DTMF
menusarrayNoMenu definitions (see below)

Menu object:

PropertyTypeDescription
idstringMenu identifier. One menu must have id: "main"
mainPromptstringPrompt to play: #tts[...], #ssml[...], or #href[url]
repeatPromptstringPrompt on invalid/no input
repeatsintegerNumber of times to repeat on timeout
maxDigitsintegerMax DTMF digits to collect
timeoutMillsintegerTimeout in ms (default: 5000)
maxTimeoutMillsintegerMax timeout for multi-digit input
optionsarray`[{ "dtmf": 1, "action": "return(value)"
{
  "action": {
    "name": "runMenu",
    "barge": true,
    "mainMenu": "main",
    "menus": [
      {
        "id": "main",
        "mainPrompt": "#tts[Press 1 for support or 2 to continue.]",
        "options": [
          { "dtmf": 1, "action": "return(support)" },
          { "dtmf": 2, "action": "menu(sub)" }
        ]
      },
      {
        "id": "sub",
        "mainPrompt": "#tts[Enter your 4-digit PIN.]",
        "maxDigits": 4,
        "timeoutMills": 10000,
        "options": [
          { "dtmf": 1, "action": "menu(main)" }
        ]
      }
    ]
  }
}

park

Parks the call with looping hold prompt.

PropertyTypeRequiredDescription
namestringYesMust be "park"
localestringNoTTS locale
introPromptstringNoPlayed once when parked: #tts[...] or #ssml[...]
holdPromptstringNoLoops until unparked or maxDuration reached
maxDurationintegerNoMax hold time in seconds
{
  "action": {
    "name": "park",
    "introPrompt": "#tts[Please hold.]",
    "holdPrompt": "#tts[Your call is important to us.]",
    "maxDuration": 180
  }
}

Instruction Reference

playFiles

Plays IVR files, TTS, or SSML.

PropertyTypeRequiredDescription
namestringYesMust be "playFiles"
idsarrayYesFile URLs, #tts[text], or #ssml[commands]
localestringNoRequired for TTS/SSML
{ "name": "playFiles", "ids": ["#tts[Welcome]"], "locale": "en-US" }

say

Synthesizes and plays text-to-speech. Max 600 characters (contact support to increase).

PropertyTypeRequiredDescription
namestringYesMust be "say"
textstringNoThe message to speak
localestringNoTTS locale
{ "name": "say", "text": "Hello from Sinch!", "locale": "en-US" }

sendDtmf

Sends DTMF tones. Valid characters: 0-9, #, w (500ms pause).

{ "name": "sendDtmf", "value": "ww1234#w#" }

setCookie

Persists key-value state across callback events within the same call session.

{ "name": "setCookie", "key": "step", "value": "greeting_done" }

answer

Forces the call to be answered (starts billing). Place before playFiles if playing audio on an unanswered call.

{ "name": "answer" }

startRecording

Begins recording the call.

PropertyTypeRequiredDescription
namestringYesMust be "startRecording"
options.destinationUrlstringNoURL to upload recording
options.credentialsstringNoCredentials for upload
options.formatstringNoRecording format
options.notificationEventsbooleanNoSend Notify event when recording finishes
options.transcriptionOptions.enabledbooleanNoEnable auto-transcription
options.transcriptionOptions.localestringNoTranscription locale (e.g., "en-US")
{
  "name": "startRecording",
  "options": {
    "destinationUrl": "s3://bucket/recordings/",
    "credentials": "accesskey:secretkey",
    "notificationEvents": true,
    "transcriptionOptions": { "enabled": true, "locale": "en-US" }
  }
}

stopRecording

Stops the active recording.

{ "name": "stopRecording" }

Prompt Formats

Use these within playFiles.ids, runMenu prompts, and park prompts:

FormatSyntaxExample
Text-to-speech#tts[text]#tts[Welcome to support.]
SSML#ssml[commands]#ssml[<speak><break time="1s"/>Hello</speak>]
Audio file URL#href[url]#href[https://example.com/greeting.wav]

Links

skills

README.md

tile.json