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. 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- The caller dials the masked number.
- They hear a short prompt (default: "Please enter the code, followed by the hash key"). Digits sent by the phone interrupt the prompt.
- They enter the code and
#. - If the code is active, the target's phone rings. The caller hears ringback.
- The target sees the masked number as the caller ID, not the caller's real number.
- 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. Extension codes shine when the caller could be anyone.
Setting it up
- Get a number. Buy an Indian number in the Edesy voice portal (KYC first), then enroll it in masking.
- Switch it to extension routing:
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." }- Create an extension:
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.
- Print or publish it. Put the
tel_uriin 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, withPATCH /v1/masking/extensions/{id}settingtarget_numberandstatus: "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,statusor 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 and what number masking costs.
Read more on the extension codes feature page, the number masking hub and the number masking docs. For specific uses, see QR vehicle tags and parcel labels.