Migrating from another DRM vendor

Two hops change — the key generator your packager calls and the licence proxy your players hit — and the client changes nothing. The examples use EZDRM, the vendor SuperSecure itself migrated from; other CPIX-based vendors map the same way.

#Packager

Before (EZDRM)After (SuperDRM)
GET https://cpix.ezdrm.com/keygenerator/cpix2.aspx?k=<guid>&u=<user>&p=<pass>&c=<label>&EncryptionScheme=cbcsGET https://api.superdrm.com/v1/cpix?k=<guid>&c=<label>&EncryptionScheme=cbcs with Authorization: Bearer sdrm_live_…
Response: CPIX 2Response: CPIX 2, same elements (explicitIV, kid, PlainValue, DRMSystem/PSSH, HLSSignalingData)

Two variables on the packager host: SUPERDRM_URL and SUPERDRM_KEY. Unset them and the packager is back on the previous vendor.

Import mode lets you switch without a flag day: the previous vendor keeps generating the key, and the packager imports it into SuperDRM (POST /v1/keys/import). Every file then holds the same key in both systems, so it plays through either, and nothing needs repackaging when you finally cancel the old contract. Backfill existing content the same way: a vendor's CPIX is deterministic per content id, so a script can walk your catalogue and import every historic key.

#Licence proxy

Before (EZDRM)After (SuperDRM)
POST https://widevine-dash.ezdrm.com/proxy?pX=…POST https://api.superdrm.com/v1/<tenant>/license/widevine?cid=<content_id> + Bearer
POST https://fps.ezdrm.com/api/licenses/auth?pX=…&CustomData=<jwt> (+ an auth callback)POST …/license/fairplay?cid=<content_id> + Bearer, raw SPC in, raw CKC out
POST https://playready.ezdrm.com/cency/preauth.aspx?pX=……/license/playready → 501 until licensed (Edge uses Widevine)
Your FairPlay certificate URLGET …/v1/<tenant>/fairplay/cert

Send X-SuperDRM-Policy: {"hw":true} on relays for files that require hardware. Three settings on the proxy: SUPERDRM_URL, SUPERDRM_KEY, SUPERDRM_TENANT. A fourth, SUPERDRM_FAIRPLAY, keeps FairPlay on the old vendor (0) until your Apple credentials are installed (1).

Per-asset fallback. A content id SuperDRM never issued or imported answers 404 no_key in a couple of milliseconds; the proxy then relays that one request to the previous vendor. Also fall back on 501 and 503. Files keep the keys of whichever service issued them, so old files keep playing through the old vendor for as long as you keep it.

relay.ts
const r = await relaySuperDRM(system, contentId, challenge);
if (r.status === 404 || r.status === 501 || r.status === 503) return relayPreviousVendor(system, challenge);

#Direct-to-player (optional, later)

Instead of relaying, mint a token — POST /v1/tokens {content_id, sub, ref, ttl_s, policy} — and drop the returned servers map into the player's DRM config. Set auth_webhook on the tenant to keep live revocation.

#Order of operations

  1. Flip the packager (in import mode if you want a soft landing). New files get SuperDRM keys; old files keep their keys.
  2. Flip the proxy with fallback in place. Watch the meter: new files show ok=true; pre-switch files show no_key followed by a successful relay to the old vendor. Those rows are the fallback working, not an outage.
  3. Backfill historic keys so no_key rows stop appearing.
  4. Watch superdrm licences and the old vendor's dashboard side by side for a week.
  5. Install FairPlay credentials and set SUPERDRM_FAIRPLAY=1; the certificate route serves SuperDRM's bundle for files it holds and the old certificate for the rest.
  6. Cancel the old contract the month after both flags flip and its dashboard shows zero relays.

Updated September 2026