Call Control

Write the markup.The call follows it.

Script what happens on a call with simple markup your server returns. Play a prompt, gather digits, dip into your own API and route to a queue, one instruction at a time. Voice only, versioned v0.x.

call-control.jsonanswer-URL response
// your answer URL returns
{ "instructions": [
{ "play": { "text": "Welcome to Acme support." } },
{ "gather": { "num_digits": 1, "timeout": 6,
"action_url": "https://your.app/menu" } },
{ "dial": { "queue": "support" } }
] }

The same document as a flow: TelVox fetches your answer URL, then runs each instruction in order. Play speaks the prompt, gather collects a digit, dial sends the caller to the support queue.

now executing · answer_url

When a call connects, TelVox fetches your answer URL. The JSON document it returns is the flow: each instruction runs as a node in the same 12-node IVR engine that TelVox Dial ships.

The primitive catalog

Twelve nodes, composable from code.

The call-control document is a list of instructions. Each one maps to a real node in the engine, so what you can draw in the visual builder you can also express programmatically.

menucollect / gatherplaybusiness-hoursapi_callqueueagentvoicemailcallbacktransferconditionhangup
play · gather

Play and gather

Speak prompts and collect DTMF input. The play and gather primitives map straight to the engine's play and collect nodes, so a menu takes a handful of instructions.

api_call

Live data-dip

Call your own API mid-call and branch on the answer. The api_call node fetches account context and the condition node routes on it, so a flow personalizes without leaving the call.

queue

ACD queues

Enqueue callers and distribute to agents with FIFO or longest-idle selection, music on hold, max-wait and max-size limits, and overflow audio. It's the real Redis-backed queue engine.

dial

Conference and bridge

Bridge legs together or drop callers into a conference. Built on the same ARI snoop-and-bridge that powers Dial's supervisor barge, transfer and conference.

transfer · callback

Transfer and callback

Hand a call to another number, agent or flow, or schedule a callback so a caller keeps their place without holding the line. Both are shipped IVR nodes.

voicemail · business-hours

Voicemail and business hours

Route to voicemail after hours and gate flows on a business-hours schedule. The voicemail and business-hours nodes are first-class in the engine.

Live data-dip

Look up, then route, mid-call.

The api_call node fetches context from your own systems while the caller waits, and the condition node branches on it. Personalize a flow without bouncing the caller out of the call.

api_call nodeoutbound data-dip
// api_call node: branch on an external API mid-call
{
  "api_call": {
    "method": "GET",
    "url": "https://your.app/crm/lookup",
    "query": { "phone": "{{call.from}}" },
    "timeout": 4,
    "save_as": "account"
  }
}
condition nodebranch on result
// branch on what came back
{
  "condition": {
    "when": "{{account.tier}} == 'gold'",
    "then": { "dial": { "queue": "priority" } },
    "else": { "dial": { "queue": "support" } }
  }
}

Honest about what's shipped

Real engine today. Programmable markup in preview.

These flows run today on Dial's visual IVR builder, the Redis-backed ACD queue and the ARI bridge and conference engine. The JSON call-control API is versioned v0.x, and the declarative VoxML markup dialect is roadmap only. Every artifact here is illustrative and may differ at GA.

Queues and conferences have their own reference resources: see the Queue & Members reference and the Conference & Queue reference.

voxml.xmlroadmap
<!-- VoxML markup: ROADMAP, illustrative only -->
<Response>
  <Play>Welcome to Acme support.</Play>
  <Gather numDigits="1" timeout="6"
          action="https://your.app/menu" />
  <Dial>
    <Queue>support</Queue>
  </Dial>
</Response>

Questions

Call control FAQ

Straight answers on the markup, the engine underneath it, and what's preview versus shipped.

The JSON call-control document is the primary, preview model: your answer URL returns an instructions array (play, gather, dial, record, hangup) and TelVox executes it. VoxML is a declarative XML markup dialect, the genre convention familiar from other CPaaS platforms, and it's roadmap only. Both are illustrative until GA.

Get started

Build the flow your product needs.

Sign up and we'll map your IVR, queue and conference flows onto the call-control primitives.