Voice API
Explore Twilio’s Programmable Voice API and create custom call experiences with speech recognition, call recording, conference calling and more.
Sign up and start buildingTry a phone call from the Voice API
When you start the phone call, this code makes a request to the Twilio Voice API providing both a phone number to call, and a server location that will provide TwiML instructions on how to route the phone call.
This call logic relies on a number of TwiML verbs including <Say> to speak audio to the caller, <Gather> to take dialpad input from the user, and <Play> to play audio back to the user.
Demo available in the U.S. and Canada.
- PHP
- Node
- Python
- Ruby
- Java
- .NET (C#)
<?php
// Update the path below to your autoload.php,
// see https://getcomposer.org/doc/01-basic-usage.md
require_once '/path/to/vendor/autoload.php';
use Twilio\Rest\Client;
// Your Account Sid and Auth Token from twilio.com/console
$sid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$token = "your_auth_token";
$twilio = new Client($sid, $token);
$call = $twilio->calls
->create("+15558675310", // to
"+15017122661", // from
array("url" => "http://demo.twilio.com/docs/voice.xml")
);
print($call->sid);
// Install the C# / .NET helper library from twilio.com/docs/csharp/install
using System;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
class Program
{
static void Main(string[] args)
{
// Find your Account Sid and Token at twilio.com/console
const string accountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const string authToken = "your_auth_token";
TwilioClient.Init(accountSid, authToken);
var call = CallResource.Create(
url: new Uri("http://demo.twilio.com/docs/voice.xml"),
to: new Twilio.Types.PhoneNumber("+15558675310"),
from: new Twilio.Types.PhoneNumber("+15017122661")
);
Console.WriteLine(call.Sid);
}
}
// Install the Java helper library from twilio.com/docs/java/install
import com.twilio.Twilio;
import com.twilio.rest.api.v2010.account.Call;
import com.twilio.type.PhoneNumber;
import java.net.URI;
public class Example {
// Find your Account Sid and Token at twilio.com/console
public static final String ACCOUNT_SID = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
public static final String AUTH_TOKEN = "your_auth_token";
public static void main(String[] args) {
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
Call call = Call.creator(
new com.twilio.type.PhoneNumber("+15558675310"),
new com.twilio.type.PhoneNumber("+15017122661"),
URI.create("http://demo.twilio.com/docs/voice.xml"))
.create();
System.out.println(call.getSid());
}
}
// Download the helper library from https://www.twilio.com/docs/node/install
// Your Account Sid and Auth Token from twilio.com/console
const accountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const authToken = "your_auth_token";
const client = require("twilio")(accountSid, authToken);
client.calls
.create({
url: "http://demo.twilio.com/docs/voice.xml",
to: "+15558675310",
from: "+15017122661",
})
.then((call) => console.log(call.sid))
.done();
# Download the helper library from https://www.twilio.com/docs/python/install
from twilio.rest import Client
# Your Account Sid and Auth Token from twilio.com/console
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
client = Client(account_sid, auth_token)
call = client.calls.create(
url='http://demo.twilio.com/docs/voice.xml',
to='+15558675310',
from_='+15017122661'
)
print(call.sid)
# Download the helper library from https://www.twilio.com/docs/ruby/install
require 'rubygems'
require 'twilio-ruby'
# Your Account Sid and Auth Token from twilio.com/console
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
@client = Twilio::REST::Client.new(account_sid, auth_token)
call = @client.calls.create(
url: 'http://demo.twilio.com/docs/voice.xml',
to: '+15558675310',
from: '+15017122661'
)
puts call.sid
Powerful Voice API primitives
Programmatic call control
Your app instructs Twilio in real time on how a call should proceed — build nearly any workflow you can imagine.
View Voice API docs<Response> <Play>/ahoy.mp3</Play> <Dial action="/forward"> +15551234456 </Dial> </Response>
<Say> text and <Gather> keypad input
The basics of most call flows start with the ability to speak strings of text and gather DTMF keypad input.
View Docs<Response> <Gather action="/process-keypad-input"> <Say language="en-gb"> Ahoy! Choose an option. For Sales press 1. For Support press 2. </Say> </Gather> </Response>
<Queue> and <Conference> built in
TwiML provides intelligent Conference and Queue primitives to take the heavy lifting out of building seamless call experiences.
View Docs<Response> <Dial> <Client>jenny</Client> </Dial> </Response>
<Dial> a WebRTC‑powered <Client>
Connect a call to a web or mobile app using the Twilio Client SDK. Your TwiML specifies to which client username to connect the call.
View Docs<Response> <Say language="en-gb"> Ahoy! Please hold while we connect you to an agent. </Say> <Queue url="/support-hold"> support-wait-queue </Queue> </Response>
Call progress notifications
Get webhooks notifying of call progress events as any call progresses through key events, such as Initiated, Ringing, Answered, and Completed.
View Docs<Response> <Dial> <Number statusCallbackEvent="initiated ringing answered completed" statusCallback="https://myapp.com/calls/events" statusCallbackMethod="POST"> +14158675309 </Number> </Dial> </Response>
The Twilio advantage
Communicate reliably
Experience a 99.95% uptime SLA made possible with automated failover and zero maintenance windows.
Operate at scale
Extend the same app you write once to new markets with configurable features for localization and compliance.
Many channels
Use the same platform you know for voice, SMS, video, chat, two-factor authentication, and more.
No shenanigans
Get to market faster with pay‑as‑you‑go pricing, free support, and the freedom to scale up or down without contracts.
Not ready yet? Talk to an expert