twilio 2.9.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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>