Skip to content
Docs
Get early access

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.

Create the asset with "drm": true. Protection applies to the whole lesson and can’t be turned off later.

Request body
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.

PlatformSupport
Chrome, Edge, Firefox (desktop)✓
Android (Chrome)✓
Safari on macOS, iOS and iPadOSEnabled per workspace during onboarding
  1. Your backend creates a playback session for the learner.
  2. The player exchanges the session for a short-lived entitlement.
  3. 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).

If you don’t use WirePlayer, call the entitlement URL yourself:

Request
POST {urls.entitlement}
Authorization: Bearer {token}
Response · 200
{
"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.

StatuscodeMeaning
401unauthorizedNo session token was sent
403playback_expired, playback_revoked, …The session is no longer valid
409asset_not_protectedThis lesson isn’t protected; play it without an entitlement
429rate_limitedToo many entitlement requests for one session; retry after Retry-After seconds
503drm_unconfiguredProtection isn’t enabled for your workspace yet
CodeMeaning
drm_unsupportedThis browser or device can’t play protected lessons
drm_entitlement_deniedThe session expired, was ended or was rate limited
drm_entitlement_network, drm_license_networkA network problem interrupted licensing; retry
drm_license_denied, drm_license_rejectedThe licence was refused for this device
drm_no_session, drm_plugin_unavailable, drm_certificate, drm_entitlement_invalid, drm_errorPlayback couldn’t be set up; reload the page, and contact support if it persists