1WWW::Twilio::API(3) User Contributed Perl Documentation WWW::Twilio::API(3)
2
3
4
6 WWW::Twilio::API - Accessing Twilio's REST API with Perl
7
9 use WWW::Twilio::API;
10
11 my $twilio = WWW::Twilio::API->new(AccountSid => 'AC12345...',
12 AuthToken => '1234567...');
13
14 ## make a phone call
15 $response = $twilio->POST( 'Calls',
16 From => '1234567890',
17 To => '8905671234',
18 Url => 'http://domain.tld/send_twiml' );
19
20 print $response->{content};
21
23 This section is for existing WWW::Twilio::API users considering an
24 upgrade from WWW::Twilio::API versions prior to 0.15. If you're new to
25 WWW::Twilio::API you may safely unconcern yourself with this section
26 and move on to "DESCRIPTION" below.
27
28 WWW::Twilio::API since version 0.15 defaults to Twilio's 2010-04-01
29 API. That is the only substantive change from version 0.14. If you are
30 one of those types of people who must have the latest version of
31 everything, you have two options:
32
33 • Before you upgrade to 0.15, change all of your new() method calls
34 to explicitly use API_VERSION as '2008-08-01', like this:
35
36 my $twilio = WWW::Twilio::API->new
37 ( AccountSid => 'AC12345...',
38 AuthToken => '1234567...',
39 API_VERSION => '2008-08-01' ); ## <-- add this line here
40
41 Now you may safely upgrade WWW::Twilio::API and stay current. You
42 can then update your individual Twilio API calls piecemeal at your
43 leisure.
44
45 • Go through all of your existing GET, PUT, POST, and DELETE calls
46 and make sure that they're up-to-date with Twilio's new
47 '2010-04-01' API (the new API is a little simpler in some ways than
48 the 2008 version) and set the API_VERSION to '2010-04-01'. Test
49 that your code all works with the new API.
50
51 Now you can safely upgrade WWW::Twilio::API.
52
54 WWW::Twilio::API aims to make connecting to and making REST calls on
55 the Twilio API easy, reliable, and enjoyable.
56
57 You should have ready access to Twilio's API documentation in order to
58 use WWW::Twilio::API.
59
60 WWW::Twilio::API knows almost nothing about the Twilio API itself other
61 than the authentication and basic format of the REST URIs.
62
63 Users already familiar with the API may skip the following section
64 labeled "TWILIO API" and move to the "METHODS" section. Beginners
65 should definitely continue here.
66
68 This section is meant to help you understand how to read the Twilio API
69 documentation and translate it into WWW::Twilio::API calls.
70
71 The Twilio API documentation is found here:
72
73 http://www.twilio.com/docs/api/rest/
74
75 The Twilio REST API consists of requests and responses. Requests
76 consist of Resources and Properties. Responses consist of HTTP status
77 codes and often content. What resources, properties, status codes and
78 content you should use is what the Twilio REST API documentation
79 covers.
80
81 Getting started
82 While what comes next is covered in the Twilio documentation, this may
83 help some people who want a quicker start. Head over to twilio.com and
84 signup for a free demo account. Once you've signed up, visit
85
86 https://www.twilio.com/user/account/
87
88 where you'll find your Account Sid and AuthToken. Your Account Sid and
89 AuthToken are essentially your username and password for the Twilio
90 API. Note that these are not the same credentials as your Twilio
91 account login username and password, which is an email address and a
92 password you've selected. You'll never use your email address and
93 password in the API--those are only for logging into your Twilio web
94 account at twilio.com.
95
96 Once you've signed up, be sure to add at least one phone number to your
97 account by clicking "Numbers" and then "Verify a number". Be sure
98 you're near the phone whose number you entered, as Twilio will make an
99 automated call to verify it. Once you've added a phone number, you can
100 start playing with Twilio's Calls API, which we'll be using in some of
101 our examples below.
102
103 Twilio requests
104 Twilio request resources look just like a URL you might enter into your
105 browser to visit a secure web page:
106
107 https://api.twilio.com/2010-04-01/Accounts/{YourAccountSid}/Calls
108
109 In addition to the URI above, if the request is a POST (as opposed to a
110 GET), you would also pass along certain key/value pairs that represent
111 the resources's properties.
112
113 So, to place a call using Twilio, your resource is:
114
115 https://api.twilio.com/2010-04-01/Accounts/{YourAccountSid}/Calls
116
117 and the set of properties for this resource might be:
118
119 To = 5558675309
120 From = 4158675309
121 Url = http://www.myapp.com/myhandler
122
123 You can see the list of properties for the Calls resource here:
124
125 http://www.twilio.com/docs/api/rest/making_calls
126
127 Further down in "METHODS" we'll cover how this works using
128 WWW::Twilio::API, but here's a teaser to help you see how easy your job
129 as a budding Twilio developer will be:
130
131 ## call Jenny
132 $twilio->POST('Calls',
133 To => '5558675309',
134 From => '4158675309',
135 Url => 'http://www.myapp.com/myhandler');
136
137 Twilio responses
138 Once you have made a request to a Twilio resource, the Twilio API
139 server will send a response back to you. The response consists of an
140 HTTP status code (e.g., 200, 302, 404, 500) and some content (usually
141 an XML document).
142
143 For example, if we made the POST to the Calls resource above, and if
144 everything went well, we'd receive a status of 200 and an XML document
145 like this, telling us that everything went great:
146
147 <?xml version="1.0"?>
148 <TwilioResponse>
149 <Call>
150 <Sid>CAxxxxxxxxxx</Sid>
151 <DateCreated>Wed, 10 Aug 2011 04:38:16 +0000</DateCreated>
152 <DateUpdated>Wed, 10 Aug 2011 04:38:16 +0000</DateUpdated>
153 <ParentCallSid/>
154 <AccountSid>ACxxxxxxxx</AccountSid>
155 <To>+15558675309</To>
156 <ToFormatted>(555) 867-5309</ToFormatted>
157 <From>+14158675309</From>
158 <FromFormatted>(415) 867-5309</FromFormatted>
159 <PhoneNumberSid>PNxxxxxxxxxxx</PhoneNumberSid>
160 <Status>queued</Status>
161 <StartTime/>
162 <EndTime/>
163 <Duration/>
164 <Price/>
165 <Direction>outbound-api</Direction>
166 <AnsweredBy/>
167 <ApiVersion>2010-04-01</ApiVersion>
168 <Annotation/>
169 <ForwardedFrom/>
170 <GroupSid/>
171 <CallerName/>
172 <Uri>/2010-04-01/Accounts/ACxxxxxxxxx/Calls/CAxxxxxx</Uri>
173 <SubresourceUris>
174 <Notifications>/2010-04-01/Accounts/ACxxxxxxxxxxx/Calls/CAxxxxxxx/Notifications</Notifications>
175 <Recordings>/2010-04-01/Accounts/ACxxxxxxxxxx/Calls/CAxxxxxx/Recordings</Recordings>
176 </SubresourceUris>
177 </Call>
178 </TwilioResponse>
179
180 Don't let all this HTTP request/response (or XML) business worry you:
181 WWW::Twilio::API makes requests and handles responses for you, so you
182 don't have to get involved with all the details. Besides, you can also
183 opt to have Twilio send its responses to you in CSV, JSON, or HTML.
184
185 Using WWW::Twilio::API
186 Now that we have a basic understanding of how Twilio's REST API works,
187 we can translate the API into WWW::Twilio::API method calls. Doing this
188 is trivial:
189
190 1. Find the API resource you want to do (e.g., make a call, check
191 accounts, verify a caller id, etc.) in the manual. Look at the Base
192 Resource URI, and take note of everything after
193 "/2010-04-01/Accounts/{YourAccountSid}/" (e.g., Calls).
194
195 Please see the exception for Accounts above in the section "API
196 resource name" under the GET method.
197
198 This is your API resource: "Calls"
199
200 2. Determine which HTTP method you need to make to make the call. For
201 example, to view details about a call, you'll use the GET method
202 for the Calls resource. To make a new call, you'll use the POST
203 method for the Calls resource. Both use the same resource, but
204 different HTTP methods, depending on what you want to do.
205
206 This is your API method. "GET"
207
208 3. Determine the resource properties you'll need to send. Most GET
209 methods don't require any parameters, but may require additional
210 information in the resource (e.g., to view details about all calls,
211 your resource will simply be "Calls", whereas to look at a
212 particular call, your resource will look like
213 "Calls/CA42ed11f93dc08b952027ffbc406d0868")
214
215 If you're using a POST method to make your call, consult the Twilio
216 documentation for making calls and you should see a table under
217 POST Parameters describing the required and optional parameters you
218 may send in your API call.
219
220 These are your resource parameters for the Calls API: From =
221 '1234567890', To = '5558675309', Url =
222 'http://perlcode.org/cgi-bin/twilio'.
223
224 Also, if you want your response in something other than XML, you
225 may add any of 'csv', 'json', or 'html' (any representation found
226 at http://www.twilio.com/docs/api/rest/tips) to the Twilio API
227 call:
228
229 ## return JSON in $response->{content}
230 $response = $twilio->POST('Calls.json',
231 To => '5558675309',
232 From => '1234567890',
233 Url => 'http://twimlets.com/callme');
234
235 ## CSV list of recordings
236 $response = $twilio->POST('Recordings.csv');
237
238 See "Alternative resource representations" below.
239
240 4. Create a WWW::Twilio::API object and make the call using the API
241 method, API resource, and resource parameters. The pattern you'll
242 follow looks like this:
243
244 $response = $twilio_object->METHOD(Resource, %parameters);
245
246 For these examples, see the following pages in Twilio's API
247 documentation:
248
249 http://www.twilio.com/docs/api/rest/call
250 http://www.twilio.com/docs/api/rest/making_calls
251
252 Here are the examples:
253
254 ## create an object
255 my $twilio = new WWW::Twilio::API( AccountSid => '{your account sid}',
256 AuthToken => '{your auth token}' );
257
258 ## view a list of calls we've made
259 $response = $twilio->GET('Calls.json');
260 print $response->{content}; ## this is a JSON document
261
262 ## view one particular call we've made
263 $response = $twilio->GET('Calls/CA42ed11f93dc08b952027ffbc406d0868.csv');
264 print $response->{content}; ## this is a CSV document
265
266 ## make a new call
267 $response = $twilio->POST('Calls',
268 From => '1234567890',
269 To => '3126540987',
270 Url => 'http://perlcode.org/cgi-bin/twilio');
271 print $response->{content}; ## this is an XML document
272
273 5. Examine the response to make sure things went ok. If your response
274 code isn't 200 (or whatever the normal code for the resource and
275 method you're using is), something went wrong and you should check
276 for any error codes:
277
278 $response = $twilio->POST('Calls'); ## I forgot my parameters!
279
280 unless( $response->{code} == 200 ) {
281 die <<_UNTIMELY_;
282 Error: ($response->{code}): $response->{message}
283 $response->{content}
284 _UNTIMELY_
285 }
286
287 which would print:
288
289 (400): Bad Request
290 <?xml version="1.0"?>
291 <TwilioResponse>
292 <RestException>
293 <Status>400</Status>
294 <Message>No called number is specified</Message>
295 <Code>21201</Code>
296 <MoreInfo>http://www.twilio.com/docs/errors/21201</MoreInfo>
297 </RestException>
298 </TwilioResponse>
299
300 See how useful that is? Everything you need to know: "No called
301 number is specified" might jog your memory into realizing that you
302 didn't specify anything else either.
303
304 Once we've fixed everything up, we can try again:
305
306 ## call Jenny
307 $response = $twilio->POST('Calls',
308 To => '5558675309',
309 From => '3126540987',
310 Url => 'http://perlcode.org/cgi-bin/twilio');
311
312 print $response->{content};
313
314 which now prints:
315
316 <?xml version="1.0"?>
317 <TwilioResponse>
318 <Call>
319 <Sid>CAxxxxxxxxxx</Sid>
320 <DateCreated>Wed, 10 Aug 2011 04:38:16 +0000</DateCreated>
321 <DateUpdated>Wed, 10 Aug 2011 04:38:16 +0000</DateUpdated>
322 <ParentCallSid/>
323 <AccountSid>ACxxxxxxxx</AccountSid>
324 <To>+15558675309</To>
325 <ToFormatted>(555) 867-5309</ToFormatted>
326 <From>+13126540987</From>
327 <FromFormatted>(312) 654-0987</FromFormatted>
328 <PhoneNumberSid>PNxxxxxxxxxxx</PhoneNumberSid>
329 <Status>queued</Status>
330 <StartTime/>
331 <EndTime/>
332 <Duration/>
333 <Price/>
334 <Direction>outbound-api</Direction>
335 <AnsweredBy/>
336 <ApiVersion>2010-04-01</ApiVersion>
337 <Annotation/>
338 <ForwardedFrom/>
339 <GroupSid/>
340 <CallerName/>
341 <Uri>/2010-04-01/Accounts/ACxxxxxxxxx/Calls/CAxxxxxx</Uri>
342 <SubresourceUris>
343 <Notifications>/2010-04-01/Accounts/ACxxxxxxxxxxx/Calls/CAxxxxxxx/Notifications</Notifications>
344 <Recordings>/2010-04-01/Accounts/ACxxxxxxxxxx/Calls/CAxxxxxx/Recordings</Recordings>
345 </SubresourceUris>
346 </Call>
347 </TwilioResponse>
348
349 Excellent! This pattern works for all API methods (see note on
350 "Accounts" in the "API resource name" section above under the GET
351 method).
352
353 What's Missing? TwiML
354 The missing magical piece is the TwiML, which is supplied by the Url
355 resource parameter you may have noticed above in the Calls resource
356 examples.
357
358 TwiML controls the flow of your call application, including responding
359 to key presses, playing audio files, or "reading" text-to-speech
360 phrases to the person on the other end of the line.
361
362 To continue the Calls example, you will need to give the Calls resource
363 a URL that returns TwiML (see http://www.twilio.com/docs/api/twiml/).
364 This is not hard, but it does require you to have a web server
365 somewhere on the Internet that can reply to GET or POST requests.
366
367 Twilio provides a set of canned TwiML applications for you to use for
368 free on their server, or you may download them and modify them as you
369 wish. Twilio's "Twimlets" may be found here:
370
371 http://labs.twilio.com/twimlets/
372
373 A TwiML document looks like this:
374
375 <?xml version="1.0" encoding="UTF-8" ?>
376 <Response>
377 <Say>Hello World</Say>
378 <Play>http://api.twilio.com/Cowbell.mp3</Play>
379 </Response>
380
381 When the Twilio API's Calls resource is invoked with a URL that returns
382 an XML document like the above, Twilio's servers will first "read" the
383 phrase "Hello World" to the caller using a text-to-speech synthesizer.
384 It will then download Cowbell.mp3 and play it to the caller.
385
386 Note that the URL you supply may be a static file, or it may be a
387 script or other handler that can receive a GET or POST from Twilio's
388 API server.
389
390 If you don't have your own web server, one location you might consider
391 temporarily is one used in Twilio's own examples, which simply creates
392 a TwiML document based on whatever arguments you send it:
393
394 http://twimlets.com/message?Message=$MSG
395
396 where $MSG is a URI encoded string of what you want Twilio to say when
397 the person who is called picks up the phone.
398
399 For example, you could say:
400
401 http://twimlets.com/message?Message=Nice+to+meet+you
402
403 and when you did this:
404
405 $twilio->POST('Calls',
406 From => '1112223333',
407 To => '1231231234',
408 Url => 'http://twimlets.com/message?Message=Nice+to+meet+you');
409
410 Twilio's API would call '123-123-1234' and when someone answers, they
411 will hear "Nice to meet you" in a somewhat computerized voice.
412
413 Go ahead and follow the twimlets.com link above and view the source in
414 your browser window. It's just a plain XML document.
415
416 See http://www.twilio.com/docs/api_reference/TwiML/ for full TwiML
417 documentation.
418
420 This section describes all the available methods in detail.
421
422 new
423 Creates a new Twilio object.
424
425 Available parameters:
426
427 AccountSid
428 Your account sid (begins with 'AC')
429
430 AuthToken
431 Your account auth token.
432
433 API_VERSION
434 Defaults to '2010-04-01'. You won't need to set this unless: a)
435 Twilio updates their API, and b) you want to take advantage of it
436 or c) you've coded against an older API version and need to set
437 this for backward compatibility.
438
439 NOTE: WWW::Twilio::API prior to version 0.15 defaulted to
440 '2008-08-01'; if you're upgrading WWW::Twilio::API, see
441 "COMPATIBILITY" section at the top of this documentation.
442
443 LWP_Callback
444 No default. This is a code reference you may pass in. The code
445 reference will receive the internal LWP::UserAgent object
446 immediately after it is created so you can set up proxies,
447 timeouts, etc.
448
449 utf8
450 If set to a true value, will use URI::Escape's "uri_escape_utf8"
451 instead of "uri_escape".
452
453 Example:
454
455 my $twilio = new WWW::Twilio::API
456 ( AccountSid => 'AC...',
457 AuthToken => '...',
458 API_VERSION => '2008-08-01',
459 LWP_Callback => sub { shift->timeout(30) } );
460
461 General API calls
462 All API calls are of the form:
463
464 $twilio_object->METHOD('Resource', %parameters)
465
466 where METHOD is one of GET, POST, PUT, or DELETE, and 'Resource' is the
467 resource URI after removing the leading
468 "/2010-04-01/Accounts/{YourAccountSid}/".
469
470 Note that you do not need to URI encode the parameters;
471 WWW::Twilio::API handles that for you (this just means that you don't
472 have to do anything special with the parameters you give the
473 WWW::Twilio::API object).
474
475 Note: There is one exception to URI encoding: when you are passing a
476 I<Url> parameter (e.g., to the I<Calls> resource), and that URL
477 contains a B<GET> query string, that query string needs to be URI
478 encoded. See the F<examples.pl> file with this distribution for an
479 example of that.
480
481 Each of GET, POST, PUT, and DELETE returns a hashref with the call
482 results, the most important of which is the content element. This is
483 the untouched, raw response of the Twilio API server, suitable for you
484 to do whatever you want with it. For example, you might want to hand it
485 off to an XML parser:
486
487 $resp = $twilio->GET('Calls');
488
489 use XML::LibXML;
490 my $parser = new XML::LibXML;
491 my $doc = $parser->parse_string($resp->{content});
492 ... do some processing on $doc now ...
493
494 What you do with the results is up to you.
495
496 Here are the (current) elements in the response:
497
498 content
499 Contains the response content (in XML, CSV, JSON, or HTML if
500 specified).
501
502 code
503 Contains the HTTP status code. You should check this after each
504 call to make sure it's what you'd expect (according to the API).
505 Most successful responses will be '200', but some are '204' or
506 others.
507
508 message
509 A brief HTTP status message, corresponding to the status code. For
510 200 codes, the message will be "OK". For "400" codes, the message
511 will be "Bad Request" and so forth.
512
513 For the curious, a complete list of HTTP status codes, messages and
514 explanations may be found here:
515
516 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
517
518 Example:
519
520 $response = $twilio->GET('Calls/CA42ed11f93dc08b952027ffbc406d0868');
521
522 $response is a hashref that looks like this:
523
524 {
525 content => '<an xml string>',
526 code => '200',
527 message => 'OK',
528 }
529
530 Alternative resource representations
531 By default, results come back in XML and are stored in the response's
532 content element. You may wish to have results returned in comma-
533 separated value format. To do this, simply append '.csv' to the end of
534 your API resource:
535
536 $resp = $twilio->GET('Calls.csv');
537
538 The same thing works for JSON and HTML: simply append '.json' or
539 '.html' respectively to the end of your API resource. See
540 http://www.twilio.com/docs/api/rest/tips for other possible
541 representations.
542
543 GET
544 Sends a GET request to the Twilio REST API.
545
546 Available parameters:
547
548 API resource name
549 The first argument to GET should always be the API resource name
550 you want to invoke. Examples include Accounts, Calls, Recordings
551 and so on. It may be a multi-level resource name, such as
552 Recordings/{RecordingSid}/Transcriptions. It may also have a
553 particular instance you want to see, such as
554 Calls/CA42ed11f93dc08b952027ffbc406d0868.
555
556 The one exception is the Accounts resource. For the Accounts
557 resource, you may specify 'Accounts', an empty string, or nothing
558 (for GET requests only), since there is nothing after the common
559 URI base ("/2010-04-01/Accounts/{YourAccountSid}"). Using Accounts
560 is recommended for orthogonality with other resources, and to be
561 clear, especially when you're using a POST method.
562
563 You may wish to append '.csv', '.json' or '.html' to the API
564 resource to receive results in CSV (comma-separated values), JSON,
565 or HTML formats, instead of the default XML. See "Alternative
566 resource representations" above.
567
568 API resource parameters
569 Each API resource takes zero or more key-value pairs as parameters.
570 See the POST method below for examples.
571
572 None of the following examples use resource parameters; see the POST
573 section for examples illustrating the use of resource parameters.
574
575 GET examples:
576
577 ## get a list of all calls
578 $response = $twilio->GET('Calls');
579
580 ## get a single call instance in CSV format
581 $response = $twilio->GET('Calls/CA42ed11f93dc08b952027ffbc406d0868.csv');
582
583 ## get a recording list in XML
584 $response = $twilio->GET('Recordings');
585
586 ## get a recording list in HTML
587 $response = $twilio->GET('Recordings.html');
588
589 POST
590 Sends a POST request to the Twilio REST API.
591
592 Available parameters:
593
594 Same as GET.
595
596 The following examples illustrate the use of an API resource with
597 resource parameters. Be sure to check Twilio's API for correct
598 arguments for the current Twilio API version.
599
600 ## validate a CallerId: 'OutgoingCallerIds' is the API resource and
601 ## everything else are resource parameters
602 $response = $twilio->POST('OutgoingCallerIds',
603 FriendlyName => "Some Caller Id",
604 PhoneNumber => '1234567890');
605
606 ## make a phone call (note: this is for Twilio's 2008-08-01 API)
607 $response = $twilio->POST('Calls',
608 Caller => '1231231234',
609 Called => '9081231234',
610 Url => 'http://some.where/handler');
611
612 ## send an SMS message
613 $response = $twilio->POST('SMS/Messages',
614 From => '1231231234',
615 To => '9081231234',
616 Body => "Hey, let's have lunch" );
617
618 PUT
619 Sends a PUT request to the Twilio REST API.
620
621 Available parameters:
622
623 Same as GET.
624
625 DELETE
626 Sends a DELETE request to the Twilio REST API.
627
628 Available parameters:
629
630 Same as GET.
631
632 Example:
633
634 $response = $twilio->DELETE('Recordings/RE41331862605f3d662488fdafda2e175f');
635
637 Versions of WWW::Twilio::API prior to 0.15 defaulted to 2008-08-01. API
638 calls since WWW::Twilio::API version 0.15 and later are against
639 Twilio's 2010-04-01 API. If you need to call against a different API,
640 you may pass it into the constructor:
641
642 $t = WWW::Twilio::API->new( AccountSid => '...',
643 AuthToken => '...',
644 API_VERSION => 'YYYY-MM-DD' );
645
646 where 'YYYY-MM-DD' is the new (or old) API version.
647
649 There are plenty of examples strewn in the documentation above. If you
650 need more, see the examples.pl file with this distribution; also please
651 see Twilio's own REST API documentation and TwiML documentation.
652
654 LWP(1), <http://www.twilio.com/>
655
657 Scott Wiersdorf, <scott@perlcode.org>
658
660 Copyright (C) 2009–2012 by Scott Wiersdorf
661
662 This library is free software; you can redistribute it and/or modify it
663 under the same terms as Perl itself, either Perl version 5.8.1 or, at
664 your option, any later version of Perl 5 you may have available.
665
666
667
668perl v5.34.0 2022-01-21 WWW::Twilio::API(3)