Twilio Proxy for masked phone numbers in Node.js


Twilio Proxy for masked phone numbers in Node.js

Twilio Proxy for masked phone numbers in Node.js

Twilio offers a service called Proxy to allow masked phone numbers. What that means? You know when you call an Uber and the number shown to you is not the phone number of your driver?! Exactly that means masked phone number.

The Proxy API connects two parties together, allowing them to communicate and keep personal information private.

masked phone numbers

How to make a call in Node.js

Let’s get to the point. I’ve made a twilio-service.js

import Twilio from 'twilio'

const TWILIO_SERVICE_ID = 'YOUR_SERVICE_ID' // create a service here: https://console.twilio.com/us1/develop/proxy/services
const TWILIO_ACCOUNT_SID= 'YOUR_ACCOUNT_ID'
const TWILIO_AUTH_TOKEN = 'YOUR_AUTH_TOKEN'

const twilioService = function () {
  let client
  if (!client) {
    client = new Twilio(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, {
      logLevel: 'debug'
    })
    delete client.constructor
  }

  return {
    _client: client,

    /**
     * Creates new session to prepare a call
     * docs: https://www.twilio.com/docs/proxy/api/session
     * @returns
     */
    createSession: async function () {
      return client.proxy.services(TWILIO_SERVICE_ID).sessions.create({
        mode: 'voice-only'
      })
    },

    /**
     * Delete a call sesion
     * @param {string} sessionId The id of session
     * docs: https://www.twilio.com/docs/proxy/api/session#delete-a-session-resource
     * @returns
     */
    deleteSession: async function (sessionId) {
      return client
        .proxy
        .services(TWILIO_SERVICE_ID)
        .sessions(sessionId)
        .remove()
    },

    /**
     * Add new participant to the call
     * Maximum 2 participants per call are allowed
     * docs: https://www.twilio.com/docs/proxy/api/participant
     *
     * @param {string} sessionId The id of session
     * @param {string} phoneNumber The phone number of participant to call
     * @returns
     */
    addParticipantToSession: async function (sessionId, phoneNumber) {
      return client
        .proxy
        .services(TWILIO_SERVICE_ID)
        .sessions(sessionId)
        .participants
        .create({
          identifier: phoneNumber
        })
    }

  }
}

export default twilioService()

To make a call only need 3 steps:

  1. Create a new proxy session
  2. Add participants to the session created previously. We have two participants. Each of them has a property identifier (their real phone number) and has assigned a new property proxyIdentifier (the masked phone number).
  3. Now each of them can call their own proxyIdentifier, Twilio match their masked number with the masked number of the recipient, and call then the real number of the recipient.
  import TwilioService from '../services/twilio';

  const participant1Number = '+14156789012';
  const participant2Number = '+17012345678';

  const session = await TwilioService.createSession()
  // session = {
  //   ...
  //    "sid": "KCaa270143d7a1ef87f743313a07d4069d",
  //    ...
  // }
  const participantFrom = await TwilioService.addParticipantToSession(session.sid,participant1Number)
  // participantFrom = {
  //   "sid": "KPa4947c3d7b8ca7b0138dbc8181f12e16",
  //   "sessionSid": "KCaa270143d7a1ef87f743313a07d4069d",
  //   "identifier": "+14156789012",
  //   "proxyIdentifier": "+14153749231",
  // }
  const participantTo = await TwilioService.addParticipantToSession(session.sid, participant2Number)  
  participantTo = {
  //   "sid": "KP48f197284b3f50c5b31891ecc8377c20",
  //   "sessionSid": "KCaa270143d7a1ef87f743313a07d4069d",
  //   "identifier": "+17012345678",
  //   "proxyIdentifier": "+40371246711",
  // }

What is next?

Let’s say you are +14156789012 and you need to connect with +17012345678. You’ve run the previous code, now Twilio created a proxy between these two numbers. But you don’t know the number of +17012345678.

Take your phone, make a call to your proxyIdentifier, +14153749231, Twilio identifies your identity and match your masked phone number with the other paticipant, and call their real name +17012345678, but you never know which is the real number of your companion speaker. To make the call from the other side, do the same.

Do you wanna cancel the proxy between two of them?

 await TwilioService.deleteSession(session.sid);

That is all boys. For further questions send me an email or message on Twitter. Do you like the article? Share it!

Newsletter


Related Posts

What I learned to never do in a presentation meeting

What I learned to never do in a presentation meeting. I had a very bad meeting experience with a gateway provider.

Startup graveyard is a series of killed projects that made millions in revenue per year

Startup graveyard is a series of killed projects that made millions in revenue per year. Just watch their graveyard and do it your own. What better validation do you expect.

How do you detect Credit card type based on the number?

How do you detect Credit card type based on the number using JavaScript? Simple solution using only code, no library required.

Download files in Javascript from Node.js server

How to download files in Javascript, either you use Vue.js, React, Angular, jQuery, or Vanilla JS. On the backend side, we run on Node.js using Express.js.

What books to read

The list of books I read. I decided one year ago to challenge myself and read as many books as I can this year. Take a look at this article and find all of them.

Startup tools for a better version

Are you a startup founder and are you looking for startup tools like invoice, planning or just making money with much automation? Check this article, from founder to founders.

How to use express validator?

How to use express validator through full examples. I found express validator very powerful, but having a poor documentation.

How to check DNS propagation

How to check DNS propagation? Did you changed the DNS records recently and now is not working? Stop crying and check the DNS propagation.

LibraPay library for Nodejs

LibraPay library for Nodejs - integrate Libra Bank online payment gateway using this library for NodeJs.

Opensource Object Storage with Minio

Opensource Object Storage with Minio using Docker. An alternative to AWS S3, Linode Storage, Google Storage, Azure Storage.