tel: URI Scheme: The Complete Developer Guide

RFC 3966 / E.164: how to create clickable phone number links in HTML

tel: Link Builder

Enter a phone number and get a conformant RFC 3966 tel: link. Formatting characters are stripped automatically.

tel: URI

tel:+14165550100

HTML

<a href="tel:+14165550100">Call us</a>

Test this linkValid RFC 3966

What is the tel: URI scheme?

The tel: URI scheme (defined in RFC 3966) lets you create hyperlinks that, when tapped on a mobile device or clicked on a desktop with a VoIP client, immediately dial a phone number. It is supported by all modern browsers and mobile operating systems.

<a href="tel:+14165550100">Call us</a>

tel: URI Grammar

A tel: URI breaks down into a fixed scheme, a global number, and zero or more parameters. Take tel:+1-416-555-0100;ext=123:

schemetel:Lowercase by convention (schemes are case-insensitive per RFC 3986)
global-number-digits+14165550100Leading +, country code, subscriber digits — combined with any parameters this forms global-number
parameter;ext=123Zero or more, each ;name=value

RFC 3966 permits visual separators (-, ., (, )) inside global-number-digits, but real dialers handle them inconsistently — omit them and stick to bare E.164 digits.

tel: URI Parameters

Parameters attach extra dialing instructions after the number, each written as a ;name=value pair.

;ext=tel:+14165550100;ext=123
PBX extension dialed after connection
;isub=tel:+14165550100;isub=12
ISDN subaddress; rare outside legacy ISDN
;phone-context=tel:5550100;phone-context=+1416
Required for local (non-+) numbers

The phone-context rule is strict: a tel: URI without a leading + is a local number, and it is invalid under RFC 3966 unless it carries ;phone-context=.

E.164 International Format

Always use E.164 format in tel: links. E.164 is the ITU-T international standard: + followed by the country code, then the subscriber number, with no spaces, dashes, or parentheses.

US / Canada (NANP)(416) 555-0100tel:+14165550100
UK+44 20 7946 0000tel:+442079460000
Australia+61 2 5550 1234tel:+61255501234
Germany+49 30 12345678tel:+493012345678

US and Canada Area Codes

All US and Canadian numbers share country code +1 under the North American Numbering Plan (NANP). The three digits after the country code are the area code (NPA), followed by a seven-digit subscriber number.

Format: +1 [NPA] [NXX] [XXXX]

Example: +1 212 555 0100 (New York)

tel href: tel:+12125550100

Look up any area code in the GeoDial area code directory to see its location and copy correctly formatted tel: link examples.

Platform Examples

The href is the same everywhere — HTML, JSX, and iOS Safari all use plain tel:. Android only needs the intent:// form if you want to route around a browser that doesn't register a dialer handler.

HTML

<a href="tel:+14165550100">Call us</a>

React / JSX

<a href="tel:+14165550100">Call us</a>

iOS Safari

Safari already confirms before dialing; telprompt: was a non-standard scheme historically used to force that confirmation inside native app webviews (UIWebView/WKWebView) — use tel: here too

<a href="tel:+14165550100">Call us</a>

Android intent fallback

<a href="intent://+14165550100#Intent;scheme=tel;end">Call us</a>

Validating E.164 Numbers

Before building a tel: href, check the number matches the E.164 shape: a leading +, then 2–15 digits, with the first digit non-zero.

// E.164: "+" then 2–15 digits, first digit non-zero
const E164 = /^\+[1-9]\d{1,14}$/;

E164.test("+14165550100"); // true
E164.test("14165550100");  // false — no leading +
E164.test("+0416555010");  // false — country code cannot start with 0
E164.test("+5");           // false — needs at least two digits

This only validates shape, not whether the number is actually assigned to a working line — that requires a carrier lookup, which is a different problem than link formatting.

Browser and OS Behavior

What happens when someone clicks a tel: link depends entirely on the platform:

iOS SafariConfirmation sheet, then dials
Android ChromeOpens the dialer pre-filled; user presses call
macOS SafariOffers FaceTime Audio or a paired iPhone
Windows ChromePrompts for a registered handler (Teams, Skype); nothing if none
Linux desktopUsually no handler registered — link appears dead

Because the link can silently do nothing, always render the number as visible text next to it — desktop users, especially on Windows and Linux, frequently cannot action a tel: link at all.

Common Mistakes

Badhref="tel:(212) 555-0100"
Goodhref="tel:+12125550100"
Strip all formatting characters
Badhref="tel:2125550100"
Goodhref="tel:+12125550100"
Always include the + and country code
Badhref="tel:+1-212-555-0100"
Goodhref="tel:+12125550100"
No dashes in the href (dashes are allowed by RFC 3966 but cause issues on some clients)
Badhref="tel:5550100"
Goodhref="tel:+14165550100"
A local number without ;phone-context= is invalid under RFC 3966
Badhref="TEL:+14165550100"
Goodhref="tel:+14165550100"
The scheme is case-insensitive per spec, but some in-app browsers only match lowercase

Further Reading