Tests Gem Version Learn with TwilioQuest


The documentation for the Twilio API can be found here.

The individual releases here.


twilio-ruby uses a modified version of Semantic Versioning for all changes. See this document for details.

Supported Ruby Versions

This library supports the following Ruby implementations:

  • Ruby 2.4
  • Ruby 2.5
  • Ruby 2.6
  • Ruby 2.7
  • Ruby 3.0
  • Ruby 3.1
  • Ruby 3.2

  • JRuby 9.2

  • JRuby 9.3

  • JRuby 9.4

Migrating from 5.x

Upgrade Guide


To install using Bundler grab the latest stable version:

gem 'twilio-ruby', '~> 6.7.0'

To manually install twilio-ruby via Rubygems simply gem install:

gem install twilio-ruby -v 6.7.0

To build and install the development branch yourself from the latest source:

git clone [email protected]:twilio/twilio-ruby.git
cd twilio-ruby
make install

Info If the command line gives you an error message that says Permission Denied, try running the above commands with sudo.

For example: sudo gem install twilio-ruby

Test your installation

To make sure the installation was successful, try sending yourself an SMS message, like this:

require "twilio-ruby"

# Your Account SID and Auth Token from
auth_token = "your_auth_token"

@client = account_sid, auth_token
message = @client.messages.create(
  body: "Hello from Ruby",
  to: "+12345678901",  # Text this number
  from: "+15005550006", # From a valid Twilio number

puts message.sid

Warning It's okay to hardcode your credentials when testing locally, but you should use environment variables to keep them secret before committing any code or deploying to production. Check out How to Set Environment Variables for more information.


Authenticate the Client

require 'twilio-ruby'

# Your Account SID and Auth Token from
 = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'

# Initialize the Twilio Client with your credentials
@client = , auth_token

Use An API Key

require 'twilio-ruby'

# Your Account SID from
 = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# API Key from
api_key_sid = 'zzzzzzzzzzzzzzzzzzzzzz'
api_key_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'

# set up a client to talk to the Twilio REST API using an API Key
@client = api_key_sid, api_key_secret, 

Specify a Region and/or Edge

To take advantage of Twilio's Global Infrastructure, specify the target Region and/or Edge for the client:

# set up a client to talk to the Twilio REST API over a specific region and edge
@client = , auth_token, nil, 'au1'
@client.edge = 'sydney'

# you may also specify the region and/or edge after client creation
@client = , auth_token
@client.region = 'au1'
@client.edge = 'sydney'

This will result in the hostname transforming from to

Make a Call

  from: '+14159341234',
  to: '+16105557069',
  url: ''

Send an SMS

  from: '+14159341234',
  to: '+16105557069',
  body: 'Hey there!'

List your SMS Messages

@client.messages.list(limit: 20)

Fetch a single SMS message by Sid

# put the message sid you want to retrieve here:
message_sid = 'SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Iterate through records

The library automatically handles paging for you. Collections, such as calls and messages, have list and stream methods that page under the hood. With both list and stream, you can specify the number of records you want to receive (limit) and the maximum size you want each page fetch to be (page_size). The library will then handle the task for you.

list eagerly fetches all records and returns them as a list, whereas stream returns an enumerator and lazily retrieves pages of records as you iterate over the collection. You can also page manually using the page method.

For more information about these methods, view the auto-generated library docs.

require 'twilio-ruby'

auth_token = 'your_auth_token'

@client =, auth_token)

       .each do |call|
         puts call.direction

Enable Debug logging

In order to enable debug logging, pass in a 'logger' instance to the client with the level set to at least 'DEBUG'

@client = , auth_token
myLogger =
myLogger.level = Logger::DEBUG
@client.logger = myLogger

@client = , auth_token
myLogger ='my_log.log')
myLogger.level = Logger::DEBUG
@client.logger = myLogger

Handle Exceptions #exceptions

If the Twilio API returns a 400 or a 500 level HTTP response, the twilio-ruby library will throw a Twilio::REST::RestError. 400-level errors are normal during API operation (“Invalid number”, “Cannot deliver SMS to that number”, for example) and should be handled appropriately.

require 'twilio-ruby'

auth_token = 'your_auth_token'

@client = account_sid, auth_token

  messages = @client.messages.list(limit: 20)
rescue Twilio::REST::RestError => e
  puts e.message

Debug API requests

To assist with debugging, the library allows you to access the underlying request and response objects. This capability is built into the default HTTP client that ships with the library.

For example, you can retrieve the status code of the last response like so:

require 'rubygems' # Not necessary with ruby 1.9 but included for completeness
require 'twilio-ruby'

# Your Account SID and Auth Token from
auth_token = 'your_auth_token'

@client =, auth_token)

@message = @client.messages.create(
  to: '+14158675309',
  from: '+14258675310',
  body: 'Ahoy!'

# Retrieve the status code of the last response from the HTTP client
puts @client.http_client.last_response.status_code

Customize your HTTP Client

twilio-ruby uses Faraday to make HTTP requests. You can tell Twilio::REST::Client to use any of the Faraday adapters like so:

@client.http_client.adapter = :typhoeus

To use a custom HTTP client with this helper library, please see the advanced example of how to do so.

To apply customizations such as middleware, you can use the configure_connection method like so:

@client.http_client.configure_connection do |faraday|
  faraday.use SomeMiddleware

Get started With Client Capability Tokens

If you just need to generate a Capability Token for use with Twilio Client, you can do this:

require 'twilio-ruby'

# put your own account credentials here:
 = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'

# set up
capability = , auth_token

# allow outgoing calls to an application
outgoing_scope = 'AP11111111111111111111111111111111'

# allow incoming calls to 'andrew'
incoming_scope = 'andrew'

# generate the token string
@token = capability.to_s

There is a slightly more detailed document in the Capability section of the wiki.

Generate TwiML

To control phone calls, your application needs to output TwiML.

You can construct a TwiML response like this:

require 'twilio-ruby'

response = do |r|
  r.say(message: 'hello there', voice: 'alice')
  r.dial(caller_id: '+14159992222') do |d|
    d.client 'jenny'

# print the result
puts response.to_s

This will print the following (except for the whitespace):

<?xml version="1.0" encoding="UTF-8"?>
  <Say voice="alice">hello there</Say>
  <Dial callerId="+14159992222">

Docker Image

The Dockerfile present in this repository and its respective twilio/twilio-ruby Docker image are currently used by Twilio for testing purposes only.

Getting help

If you need help installing or using the library, please check the Twilio Support Help Center first, and file a support ticket if you don't find an answer to your question.

If you've instead found a bug in the library or would like new features added, go ahead and open issues or pull requests against this repo!