WebUSB works in Chrome 61+, Edge 79+, Opera 48+, and Samsung Internet 8.2+. Firefox, Safari, and iOS do not support it. Learn the API, limits, and quirks.

Prince Dewani
May 1, 2026
WebUSB is a JavaScript API from the Web Platform Incubator Community Group at the W3C that lets web pages talk directly to USB devices through the navigator.usb object. It works in Chrome 61+, Edge 79+, Opera 48+, Samsung Internet 8.2+, and Opera Mobile 80+ on Windows, macOS, Linux, ChromeOS, and Android, while Firefox, Safari on macOS, Safari on iOS, and Internet Explorer do not support it.
This guide covers what WebUSB is, which browsers ship it, the key API features, how to connect to a USB device, and the known issues to plan around.
WebUSB is a JavaScript API that gives a web page low-level access to USB devices through the navigator.usb object, without any native driver or browser plugin. The Web Platform Incubator Community Group at the W3C edits the spec, and Reilly Grant at Google is the editor. The API supports control, interrupt, bulk, and isochronous transfers, so a single page can reflash an Arduino, drive a receipt printer, or read raw sensor data from custom hardware.
Chromium-based browsers ship WebUSB on desktop and Android, while Firefox, Safari on macOS, and Safari on iOS leave it out, so global browser support sits at about 76% as of April 2026.
Chrome supports WebUSB from Chrome 61 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 54 to 60 had WebUSB disabled by default and needed the chrome://flags/#enable-experimental-web-platform-features flag. Chrome 4 to 53 did not support WebUSB at all. The forget method that revokes a device permission shipped in Chrome 101.
Microsoft Edge supports WebUSB from Edge 79 on Windows, macOS, and Linux, the version where Edge moved to the Chromium engine. Pre-Chromium EdgeHTML versions 12 to 78 never added WebUSB. Edge for Android also supports WebUSB on phones and tablets, since it tracks Chromium for Android.
Firefox does not support WebUSB in any version on Windows, macOS, Linux, or Android. Mozilla has marked the spec as harmful in its public standards position, citing fingerprinting risk, security exposure of USB hardware, and the lack of a strong user-consent model. There is no about:config preference that turns WebUSB on, and Mozilla has no engineer publicly assigned to the work.
Safari does not support WebUSB on macOS, iPadOS, or iOS, and the WebKit standards positions list marks the spec as opposed. Safari Technical Preview also leaves the API out. iPad and iPhone users running the latest iOS see navigator.usb as undefined, with no flag to enable.
Opera supports WebUSB from Opera 48 on Windows, macOS, and Linux, and tracks every Chromium release after that. Opera 41 to 47 had WebUSB disabled by default. Opera 9 to 40 did not support it. Opera Mobile on Android adds WebUSB from Opera Mobile 80, while Opera Mini does not expose it in any version.
Samsung Internet supports WebUSB from version 8.2 on Galaxy phones and tablets, since it tracks the Chromium engine. Samsung Internet 4.0 to 8.0 did not support WebUSB. The WebUSB feature flag is on by default, so users do not need to flip a setting in the Samsung Internet app.
Chrome for Android supports WebUSB from Chrome 61, so any current Android device running Chrome can talk to USB peripherals over USB On-The-Go. The legacy stock Android Browser based on WebView 2.x to 4.x never added WebUSB. Firefox for Android does not support WebUSB in any version.
Internet Explorer does not support WebUSB in any version. The API depends on the Chromium device service plumbing, which Trident and pre-Chromium EdgeHTML never had. Microsoft has retired Internet Explorer 11, so move USB-dependent web apps to Chromium-based Edge or Chrome for any new work.
WebUSB exposes the full USB protocol stack to a web page, while the browser keeps the user in control of every device handshake. The headline features cover device selection, raw transfers, and event-based device updates.
You connect to a USB device by feature-detecting navigator.usb, calling requestDevice from a user gesture, opening the returned device, selecting a configuration, and claiming an interface. Every step has to run on a click or keypress because requestDevice requires user activation.
Use the filters argument to narrow the chooser to your hardware. A filter can match vendorId, productId, classCode, subclassCode, protocolCode, and serialNumber. The browser shows the user every connected device that matches at least one filter.
Paste this snippet into the DevTools console of Chrome, Edge, Opera, or Samsung Internet on Android. Click anywhere on the page once and the device chooser opens.
// Paste this into the DevTools console to confirm WebUSB support and request a device.
if ("usb" in navigator) {
console.log("WebUSB is available.");
document.body.addEventListener("click", async () => {
try {
const filters = [{ vendorId: 0x2341 }]; // example: any Arduino USB device
const device = await navigator.usb.requestDevice({ filters });
await device.open();
if (device.configuration === null) {
await device.selectConfiguration(1);
}
await device.claimInterface(0);
console.log("Opened device:", device.productName, "by", device.manufacturerName);
} catch (error) {
console.log("WebUSB request failed:", error.message);
}
}, { once: true });
} else {
console.log("WebUSB is not supported in this browser.");
}If the console prints "WebUSB is not supported in this browser", you are running Firefox, Safari, or a non-Chromium mobile browser. Fall back to a native helper app or a Trusted Web Activity for those visitors.
Note: WebUSB breaks across Firefox, Safari, and iOS. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
WebUSB lives in Chromium and skips two of the three browser engines, so the painful edge cases land on Firefox refusal, the Safari and iOS gap, the user-gesture rule, and the platform-level USB blocklist.
In my experience, the trickiest failure is the Windows driver step. A board that works out of the box on Linux and macOS opens fine in Chrome, but the same board on Windows throws "Unable to claim interface" until the user runs Zadig and swaps the driver to WinUSB. Ship a one-page driver guide alongside any WebUSB product, or your Windows users will assume the page is broken.
All WebUSB version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance