Skip to content

Web Bluetooth API

Published

Web Bluetooth API — The Web Bluetooth API lets a web app request access to nearby Bluetooth Low Energy devices via navigator.bluetooth.requestDevice() and communicate with their GATT services.

  • Legend
  • Yes
  • Partial
  • Flag
  • No
  • Unknown
Browser / PlatformSupportVersionsConfidenceSourceNotes
Chrome (Desktop)Yes56highsource—
Chrome (Android)Yes56highsource1
Edge (Desktop)Yes79highsource2
Firefox (Desktop)No—highsource3
Firefox (Android)No—highsource45
Safari (macOS)No—highsource6
Safari (iOS)No—highsource78
Samsung InternetYes6.0highsource9
WebView (Android)No—highsource10
OperaYes43highsource11
  1. Derived by browser-compat-data mirroring from Chrome.
  2. Derived by browser-compat-data mirroring from Chrome.
  3. Implementation tracking: https://bugzil.la/674737.
  4. Implementation tracking: https://bugzil.la/674737.
  5. Derived by browser-compat-data mirroring from Firefox.
  6. Implementation tracking: https://webkit.org/b/101034.
  7. Implementation tracking: https://webkit.org/b/101034.
  8. Derived by browser-compat-data mirroring from Safari.
  9. Derived by browser-compat-data mirroring from Chrome Android.
  10. No WebView Android support is recorded in browser-compat-data.
  11. Mirrors Chrome's implementation (BCD `opera: mirror`): Linux support exists but is not enabled by default.

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

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

Requesting a device must happen inside a user gesture (e.g. a click handler), and you narrow the request with filters naming the GATT service(s) you intend to use:

async function connectHeartRateMonitor() {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['heart_rate'] }],
});
const server = await device.gatt.connect();
const service = await server.getPrimaryService('heart_rate');
const characteristic = await service.getCharacteristic('heart_rate_measurement');
await characteristic.startNotifications();
return characteristic;
}

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

if ('bluetooth' in navigator) {
connectButton.hidden = false;
} else {
connectButton.hidden = true;
fallbackNotice.textContent = 'This browser cannot pair Bluetooth devices from the page.';
}
  • Requires a secure context — calling it from an insecure origin is not permitted.
  • requestDevice() requires transient user activation (a click or tap handler); without it, the returned promise rejects with a SecurityError.
  • If no device is available to return — for example the user does not select one — requestDevice() rejects with a NotFoundError.
  • Support is not uniform across browsers or platforms; check the support table above before relying on the feature for a given target.
  • Always pair the runtime check above with the support table, since a browser can expose navigator.bluetooth while still restricting behaviour in ways that only surface at request time.

For the full reference (device-picker flow, GATT model, permission behaviour), see Web Bluetooth API.

Related: WebUSB API.

← Back to the Compatibility explorer.