Testing

WebUSB: Browser Support, Features, Limitations

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.

Author

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.

What is WebUSB?

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.

Which browsers does WebUSB support?

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.

Loading browser compatibility data...

WebUSB compatibility in Chrome

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.

WebUSB compatibility in Edge

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.

WebUSB compatibility in Firefox

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.

WebUSB compatibility in Safari

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.

WebUSB compatibility in Opera

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.

WebUSB compatibility in Samsung Internet

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.

WebUSB compatibility in Android Browser

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.

WebUSB compatibility in Internet Explorer

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.

What are the key features of WebUSB?

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.

  • navigator.usb.requestDevice: Pops a browser-supplied device chooser on a click. The user picks a device from a filter list of vendor IDs, product IDs, USB classes, and serial numbers, and the page only sees the device the user selected.
  • navigator.usb.getDevices: Returns the list of devices the user has already approved for the origin. The page never gets a free pass to enumerate hardware in the background.
  • USBDevice.open and USBDevice.close: Open and close the device handle. Only one tab can hold the handle at a time, so the API surfaces a clear lifecycle and avoids contention with native drivers.
  • selectConfiguration and claimInterface: Pick the active USB configuration and claim an interface for exclusive use. Both calls are mandatory before any data transfer.
  • controlTransferIn and controlTransferOut: Send and receive control transfers on endpoint zero, the standard channel for USB setup packets and vendor-specific commands.
  • transferIn, transferOut, isochronousTransferIn, isochronousTransferOut: Run bulk, interrupt, and isochronous transfers on any claimed endpoint. Each call takes a Uint8Array buffer and returns a USBTransferResult.
  • connect and disconnect events: Fire on the navigator.usb object when an approved device is plugged in or unplugged. Pages can react to USB cable changes without polling.
  • USBDevice.forget: Revokes the page's permission for that device, available from Chrome 101. The next requestDevice call must show the chooser again.
  • HTTPS and user gesture only: WebUSB only runs in a secure context, and requestDevice only fires inside a real user activation. Both rules are enforced by the browser, not the page.
...

How do you connect to a USB device with WebUSB?

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

Note: WebUSB breaks across Firefox, Safari, and iOS. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!

What are the known issues with WebUSB?

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.

  • Firefox calls WebUSB harmful: Mozilla flags WebUSB as harmful in its standards position. Sites that need USB access on Firefox must ship a native helper or guide users to Chrome, Edge, or Opera.
  • No Safari, no iOS, no iPadOS: Safari on macOS, iPadOS, and iOS lack WebUSB and the WebKit position lists the spec as opposed. iPad and iPhone visitors need a native app or a sidecar tool, since there is no flag to enable.
  • Built-in USB blocklist: Chrome blocks access to HID keyboards, mice, FIDO authenticators, smart cards, USB audio class devices, and any device whose interface class sits on the WebUSB blocklist. The page cannot override the list, so kiosk and authentication use cases fall back to native code.
  • requestDevice must run on a user gesture: Chrome throws DOMException "Must be handling a user gesture" if you call requestDevice from a setTimeout, fetch callback, or page-load handler. Always wire it to a click or keypress.
  • Windows needs a WinUSB driver: On Windows, the device must bind to the WinUSB.sys driver before Chrome can open it. Vendors ship a Microsoft OS 2.0 descriptor or use a tool like Zadig to swap the driver.
  • One tab owns the device: Once a tab calls open and claimInterface, no other tab or native process can talk to the device until the tab calls close or is destroyed. Plan your UX so users do not race two pages onto the same hardware.
  • No background access: Service workers and background pages cannot call requestDevice, and a page loses the device handle when the tab is discarded. Long-running USB sessions must keep the foreground tab alive.
  • HTTPS or localhost only: WebUSB refuses to run on plain HTTP origins. Local development needs http://localhost or a self-signed HTTPS certificate, since file:// pages also fail the secure-context check.

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.

...

Citations

All WebUSB version numbers and platform notes in this guide come from these primary sources:

Author

Prince Dewani is a Community Contributor at TestMu AI, where he manages content strategies around software testing, QA, and test automation. He is certified in Selenium, Cypress, Playwright, Appium, Automation Testing, and KaneAI. Prince has also presented academic research at the international conference PBCON-01. He further specializes in on-page SEO, bridging marketing with core testing technologies. On LinkedIn, he is followed by 4,300+ QA engineers, developers, DevOps experts, tech leaders, and AI-focused practitioners in the global testing community.

Open in ChatGPT Icon

Open in ChatGPT

Open in Claude Icon

Open in Claude

Open in Perplexity Icon

Open in Perplexity

Open in Grok Icon

Open in Grok

Open in Gemini AI Icon

Open in Gemini AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

Frequently asked questions

Did you find this page helpful?

More Related Hubs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests