Documentation
From zero to a playing video in about four minutes, then every knob you might need afterwards.
Quickstart
Create an asset from any URL we can reach. The response is immediate; the webhook tells you when it is playable.
curl -X POST https://api.us-mirror-01.123ok.uk/v1/assets \
-H "Authorization: Bearer $RR_KEY" \
-H 'Content-Type: application/json' \
-d '{"input":"https://you.example/master.mov",
"playback_policy":"public",
"captions":["en","de"]}'Direct uploads
For browser uploads, ask for an upload URL and hand it to the client. The URL is single-use and expires in an hour.
const { url, asset_id } = await fetch('/api/upload-url')
.then(r => r.json());
await fetch(url, { method: 'PUT', body: file });
// listen for the asset.ready webhookPlayback
Every asset has a playback ID. Compose the manifest URL yourself or use the embed.
https://stream.us-mirror-01.123ok.uk/pb_8c31f0a2.m3u8
https://stream.us-mirror-01.123ok.uk/pb_8c31f0a2.mpd
https://image.us-mirror-01.123ok.uk/pb_8c31f0a2/thumb.webp?t=42Assets
| Method | Path | Purpose |
|---|---|---|
POST | /v1/assets | create from URL |
GET | /v1/assets/{id} | status, renditions, duration |
GET | /v1/assets | list, cursor-paginated |
POST | /v1/assets/{id}/captions | add or replace a track |
DELETE | /v1/assets/{id} | delete asset and originals |
Live streams
Create a stream, get an RTMP or SRT ingest URL and a stream key. Recordings become normal assets when the stream ends.
{
"id": "ls_71c0",
"ingest": "rtmps://ingest.us-mirror-01.123ok.uk:443/live",
"stream_key": "sk_live_9c31…",
"latency": "low",
"record": true
}Webhooks
Signed with an HMAC over the raw body. Retried with exponential backoff for 24 hours, and every delivery attempt is visible in the dashboard.
asset.createdasset.readyasset.erroredlive.startedlive.endedupload.completed
Signing playback
Signed policies are JWTs with your key ID in the header. Keep expiry short — the edge caches the decision for the token lifetime, not longer.