{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-docs/functions/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["partial"]},"type":"markdown"},"seo":{"title":"Developer Documentation","siteUrl":"https://developers.sinch.com","llmstxt":{"title":"Sinch Developer Documentation","description":"LLMs.txt containing a map of all the documentation files for Sinch.","sections":[{"title":"SMS API","description":"The SMS API allows you to send and receive SMS messages with a few easy steps. You can also send bulk SMS messages to multiple customers using the Sinch SMS service.","includeFiles":["docs/sms/**/*.md","docs/sms/**/*.yaml"],"excludeFiles":["docs/sms/index.md"]},{"title":"Numbers API","description":"The Numbers API enables you to search for, view, and activate numbers. It's considered a precursor to other APIs in the Sinch product family. The numbers API can be used in tandem with any of our APIs that perform messaging or calling.","includeFiles":["docs/numbers/**/*.md","docs/numbers/**/*.yaml"],"excludeFiles":["docs/numbers/index.md"]},{"title":"Conversation API","description":"Send and receive messages globally on many popular channels with ease and confidence when using Sinch's Conversation API. Conversation API is the preferred API for sending mobile messages on SMS and other social channels with Sinch. It is a simple API with unified error messages, consistent request payloads, and common webhook payloads that are channel-agnostic.","includeFiles":["docs/conversation/**/*.md","docs/conversation/**/*.yaml"],"excludeFiles":["docs/conversation/index.md"]},{"title":"Voice API","description":"The Voice API works as a big telephony switch. The Voice API handles incoming phone calls (also known as incoming call “legs”), sets up outgoing phone calls (or outgoing call “legs”), and bridges the two. The incoming call leg may come in over a data connection (from a smartphone or web application using the Sinch SDKs) or through a local phone number (from the PSTN network). Similarly, the outgoing call leg can be over data (to another smartphone or web application using the Sinch SDKs) or the PSTN network.","includeFiles":["docs/voice/**/*.md","docs/voice/**/*.yaml"],"excludeFiles":["docs/voice/index.md"]},{"title":"Verification API","description":"The Verification API is a platform for phone number verification. It consists of the API and different software development kits (the Sinch SDKs) that you integrate with your smartphone or web application and cloud based back-end services. Together they enable SMS, Flashcall, Phone Call and Data verification in your application.","includeFiles":["docs/verification/**/*.md","docs/verification/**/*.yaml"],"excludeFiles":["docs/verification/index.md"]},{"title":"Provisioning API","description":"Provisioning API allows you to programmatically set up your senders, accounts and templates on your favorite messaging platforms on the Conversation API. For now, you can create your first WhatsApp channel through Meta's Embedded sign up, you can configure your first SMS App and configure your webhooks. As development continues, we will be adding the most commonly used channels.","includeFiles":["docs/provisioning-api/**/*.md","docs/provisioning-api/**/*.json"],"excludeFiles":["docs/provisioning-api/index.md"]},{"title":"Elastic SIP Trunking API","description":"With Elastic SIP Trunking you can create and manage your SIP trunks and phone numbers programmatically.","includeFiles":["docs/est/**/*.md","docs/est/**/*.yaml"],"excludeFiles":["docs/est/index.md"]},{"title":"Fax API","description":"Send and receive HIPAA compliant faxes on our modern fax platform using our developer-friendly API.","includeFiles":["docs/fax/**/*.md","docs/fax/**/*.yaml"],"excludeFiles":["docs/fax/index.md"]},{"title":"In-app Voice and Video SDK","description":"The In-app Voice and Video SDK enables you to add voice and video calling capabilities directly into your mobile or web application using the Sinch SDKs.","includeFiles":["docs/in-app-calling/**/*.md"],"excludeFiles":["docs/in-app-calling/index.md"]}],"hide":false,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"glossary","__idx":0},"children":["Glossary"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Sinch platform uses a handful of terms that are not obvious at first. Here's what each one means."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"voice-callback-events","__idx":1},"children":["Voice callback events"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When something happens to a call on the Sinch network, Sinch sends an HTTP callback to your Function. There are four of them, and together they describe the call's lifecycle."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"ice--incoming-call-event","__idx":2},"children":["ICE — Incoming Call Event"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fired when a phone call arrives at one of your Sinch phone numbers. Your function responds with ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#svaml"},"children":["SVAML"]}," to decide what happens next: play a message, connect to another number, run a menu, record, bridge to SIP, etc."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["ICE is where most Functions do their work."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"ace--answered-call-event","__idx":3},"children":["ACE — Answered Call Event"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fired when an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["outbound"]}," call you initiated is answered. Use this to start doing something once the other party picks up — play a message, start a conference, run an IVR on the callee."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"pie--prompt-input-event","__idx":4},"children":["PIE — Prompt Input Event"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fired when a menu interaction completes. The caller pressed a DTMF digit (or said something that was recognized), and the menu you started via SVAML returned a result. You get the result and respond with the next SVAML step."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"dice--disconnected-call-event","__idx":5},"children":["DICE — Disconnected Call Event"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Fired when the call ends. Informational only — use it for logging, billing, cleanup."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"typical-lifecycle","__idx":6},"children":["Typical lifecycle"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"Inbound call:   ICE → (optional PIE loop for menus) → DICE\nOutbound call:  ACE → (optional PIE loop)            → DICE\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"svaml--sinch-voice-application-markup-language","__idx":7},"children":["SVAML — Sinch Voice Application Markup Language"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A JSON format for controlling calls. When your Function responds to an ICE callback, you return SVAML telling Sinch what to do: \"say this message\", \"play this audio\", \"connect to this number\", \"run this menu\", and so on."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Both runtimes provide fluent builders so you never write raw JSON:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Node:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["new IceSvamlBuilder().say('Hello').connectPstn('+15551234567').build()"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["C#:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["new IceSvamletBuilder().Instructions.Say(\"Hello\").Action.ConnectPstn(\"+15551234567\").Build()"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/functions/reference/svaml-cheatsheet"},"children":["SVAML cheat sheet"]}," for the most-used actions, or the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/voice/api-reference/svaml/"},"children":["full SVAML spec on developers.sinch.com"]}," for every action and option."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"voice-app","__idx":8},"children":["Voice App"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A configuration entity in Sinch that owns your voice functionality. A Voice App has:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["application key + secret"]}," (authentication)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Callback URLs"]}," — where Sinch sends ICE, ACE, PIE, DICE events"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Assigned phone numbers that route calls to it"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you deploy a Function that handles voice, the CLI can update the Voice App's callback URL to point at your Function's new URL. That linking is managed via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch.json"]}," in your project."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"conversation-app","__idx":9},"children":["Conversation App"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The multi-channel messaging equivalent of a Voice App. A Conversation App has:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["App ID"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Channel credentials"]}," (WhatsApp Business Account, Messenger page token, Viber credentials, etc.)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Webhook URL"]}," — where Sinch posts incoming messages and delivery events"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["One Conversation App can handle many channels simultaneously. SMS, WhatsApp, Messenger, Viber, RCS, MMS all go through the same webhook."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"sinch-dashboard","__idx":10},"children":["Sinch Dashboard"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The web-based control surface for your Sinch account, at ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://dashboard.sinch.com"},"children":["dashboard.sinch.com"]},". It's where you:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create and manage Projects"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Issue and rotate API keys"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure Voice Apps and Conversation Apps"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Buy, manage, and release phone numbers"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["View usage, billing, and logs"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Sinch CLI is the terminal-side complement to the Dashboard — everything the CLI does goes through the same underlying APIs, so work done in either place shows up in the other."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"project-project-id","__idx":11},"children":["Project (Project ID)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The top-level tenant in your Sinch account. Everything — Voice Apps, Conversation Apps, phone numbers, API credentials — belongs to a Project. Find your Project ID in the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://dashboard.sinch.com"},"children":["Sinch Dashboard"]}," under Settings."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Most CLI commands need a Project ID to know which account to operate on; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch auth login"]}," stores it for you."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"functioncontext","__idx":12},"children":["FunctionContext"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The object your handler receives as its first parameter. It gives you cache, storage, config, logger, and pre-wired SDK clients for Voice, Conversation, SMS, and Numbers. Think of it as \"the standard library of the Sinch runtime.\" See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#"},"children":["context-object"]}," for the full tour."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"handler","__idx":13},"children":["Handler"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A function (Node) or controller method (C#) that Sinch invokes over HTTP."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Voice callbacks"]}," map to specific handler names: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ice"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ace"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pie"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dice"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom HTTP endpoints"]}," map by URL path — export a function named ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," and it's available at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /status"]},". (Node.) Or add a controller action in C#."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#"},"children":["handlers"]}," for how the mapping works."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"template","__idx":14},"children":["Template"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A pre-built starting point for a Function. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch templates list"]}," shows what's available; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch functions init <template>"]}," scaffolds a new directory with working code. Examples include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["simple-voice-ivr"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sms-responder"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ai-voice-agent"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Templates are published by the Sinch team and fetched by the CLI on demand — you always get the latest versions when you run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch templates list"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch functions init"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"tunnel","__idx":15},"children":["Tunnel"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A public URL that points to your local ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch functions dev"]}," process. Sinch can't reach ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["localhost"]},", so when you're developing, the CLI opens a Cloudflare Tunnel (or similar) that exposes your laptop to the internet for the duration of the session."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch functions dev"]}," exits, the tunnel closes and any Voice App callback URLs the CLI touched are reverted."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"dev-vs-prod-runtime-package","__idx":16},"children":["Dev vs Prod runtime package"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Function runtime has two flavors of each package:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Dev package"]}," — what you develop against locally. Cache is in-memory, storage is the local filesystem, the database is a plain SQLite file."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Prod package"]}," — swapped in at deploy time. Cache is persistent and shared across invocations, storage is durable cloud-backed, and the SQLite database is continuously backed up."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You never reference the prod package directly. The build pipeline handles the swap. Your code imports from the dev package and runs unchanged in production."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"sinchjson","__idx":17},"children":["sinch.json"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The project manifest for a Function. Defines its name, runtime, variables, template metadata, and (if the function handles voice or messaging) which Voice App or Conversation App it's bound to. The CLI reads this file when you run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch functions dev"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch functions deploy"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Secrets are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," declared in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch.json"]}," — they live in the OS keychain under the function name and are injected into the deployed runtime as environment variables. Manage them with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sinch secrets add"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"assets","__idx":18},"children":["Assets"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Files you ship alongside your code that the runtime can read at request time — prompts (WAV, MP3), JSON data, templates. Access them with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["context.assets('filename.wav')"]}," rather than ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fs.readFileSync"]}," (which won't find them in production)."]}]},"headings":[{"value":"Glossary","id":"glossary","depth":1},{"value":"Voice callback events","id":"voice-callback-events","depth":2},{"value":"ICE — Incoming Call Event","id":"ice--incoming-call-event","depth":3},{"value":"ACE — Answered Call Event","id":"ace--answered-call-event","depth":3},{"value":"PIE — Prompt Input Event","id":"pie--prompt-input-event","depth":3},{"value":"DICE — Disconnected Call Event","id":"dice--disconnected-call-event","depth":3},{"value":"Typical lifecycle","id":"typical-lifecycle","depth":3},{"value":"SVAML — Sinch Voice Application Markup Language","id":"svaml--sinch-voice-application-markup-language","depth":2},{"value":"Voice App","id":"voice-app","depth":2},{"value":"Conversation App","id":"conversation-app","depth":2},{"value":"Sinch Dashboard","id":"sinch-dashboard","depth":2},{"value":"Project (Project ID)","id":"project-project-id","depth":2},{"value":"FunctionContext","id":"functioncontext","depth":2},{"value":"Handler","id":"handler","depth":2},{"value":"Template","id":"template","depth":2},{"value":"Tunnel","id":"tunnel","depth":2},{"value":"Dev vs Prod runtime package","id":"dev-vs-prod-runtime-package","depth":2},{"value":"sinch.json","id":"sinchjson","depth":2},{"value":"Assets","id":"assets","depth":2}],"frontmatter":{"seo":{"title":""}},"lastModified":"2026-04-15T14:23:23.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/functions/concepts/glossary","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}