Voice API

Explore Twilio’s Programmable Voice API and create custom call experiences with speech recognition, call recording, conference calling and more.

Try 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.

Demo available in the U.S. and Canada.

<?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);
// 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
// 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());
  }
}
// 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);
  }
}

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.

<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.

<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.

<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.

<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.

<Response>
  <Dial>
    <Number
      statusCallbackEvent="initiated ringing answered completed"
      statusCallback="https://myapp.com/calls/events"
      statusCallbackMethod="POST">
        +14158675309
    </Number>
  </Dial>
</Response>

The Twilio Advantage

Chat bubble with globe

Communicate reliably

Experience a 99.95% uptime SLA made possible with automated failover and zero maintenance windows.

Planet Earth

Operate at scale

Extend the same app you write once to new markets with configurable features for localization and compliance.

Network

Many channels

Use the same platform you know for voice, SMS, video, chat, two-factor authentication, and more.

Checkmark

No shenanigans

Get to market faster with pay‑as‑you‑go pricing, free support, and the freedom to scale up or down without contracts.