Skip to content

Web NFC API

Published

Web NFC API — The Web NFC API lets a web app read and write NDEF messages to NFC tags via the NDEFReader interface.

  • Legend
  • Yes
  • Partial
  • Flag
  • No
  • Unknown
Browser / PlatformSupportVersionsConfidenceSourceNotes
Chrome (Desktop)No—highsource1
Chrome (Android)Yes89highsource—
Edge (Desktop)No—highsource23
Firefox (Desktop)No—highsource4
Firefox (Android)No—highsource56
Safari (macOS)No—highsource7
Safari (iOS)No—highsource89
Samsung InternetYes15.0highsource10
WebView (Android)Yes89highsource11
  1. No Chrome support is recorded in browser-compat-data.
  2. No Edge support is recorded in browser-compat-data.
  3. Derived by browser-compat-data mirroring from Chrome.
  4. No Firefox support is recorded in browser-compat-data.
  5. No Firefox for Android support is recorded in browser-compat-data.
  6. Derived by browser-compat-data mirroring from Firefox.
  7. No Safari support is recorded in browser-compat-data.
  8. No Safari on iOS support is recorded in browser-compat-data.
  9. Derived by browser-compat-data mirroring from Safari.
  10. Derived by browser-compat-data mirroring from Chrome Android.
  11. Derived by browser-compat-data mirroring from Chrome Android.

Source data: /compatibility/web-nfc.json · Global usage: 35 % (StatCounter 2026-05)

Source: spec · MDN · Last verified 2026-10-03 · Confidence: high (computed from sources)

scan() must be called from a secure, active top-level browsing context. Once scanning starts, reading events deliver each tag’s NDEF message:

async function scanNfcTags(onTag) {
const reader = new NDEFReader();
await reader.scan();
reader.onreading = (event) => onTag(event.message, event.serialNumber);
}

Check for NDEFReader before offering the feature, and give the reader a fallback path when it is absent:

if ('NDEFReader' in window) {
scanButton.hidden = false;
} else {
scanButton.hidden = true;
fallbackNotice.textContent = 'This browser cannot scan NFC tags from the page.';
}
  • Requires a secure context — plain HTTP origins other than potentially trustworthy ones like localhost cannot use it.
  • scan() must run in an active top-level browsing context; calling it from a non-active context rejects the returned promise, and losing visibility later suspends rather than cancels the read.
  • Per MDN browser-compat-data, Web NFC has no desktop implementation in any browser — 'NDEFReader' in window is false on desktop and the fallback path above is required there.
  • Support is limited to Chromium-based browsers on Android (Chrome for Android and browsers that mirror its engine, such as Samsung Internet); Firefox and Safari implement none of the API on any platform.

For the full reference (permissions, write(), and the NDEF message format), see Web NFC: reading and writing NFC tags from the web.

See also WebHID API for another device-access API.

← Back to the Compatibility explorer.