Content protection
Protect paid lessons with studio-grade DRM that works across browsers and devices.
Content protection encrypts a lesson so it can only be decoded inside the viewer’s browser or device, for a learner you authorised, while their session is valid. It’s the same class of protection used by major streaming services.
Turn it on
Section titled “Turn it on”Create the asset with "drm": true. Protection applies to the whole lesson and can’t be turned
off later.
POST /v1/assets{ "title": "Lecture 4 — Fourier series", "drm": true }That’s all. Upload and play as usual: playback sessions for protected assets include
"drm": true and an extra urls.entitlement, and WirePlayer uses them automatically.
Where protected lessons play
Section titled “Where protected lessons play”| Platform | Support |
|---|---|
| Chrome, Edge, Firefox (desktop) | ✓ |
| Android (Chrome) | ✓ |
| Safari on macOS, iOS and iPadOS | Enabled per workspace during onboarding |
How access works
Section titled “How access works”- Your backend creates a playback session for the learner.
- The player exchanges the session for a short-lived entitlement.
- The browser uses the entitlement to obtain a playback licence for this lesson only.
Entitlements last a few minutes and never outlive the session. Licences end with the session and can’t be saved for offline use. Ending a session stops new entitlements immediately after it takes effect (within about two minutes).
Using your own player
Section titled “Using your own player”If you don’t use WirePlayer, call the entitlement URL yourself:
POST {urls.entitlement}Authorization: Bearer {token}{ "expires_at": 1760281500000, "license_headers": { "…": "…" }, "key_systems": { "com.widevine.alpha": { "license_url": "https://…" }, "com.microsoft.playready": { "license_url": "https://…" } }}Use the key system your browser supports, send licence requests to its license_url, and attach
every header in license_headers unchanged. Request a new entitlement once expires_at
passes.
| Status | code | Meaning |
|---|---|---|
| 401 | unauthorized | No session token was sent |
| 403 | playback_expired, playback_revoked, … | The session is no longer valid |
| 409 | asset_not_protected | This lesson isn’t protected; play it without an entitlement |
| 429 | rate_limited | Too many entitlement requests for one session; retry after Retry-After seconds |
| 503 | drm_unconfigured | Protection isn’t enabled for your workspace yet |
WirePlayer errors
Section titled “WirePlayer errors”| Code | Meaning |
|---|---|
drm_unsupported | This browser or device can’t play protected lessons |
drm_entitlement_denied | The session expired, was ended or was rate limited |
drm_entitlement_network, drm_license_network | A network problem interrupted licensing; retry |
drm_license_denied, drm_license_rejected | The licence was refused for this device |
drm_no_session, drm_plugin_unavailable, drm_certificate, drm_entitlement_invalid, drm_error | Playback couldn’t be set up; reload the page, and contact support if it persists |