Search code examples
twiliotwilio-api

Register multiple webhooks for single Twilio number


Is it possible to programmatically register multiple webhook URLs for a single Twilio number? (When we receive an inbound SMS we would like multiple webhooks to be called with that data)

The docs for "update an incomingPhoneNumber resource" suggest that you can optionally set the smsUrl, but it's not clear how you would set multiple webhook URLs for a single number.


Solution

  • Not through the Twilio console options. You can write a Twilio Function that can fork out multiple outbound webhooks such as below, and then you just point the Twilio console to this Twilio Function.

    const axios = require('axios');
    const qs = require('querystring');
    
    exports.handler = function(context, event, callback) {
    
      let twiml = new Twilio.twiml.MessagingResponse();
    
      let {
        ApiVersion,
        SmsSid,
        SmsStatus,
        SmsMessageSid,
        NumSegments,
        ToState,
        From,
        MessageSid,
        AccountSid,
        ToCity,
        FromCountry,
        ToZip,
        FromCity,
        To,
        FromZip,
        ToCountry,
        Body,
        NumMedia,
        FromState
      } = event;
    
      let requestBody = {
        ApiVersion,
        SmsSid,
        SmsStatus,
        SmsMessageSid,
        NumSegments,
        ToState,
        From,
        MessageSid,
        AccountSid,
        ToCity,
        FromCountry,
        ToZip,
        FromCity,
        To,
        FromZip,
        ToCountry,
        Body,
        NumMedia,
        FromState
      };
    
      let url1 = "https://example.com/1";
      let url2 = "https://example.com/2";
    
      const config = {
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      };
    
      Promise.all([
        axios.post(url1, qs.stringify(requestBody), config),
        axios.post(url2, qs.stringify(requestBody), config)
      ]).then(result => {
        callback(null, twiml);
      }).catch(err => {
        console.log(err);
        callback(err);
      });
    };