Call Control
Write the markup.The call follows it.
Script what happens on a call with the Twilio-style XML your server returns. Say a prompt, gather digits, look the caller up in your own systems and route to a queue, one verb at a time. Voice only, versioned v0.x.
<!-- your answer URL returns --><Response><Say>Welcome to Acme support.</Say><Gather numDigits="1" timeout="6"action="https://your.app/menu" /><Dial><Queue>support</Queue></Dial></Response>
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 <Response> it returns is the flow, and each verb runs on the same IVR and queue engine that TelVox Dial ships.
Try it
Call in. Press a key.
Hear the menu, press 1 or 2, and watch your instructions run one at a time, then hand the call to the right queue.
<!-- your answer URL returns --><Response><Gather numDigits="1" timeout="6" action="https://your.app/menu"><Say>Welcome to Acme. Press 1 for sales, 2 for support.</Say></Gather><Dial><Queue>support</Queue></Dial></Response>
When the caller presses a key, the digit is POSTed to your action URL and the XML you reply with decides what happens next.
The primitive catalog
The verbs, on a real engine.
Your XML is a list of verbs that runs top to bottom. Underneath is the engine behind Dial's visual IVR builder and its twelve node types, below.
Say, play and gather
Speak prompts, play audio and collect the keys a caller presses. A menu is a Gather with a Say inside it.
Live data-dip
Your answer URL gets the caller's number before you reply, and Gather's action URL gets each key press. Look the caller up in your own systems and answer with different XML.
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.
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 and callback
Hand a call to another number or SIP endpoint with Dial. Callbacks, so a caller keeps their place without holding the line, are a shipped node in Dial's IVR builder.
Voicemail and business hours
Take a voicemail with Record, and gate flows on business hours: your server checks the time and answers with the right XML, or use the business-hours node in Dial's builder.

Live data-dip
Look up, then route, mid-call.
Your answer URL gets the caller's number before you reply. Look them up in your own systems and answer with different XML, so the flow is personal before the first word is spoken.
// your answer URL: look the caller up, then answer
app.post("/voice/answer", async (req, res) => {
const account = await crm.lookup(req.body.from); // the caller's number
const queue = account?.tier === "gold" ? "priority" : "support";
res.type("text/xml").send(`<Response>
<Say>Thanks for calling Acme.</Say>
<Dial><Queue>${queue}</Queue></Dial>
</Response>`);
});<!-- what a gold-tier caller gets -->
<Response>
<Say>Thanks for calling Acme.</Say>
<Dial>
<Queue>priority</Queue>
</Dial>
</Response>Honest about what's shipped
Real engine today. The XML is live.
Connect runs your XML today, on the same engine as Dial's visual IVR builder, the Redis-backed ACD queue and the ARI bridge and conference engine. The public API is versioned v0.x, and the verb table shows exactly which verbs and attributes are live and which aren't built yet. The samples here are illustrative.
Queues and conferences have their own reference resources: see the Queue & Members reference and the Conference & Queue reference.
<!-- your answer URL returns -->
<Response>
<Gather numDigits="1" timeout="6"
action="https://your.app/menu">
<Say>Welcome to Acme support.</Say>
</Gather>
<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.
Yes. Your answer URL returns a <Response> with verbs like Say, Play, Gather, Dial, Record and Enqueue, and Connect runs it on a live call. The API is versioned v0.x, and a few verbs and attributes behave differently or aren't built yet: the verb table on the Connect home page lists each one.
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.