This page describes which browsers, operating systems, and WebView environments are supported by Veriff's web-based verification flow, and which Web Platform APIs are required for it to function correctly.
HTTPS required
All camera, media, and real-time communication APIs used by Veriff are restricted by browsers to secure contexts. The verification URL must be served over HTTPS. Plain HTTP is not supported (except localhost for development and testing).
Supported browsers
The verification flow requires navigator.mediaDevices.getUserMedia, mediaDevices, and enumerateDevices to be available in the end-user's browser. Browsers that do not support these APIs are shown an error at session start. The tables below list browsers and versions where Veriff is known to work reliably.
Desktop
| Browser | Minimum version | Notes |
|---|---|---|
| Chrome | 80 | |
| Edge (Chromium) | 80 | Chromium-based; same baseline as Chrome |
| Firefox | ESR (140+) | |
| Safari | 14 (macOS) | |
| Brave | Current | Chromium-based; same baseline as Chrome |
Legacy Microsoft Edge (EdgeHTML engine) and Internet Explorer are not supported.
Mobile
| Browser | Minimum version | Notes |
|---|---|---|
| Chrome for Android | 80 | |
| Safari on iOS | 15 | |
| Samsung Internet | 21 | End-users may need to manually grant camera permissions through the Samsung-specific permissions flow |
| Chrome on iOS | 15 | Uses the iOS WebKit engine, subject to the same API constraints as Safari on iOS |
| Firefox for Android | ESR (140+) |
All browsers on iOS (Chrome, Firefox, Edge, Opera, etc.) use Apple's WebKit rendering engine. They are subject to the same platform API availability as Safari on iOS, not their desktop counterparts.
Operating system requirements
| Platform | Minimum version |
|---|---|
| iOS | 15 |
| Android | 10 (API level 29) |
| macOS | Driven by browser support above |
| Windows | Driven by browser support above |
Unsupported browsers
The following browsers and environments are detected at session start. End-users will be shown an error screen directing them to switch to a supported browser before verification can proceed.
| Browser / Environment | Reason |
|---|---|
| DuckDuckGo (Android) | No camera or microphone access |
| MIUI Browser (Xiaomi devices) | Camera permission request hangs indefinitely |
| UC Browser | Camera API throws an error instead of prompting for permission |
| Vivo Browser | Broken camera API implementation |
| Facebook and Messenger in-app browser (Android) | Missing camera APIs |
| Yahoo Japan app browser (Android) | Missing camera APIs |
| iOS browsers that are not Safari or WKWebView | Missing camera APIs. end-users are directed to open the link in Safari |
Any browser missing getUserMedia, mediaDevices, or enumerateDevices |
Core camera APIs unavailable. end-users are shown an "outdated browser" message |
| Opera (desktop) | Not supported |
| Internet Explorer (all versions) | Not supported |
| Legacy Edge (EdgeHTML engine) | Missing camera APIs |
If camera access is blocked in Samsung Internet, a dedicated guidance screen is shown to help end-users grant the permission manually.
WebView environments
| Environment | Support | Notes |
|---|---|---|
| Android WebView (Chrome-based) | Supported | Android 10+ required. On Android 10+, WebView is a separate component that auto-updates via Google Play, independent of the OS version. |
| Chrome Custom Tabs (Android) | Supported | |
| WKWebView (iOS) | Supported | |
| SFSafariViewController (iOS) | Supported | |
| UIWebView (iOS) | Not supported | Deprecated by Apple; missing camera APIs |
| Facebook / Messenger in-app browser (Android) | Not supported | Missing camera APIs |
For WebView integration guides, see the WebView integration guide.
Required browser APIs
These APIs must be available for the verification flow to start. If any are missing, the end-user will see an error screen.
| API | Purpose |
|---|---|
navigator.mediaDevices.getUserMedia |
Camera and microphone access |
navigator.mediaDevices.enumerateDevices |
Camera device selection |
| WebAssembly | On-device ML for face detection and barcode scanning (barcode scanning is only required for document specimens that include a barcode) |
| Web Workers | Off-main-thread processing |
| WebSockets | Real-time session communication |
| Canvas 2D API | Photo capture and image processing |
MediaRecorder |
Video recording (only when video is required by the session) |
| RTCPeerConnection (WebRTC) | Live video streaming, legacy path (only when video is required by the session) |
All required APIs are supported in every browser and OS version listed in the Supported browsers section above.
Optional APIs
These APIs are detected at runtime. When unavailable, the application falls back gracefully and the verification flow continues, but with a different code path.
| API | Purpose | Where it is unavailable |
|---|---|---|
| WebGL / WebGL2 | GPU-accelerated face detection | Falls back to CPU processing automatically |
ImageCapture |
Optimised photo capture from camera | Falls back to Canvas 2D capture. Not available in Firefox; Safari 18.4+ only |
OffscreenCanvas |
Off-main-thread image processing | Falls back to main-thread processing. Safari 17+ only |
| Accelerometer / Gyroscope (Generic Sensor API) | Motion-based fraud signals | Chrome and Chromium-based Android browsers only. Not available in Firefox or Safari / iOS. |
| Permissions API | Camera permission status pre-check | Falls back to requesting permission directly |
Accelerometer / Gyroscope: Veriff uses the Generic Sensor API (window.Accelerometer, window.Gyroscope), not the older DeviceMotion / DeviceOrientation events. These are two distinct browser APIs and are not interchangeable.
Known WebView limitations
These are platform-level constraints that affect WebView environments.
Camera device labels are anonymised until permission is granted. On Android, navigator.mediaDevices.enumerateDevices() returns devices with empty labels until camera permission has been explicitly granted.
window.close() is a no-op in most WebViews. When a verification session ends, the Veriff flow attempts to close the page. In WebViews that did not programmatically open the page, window.close() is ignored by the browser. Use the session FINISHED event to handle navigation in your native layer.
localStorage must not be blocked. The Veriff flow wraps all storage calls defensively, so the session will not crash if storage is unavailable, but certain session features will degrade silently.
window.open() must be delegated to the system browser. When the verification flow opens an external URL (for example, to hand off to a third-party service), it calls window.open(). In most WebViews this call is silently ignored or opens inside the WebView itself, which may break the target service. Intercept the call in your native layer and forward the URL to the device's default browser, or open it in a Chrome Custom Tab (Android) or SFSafariViewController (iOS).
Connection requirements
| Requirement | Details |
|---|---|
| Protocol | HTTPS required |
| WebSocket | Port 443 (WSS) must not be blocked by firewalls or corporate proxies |
| WebRTC | STUN/TURN traffic required when video streaming is enabled; UDP port 3478 or TCP 443 fallback. Contact support for firewall allowlist details. |
Changelog
| Date | Description |
|---|---|
| May 6, 2026 | Document published |