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=cbcs | GET https://api.superdrm.com/v1/cpix?k=<guid>&c=<label>&EncryptionScheme=cbcs with Authorization: Bearer sdrm_live_… |
| Response: CPIX 2 | Response: 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 URL | GET …/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.
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
- Flip the packager (in import mode if you want a soft landing). New files get SuperDRM keys; old files keep their keys.
- Flip the proxy with fallback in place. Watch the meter: new files show
ok=true; pre-switch files showno_keyfollowed by a successful relay to the old vendor. Those rows are the fallback working, not an outage. - Backfill historic keys so
no_keyrows stop appearing. - Watch
superdrm licencesand the old vendor's dashboard side by side for a week. - 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. - Cancel the old contract the month after both flags flip and its dashboard shows zero relays.
Updated September 2026