# DRM Check

> DRM check: Widevine L1, L2 or L3 via robustness, HDCP via getStatusForPolicy. L3 plus no HDCP 2.2 is why Netflix stays at 480p. Nothing uploaded.

- URL: https://bytescope.dev/en/drm-check/
- Locale: en · Also: [ja](https://bytescope.dev/ja/drm-check.md) · [zh-Hant](https://bytescope.dev/zh-Hant/drm-check.md)
- Runs: Nothing is uploaded. The scan asks this browser's Encrypted Media Extensions in this tab and never talks to a license server.
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

This page answers one question people actually type: why is Netflix only 480p? Nothing is uploaded, and no license request is sent. After you run the probe it calls `navigator.requestMediaKeySystemAccess()` for Widevine, PlayReady, FairPlay and ClearKey, walks Widevine `robustness` one rung at a time, then asks `getStatusForPolicy({ minHdcpVersion })` for HDCP 1.0 through 2.3. L3 plus a missing HDCP 2.2 is the usual answer. The competing pages are engineering demos; this one is written for a person.

### Key systems, not a boolean

`requestMediaKeySystemAccess` rejects when a key system or config is missing. A reject is the normal 'no', not an error, and each call is try/caught so one miss cannot take the table down. ClearKey is the control: almost every browser has `org.w3.clearkey`, so if ClearKey fails, Encrypted Media Extensions itself is not wired. Widevine is `com.widevine.alpha`. PlayReady is Edge-on-Windows. FairPlay is Safari (`com.apple.fps` / `com.apple.fps.1_0`).

### L1 versus L3

Widevine does not expose a `securityLevel` field to the web. The page asks for `""`, `SW_SECURE_CRYPTO`, `SW_SECURE_DECODE`, `HW_SECURE_CRYPTO`, `HW_SECURE_DECODE`, `HW_SECURE_ALL` as video robustness and lists every result. `HW_SECURE_ALL` or `HW_SECURE_DECODE` passing is L1 (keys and decode in a TEE). Only `SW_SECURE_*` passing is L3 (software CDM — streamers typically cap at SD). `HW_SECURE_CRYPTO` alone is Widevine L2; this page will not collapse that into L1 or L3. A timeout is `unknown`, never a guessed 'no'.

### HDCP 2.2

`MediaKeys.getStatusForPolicy` is how a page asks whether the current output can enable a given HDCP version. Safari does not implement it — that region is `unsupported`, not `false`. Each return is a `MediaKeyStatus` (`usable`, `output-restricted`, `output-downscaled`, …), printed in full. 4K HDR streams usually need HDCP 2.2 `usable`. If that rung is not `usable`, that is a common reason quality is cut.

### Evidence, then a sentence

The robustness table and the HDCP table are the evidence. The sentence at the top is derived from them: L3, missing HDCP 2.2, both, neither, or 'we could not tell'. It will not flatten those into a single traffic-light.

### What this browser has

Feature detection runs after mount. About and FAQ render in every browser, including ones with no EME. Desktop Chrome is typically Widevine L3. Android Chrome with a TEE is often L1. Safari is FairPlay, not Widevine. Trust the live rows, not the typical-support matrix.

## Limits

Does not unlock higher streaming quality or bypass DRM; it reports which key systems and security levels this browser exposes.

## Machine output

Copy JSON copies an envelope `{ tool, url, generatedAt, userAgentHint, result }`. `tool` is `"drm-check"`; `result` is what EME reported — no streaming-capability inference.

- `emeAvailable` (boolean | null) — `null` = not probed yet; `false` = probed, EME missing; `true` = `requestMediaKeySystemAccess` exists.
- `keySystems` (array of objects) — Fixed key-system list. Each item is `{ id, present }`; `present` is `null` = not asked / timed out, `false` = asked, not present, `true` = present.
- `widevineLevel` (string) — `"L1"` | `"L2"` | `"L3"` | `"unknown"`. `"unknown"` = not judged (not asked, timed out, or budget spent).
- `widevineRobustness` (array of objects) — Video then audio robustness ladder. Each item is `{ robustness, kind, outcome }`; `kind` is `"video"` | `"audio"`; `outcome` is `"supported"` | `"unsupported"` | `"unknown"` (`"unknown"` = not asked / timed out).
- `hdcpApi` (string) — `"ok"` | `"unsupported"` | `"unknown"`. `"unknown"` = HDCP policy API not queried.
- `hdcpRungs` (array of objects) — Fixed HDCP version list. Each item is `{ version, outcome, status }`; `outcome` is `"status"` | `"unsupported"` | `"unknown"`; `status` is a MediaKeyStatus string when `outcome` is `"status"`, otherwise `null`.

## FAQ

### Why is my Netflix only 480p?

On Chrome, Edge and Firefox the usual pair is Widevine L3 plus HDCP that cannot do 2.2. L3 is a software CDM; Netflix (and similar apps) typically refuse HD on it. HDCP 2.2 is what 4K HDR licenses ask for. This page prints both. If both look fine, the cap is probably the plan, the app, or a display path this tab cannot see.

### What is Widevine L1 versus L3?

L1 keeps keys and decode inside a hardware Trusted Execution Environment. L2 keeps keys in the TEE but decodes in software — most streamers still cap it the way they cap L3. L3 is software throughout. The web API does not return those letters; the page infers them from which `robustness` strings `requestMediaKeySystemAccess` accepts. `HW_SECURE_ALL` / `HW_SECURE_DECODE` → L1. `HW_SECURE_CRYPTO` as the ceiling → L2. Only `SW_SECURE_*` → L3. A timeout stays unknown.

### What does HDCP 2.2 have to do with 480p?

A 4K HDR license usually requires HDCP 2.2 Type 1 on the output. `getStatusForPolicy({ minHdcpVersion: "2.2" })` returning anything other than `usable` is the browser saying that policy cannot be met. That is a quality cap, not a broken cable diagnostic. Safari does not expose the API, so this page will not pretend it ran the check.

### Do you send a license request or upload anything?

No. There is no license server, no `generateRequest`, no session. The scan is capability queries in this tab. ClearKey passing does not mean a movie will play; it means EME is present.

### Safari shows no Widevine and HDCP as unsupported. Is that a fail?

No. Safari uses FairPlay (`com.apple.fps`), not Widevine, and it does not implement `getStatusForPolicy`. Those rows are honest absences. Netflix on Safari is a FairPlay path; this page will not map it onto a Widevine L3 story.

### ClearKey passed. Does DRM work?

ClearKey is the W3C test CDM. A pass means Encrypted Media Extensions is wired, not that Netflix, Disney+, or Prime will issue you a license. Read Widevine / PlayReady / FairPlay for the commercial CDMs.

## Related tools

- [Codec Check](https://bytescope.dev/en/codec-check.md) — Can this browser decode HEVC, AV1, VP9 — the other half of 'why won't it play'.
- [HDR Test](https://bytescope.dev/en/hdr-test.md) — Is this window actually HDR? dynamic-range, P3, a luminance ladder.
- [Video Info Inspector](https://bytescope.dev/en/video-info.md) — Drop a file: codecs, bitrate, HDR, and why it will not play.
