<Response>
TelVox Connect · Programmable voice
Phone calls ina few lines of XML.
Phone calls in a few lines of XML.Return Twilio-style XML from your server and Connect runs it on a live call: say, play, gather, dial, record and enqueue.
Events show up here: each verb, each request to your server, each status callback.
+91 22 4000 1234
Ready
Call this number and Connect runs your XML.
Press Place test call, edit the XML, or pick another example.
</Response>
The verbs
Nine verbs and four nouns, live today.
Pick one to see what it takes and what behaves differently. The dashed ones aren't built yet. Better you read that here than find it in production.
Not built yet
Redirect
jump to another URL
Connect
media streams
Stream
live audio out
Refer
SIP REFER
Pay
card capture
Leave
leave a queue
Client
Dial an app user
Echo
echo test
<Gather>
liveAsks a question and collects the digits the caller presses.
- numDigits
- digits to collect, default 1
- timeout
- seconds to wait, default 5
- action
- your URL that gets the digits
- Keypad (DTMF) only. No speech input yet.
- The digits reach your action URL as JSON: { "digit": "1" }.
- Gather ends the document. Put what comes next in your action's reply.
<Response>
<Gather numDigits="1" action="/menu" timeout="6">
<Say>Press 1 for sales, or 2 for support.</Say>
</Gather>
</Response>Moving from Twilio
Your XML comes with you. Here's the rest of the diff.
Carries over as is
- Your <Response> documents built from the nine verbs, including a Say inside Gather and the nouns inside Dial.
- Status callbacks with the same field names: CallSid, CallStatus, Direction, From, To, Duration and the rest.
- Dial results on your action URL: DialCallStatus, DialCallDuration and RecordingUrl.
- Conference settings like beep, muted, startConferenceOnEnter and endConferenceOnExit.
Change these
- 01Start calls with our REST API.A Bearer key and three fields: to, from and url. Twilio's helper libraries won't connect to it.
- 02Read webhook bodies as JSON.Gather sends { "digit": "1" }, not a Digits form field.
- 03Gather is keypad only, and it ends the document.Put what happens next in your action's reply. On a timeout it posts an empty digit.
- 04Record is silent unless you ask for the beep.Add playBeep="true".
- 05Dial records from answer by default.Add record="do-not-record" when you don't want a recording.
- 06Some verbs aren't built yet.Redirect, Stream, Connect, Pay and the other dashed tiles above.
// webhooks arrive as JSON+app.use(express.json());app.post("/menu", (req, res) => {- const choice = req.body.Digits;+ const choice = req.body.digit;res.type("text/xml").send(menuFor(choice)); // your XML, unchanged});// starting a call-await client.calls.create({ to, from, url });+await fetch(`${TELVOX_API}/api/calls`, {+ method: "POST",+ headers: { Authorization: `Bearer ${TELVOX_KEY}`, "Content-Type": "application/json" },+ body: JSON.stringify({ to, from, url }),+});
That's a typical Node app. The XML your handlers send back doesn't change.
Beyond the markup
Everything a voice app needs around the call.
Starting fresh
Your first call in three steps.
- 1Get your API keySign up and you get a key for the REST API and a dashboard.
- 2Claim a numberPick one from the pool in your dashboard and set its voice URL to your server.
- 3Answer with XMLWhen someone calls, Connect asks your URL what to do. Reply with a <Response>.
app.post("/voice", (req, res) => { res.type("text/xml").send(` <Response> <Say>Hello from TelVox Connect.</Say> </Response>`); });
Then call your number. Full walkthrough in the quickstart.
Bring your call flows. Pay by the second.
Usage pricing, billed by the second. See the rate card, or tell us your volume and we'll price it with you.
Questions
What developers ask first.
For call flows, it's close. XML built from the nine live verbs runs as written. The REST API and the webhook bodies are different, and some verbs aren't built yet. The diff on this page lists every change.
Twilio and TwiML are trademarks of Twilio Inc. TelVox isn't affiliated with Twilio.