Operator CLI
bin/superdrm wraps the admin API. It reads SUPERDRM_URL and SUPERDRM_ADMIN_TOKEN from the environment, falling back to ~/.config/superdrm/api.env, so on the api host it needs no arguments. Under Compose, run it inside the api container or point SUPERDRM_URL at the published api address.
superdrm health
superdrm tenant:list
superdrm tenant:create <slug> <name> [--plan internal|developer|growth|scale|enterprise] [--webhook URL]
superdrm tenant:update <slug> [--plan X] [--status active|suspended] [--webhook URL|""] [--settings '{json}']
superdrm tenant:drm <slug> <widevine|fairplay|playready|clearkey> [--enabled 1|0] [--mode shared|own] [--config '{json}'] [--public '{json}']
superdrm tenant:rotate-secret <slug>
superdrm key:create <slug> [--name NAME] [--scopes a,b] [--env live|test]
superdrm key:revoke <slug> <key id>
superdrm partner:set <widevine:prod|widevine:uat|fairplay:prod> --config '{json}' [--public '{json}']
superdrm partner:list
superdrm usage [--tenant slug] [--from YYYY-MM-DD] [--to YYYY-MM-DD]
superdrm licences [--limit N]
superdrm audit [--limit N]
superdrm export <file.json.gz>
superdrm import <file.json.gz>
superdrm verify-kek [content id]
superdrm install:sign … # mothership only: mint an install licence for an on-prem customer#Common tasks
Onboard a tenant and hand over credentials
superdrm tenant:create acme "Acme Corp" --plan growth
# → api_key and token_secret, shown onceInstall production Widevine credentials (after the partner agreement)
superdrm partner:set widevine:prod \
--public '{"provider":"acme","host":"https://license.widevine.com"}' \
--config '{"provider":"acme","signing_key":"<64 hex>","signing_iv":"<32 hex>","host":"https://license.widevine.com"}'
# then SUPERDRM_WIDEVINE_ENV=prod in the api env and restartInstall a tenant's FairPlay certificate
superdrm tenant:drm acme fairplay --mode shared --public '{"cert_b64":"<base64 of fps_certificate.bin>"}'Turn PlayReady on for a tenant (once the server is licensed)
superdrm tenant:drm acme playready --enabled 1Set a tenant default policy (hardware required, HDCP type 0)
superdrm tenant:update acme --settings '{"policy":{"hw":true,"hdcp":"type0"}}'Suspend and reinstate
superdrm tenant:update acme --status suspended # the licence path re-reads status per request
superdrm tenant:update acme --status activeWatch the meter
superdrm licences --limit 20
superdrm usage --tenant acme --from 2026-09-01Move to another host
superdrm export superdrm-$(date +%F).json.gz
DATABASE_URL=postgres://… superdrm import superdrm-2026-09-16.json.gz
superdrm verify-kekEvery command prints the API's JSON reply; a non-2xx exits 1 with the error body.
Updated September 2026