Level up your Twilio API skills in TwilioQuest, an educational game for Mac, Windows, and Linux. Download Now


Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

TwiML™ Voice: <Gather>

You can use TwiML's <Gather> verb to collect digits or transcribe speech during a call.

Learn how to build AI-powered IVRs with <Autopilot> using speech recognition and natural language understanding.

The following example shows the most basic use of <Gather> TwiML:

<?xml version="1.0" encoding="UTF-8"?>

You can always send Twilio plain TwiML, or leverage the helper libraries to add TwiML to your web applications:

        Toggle to your preferred programming language, or view the raw TwiML to see how the libraries and TwiML syntax differ

        Simple <Gather>

        Toggle to your preferred programming language, or view the raw TwiML to see how the libraries and TwiML syntax differ

        When Twilio executes this TwiML, it will pause for up to five seconds to wait for the caller to enter digits on their keypad. A few things might happen next:

        • The caller enters digits followed by a # symbol or 5 seconds of silence. Twilio will submit those digits in a POST request back to the URL hosting your TwiML.
        • The caller doesn't enter any digits and 5 seconds pass. Twilio will move on to the next TwiML verb in the document – since there are no more verbs here, Twilio will end the call.

        By nesting <Say> or <Play> in your <Gather>, you can read some text or play music for your caller while waiting for their input. See "Nest other verbs" below for examples and more information.

        <Gather> Attributes

        <Gather> supports the following attributes that change its behavior:

        Attribute name 許容値 初期値
        action URL (relative or absolute) 現在の文書の URL
        finishOnKey 0-9, #, *, and '' (the empty string) #
        hints 「単語、多くの単語を含むフレーズ」 none
        input dtmf, speech, dtmf speech dtmf
        language BCP-47 language tags en-US
        method GET, POST POST
        numDigits 正の整数値(秒) 無制限
        partialResultCallback URL (relative or absolute) none
        partialResultCallbackMethod GET, POST POST
        profanityFilter true, false true
        speechTimeout positive integer or auto timeout attribute value
        Timeout 正の整数値(秒) 5
        speechModel default, numbers_and_commands, phone_call default
        actionOnEmptyResult true, false false

        DIAL動詞 と SMS動詞は、複数の属性を使えます。

        下の例ではcallerIdパラメータが省略されていますが、Twilio for KDDI Web Communications をご利用のお客様においては、callerId パラメータで必ずご自身で購入したTwilio電話番号を指定する必要があり、かつ、省略できません。


        <?xml version="1.0" encoding="UTF-8"?>
            <Gather input="speech dtmf" timeout="3" numDigits="1">
                <Say>Please press 1 or say sales for sales.</Say>


        The action attribute takes an absolute or relative URL as a value. When the caller finishes entering digits (or the timeout is reached), Twilio will make an HTTP request to this URL. That request will include the user's data and Twilio's standard request parameters.

        If you do not provide an action parameter, Twilio will POST to the URL that houses the active TwiML document.

        Twilio may send some extra parameters with its request after the <Gather> ends:

        If you gather digits from the caller, Twilio will include the Digits parameter containing the numbers your caller entered.

        If you specify speech as an input with input="speech", Twilio will include SpeechResult and Confidence:

        • SpeechResult contains the transcribed result of your caller's speech.
        • Confidence contains a confidence score between 0.0 and 1.0. A higher confidence score means a better likelihood that the transcription is accurate.

        After <Gather> ends and Twilio sends its request to your action URL, the current call will continue using the TwiML you send back from that URL. Because of this, any TwiML verbs that occur after your <Gather> are unreachable.

        However, if the caller did not enter any digits or speech, call flow would continue in the original TwiML document.

        Without an action URL, Twilio will re-request the URL that hosts the TwiML you just executed. This can lead to unwanted looping behavior if you're not careful. See our example below for more information.

        Imagine you have the following TwiML hosted at http://example.com/complex_gather.xml:

        <?xml version="1.0" encoding="UTF-8"?>
                    Please enter your account number,
                    followed by the pound sign
            <Say>We didn't receive any input. Goodbye!</Say>

        Scenario 1: If the caller:

        • does not press the keypad or say anything for five seconds, or
        • enters '#' (the default finishOnKey value) before entering any other digits

        then they will hear, "We didn't receive any input. Goodbye!"

        Scenario 2: If the caller:

        • enters a digit while the call is speaking "Please enter your account number..."

        then the <Say> verb will stop speaking and wait for the user's action.

        Scenario 3: If the caller:

        • enters 12345 and then presses #, or
        • allows 5 seconds to pass

        then Twilio will submit the digits and request parameters to the URL hosting this TwiML (http://example.com/complex_gather.xml). Twilio will fetch this same TwiML again and execute it, getting the caller stuck in this <Gather> loop.

        To avoid this behavior, it's best practice to point your action URL to a new URL that hosts some other TwiML for handling the duration of the call.

        The following code sample is almost identical to the TwiML above, but we've added the action and method attributes:

              Specify an action URL to properly handle the rest of the call

              Complex <Gather> with action/method and nested <Say>

              Specify an action URL to properly handle the rest of the call

              Now when the caller enters their input, Twilio will submit the digits and request parameters to the process_gather.php URL.

              If we wanted to read back this input to the caller, our code hosted at /process_gather.php might look like:

              // page located at http://yourserver/process_gather.php
              echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
              echo "<Response><Say>You entered " . $_REQUEST['Digits'] . "</Say></Response>";

              Back to attributes list


              finishOnKey lets you set a value that your caller can press to submit their digits.

              For example, if you set finishOnKey to # and your caller enters 1234#, Twilio will immediately stop waiting for more input after they press #.

              Twilio will then submit Digits=1234 to your action URL (note that the # is not included).

              Allowed values for this attribute are:

              • # (this is the default value)
              • *
              • Single digits 09
              • An empty string ('')

              If you use an empty string, <Gather> will capture all user input and no key will end the <Gather>. In this case, Twilio submits the user's digits to the action URL only after the timeout is reached.

              Back to attributes list

              If the following TwiML is used, finishOnKey has no impact once the caller starts speaking.

              <?xml version="1.0" encoding="UTF-8"?>
                  <Gather input="speech dtmf" finishOnKey="#" timeout="5">
                          Please say something or press * to access the main menu
                  <Say>We didn't receive any input. Goodbye!</Say>


              You can improve Twilio's recognition of the words or phrases you expect from your callers by adding hints to your <Gather>.

              The hints attribute contains a list of words or phrases that Twilio should expect during recognition.

              You may provide up to 500 words or phrases in this list, separating each entry with a comma. Your hints may be up to 100 characters each, and you should separate each word in a phrase with a space, e.g.:

              hints="this is a phrase I expect to hear, keyword, product name, name"

              Back to attributes list


              Specify which inputs (DTMF or speech) Twilio should accept with the input attribute.

              The default input for <Gather> is dtmf. You can set input to dtmf, speech, or dtmf speech.

              If you set input to speech, Twilio will gather speech from the caller for a maximum duration of 60 seconds.

              If you're using Twilio's speech recognition with <Gather>, you can use this tool to estimate your costs.

              If you set dtmf speech for your input, dtmf will take precedence over speech. If the caller enters the numDigits or presses the finishOnKey , the <Gather> will end without collecting more speech.

              The following example shows a <Gather> that specifies speech input from the user. When this TwiML executes, the caller will hear the <Say> prompt. Twilio will then collect speech input for up to 60 seconds.

              Once the caller stops speaking for five seconds, Twilio posts their transcribed speech to your action URL.


                    Back to attributes list


                    The language attribute specifies the language Twilio should recognize from your caller.

                    This value defaults to en-US, but you can set your language to any of our supported languages: see the full list.

                    Back to attributes list


                    The method you set on <Gather> tells Twilio whether to request your action URL via HTTP GET or POST.

                    POST is <Gather>'s default method.

                    Back to attributes list


                    You can set the number of digits you expect from your caller by including numDigits in <Gather>.

                    The numDigits attribute only applies to DTMF input.

                    For example, you might wish to set numDigits="5" when asking your caller to enter their 5-digit zip code. Once the caller enters the final digit of 94117, Twilio will immediately submit the data to your action URL.

                    Back to attributes list


                    If you provide a partialResultCallback URL, Twilio will make requests to this URL in real-time as it recognizes speech. These requests will contain a parameter labeled UnstableSpeechResult which contains partial transcriptions. These transcriptions may change as the speech recognition progresses.

                    The webhooks Twilio makes to your partialResultCallback are asynchronous. They do not accept any TwiML in response. If you want to take more actions based on this partial result, you need to use the REST API to modify the call.

                    Back to attributes list


                    The profanityFilter specifies if Twilio should filter profanities out of your speech transcription. This attribute defaults to true, which replaces all but the initial character in each filtered profane word with asterisks, e.g., 'f***.'

                    If you set this attribute to false, Twilio will no longer filter any profanities in your transcriptions.

                    Back to attributes list


                    When collecting speech from your caller, speechTimeout sets the limit (in seconds) that Twilio will wait before it stops its speech recognition. After this timeout is reached, Twilio will post the speechResult to your action URL.

                    If you use both timeout and speechTimeout in your <Gather>, timeout will take precedence for DTMF input and speechTimeout will take precedence for speech.

                    If you set speechTimeout to auto, Twilio will stop speech recognition when there is a pause in speech and return the results immediately.

                    Back to attributes list


                    timeout allows you to set the limit (in seconds) that Twilio will wait for the caller to press another digit or say another word before it sends data to your action URL.

                    For example, if timeout is 3, Twilio wait three seconds for the caller to press another key or say another word before submitting their data.

                    Twilio will wait until all nested verbs execute before it begins the timeout period.

                    The default timeout value is 5.

                    Back to attributes list


                    speechModel allows you to select a specific model that is best suited for your use case to improve the accuracy of speech to text. The attribute currently supports default, numbers_and_commands and phone_call.

                    numbers_and_commands and phone_call are best suited for the use cases where you'd expect to receive short queries such as voice commands or voice search. Please explore both options to see which works best for your use case.

                    Back to attributes list


                    actionOnEmptyResult allows you to force <Gather> to send a webhook to the action url even when there is no input. By default, if <Gather> times out while waiting for the input, it will continue on to the next TwiML instruction.

                    For example, in the following TwiML when <Gather> times out, <Say> instruction is executed.

                    <?xml version="1.0" encoding="UTF-8"?>
                                Please enter your account number,
                                followed by the pound sign
                        <Say>We didn't receive any input. Goodbye!</Say>

                    To always force <Gather> to send a webhook to the action Url use the following TwiML,

                    <?xml version="1.0" encoding="UTF-8"?>
                        <Gather actionOnEmptyResult="true" action="/gather-action">
                                Please enter your account number,
                                followed by the pound sign

                    Nest other verbs

                    You can nest the following verbs within <Gather>:


                    The following example shows a <Gather> with a nested <Say>. This will read some text to the caller, and allows the caller to enter input at any time while that text is read to them:


                          When a <Gather> contains nested <Say> or <Play> verbs, the timeout begins either after the audio completes or when the caller presses their first key.

                          Manage timeouts

                          When a <Gather> reaches its timeout without any user input, call control will fall through to the next verb in your original TwiML document.

                          If you wish to have Twilio submit a request to your action URL even if <Gather> times out, include a <Redirect> after the <Gather> like this:

                                Send information to your action URL even if <Gather> times out

                                <Redirect> after <Gather>

                                Send information to your action URL even if <Gather> times out

                                With this code, Twilio will move to the next verb in the document (<Redirect>) when <Gather> times out. In our example, we instruct Twilio to make a new GET request to /process_gather.php?Digits=TIMEOUT


                                A few common problems users face when working with <Gather>:

                                Problem: <Gather> doesn't receive caller input when the caller is using a VoIP phone.

                                Solution: Some VoIP phones have trouble sending DTMF digits. This is usually because these phones use compressed bandwidth-conserving audio protocols that interfere with the transmission of the digit's signal. Consult your phone's documentation on DTMF problems.

                                Problem: Twilio does not send the Digits parameter to your <Gather> URL.

                                Solution: Check to ensure your application is not responding to the action URL with an HTTP 3xx redirect. Twilio will follow this redirect, but won't resend the Digits parameter.

                                If you encounter other issues with <Gather>, please reach out to our support team for assistance.

                                Language appendix


                                Language 言語タグ
                                アフリカーンス語(南アフリカ) af-ZA
                                アムハラ語(エチオピア) am-ET
                                アラビア語(アルジェリア) ar-DZ
                                アラビア語(バーレーン) ar-BH
                                アラビア語(エジプト) ar-EG
                                アラビア語(イラク) ar-IQ
                                アラビア語(イスラエル) ar-IL
                                アラビア語(ヨルダン) ar-JO
                                アラビア語(クウェート) ar-KW
                                アラビア語(レバノン) ar-LB
                                アラビア語(モロッコ) ar-MA
                                アラビア語(オマーン) ar-OM
                                アラビア語(カタール) ar-QA
                                アラビア語(サウディアラビア) ar-SA
                                アラビア語(パレスチナ自治区) ar-PS
                                アラビア語(チュニジア) ar-TN
                                アラビア語(アラブ首長国連邦) ar-AE
                                アルメニア語(アルメニア) hy-AM
                                アゼルバイジャン語(アゼルバイジャン) az-AZ
                                バスク語(スペイン) eu-ES
                                ベンガル語(バングラデシュ) bn-BD
                                ベンガル語(インド) bn-IN
                                ブルガリア語(ブルガリア) bg-BG
                                カタルーニャ語(スペイン) ca-ES
                                中国語、広東語(繁体字、香港) yue-Hant-HK
                                中国語(簡体字、中国) cmn-Hans-CN
                                中国語、標準中国語(簡体字、香港) cmn-Hans-HK
                                中国語(繁体字、台湾) cmn-Hant-TW
                                クロアチア語(クロアチア) hr-HR
                                チェコ語(チェコ共和国) cs-CZ
                                デンマーク語(デンマーク) da-DK
                                オランダ語(オランダ) nl-NL
                                英語(オーストラリア) en-AU
                                英語(カナダ) en-CA
                                英語(ガーナ) en-GH
                                英語(インド) en-IN
                                英語(アイルランド) en-IE
                                英語(ケニア) en-KE
                                英語(ニュージーランド) en-NZ
                                英語(ナイジェリア) en-NG
                                英語(フィリピン) en-PH
                                英語(南アフリカ) en-ZA
                                英語(タンザニア) en-TZ
                                英語(英国) en-GB
                                英語(米国) en-US
                                Filipino (Philippines) fil-PH
                                フィンランド語(フィンランド) fi-FI
                                フランス語(カナダ) fr-CA
                                フランス語(フランス) fr-FR
                                ガリシア語(スペイン) gl-ES
                                ジョージア語(ジョージア) ka-GE
                                ドイツ語(ドイツ) de-DE
                                ギリシャ語(ギリシャ) el-GR
                                グジャラート語(インド) gu-IN
                                ヘブライ語(イスラエル) he-IL
                                ヒンディー語(インド) hi-IN
                                ハンガリー語(ハンガリー) hu-HU
                                アイスランド語(アイスランド) is-IS
                                インドネシア語(インドネシア) id-ID
                                イタリア語(イタリア) it-IT
                                日本語(日本) ja-JP
                                ジャワ語(インドネシア) jv-ID
                                カナラ語(インド) kn-IN
                                クメール語(カンボジア) km-KH
                                韓国語(韓国) ko-KR
                                ラオ語(ラオス) lo-LA
                                ラトビア語(ラトビア)  lv-LV
                                リトアニア語(リトアニア) lt-LT
                                マレー語(マレーシア) ms-MY
                                マレーシア(インド) ml-IN
                                マラーティー語(インド) mr-IN
                                ネパール語(ネパール)  ne-NP
                                Norwegian Bokmål (Norway) nb-NO
                                ペルシャ語(イラン) fa-IR
                                ポーランド語(ポーランド) pl-PL
                                ポルトガル語(ブラジル) pt-BR
                                ポルトガル語(ポルトガル) pt-PT
                                ルーマニア語(ルーマニア) ro-RO
                                ロシア語(ロシア) ru-RU
                                セルビア語(セルビア) sr-RS
                                シンハラ語(スリランカ) si-LK
                                スロバキア語(チェコスロバキア) sk-SK
                                スロベニア語(スロベニア) sl-SI
                                スペイン語(アルゼンチン) es-AR
                                スペイン語(ボリビア) es-BO
                                スペイン語(チリ) es-CL
                                スペイン語(コロンビア) es-CO
                                スペイン語(コスタリカ) es-CR
                                スペイン語(ドミニカ共和国) es-DO
                                スペイン語(エクアドル) es-EC
                                スペイン語(エルサルバドル) es-SV
                                スペイン語(グアテマラ) es-GT
                                スペイン語(ホンデュラス) es-HN
                                スペイン語(メキシコ) es-MX
                                スペイン語(ニカラグア) es-NI
                                スペイン語(パナマ) es-PA
                                スペイン語(パラグアイ) es-PY
                                スペイン語(ペルー) es-PE
                                スペイン語(プエルトリコ) es-PR
                                スペイン語(スペイン) es-ES
                                スペイン語(米国) es-US
                                スペイン語(ウルグアイ) es-UY
                                スペイン語(ベネズエラ) es-VE
                                スンダ語(インドネシア) su-ID
                                スワヒリ語(ケニア)  sw-KE
                                スワヒリ語(タンザニア) sw-TZ
                                スウェーデン語(スウェーデン) sv-SE
                                タミール語(インド) ta-IN
                                タミール語(マレーシア) ta-MY
                                タミル語(シンガポール) ta-SG
                                タミル語(スリランカ) ta-LK
                                テルグ語(インド) te-IN
                                タイ語(タイ) th-TH
                                トルコ語(トルコ) tr-TR
                                ウクライナ語(ウクライナ) uk-UA
                                ウルドゥ語(インド) ur-IN
                                ウルドゥ語(パキスタン) ur-PK
                                ベトナム語(ベトナム) vi-VN
                                ズールー語(南アフリカ) zu-ZA
                                Rate this page:


                                誰しもが一度は考える「コーディングって難しい」。そんな時は、お問い合わせフォームから質問してください。 または、Stack Overflow でTwilioタグのついた情報から欲しいものを探してみましょう。