# Extension Code Number Masking: One Number, Many Private Contacts (2026)

> How extension-code number masking works: a caller dials one masked number and enters a short code (or scans a QR) to reach the right person, with neither side seeing the other's number. Setup, API and costs.

Source: https://edesy.in/blog/extension-code-number-masking-2026

**Extension code number masking lets one masked phone number reach many people privately. Each person gets a
short code; a caller dials the masked number, enters the code followed by `#` (or scans a QR that sends it), and
is connected to that person. Neither side sees the other's real number. It suits vehicle tags, parcel labels,
classifieds and society intercoms.**

> **Set up extension codes:** [Open the Edesy masking portal](https://masking.edesy.in/?utm_source=edesy.in&utm_medium=blog&utm_campaign=extension-code-number-masking-2026). Switch a number to extension routing and create your first code.

## How a call works

```
Caller dials +91 80XX XXX XXX  ->  enters 482193#  ->  connected to the person behind code 482193
```

1. The caller dials the masked number.
2. They hear a short prompt (default: "Please enter the code, followed by the hash key"). Digits sent by the
   phone interrupt the prompt.
3. They enter the code and `#`.
4. If the code is active, the target's phone rings. The caller hears ringback.
5. The target sees the masked number as the caller ID, not the caller's real number.
6. When the target answers, the call is bridged and billing starts.

## What the caller hears

| Situation | What happens |
|---|---|
| Call connects | Prompt to enter the code |
| Valid, active code | Short pause, then the target rings |
| Wrong code or no input | "That code is not valid. Please try again." Up to 3 attempts, then goodbye |
| Inactive code | "This code is not active." Call ends |
| Target busy or no answer | Call ends; logged as missed |
| Account balance empty | "Service temporarily unavailable." Call ends |

## Extension codes vs sessions vs webhook routing

Edesy masking numbers have three routing modes. Choose per number.

| Mode | How the call finds its target | Best for |
|---|---|---|
| Sessions | Pair A and B on a number; route by who is calling; expiry and call limits | Orders, rides, bookings between two known people |
| Your routing webhook | Edesy asks your server (`masking.route`) where to send each call | Custom logic in your own app |
| Extension codes | The caller enters a code | Unknown callers: tags, labels, listings, intercom |

If both people are known when you set up the call, sessions are usually the better fit; see the
[session API guide](https://edesy.in/blog/number-masking-session-api-build-guide-2026). Extension codes shine when the caller
could be anyone.

## Setting it up

1. **Get a number.** Buy an Indian number in the Edesy voice portal (KYC first), then enroll it in masking.
2. **Switch it to extension routing:**

```http
PATCH https://voice-api.edesy.in/v1/masking/numbers/{number_id}/routing
{ "routing_mode": "extension",
  "extension_prompt": "Please enter the code, followed by the hash key." }
```

3. **Create an extension:**

```http
POST https://voice-api.edesy.in/v1/masking/extensions
{ "target_number": "9876543210", "label": "Car MH12AB1234", "reference": "tag_000123" }
```

The response includes the code (6 random digits if you don't supply one) and `dial_links`, one per
extension-mode number, each with a ready-made `tel_uri`.

4. **Print or publish it.** Put the `tel_uri` in a QR code or link, and print the number and code as text too.

You can also create, print and manage codes in the portal.

## The extension object

| Field | Notes |
|---|---|
| `code` | 4 to 10 digits, unique in your account; random if you omit it |
| `target_number` | The Indian number the call connects to |
| `label` | Your display name, e.g. a vehicle number |
| `reference` | Your own ID (tag, listing, shipment); unique when set |
| `status` | `active` or `inactive`; inactive codes play "not active" |
| `metadata` | Free-form data echoed back, never used for routing |
| `dial_links` | Read-only `tel:` links for QR codes and buttons |

Generated codes are random, not sequential, so people can't guess a neighbour's code. If you choose your own,
don't make them sequential either.

## Managing codes over time

- **Pre-print tags:** create extensions with `status: "inactive"` and no target. Activate each one when it is sold,
  with `PATCH /v1/masking/extensions/{id}` setting `target_number` and `status: "active"`.
- **Change the owner's number:** update `target_number`. The next call uses it; the printed code doesn't change.
- **Retire a code:** set it inactive, or delete it. Past call logs keep the code.
- **Find a code:** list with filters for `code`, `reference`, `status` or a search term.

## Events and logs

Your event webhook receives extension calls with `direction: "extension"`, the `extension_code` and your
`reference`: `call.incoming` when a valid code is entered, `call.connected` when the target answers, `call.missed`
if they don't, and `call.ended` with the bridged duration. Invalid codes produce no event. Call logs can be
filtered by direction and code.

## What it doesn't do (yet)

Be clear with your users about the limits:

- One target per code; no fallback number.
- The target can't call the caller back through the code. They see only the masked number.
- No whisper or announcement to the target before connecting.

## Cost

| Item | Price (excl. 18% GST) |
|---|---|
| Masked call minutes | Rs 1.50/min, 60-second pulse, 1-minute minimum |
| What is billed on an extension call | Bridged time only, after the target answers |
| Prompt and ringing | Not billed |
| Target never answers | No charge |
| Number rental | Rs 499/month (mobile or 92-series), Rs 449 (landline) |

See [number masking pricing](https://edesy.in/number-masking/pricing) and [what number masking costs](https://edesy.in/blog/what-number-masking-costs-india-2026).

Read more on the [extension codes feature page](https://edesy.in/number-masking/features/extension-codes), the
[number masking hub](https://edesy.in/number-masking) and the [number masking docs](https://edesy.in/docs/number-masking). For specific uses, see
[QR vehicle tags](https://edesy.in/blog/qr-code-vehicle-tag-masked-calling-2026) and
[parcel labels](https://edesy.in/blog/masked-calling-for-parcel-labels-2026).

## Frequently Asked Questions

### What is extension code number masking?

It is a way to give many people a private contact on one shared masked number. Each person gets a short numeric code. A caller dials the masked number, enters the code followed by #, and is connected to that person. Both sides see only the masked number.

### How is it different from session-based masking?

Session masking pairs two known people (say a customer and a delivery agent) on a virtual number for a limited time. Extension codes work when the caller is unknown in advance, such as whoever scans a vehicle tag or reads a classified ad, because the code identifies who they want to reach.

### Can the caller skip typing the code?

Yes. Each extension has a tel: link such as tel:+9180XXXXXXXX,,482193#. Put it in a QR code or a web button and the phone dials the number, pauses, and sends the code. Print the code too, because some phones don't send it automatically.

### What happens if someone enters the wrong code?

They hear that the code isn't valid and can try again, up to three attempts, after which the call ends. Inactive codes play a message saying the code isn't active.

### How much does an extension-code call cost?

Masking is Rs 1.50 per minute on a 60-second pulse with a 1-minute minimum, plus number rental. For extension calls, only the bridged time after the target answers is billed; the prompt and ringing aren't. Prices exclude 18% GST.

### How many extensions can one number have?

Any number. Extensions belong to your account, not to a single number, and any of your extension-mode numbers accepts any of your codes, so you can add numbers for capacity.
