The Permissions API works in Chrome 43+, Edge 79+, Firefox 46+, Opera 30+, Samsung Internet 4+, and Safari 16+. Learn the states, names, and limits.

Prince Dewani
May 6, 2026
On This Page
The Permissions API is a W3C JavaScript API that lets web pages query the state of permission-controlled features like geolocation, notifications, camera, and microphone through navigator.permissions.query(). It works in Chrome 43+, Edge 79+, Firefox 46+, Opera 30+, Samsung Internet 4+, and Safari 16+ on macOS and iOS, while Internet Explorer never supported it.
This guide covers what the Permissions API is, the browsers that support it, the permission names you can query, how to check support, and known issues.
The Permissions API is a JavaScript interface, edited by the W3C Web Application Security Working Group, that exposes permission state on navigator.permissions. A call to query returns a PermissionStatus object whose state is granted, denied, or prompt, and the object fires a change event when the user updates the setting.
Every Chromium-based browser, Firefox, and Safari 16+ ship the Permissions API, putting global support near 96%. Internet Explorer and the legacy Android Browser left it out.
Chrome supports the Permissions API from Chrome 43 on Windows, macOS, Linux, ChromeOS, and Android. The navigator.permissions object is exposed in top-level pages and in dedicated, shared, and service workers. Chrome 4 to 42 did not support it. Chrome ships the widest set of permission names, so a query that works in any other browser also works here.
Microsoft Edge supports the Permissions API from Edge 79, the first Chromium-based release, on Windows 10, Windows 11, and macOS. Pre-Chromium EdgeHTML 12 to 18 never added the API. Edge inherits every permission name Chrome ships, so query patterns line up across the two browsers.
Firefox supports the Permissions API from Firefox 46 on Windows, macOS, Linux, and Android. Firefox accepts a smaller list of permission names than Chrome, with geolocation, notifications, push, persistent-storage, midi, screen-wake-lock, and storage-access mapped through query. Names that Chrome ships but Firefox does not, like camera and microphone, throw a TypeError.
Safari supports the Permissions API from Safari 16 on macOS Big Sur, Monterey, Ventura, Sonoma, and Sequoia. Safari 15.6 and earlier did not expose navigator.permissions. The Safari implementation only accepts camera, microphone, geolocation, and notifications as permission names; queries for push, clipboard, or background-sync throw a TypeError.
Safari on iOS and iPadOS supports the Permissions API from Safari 16. Older iOS releases up to iOS 15 did not expose navigator.permissions, so iPhones on those versions return undefined when a page touches the property. Chrome and Edge on iOS run on the WebKit engine, so they inherit the same Safari 16 floor.
Opera supports the Permissions API from Opera 30 on Windows, macOS, and Linux, and tracks every Chromium release after that. Opera Mobile supports it from Opera Mobile 80 on Android, while Opera Mini does not support it in any version because the proxy-based engine strips out modern permission UI.
Samsung Internet supports the Permissions API from Samsung Internet 4.0 on Galaxy phones and tablets running Android. Every release after 4.0 keeps the API on by default and follows Chromium for the supported permission names. Samsung Internet 1.0 to 3.0 did not support it.
Chrome for Android, Samsung Internet, and Firefox for Android together provide the Permissions API on most modern Android phones. The legacy stock Android Browser, last shipped with Android 4.4 KitKat, never added the API. Use a Chromium-based browser or Firefox 46+ for Android coverage.
Internet Explorer does not support the Permissions API in any version. The Trident engine never implemented navigator.permissions, and Microsoft has retired Internet Explorer. Move any permission-aware code to Chromium-based Edge or another modern browser for new work.
Note: The Permissions API breaks across Safari, Firefox, and older mobile browsers. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
navigator.permissions.query accepts a PermissionDescriptor with a name field. Each browser ships its own subset of permission names, so feature-detect every name before relying on it.
Run a two-step check at runtime: confirm navigator.permissions exists, then call query with the permission name you care about and read result.state. Wrap query in try/catch because unknown names throw a TypeError on Safari and Firefox.
Paste the snippet below into the DevTools console. It walks four common names, prints the current state, and logs any change the user makes inside the same tab.
// Paste this into the DevTools console of any modern browser.
// It feature-detects navigator.permissions, then queries a few names safely.
async function checkPermissions() {
if (!("permissions" in navigator)) {
console.log("Permissions API is not supported in this browser.");
return;
}
const names = ["geolocation", "notifications", "camera", "microphone"];
for (const name of names) {
try {
const status = await navigator.permissions.query({ name });
console.log(name + ":", status.state);
status.onchange = () => {
console.log(name + " changed to:", status.state);
};
} catch (err) {
console.warn(name + " is not a recognised name in this browser:", err.message);
}
}
}
checkPermissions();The Permissions API ships in every modern engine, but the names, the worker surface, and the request flow drift across browsers. Plan around these gaps before you wire query into a production permission strategy.
In my experience, the most surprising failure is forgetting that query never prompts. Calling navigator.permissions.query for the camera name on page load and reading "prompt" tricks people into thinking the user has been asked, when in fact getUserMedia still has to fire the dialog later.
All Permissions API 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