API reference
The Rezeis API is REST over HTTPS. All requests and responses are JSON, all timestamps are RFC 3339 in UTC, and every endpoint lives under https://api.rezeis.click/v1. New to the API? Start with the quickstart.
Authentication
Pass your secret key as a bearer token on every request. Keys are scoped per project and can be restricted to read-only.
Authorization: Bearer sk_live_<your key>
Never ship a secret key in a browser or mobile bundle. For client-side uploads, mint a short-lived upload token server-side instead.
Idempotency
All create endpoints accept an Idempotency-Key header. Retrying a request with the same key returns the original response instead of creating a second job — safe to retry after a network blip.
curl -X POST https://api.rezeis.click/v1/jobs \
-H "Authorization: Bearer $REZEIS_KEY" \
-H "Idempotency-Key: 9f1c-c0ffee-42" \
-d '{"input":"...","profile":"abr-720p"}'
Keys are retained for 24 hours. After that, the same key starts a fresh request.
Pagination
List endpoints are cursor-paginated. Pass limit (max 100) and starting_after with the id of the last item you saw. The has_more flag tells you when to stop.
{ "data": [ ... ], "has_more": true, "last_id": "job_8f2a71c4" }
Versioning
The version is pinned in the path. Additive changes (new fields, new enum members) ship without a version bump, so parse defensively and ignore unknown fields. Breaking changes get a new path segment and twelve months of overlap — see the changelog.
Encoding jobs
POST/v1/jobs
Creates an encoding job.
| Field | Type | Description |
|---|---|---|
input | string | Required. HTTP(S) or s3:// URL of the source. |
profile | string | Ladder preset, e.g. abr-1080p. Defaults to auto. |
outputs | array | Any of hls, dash, mp4. Defaults to ["hls"]. |
codec | string | h264 (default), hevc or av1. |
webhook | string | URL notified on every status transition. |
metadata | object | Up to 16 key/value pairs echoed back on the asset. |
{
"id": "job_8f2a71c4", "status": "queued",
"created_at": "2026-09-13T18:04:11Z",
"renditions": [1080, 720, 480, 360],
"playback": "https://cdn.rezeis.click/v/8f2a71c4/master.m3u8"
}
GET/v1/jobs/{id}
Returns the current state. status moves through queued → analysing → encoding → packaging → ready, or terminates as failed. While encoding, progress is an integer percentage.
GET/v1/jobs
Lists jobs newest first. Supports limit, starting_after and a status filter.
DELETE/v1/jobs/{id}
Cancels a job that has not reached packaging. Encoded segments are discarded and the minutes are not billed.
Assets
A completed job produces an asset — the manifests, renditions and thumbnails kept in storage.
GET/v1/assets/{id}
Returns manifest URLs, per-rendition byte sizes, duration and the thumbnail set.
DELETE/v1/assets/{id}
Removes the asset and purges it from the edge, usually within 30 seconds.
Playback tokens
For private content, sign a short-lived token server-side and append it to the manifest URL.
POST /v1/playback-tokens
{ "asset": "ast_5c19be20", "ttl": 3600, "restrict": { "country": ["PL","DE"] } }
Webhooks
Every status transition posts a JSON body to your webhook URL. Delivery is retried with exponential backoff for 24 hours.
{ "event": "job.ready", "job": "job_8f2a71c4", "asset": "ast_5c19be20", "duration": 742.5 }
Verify the Rezeis-Signature header — an HMAC-SHA256 of the raw body — in constant time, and treat redelivered events as idempotent.
Rate limits
| Plan | Requests / min | Concurrent jobs |
|---|---|---|
| Free | 60 | 2 |
| Starter | 600 | 20 |
| Growth | 1,500 | 60 |
| Scale | 6,000 | 200 |
Every response carries X-RateLimit-Remaining and X-RateLimit-Reset. On 429, honour Retry-After.
Error codes
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed body or unknown field value. |
| 401 | bad_credentials | Missing, malformed or revoked API key. |
| 402 | quota_exhausted | Plan limit reached. |
| 404 | not_found | No such job or asset in this project. |
| 409 | invalid_state | Action not allowed from the current status. |
| 415 | unsupported_source | The probe could not decode the input. |
| 429 | rate_limited | Too many requests this minute. |
| 5xx | internal | Our fault. Safe to retry with backoff. |