RFC 3966 / E.164: how to create clickable phone number links in HTML
Enter a phone number and get a conformant RFC 3966 tel: link. Formatting characters are stripped automatically.
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>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:
RFC 3966 permits visual separators (-, ., (, )) inside global-number-digits, but real dialers handle them inconsistently — omit them and stick to bare E.164 digits.
Parameters attach extra dialing instructions after the number, each written as a ;name=value pair.
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=.
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.
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.
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>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 digitsThis 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.
What happens when someone clicks a tel: link depends entirely on the platform:
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.
href="tel:(212) 555-0100"href="tel:+12125550100"href="tel:2125550100"href="tel:+12125550100"href="tel:+1-212-555-0100"href="tel:+12125550100"href="tel:5550100"href="tel:+14165550100"href="TEL:+14165550100"href="tel:+14165550100"