twilio-ruby 3.10.1 → 3.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS.md +24 -0
- data/CHANGES +11 -0
- data/Makefile +13 -0
- data/README.md +28 -13
- data/docs/Makefile +130 -0
- data/docs/_themes/LICENSE +45 -0
- data/docs/_themes/README.rst +25 -0
- data/docs/_themes/flask_theme_support.py +86 -0
- data/docs/_themes/kr/layout.html +32 -0
- data/docs/_themes/kr/relations.html +19 -0
- data/docs/_themes/kr/static/flasky.css_t +469 -0
- data/docs/_themes/kr/static/small_flask.css +70 -0
- data/docs/_themes/kr/theme.conf +7 -0
- data/docs/_themes/kr_small/layout.html +22 -0
- data/docs/_themes/kr_small/static/flasky.css_t +287 -0
- data/docs/_themes/kr_small/theme.conf +10 -0
- data/docs/changelog.rst +1 -0
- data/docs/conf.py +266 -0
- data/docs/faq.rst +42 -0
- data/docs/getting-started.rst +91 -0
- data/docs/index.rst +108 -0
- data/docs/make.bat +170 -0
- data/docs/src/pip-delete-this-directory.txt +5 -0
- data/docs/usage/accounts.rst +89 -0
- data/docs/usage/applications.rst +108 -0
- data/docs/usage/basics.rst +81 -0
- data/docs/usage/caller-ids.rst +45 -0
- data/docs/usage/conferences.rst +108 -0
- data/docs/usage/messages.rst +110 -0
- data/docs/usage/notifications.rst +70 -0
- data/docs/usage/phone-calls.rst +168 -0
- data/docs/usage/phone-numbers.rst +159 -0
- data/docs/usage/queues.rst +112 -0
- data/docs/usage/recordings.rst +96 -0
- data/docs/usage/sip.rst +103 -0
- data/docs/usage/token-generation.rst +81 -0
- data/docs/usage/transcriptions.rst +31 -0
- data/docs/usage/twiml.rst +70 -0
- data/docs/usage/validation.rst +71 -0
- data/examples/examples.rb +8 -5
- data/lib/twilio-ruby.rb +10 -0
- data/lib/twilio-ruby/rest/accounts.rb +1 -1
- data/lib/twilio-ruby/rest/instance_resource.rb +2 -1
- data/lib/twilio-ruby/rest/list_resource.rb +4 -1
- data/lib/twilio-ruby/rest/media.rb +14 -0
- data/lib/twilio-ruby/rest/messages.rb +12 -0
- data/lib/twilio-ruby/rest/sip.rb +12 -0
- data/lib/twilio-ruby/rest/sip/credential_lists.rb +11 -0
- data/lib/twilio-ruby/rest/sip/credential_lists/credentials.rb +6 -0
- data/lib/twilio-ruby/rest/sip/domains.rb +12 -0
- data/lib/twilio-ruby/rest/sip/domains/credential_list_mappings.rb +6 -0
- data/lib/twilio-ruby/rest/sip/domains/ip_access_control_list_mappings.rb +6 -0
- data/lib/twilio-ruby/rest/sip/ip_access_control_lists.rb +11 -0
- data/lib/twilio-ruby/rest/sip/ip_access_control_lists/ip_addresses.rb +6 -0
- data/lib/twilio-ruby/rest/sms.rb +1 -1
- data/lib/twilio-ruby/rest/usage/records.rb +1 -1
- data/lib/twilio-ruby/rest/utils.rb +1 -1
- data/lib/twilio-ruby/version.rb +1 -1
- data/spec/rest/message_spec.rb +12 -0
- metadata +52 -2
@@ -0,0 +1,96 @@
|
|
1
|
+
.. module:: twilio.rest.resources
|
2
|
+
|
3
|
+
================
|
4
|
+
Recordings
|
5
|
+
================
|
6
|
+
|
7
|
+
For more information, see the
|
8
|
+
`Recordings REST Resource <http://www.twilio.com/docs/api/rest/recording>`_
|
9
|
+
documentation.
|
10
|
+
|
11
|
+
|
12
|
+
Audio Formats
|
13
|
+
-----------------
|
14
|
+
|
15
|
+
Each :class:`Recording` has a few special methods. To get the url
|
16
|
+
for the wav format of this recording, use :meth:`Recording.wav`. For the
|
17
|
+
mp3 format, use :meth:`Recording.mp3`. To make requests for either of
|
18
|
+
these formats use the same method with a '!' appended. These methods
|
19
|
+
both take a block to be executed as soon as the response returns.
|
20
|
+
|
21
|
+
|
22
|
+
Listing Your Recordings
|
23
|
+
----------------------------
|
24
|
+
|
25
|
+
The following code will print out the :attr:`duration`
|
26
|
+
for each :class:`Recording`.
|
27
|
+
|
28
|
+
.. code-block:: ruby
|
29
|
+
|
30
|
+
require 'twilio-ruby'
|
31
|
+
|
32
|
+
# To find these visit https://www.twilio.com/user/account
|
33
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
34
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
35
|
+
|
36
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
37
|
+
|
38
|
+
@client.recordings.list().each do |recording|
|
39
|
+
puts recording.duration
|
40
|
+
|
41
|
+
You can filter recordings by CallSid by passing the Sid as :attr:`call`.
|
42
|
+
Filter recordings using :attr:`before` and :attr:`after` dates.
|
43
|
+
|
44
|
+
The following will only show recordings made before January 1, 2011.
|
45
|
+
|
46
|
+
.. code-block:: ruby
|
47
|
+
|
48
|
+
require 'twilio-ruby'
|
49
|
+
|
50
|
+
# To find these visit https://www.twilio.com/user/account
|
51
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
52
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
53
|
+
|
54
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
55
|
+
@client.recordings.list(before=date(2011,1,1)).each do |recording|:
|
56
|
+
puts recording.duration
|
57
|
+
|
58
|
+
|
59
|
+
Deleting Recordings
|
60
|
+
---------------------
|
61
|
+
|
62
|
+
The :class:`Recordings` resource allows you to delete unnecessary recordings.
|
63
|
+
|
64
|
+
.. code-block:: ruby
|
65
|
+
|
66
|
+
require 'twilio-ruby'
|
67
|
+
|
68
|
+
# To find these visit https://www.twilio.com/user/account
|
69
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
70
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
71
|
+
|
72
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
73
|
+
@client.recordings.get("RC123").delete()
|
74
|
+
|
75
|
+
|
76
|
+
Accessing Related Transcptions
|
77
|
+
-------------------------------
|
78
|
+
|
79
|
+
The :class:`Recordings` allows you to retrieve associated transcriptions.
|
80
|
+
The following prints out the text for each of the transcriptions associated
|
81
|
+
with this recording.
|
82
|
+
|
83
|
+
.. code-block:: ruby
|
84
|
+
|
85
|
+
require 'twilio-ruby'
|
86
|
+
|
87
|
+
# To find these visit https://www.twilio.com/user/account
|
88
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
89
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
90
|
+
|
91
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
92
|
+
@recording = @client.recordings.get("RC123")
|
93
|
+
|
94
|
+
@recording.transcriptions.list().each do |transcription|
|
95
|
+
puts transcription.transcription_text
|
96
|
+
|
data/docs/usage/sip.rst
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
=============
|
2
|
+
Sip In
|
3
|
+
=============
|
4
|
+
|
5
|
+
Getting started with Sip In
|
6
|
+
===========================
|
7
|
+
|
8
|
+
If you're unfamiliar with SIP, please see the `SIP API Documentation
|
9
|
+
<https://www.twilio.com/docs/api/rest/sip>`_ on our website. If you want
|
10
|
+
to make a regular phone call, take a look at :doc:`phone-calls`.
|
11
|
+
|
12
|
+
Creating a Sip Domain
|
13
|
+
=====================
|
14
|
+
|
15
|
+
The :class:`Domains` resource allows you to create a new domain. To
|
16
|
+
create a new domain, you'll need to choose a unique domain that lives
|
17
|
+
under sip.twilio.com.
|
18
|
+
|
19
|
+
.. code-block:: ruby
|
20
|
+
|
21
|
+
require 'twilio-ruby'
|
22
|
+
|
23
|
+
# To find these visit https://www.twilio.com/user/account
|
24
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
25
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
26
|
+
|
27
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
28
|
+
|
29
|
+
@domain = @client.sip.domains.create(
|
30
|
+
{:friendly_name => "The Office Domain",
|
31
|
+
:voice_url => "http://example.com/voice",
|
32
|
+
:domain_name => "dunder-mifflin-scranton.sip.twilio.com",}
|
33
|
+
)
|
34
|
+
puts @domain.sid
|
35
|
+
|
36
|
+
Creating a new IpAccessControlList
|
37
|
+
==================================
|
38
|
+
|
39
|
+
To control access to your new domain, you'll need to explicitly grant access
|
40
|
+
to individual ip addresses. To do this, you'll first need to create an
|
41
|
+
:class:`IpAccessControlList` to hold the ip addresses you wish to allow.
|
42
|
+
|
43
|
+
.. code-block:: ruby
|
44
|
+
|
45
|
+
require 'twilio-ruby'
|
46
|
+
|
47
|
+
# To find these visit https://www.twilio.com/user/account
|
48
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
49
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
50
|
+
|
51
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
52
|
+
|
53
|
+
@ip_acl = @client.sip.ip_access_control_lists.create(
|
54
|
+
{:friendly_name => "The Office IpAccessControlList",}
|
55
|
+
)
|
56
|
+
puts @ip_acl.sid
|
57
|
+
|
58
|
+
Adding a new IpAddress
|
59
|
+
=========================
|
60
|
+
|
61
|
+
Now it's time to add an :class:`IpAddress` to your new :class:`IpAccessControlList`.
|
62
|
+
|
63
|
+
.. code-block:: ruby
|
64
|
+
|
65
|
+
require 'twilio-ruby'
|
66
|
+
|
67
|
+
# To find these visit https://www.twilio.com/user/account
|
68
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
69
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
70
|
+
|
71
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
72
|
+
|
73
|
+
@ip_address = @client.sip.ip_access_control_lists.get(
|
74
|
+
"AL456", # IpAccessControlList sid
|
75
|
+
).ip_addresses.create(
|
76
|
+
{:friendly_name => "Dwights's Computer",
|
77
|
+
:ip_address => "192.168.1.42",}
|
78
|
+
)
|
79
|
+
puts @ip_address.sid
|
80
|
+
|
81
|
+
Adding an IpAccessControlList to a Domain
|
82
|
+
===========================================
|
83
|
+
|
84
|
+
Once you've created a :class:`Domain` and an :class:`IpAccessControlList` you need to
|
85
|
+
associate them. To do this, create an :class:`IpAccessControlListMapping`.
|
86
|
+
|
87
|
+
.. code-block:: ruby
|
88
|
+
|
89
|
+
require 'twilio-ruby'
|
90
|
+
|
91
|
+
# To find these visit https://www.twilio.com/user/account
|
92
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
93
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
94
|
+
|
95
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
96
|
+
|
97
|
+
@ip_acl_mapping = @client.sip.domains.get(
|
98
|
+
"SD456", # SIP Domain sid
|
99
|
+
).ip_access_control_list_mappings.create(
|
100
|
+
{:ip_access_control_list_sid => "AL789"})
|
101
|
+
|
102
|
+
puts @ip_acl_mapping.sid
|
103
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
.. module:: twilio.util
|
2
|
+
|
3
|
+
===========================
|
4
|
+
Generate Capability Tokens
|
5
|
+
===========================
|
6
|
+
|
7
|
+
`Twilio Client <http://www.twilio.com/api/client>`_ allows you to make and
|
8
|
+
receive connections in the browser.
|
9
|
+
You can place a call to a phone on the PSTN network,
|
10
|
+
all without leaving your browser. See the `Twilio Client Quickstart
|
11
|
+
<http:/www.twilio.com/docs/quickstart/client>`_ to get up and running with
|
12
|
+
Twilio Client.
|
13
|
+
|
14
|
+
Capability tokens are used by `Twilio Client
|
15
|
+
<http://www.twilio.com/api/client>`_ to provide connection
|
16
|
+
security and authorization. The `Capability Token documentation
|
17
|
+
<http://www.twilio.com/docs/tokens>`_ explains in depth the purpose and
|
18
|
+
features of these tokens.
|
19
|
+
|
20
|
+
:class:`TwilioCapability` is responsible for the creation of these capability
|
21
|
+
tokens. You'll need your Twilio AccountSid and AuthToken.
|
22
|
+
|
23
|
+
.. code-block:: ruby
|
24
|
+
|
25
|
+
require 'twilio-ruby'
|
26
|
+
|
27
|
+
# Find these values at twilio.com/user/account
|
28
|
+
account_sid = "AC123123"
|
29
|
+
auth_token = "secret"
|
30
|
+
|
31
|
+
@capability = Twilio::Util::Capability.new account_sid, auth_token
|
32
|
+
|
33
|
+
|
34
|
+
Allow Incoming Connections
|
35
|
+
==============================
|
36
|
+
|
37
|
+
Before a device running `Twilio Client <http://www.twilio.com/api/client>`_
|
38
|
+
can recieve incoming connections, the instance must first register a name
|
39
|
+
(such as "Alice" or "Bob").
|
40
|
+
The :meth:`allow_client_incoming` method adds the client name to the
|
41
|
+
capability token.
|
42
|
+
|
43
|
+
.. code-block:: ruby
|
44
|
+
|
45
|
+
@capability.allow_client_incoming("Alice")
|
46
|
+
|
47
|
+
|
48
|
+
Allow Outgoing Connections
|
49
|
+
==============================
|
50
|
+
|
51
|
+
To make an outgoing connection from a
|
52
|
+
`Twilio Client <http://www.twilio.com/api/client>`_ device,
|
53
|
+
you'll need to choose a
|
54
|
+
`Twilio Application <http://www.twilio.com/docs/api/rest/applications>`_
|
55
|
+
to handle TwiML URLs. A Twilio Application is a collection of URLs responsible
|
56
|
+
for outputting valid TwiML to control phone calls and messages.
|
57
|
+
|
58
|
+
.. code-block:: ruby
|
59
|
+
|
60
|
+
# Twilio Application Sid
|
61
|
+
application_sid = "APabe7650f654fc34655fc81ae71caa3ff"
|
62
|
+
@capability.allow_client_outgoing(application_sid)
|
63
|
+
|
64
|
+
|
65
|
+
Generate a Token
|
66
|
+
==================
|
67
|
+
|
68
|
+
.. code-block:: ruby
|
69
|
+
|
70
|
+
@token = @capability.generate()
|
71
|
+
|
72
|
+
By default, this token will expire in one hour. If you'd like to change the
|
73
|
+
token expiration, :meth:`generate` takes an optional :attr:`ttl` argument.
|
74
|
+
|
75
|
+
.. code-block:: ruby
|
76
|
+
|
77
|
+
@token = @capability.generate(ttl=600)
|
78
|
+
|
79
|
+
This token will now expire in 10 minutes. If you haven't guessed already,
|
80
|
+
:attr:`ttl` is expressed in seconds.
|
81
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
.. module:: twilio.rest.resources
|
2
|
+
|
3
|
+
================
|
4
|
+
Transcriptions
|
5
|
+
================
|
6
|
+
|
7
|
+
Transcriptions are generated from recordings via the
|
8
|
+
`TwiML <Record> verb <http://www.twilio.com/docs/api/twiml/record>`_.
|
9
|
+
Using the API, you can only read your transcription records.
|
10
|
+
|
11
|
+
For more information, see the `Transcriptions REST Resource
|
12
|
+
<http://www.twilio.com/docs/api/rest/transcription>`_ documentation.
|
13
|
+
|
14
|
+
|
15
|
+
Listing Your Transcriptions
|
16
|
+
----------------------------
|
17
|
+
|
18
|
+
The following code will print out the length of each :class:`Transcription`.
|
19
|
+
|
20
|
+
.. code-block:: ruby
|
21
|
+
|
22
|
+
require 'twilio-ruby'
|
23
|
+
|
24
|
+
# To find these visit https://www.twilio.com/user/account
|
25
|
+
account_sid = "ACXXXXXXXXXXXXXXXXX"
|
26
|
+
auth_token = "YYYYYYYYYYYYYYYYYY"
|
27
|
+
|
28
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
29
|
+
@client.transcriptions.list().each do |transcription|
|
30
|
+
puts transcription.duration
|
31
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
.. _usage-twiml:
|
2
|
+
|
3
|
+
.. module:: twilio.twiml
|
4
|
+
|
5
|
+
==============
|
6
|
+
TwiML Creation
|
7
|
+
==============
|
8
|
+
|
9
|
+
TwiML creation begins with the :class:`Response` verb.
|
10
|
+
Each successive verb is created by calling various methods on the response,
|
11
|
+
such as :meth:`say` or :meth:`play`.
|
12
|
+
These methods return the verbs they create to ease creation of nested TwiML.
|
13
|
+
To finish, call the :meth:`toxml` method on the :class:`Response`,
|
14
|
+
which returns raw TwiML.
|
15
|
+
|
16
|
+
.. code-block:: python
|
17
|
+
|
18
|
+
require 'twilio-ruby'
|
19
|
+
|
20
|
+
Twilio::TwiML::Response.new do |r|
|
21
|
+
r.Say "Hello"
|
22
|
+
end.text
|
23
|
+
|
24
|
+
.. code-block:: xml
|
25
|
+
|
26
|
+
<?xml version="1.0" encoding="utf-8"?>
|
27
|
+
<Response><Say>Hello</Say><Response>
|
28
|
+
|
29
|
+
The verb methods (outlined in the :doc:`complete reference </api/twiml>`)
|
30
|
+
take the body (only text) of the verb as the first argument.
|
31
|
+
All attributes are keyword arguments.
|
32
|
+
|
33
|
+
.. code-block:: python
|
34
|
+
|
35
|
+
require 'twilio-ruby'
|
36
|
+
|
37
|
+
Twilio::TwiML::Response.new do |r|
|
38
|
+
r.Play "https://api.twilio.com/cowbell.mp3", :loop => 5
|
39
|
+
end.text
|
40
|
+
|
41
|
+
.. code-block:: xml
|
42
|
+
|
43
|
+
<?xml version="1.0" encoding="utf-8"?>
|
44
|
+
<Response>
|
45
|
+
<Play loop="3">https://api.twilio.com/cowbell.mp3</Play>
|
46
|
+
<Response>
|
47
|
+
|
48
|
+
Python 2.6+ added the :const:`with` statement for context management.
|
49
|
+
Using :const:`with`, the module can *almost* emulate Ruby blocks.
|
50
|
+
|
51
|
+
.. code-block:: python
|
52
|
+
|
53
|
+
require 'twilio-ruby'
|
54
|
+
|
55
|
+
Twilio::TwiML::Response.new do |r|
|
56
|
+
r.Say "hello"
|
57
|
+
r.Gather :finish_on_key => 4 do |g|
|
58
|
+
g.Say "world"
|
59
|
+
end
|
60
|
+
end.text
|
61
|
+
|
62
|
+
which returns the following
|
63
|
+
|
64
|
+
.. code-block:: xml
|
65
|
+
|
66
|
+
<?xml version="1.0" encoding="utf-8"?>
|
67
|
+
<Response>
|
68
|
+
<Say>Hello</Say>
|
69
|
+
<Gather finishOnKey="4"><Say>World</Say></Gather>
|
70
|
+
</Response>
|
@@ -0,0 +1,71 @@
|
|
1
|
+
.. module:: twilio.util
|
2
|
+
|
3
|
+
===========================
|
4
|
+
Validate Incoming Requests
|
5
|
+
===========================
|
6
|
+
|
7
|
+
Twilio requires that your TwiML-serving web server be open to the public. This
|
8
|
+
is necessary so that Twilio can retrieve TwiML from urls and POST data back to
|
9
|
+
your server.
|
10
|
+
|
11
|
+
However, there may be people out there trying to spoof the Twilio service.
|
12
|
+
Luckily, there's an easy way to validate that incoming requests are from Twilio
|
13
|
+
and Twilio alone.
|
14
|
+
|
15
|
+
An in-depth guide to our security features can be `found in our online
|
16
|
+
documentation <http://www.twilio.com/docs/security>`_.
|
17
|
+
|
18
|
+
Before you can validate requests, you'll need four pieces of information:
|
19
|
+
|
20
|
+
* your Twilio Auth Token (found in your `Dashboard
|
21
|
+
<https://www.twilio.com/user/account>`_)
|
22
|
+
* the POST data for the request
|
23
|
+
* the requested URL
|
24
|
+
* the X-Twilio-Signature header value
|
25
|
+
|
26
|
+
Obtaining the last three pieces of information depends on the framework you are
|
27
|
+
using to process requests. The below example assumes that you have the POST
|
28
|
+
data as a dictionary and the url and X-Twilio-Signature as strings.
|
29
|
+
|
30
|
+
The below example will print out a confirmation message if the request is
|
31
|
+
actually from Twilio.
|
32
|
+
|
33
|
+
.. code-block:: python
|
34
|
+
|
35
|
+
require 'twilio-ruby'
|
36
|
+
|
37
|
+
auth_token = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'
|
38
|
+
|
39
|
+
@validator = Twilio::Util::RequestValidator.new auth_token
|
40
|
+
|
41
|
+
# the callback URL you provided to Twilio
|
42
|
+
url = "http://www.example.com/my/callback/url.xml"
|
43
|
+
|
44
|
+
# the POST variables attached to the request (eg "From", "To")
|
45
|
+
post_vars = {}
|
46
|
+
|
47
|
+
# X-Twilio-Signature header value
|
48
|
+
signature = "HpS7PBa1Agvt4OtO+wZp75IuQa0=" # will look something like that
|
49
|
+
|
50
|
+
if @validator.validate(url, post_vars, signature)
|
51
|
+
puts "Confirmed to have come from Twilio."
|
52
|
+
else
|
53
|
+
puts "NOT VALID. It might have been spoofed!"
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
Trailing Slashes
|
58
|
+
==================
|
59
|
+
|
60
|
+
If your URL uses an "index" page, such as index.php or index.html to handle
|
61
|
+
the request, such as: https://mycompany.com/twilio where the real page
|
62
|
+
is served from https://mycompany.com/twilio/index.php, then Apache or
|
63
|
+
PHP may rewrite that URL a little bit so it's got a trailing slash, such as
|
64
|
+
https://mycompany.com/twilio/ for example.
|
65
|
+
|
66
|
+
Using the code above, or similar code in another language, you could
|
67
|
+
end up with an incorrect hash because Twilio built the hash using
|
68
|
+
https://mycompany.com/twilio and you may have built the hash using
|
69
|
+
https://mycompany.com/twilio/. More information can be found in our
|
70
|
+
documentation on validating requests.
|
71
|
+
|