twilio 2.9.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. data/.gitignore +4 -1
  2. data/CHANGELOG.rdoc +27 -0
  3. data/Gemfile +4 -0
  4. data/README.rdoc +16 -6
  5. data/Rakefile +6 -46
  6. data/lib/twilio.rb +21 -6
  7. data/lib/twilio/account.rb +1 -1
  8. data/lib/twilio/available_phone_numbers.rb +56 -0
  9. data/lib/twilio/call.rb +4 -4
  10. data/lib/twilio/conference.rb +6 -6
  11. data/lib/twilio/incoming_phone_number.rb +16 -2
  12. data/lib/twilio/notification.rb +2 -2
  13. data/lib/twilio/outgoing_caller_id.rb +5 -4
  14. data/lib/twilio/recording.rb +2 -2
  15. data/lib/twilio/sms.rb +2 -2
  16. data/lib/twilio/twilio_object.rb +8 -5
  17. data/lib/twilio/version.rb +3 -0
  18. data/spec/fixtures/xml/account.xml +23 -0
  19. data/{test → spec}/fixtures/xml/account_renamed.xml +0 -0
  20. data/spec/fixtures/xml/available_phone_numbers_local.xml +26 -0
  21. data/spec/fixtures/xml/available_phone_numbers_local_search.xml +15 -0
  22. data/spec/fixtures/xml/available_phone_numbers_toll_free.xml +14 -0
  23. data/spec/fixtures/xml/available_phone_numbers_toll_free_search.xml +10 -0
  24. data/{test → spec}/fixtures/xml/call.xml +0 -0
  25. data/{test → spec}/fixtures/xml/call_new.xml +0 -0
  26. data/{test → spec}/fixtures/xml/call_redirected.xml +0 -0
  27. data/{test → spec}/fixtures/xml/calls.xml +0 -0
  28. data/{test → spec}/fixtures/xml/conference.xml +1 -1
  29. data/{test → spec}/fixtures/xml/conference_participant.xml +0 -0
  30. data/{test → spec}/fixtures/xml/conference_participant_muted.xml +0 -0
  31. data/{test → spec}/fixtures/xml/conference_participants.xml +0 -0
  32. data/{test → spec}/fixtures/xml/conferences.xml +0 -0
  33. data/{test → spec}/fixtures/xml/incoming_phone_number.xml +0 -0
  34. data/{test → spec}/fixtures/xml/incoming_phone_numbers.xml +0 -0
  35. data/{test → spec}/fixtures/xml/notification.xml +0 -0
  36. data/{test → spec}/fixtures/xml/notifications.xml +0 -0
  37. data/{test → spec}/fixtures/xml/outgoing_caller_id.xml +0 -0
  38. data/{test → spec}/fixtures/xml/outgoing_caller_id_new.xml +0 -0
  39. data/{test → spec}/fixtures/xml/outgoing_caller_ids.xml +0 -0
  40. data/{test → spec}/fixtures/xml/recording.xml +0 -0
  41. data/{test → spec}/fixtures/xml/recordings.xml +0 -0
  42. data/{test → spec}/fixtures/xml/sms.xml +0 -0
  43. data/{test → spec}/fixtures/xml/sms_messages.xml +0 -0
  44. data/{test → spec}/fixtures/xml/sms_new.xml +0 -0
  45. data/{test → spec}/fixtures/xml/sms_new_with_callback.xml +0 -0
  46. data/{test → spec}/fixtures/xml/transcription.xml +0 -0
  47. data/{test → spec}/fixtures/xml/transcriptions.xml +0 -0
  48. data/{test → spec}/fixtures/yml/verb_responses.yml +0 -0
  49. data/spec/spec_helper.rb +17 -0
  50. data/spec/support/twilio_helpers.rb +52 -0
  51. data/spec/twilio/account_spec.rb +21 -0
  52. data/spec/twilio/available_phone_numbers_spec.rb +53 -0
  53. data/spec/twilio/call_spec.rb +64 -0
  54. data/spec/twilio/conference_spec.rb +58 -0
  55. data/spec/twilio/incoming_phone_number_spec.rb +42 -0
  56. data/spec/twilio/live_connection_spec.rb +21 -0
  57. data/spec/twilio/notification_spec.rb +29 -0
  58. data/spec/twilio/outgoing_caller_id_spec.rb +43 -0
  59. data/spec/twilio/recording_spec.rb +44 -0
  60. data/spec/twilio/sms_spec.rb +36 -0
  61. data/spec/twilio/verb_spec.rb +235 -0
  62. data/twilio.gemspec +23 -111
  63. metadata +164 -82
  64. data/VERSION.yml +0 -5
  65. data/lib/twilio/connection.rb +0 -24
  66. data/lib/twilio/local_phone_number.rb +0 -26
  67. data/lib/twilio/toll_free_phone_number.rb +0 -26
  68. data/test/fixtures/xml/account.xml +0 -11
  69. data/test/test_helper.rb +0 -33
  70. data/test/twilio/account_test.rb +0 -28
  71. data/test/twilio/call_test.rb +0 -66
  72. data/test/twilio/conference_test.rb +0 -46
  73. data/test/twilio/connection_test.rb +0 -25
  74. data/test/twilio/incoming_phone_number_test.rb +0 -31
  75. data/test/twilio/local_phone_number_test.rb +0 -37
  76. data/test/twilio/notification_test.rb +0 -35
  77. data/test/twilio/outgoing_caller_id_test.rb +0 -45
  78. data/test/twilio/recording_test.rb +0 -47
  79. data/test/twilio/sms_test.rb +0 -27
  80. data/test/twilio/toll_free_phone_number_test.rb +0 -38
  81. data/test/twilio/verb_test.rb +0 -244
data/.gitignore CHANGED
@@ -2,4 +2,7 @@
2
2
  .DS_Store
3
3
  coverage
4
4
  rdoc
5
- pkg
5
+ *.gem
6
+ .bundle
7
+ Gemfile.lock
8
+ pkg/*
@@ -0,0 +1,27 @@
1
+ = Twilio Gem Changelog
2
+
3
+ == 3.0
4
+
5
+ * SSL validation (thanks Kyle Humberto)
6
+ * Available phone numbers search support (thanks Mark Turner)
7
+ * Deprecated Twilio::Connection method has been removed, use Twilio.connect(...)
8
+ * LocalPhoneNumber and TollFreeNumber have been removed to reflect API changes
9
+ * New phone numbers are now provisioned via the IncomingPhoneNumber class
10
+ * Several classes improved to avoid adding a stray "?" when no params were set
11
+ * Compatibility with 1.9.2 (and tested on 1.8.7 MRI and REE)
12
+ * Now uses Bundler, Rspec 2, and WebMock
13
+
14
+ == 2.9
15
+
16
+ * Compatibility with Twilio's 2010-04-01 API publish
17
+
18
+ == 2.8
19
+
20
+ * SMS callback URLs
21
+ * Ability to delete phone numbers
22
+
23
+ == 2.7
24
+
25
+ * SMS functionality
26
+
27
+ For earlier versions, see https://github.com/webficient/twilio/commits/master
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in twilio.gemspec
4
+ gemspec
@@ -4,8 +4,6 @@ The Twilio gem provides two major pieces of functionality: (1) a Ruby wrapper fo
4
4
 
5
5
  See http://www.twilio.com/docs/index for Twilio's API documentation.
6
6
 
7
- For an overview of the Twilio Gem and a sample use case, check out our cached blog entry: http://webcache.googleusercontent.com/search?q=cache:AejgwBra3fMJ:www.webficient.com/2009/06/22/hello-this-is-your-rails-app-calling-you+site:http://www.webficient.com/2009/06/22/hello-this-is-your-rails-app-calling-you&hl=en&gl=us&strip=1
8
-
9
7
  == Calling the Twilio REST API
10
8
 
11
9
  First set your credentials by calling the connect method:
@@ -36,14 +34,26 @@ and you can nest multiple verbs inside a block:
36
34
 
37
35
  == Installation
38
36
 
39
- sudo gem install twilio -s http://gemcutter.org
37
+ gem install twilio
40
38
 
41
- If you need to tweak the source code, clone this repository and do a rake build and rake install.
39
+ == Contributing
40
+
41
+ 1. Run 'bundle' from the command line to install dependencies
42
+ 2. Write test(s) for your patch
43
+ 3. Submit a pull request
44
+
45
+ Note: don't require 'rubygems' in any file (http://www.rubyinside.com/why-using-require-rubygems-is-wrong-1478.html)
42
46
 
43
47
  == Copyright
44
48
 
45
- Copyright (c) 2009-2010 Phil Misiowiec, Webficient LLC. See LICENSE for details.
49
+ Copyright (c) 2009-2011 Phil Misiowiec, Webficient LLC. See LICENSE for details.
46
50
 
47
51
  == Contributors
48
52
 
49
- Kyle Daigle, Yuri Gadow, Jonathan Rudenberg, Jeff Wigal, Alex K Wolfe
53
+ * Kyle Daigle
54
+ * Yuri Gadow
55
+ * Kyle Humberto
56
+ * Jonathan Rudenberg
57
+ * Mark Turner
58
+ * Jeff Wigal
59
+ * Alex K Wolfe
data/Rakefile CHANGED
@@ -1,49 +1,9 @@
1
- require 'rake'
2
-
3
- begin
4
- require 'jeweler'
5
- Jeweler::Tasks.new do |gem|
6
- gem.name = "twilio"
7
- gem.summary = %Q{Twilio API Client}
8
- gem.description = %Q{Twilio API wrapper}
9
- gem.email = "github@webficient.com"
10
- gem.homepage = "http://github.com/webficient/twilio"
11
- gem.authors = ["Phil Misiowiec", "Jonathan Rudenberg", "Alex K Wolfe", "Kyle Daigle", "Jeff Wigal", "Yuri Gadow"]
12
- gem.add_dependency 'builder', '>= 2.1.2'
13
- gem.add_dependency 'httparty', '>= 0.4.3'
14
- end
15
- rescue LoadError
16
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
- end
18
-
19
- require 'rake/rdoctask'
20
- Rake::RDocTask.new do |rdoc|
21
- rdoc.rdoc_dir = 'rdoc'
22
- rdoc.title = 'twilio'
23
- rdoc.options << '--line-numbers' << '--inline-source'
24
- rdoc.rdoc_files.include('README*')
25
- rdoc.rdoc_files.include('lib/**/*.rb')
26
- end
1
+ require 'bundler/setup'
2
+ Bundler::GemHelper.install_tasks
27
3
 
28
- require 'rake/testtask'
29
- Rake::TestTask.new(:test) do |test|
30
- test.libs << 'lib' << 'test'
31
- test.pattern = 'test/**/*_test.rb'
32
- test.verbose = false
33
- end
34
-
35
- begin
36
- require 'rcov/rcovtask'
37
- Rcov::RcovTask.new do |test|
38
- test.libs << 'test'
39
- test.pattern = 'test/**/*_test.rb'
40
- test.verbose = true
41
- end
42
- rescue LoadError
43
- task :rcov do
44
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
45
- end
46
- end
4
+ require 'rake'
5
+ require 'rspec/core/rake_task'
47
6
 
7
+ RSpec::Core::RakeTask.new
48
8
 
49
- task :default => :test
9
+ task :default => :spec
@@ -23,16 +23,31 @@
23
23
 
24
24
  require 'httparty'
25
25
  require 'builder'
26
+
26
27
  require 'twilio/twilio_object'
28
+
27
29
  require 'twilio/account'
30
+ require 'twilio/available_phone_numbers'
28
31
  require 'twilio/call'
29
- require 'twilio/sms'
30
- require 'twilio/connection'
32
+ require 'twilio/conference'
31
33
  require 'twilio/incoming_phone_number'
32
- require 'twilio/local_phone_number'
33
34
  require 'twilio/notification'
34
35
  require 'twilio/outgoing_caller_id'
35
36
  require 'twilio/recording'
36
- require 'twilio/toll_free_phone_number'
37
- require 'twilio/conference'
38
- require 'twilio/verb'
37
+ require 'twilio/sms'
38
+ require 'twilio/verb'
39
+
40
+ module Twilio
41
+ include HTTParty
42
+ TWILIO_URL = "https://api.twilio.com/2010-04-01/Accounts"
43
+ SSL_CA_PATH = "/etc/ssl/certs"
44
+
45
+ # The connect method caches your Twilio account id and authentication token
46
+ # Example:
47
+ # Twilio.connect('AC309475e5fede1b49e100272a8640f438', '3a2630a909aadbf60266234756fb15a0')
48
+ def self.connect(account_sid, auth_token)
49
+ self.base_uri "#{TWILIO_URL}/#{account_sid}"
50
+ self.basic_auth account_sid, auth_token
51
+ self.default_options[:ssl_ca_path] ||= SSL_CA_PATH unless self.default_options[:ssl_ca_file]
52
+ end
53
+ end
@@ -2,7 +2,7 @@ module Twilio
2
2
  # The Account resource represents your Twilio Account.
3
3
  class Account < TwilioObject
4
4
  def get
5
- Twilio.get('')
5
+ Twilio.get('')
6
6
  end
7
7
 
8
8
  def update_name(name)
@@ -0,0 +1,56 @@
1
+ module Twilio
2
+ # An AvailablePhoneNumbers resources represents the available phone numbers
3
+ # that Twilio can provide you based on your search criteria. The valid
4
+ # query terms are outlined in the search methods.
5
+ # Example:
6
+ # Twilio.connect('my_twilio_sid', 'my_auth_token')
7
+ # Twilio.AvailablePhoneNumbers.search_local(:area_code => 541)
8
+ class AvailablePhoneNumbers < TwilioObject
9
+
10
+ # The Search method handles the searching of both local and toll-free
11
+ # numbers.
12
+ def search(opts={})
13
+ iso_country_code = opts[:iso_country_code] || 'US'
14
+ resource = opts.delete(:resource)
15
+
16
+ params = {
17
+ :AreaCode => opts[:area_code],
18
+ :InPostalCode => opts[:postal_code],
19
+ :InRegion => opts[:in_region],
20
+ :Contains => opts[:contains],
21
+ :NearLatLong => opts[:near_lat_long],
22
+ :NearNumber => opts[:near_number],
23
+ :InLata => opts[:in_lata],
24
+ :InRateCenter => opts[:in_rate_center],
25
+ :Distance => opts[:distance]
26
+ }.reject {|k,v| v == nil} unless opts.empty?
27
+
28
+ Twilio.get("/AvailablePhoneNumbers/#{iso_country_code}/#{resource}", :query => params)
29
+ end
30
+
31
+ # The search_local method searches for numbers in local areas (i.e. state, zip, etc..)
32
+ # Search Options:
33
+ # :area_code
34
+ # :postal_code
35
+ # :in_region
36
+ # :contains
37
+ # :near_lat_long
38
+ # :near_number
39
+ # :in_lata
40
+ # :in_rate_center
41
+ # :distance
42
+ def search_local(opts ={})
43
+ opts = {:resource => 'Local'}.merge(opts)
44
+ search(opts)
45
+ end
46
+
47
+ # The search_toll_free method searches for available toll-free numbers
48
+ # Search Options
49
+ # :contains
50
+ def search_toll_free(opts ={})
51
+ opts = {:resource => 'TollFree'}.merge(opts)
52
+ search(opts)
53
+ end
54
+ end
55
+ end
56
+
@@ -6,12 +6,12 @@ module Twilio
6
6
  # Example:
7
7
  # Twilio.connect('my_twilio_sid', 'my_auth_token')
8
8
  # Twilio::Call.make(CALLER_ID, user_number, 'http://myapp.com/twilio_response_handler')
9
- def make(from, to, url, optional = {})
10
- Twilio.post("/Calls", :body => {:From => from, :To => to, :Url => url}.merge(optional))
9
+ def make(from, to, url, opts = {})
10
+ Twilio.post("/Calls", :body => {:From => from, :To => to, :Url => url}.merge(opts))
11
11
  end
12
12
 
13
- def list(optional = {})
14
- Twilio.get("/Calls", :query => optional)
13
+ def list(opts = {})
14
+ Twilio.get("/Calls", :query => (opts.empty? ? nil : opts))
15
15
  end
16
16
 
17
17
  def get(call_sid)
@@ -4,20 +4,20 @@ module Twilio
4
4
  # a Conference Instance Resource is created to represent the conference room
5
5
  # and a Participant Instance Resource is created to represent the caller who joined.
6
6
  class Conference < TwilioObject
7
- def list(optional = {})
8
- Twilio.get("/Conferences", :query => optional)
7
+ def list(opts = {})
8
+ Twilio.get("/Conferences", :query => (opts.empty? ? nil : opts))
9
9
  end
10
10
 
11
11
  def get(conference_sid)
12
- Twilio.get("/Conferences/#{conference_sid}")
12
+ Twilio.get("/Conferences/#{conference_sid}")
13
13
  end
14
14
 
15
- def participants(conference_sid, optional = {})
16
- Twilio.get("/Conferences/#{conference_sid}/Participants", :query => optional)
15
+ def participants(conference_sid, opts = {})
16
+ Twilio.get("/Conferences/#{conference_sid}/Participants", :query => (opts.empty? ? nil : opts))
17
17
  end
18
18
 
19
19
  def participant(conference_sid, call_sid)
20
- Twilio.get("/Conferences/#{conference_sid}/Participants/#{call_sid}")
20
+ Twilio.get("/Conferences/#{conference_sid}/Participants/#{call_sid}")
21
21
  end
22
22
 
23
23
  def mute_participant(conference_sid, call_sid)
@@ -5,12 +5,26 @@ module Twilio
5
5
  # Twilio.connect('my_twilio_sid', 'my_auth_token')
6
6
  # Twilio::IncomingPhoneNumber.list
7
7
  class IncomingPhoneNumber < TwilioObject
8
- def list(optional = {})
9
- Twilio.get("/IncomingPhoneNumbers", :query => optional)
8
+ def list(opts = {})
9
+ Twilio.get("/IncomingPhoneNumbers", :query => (opts.empty? ? nil : opts))
10
10
  end
11
11
 
12
12
  def get(incoming_sid)
13
13
  Twilio.get("/IncomingPhoneNumbers/#{incoming_sid}")
14
14
  end
15
+
16
+ # Creates a phone number in Twilio. You must first find an existing number using
17
+ # the AvailablePhoneNumber class before creating one here.
18
+ #
19
+ # Required: you must either set PhoneNumber or AreaCode as a required option
20
+ # For additional options, see http://www.twilio.com/docs/api/rest/incoming-phone-numbers
21
+ def create(opts)
22
+ raise "You must set either :PhoneNumber or :AreaCode" if !opts.include?(:AreaCode) && !opts.include?(:PhoneNumber)
23
+ Twilio.post("/IncomingPhoneNumbers", :body => opts)
24
+ end
25
+
26
+ def delete(incoming_sid)
27
+ Twilio.delete("/IncomingPhoneNumbers/#{incoming_sid}")
28
+ end
15
29
  end
16
30
  end
@@ -5,8 +5,8 @@ module Twilio
5
5
  # Twilio.connect('my_twilio_sid', 'my_auth_token')
6
6
  # Twilio::Notification.list
7
7
  class Notification < TwilioObject
8
- def list(optional = {})
9
- Twilio.get('/Notifications', :query => optional)
8
+ def list(opts = {})
9
+ Twilio.get('/Notifications', :query => (opts.empty? ? nil : opts))
10
10
  end
11
11
 
12
12
  def get(notification_sid)
@@ -5,16 +5,17 @@ module Twilio
5
5
  # Twilio.connect('my_twilio_sid', 'my_auth_token')
6
6
  # Twilio::OutgoingCallerId.list
7
7
  class OutgoingCallerId < TwilioObject
8
- def create(phone_number, friendly_name = phone_number, call_delay = 0)
8
+ def create(phone_number, friendly_name = phone_number, call_delay = 0, extension = nil)
9
9
  Twilio.post("/OutgoingCallerIds", :body => {
10
10
  :PhoneNumber => phone_number,
11
11
  :FriendlyName => friendly_name,
12
- :CallDelay => call_delay
12
+ :CallDelay => call_delay,
13
+ :Extension => extension
13
14
  })
14
15
  end
15
16
 
16
- def list(optional = {})
17
- Twilio.get("/OutgoingCallerIds", :query => optional)
17
+ def list(opts = {})
18
+ Twilio.get("/OutgoingCallerIds", :query => (opts.empty? ? nil : opts))
18
19
  end
19
20
 
20
21
  def get(callerid_sid)
@@ -5,8 +5,8 @@ module Twilio
5
5
  # Twilio.connect('my_twilio_sid', 'my_auth_token')
6
6
  # Twilio::Recording.list
7
7
  class Recording < TwilioObject
8
- def list(optional = {})
9
- Twilio.get("/Recordings", :query => optional)
8
+ def list(opts = {})
9
+ Twilio.get("/Recordings", :query => (opts.empty? ? nil : opts))
10
10
  end
11
11
 
12
12
  def get(recording_sid)
@@ -10,8 +10,8 @@ module Twilio
10
10
  Twilio.post("/SMS/Messages", :body => {:From => from, :To => to, :Body => body}.merge(callback))
11
11
  end
12
12
 
13
- def list(optional = {})
14
- Twilio.get("/SMS/Messages", :query => optional)
13
+ def list(opts = {})
14
+ Twilio.get("/SMS/Messages", :query => (opts.empty? ? nil : opts))
15
15
  end
16
16
 
17
17
  def get(sms_message_sid)
@@ -1,16 +1,19 @@
1
1
  module Twilio
2
- class TwilioObject #:nodoc: all
3
- attr_reader :connection
4
-
5
- def initialize(connection = nil)
6
- @connection = connection
2
+ class TwilioObject #:nodoc: all
3
+ def initialize
7
4
  end
8
5
 
9
6
  class << self
10
7
  def method_missing(method_id, *args) #:nodoc:
11
8
  o = self.new
12
9
  o.send(method_id, *args)
10
+ rescue HTTParty::UnsupportedURIScheme
11
+ raise "You must set Twilio.connect before calling #{self.inspect}##{method_id}"
13
12
  end
14
13
  end
14
+
15
+ def connected?
16
+ self.class.base_uri
17
+ end
15
18
  end
16
19
  end
@@ -0,0 +1,3 @@
1
+ module Twilio
2
+ VERSION = "3.0.0"
3
+ end
@@ -0,0 +1,23 @@
1
+ <TwilioResponse>
2
+ <Account>
3
+ <Sid>mysid</Sid>
4
+ <FriendlyName>Do you like my friendly name?</FriendlyName>
5
+ <Status>active</Status>
6
+ <DateCreated>Wed, 04 Aug 2010 21:37:41 +0000</DateCreated>
7
+ <DateUpdated>Fri, 06 Aug 2010 01:15:02 +0000</DateUpdated>
8
+ <AuthToken>mytoken</AuthToken>
9
+ <Uri>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d</Uri>
10
+ <SubresourceUris>
11
+ <AvailablePhoneNumbers>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/AvailablePhoneNumbers</AvailablePhoneNumbers>
12
+ <Calls>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/Calls</Calls>
13
+ <Conferences>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/Conferences</Conferences>
14
+ <IncomingPhoneNumbers>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/IncomingPhoneNumbers</IncomingPhoneNumbers>
15
+ <Notifications>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/Notifications</Notifications>
16
+ <OutgoingCallerIds>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/OutgoingCallerIds</OutgoingCallerIds>
17
+ <Recordings>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/Recordings</Recordings>
18
+ <Sandbox>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/Sandbox</Sandbox>
19
+ <SMSMessages>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/SMS/Messages</SMSMessages>
20
+ <Transcriptions>/2010-04-01/Accounts/ACba8bc05eacf94afdae398e642c9cc32d/Transcriptions</Transcriptions>
21
+ </SubresourceUris>
22
+ </Account>
23
+ </TwilioResponse>
@@ -0,0 +1,26 @@
1
+ TwilioResponse>
2
+ <AvailablePhoneNumbers uri="/2010-04-01/Accounts/ACde6f1e11047ebd6fe7a55f120be3a900/AvailablePhoneNumbers/US/Local?AreaCode=510">
3
+ <AvailablePhoneNumber>
4
+ <FriendlyName>(510) 564-7903</FriendlyName>
5
+ <PhoneNumber>+15105647903</PhoneNumber>
6
+ <Lata>722</Lata>
7
+ <RateCenter>OKLD TRNID</RateCenter>
8
+ <Latitude>37.780000</Latitude>
9
+ <Longitude>-122.380000</Longitude>
10
+ <Region>CA</Region>
11
+ <PostalCode>94703</PostalCode>
12
+ <IsoCountry>US</IsoCountry>
13
+ </AvailablePhoneNumber>
14
+ <AvailablePhoneNumber>
15
+ <FriendlyName>(510) 488-4379</FriendlyName>
16
+ <PhoneNumber>+15104884379</PhoneNumber>
17
+ <Lata>722</Lata>
18
+ <RateCenter>OKLD FRTVL</RateCenter>
19
+ <Latitude>37.780000</Latitude>
20
+ <Longitude>-122.380000</Longitude>
21
+ <Region>CA</Region>
22
+ <PostalCode>94602</PostalCode>
23
+ <IsoCountry>US</IsoCountry>
24
+ </AvailablePhoneNumber>
25
+ </AvailablePhoneNumbers>
26
+ </TwilioResponse>