Contact Sales

All fields are required

How to Protect Users' Private Information With Calls by… | SignalWire
Developers

How to Protect Users' Private Information With Calls by Proxy

Facilitating voice or text communication between two parties by a proxy

SignalWire

In applications where users or service providers need to talk by voice or text but should not see each other’s real phone numbers, a call/text proxy can safely mediate communication. Using SignalWire’s SDK and proxy session endpoints, you can create back-to-back voice calls or proxied SMS between two users while masking their base identities. This preserves privacy in scenarios like driver-to-rider contact, anonymous support hotlines, and marketplace buyer-seller chats.

Protect Users’ Private Information With Calls by Proxy

Modern applications often need to let people communicate directly by phone or text, without exposing personal contact information. Marketplaces, rideshare platforms, delivery services, and on-demand support tools all rely on real-time communication, but sharing raw phone numbers creates privacy, safety, and compliance risks.

A call-by-proxy pattern solves this by allowing two parties to communicate through an intermediary number. The platform controls the connection, while neither side ever sees the other’s real phone number.

This article explains what calls by proxy are, why they matter, and how developers can implement privacy-preserving voice and messaging workflows using SignalWire.

What is a call-by-proxy?

A call-by-proxy is a communication pattern where two parties are connected through a platform-owned phone number instead of directly calling each other.

Instead of:

  • User A calls User B’s real phone number

The flow becomes:

  • User A calls a proxy number

  • The platform routes the call to User B

  • Replies flow back through the same proxy

Both users communicate normally, but neither learns the other’s private phone number.

The same pattern applies to SMS and MMS.

Why calls by proxy are critical for privacy-first applications

Exposing personal phone numbers creates long-term risks:

  • Users can be contacted outside the platform

  • Numbers can be stored, shared, or misused

  • Harassment or unwanted follow-ups become possible

  • Compliance obligations become harder to manage

Calls by proxy help platforms:

  • Protect user privacy by default

  • Maintain control over communication windows

  • Enforce policies around timing, duration, and access

  • Reduce liability from off-platform contact

This pattern is now standard in privacy-sensitive applications.

Common use cases for call and text proxying

Calls by proxy are widely used in applications where trust and anonymity matter:

  • Marketplace buyer and seller communication

  • Driver and rider coordination in mobility apps

  • Delivery driver and customer contact

  • Anonymous support or crisis hotlines

  • Healthcare coordination without exposing staff numbers

  • Short-lived service interactions that should not persist

In all of these cases, communication is necessary, but permanent identity exposure is not.

How call-by-proxy works in practice

At a high level, a proxied call or message flow looks like this:

  1. A user initiates a call or sends a message to a platform-owned number

  2. Your application identifies the active proxy session

  3. The platform creates or routes a second leg to the intended recipient

  4. Media or messages flow through the proxy

  5. When the session ends, the connection is torn down

The platform controls the session lifecycle, routing logic, and visibility.

Implementing calls by proxy with SignalWire

SignalWire supports call-by-proxy patterns through programmable voice and messaging APIs.

A typical implementation includes:

  • A backend service that tracks active proxy sessions

  • Logic to map inbound calls or messages to the correct recipient

  • Creation of outbound call legs or message sends through SignalWire

  • Optional session expiration or access rules

Because SignalWire treats calls as programmable workflows, proxy logic can be enforced consistently across voice and messaging.

This code snippet walkthrough facilitates voice or text communication between two parties by a proxy in the middle that keeps the base identities of each party hidden - while allowing them to identify each other by convenient labels.


Getting started with calls by proxy

You will need a machine with Python installed, a SignalWire account, a provisioned SignalWire phone number, and optionally Docker if you decide to run it in a container.

For this demo we will be using Python.

Running call/text by proxy: How it works

Methods and Endpoints:

Endpoint: /lookup-session
Methods: GET OR POST
When this is called, it will lookup an active proxy session and bascially create a back to back phone call that is proxied, or a proxied text message.  LEG A <-> SIGNALWIRE PROXY <-> LEG B 

Set up your environment file

  1. Copy from example.env and fill in your values
  2. Save new file called .env

Your file should look something like this:

## This is the full name of your SignalWire Space. e.g.: example.signalwire.com
SIGNALWIRE_SPACE=
# Your Project ID - you can find it on the `API` page in your Dashboard.
SIGNALWIRE_PROJECT=
# Your API token - you can generate one on the `API` page in your Dashboard
SIGNALWIRE_TOKEN=
# The proxy 1 phone number you'll be using for this Snippets. Must include the `+1` , e$
SIGNALWIRE_NUMBER_1=+14346613376
# The proxy 2 phone number you'll be using for this Snippets. Must include the `+1` , e$
SIGNALWIRE_NUMBER_2=+14346613377

Modify your proxy session file:

  1. Edit proxy_sessions.json
[
  {
    "Session_Id": "Demo123",
    "Participant_A_Number": "+15551237654",
    "Participant_B_Number": "+15553883000",
    "Proxy_Number": "+15556611212"
  },
  {
    "Session_Id": "Demo234",
    "Participant_A_Number": "+15555181212",
    "Participant_B_Number": "+12347896543",
    "Proxy_Number": "+15556611212"
  }
]

Build and run on Docker

Use our pre-built image from Docker Hub:

For Python:
docker pull signalwire/snippets-call-text-proxy:python


Or build your own image:

docker build -t snippets-call-text-proxy .


Run your image:

docker run --publish 5000:5000 --env-file .env snippets-call-text-proxy


The application will run on port 5000.

Build and Run Natively For Python:

1. Replace environment variables
2. From command line run, python3 app.py

Proxying voice calls without exposing phone numbers

For voice calls, the proxy workflow usually involves:

  • Receiving an inbound call to a SignalWire number
  • Looking up the corresponding session in your application
  • Dialing the destination party from the same proxy number
  • Bridging both legs under platform control

Neither caller sees the other’s real number, and call teardown happens cleanly when the session ends.

Proxying SMS and MMS messages

The same concept applies to text messaging:

  • Messages are sent to a proxy number
  • Your application determines the destination
  • Outbound messages are sent on behalf of the proxy
  • Replies return through the same path

This allows two-way messaging without exposing personal contact details.

Security and compliance considerations

When implementing calls by proxy, platforms should also consider:

  • Session expiration to prevent indefinite reuse
  • Rate limits to reduce abuse
  • Logging and auditing for moderation or compliance
  • Opt-in and consent requirements for messaging
  • Regional regulations governing voice and SMS traffic

Because the platform owns the proxy number, these controls are enforceable centrally.

When not to use calls by proxy

Calls by proxy are not always necessary.

You may not need a proxy if:

  • Users explicitly consent to sharing contact details
  • Communication is internal to an organization
  • Long-term direct contact is part of the product

However, for consumer-facing platforms, proxying is often the safer default.

Why calls by proxy scale better than direct connections

As applications grow, unmanaged direct connections become harder to control.

Proxy-based communication allows platforms to:

  • Rotate numbers without user disruption
  • Shut down abusive sessions instantly
  • Add monitoring or analytics centrally
  • Introduce AI or automation later without redesign

This makes proxying a future-proof architectural choice, not just a privacy feature.

If you have any issues or questions, join our Discord and chat with others in the SignalWire community!

If you need assistance or support with your SignalWire services please file a support ticket from your Dashboard.

Frequently asked questions

What is a call/text proxy?
A call/text proxy is a communication pattern in which two parties can voice call or text each other through an intermediary number that masks their real phone numbers.

Why use a proxy to protect private information?
Proxies let applications enable direct communication without revealing user phone numbers, reducing privacy risk and helping protect user data in marketplaces, marketplaces, rideshares, delivery apps, and support systems.

How does SignalWire implement proxy calls and texts?
SignalWire uses a proxy session pattern where a backend endpoint looks up a session and creates two legs of a proxied voice call or text exchange (Leg A ←→ SIGNALWIRE PROXY ←→ Leg B).

What languages does the proxy snippet support?
The demo uses Python and the SignalWire SDK, but the pattern applies to any supported language with SDK bindings (e.g., Node.js, Ruby, etc.).

What are common use cases for calls by proxy?
Common scenarios include anonymous driver-rider contact in mobility services, buyer/seller masked messaging in marketplaces, and support hotlines where the real contact info must remain private.

Related Articles