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.
Quickstart
Create a key in the dashboard, then submit your first job. The API responds immediately with a job id; encoding happens asynchronously.
curl -X POST https://api.rezeis.click/v1/jobs \
-H "Authorization: Bearer $REZEIS_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"https://example.com/master.mp4","profile":"abr-720p"}'
When the job finishes, the playback URL serves an HLS master manifest that any standard player can consume.
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 — see playback tokens for the same pattern applied to delivery.
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.
Encoding jobs
POST/v1/jobs
Creates an encoding job.
| Field | Type | Description |
|---|---|---|
input | string | Required. HTTP(S) or s3:// URL of the source file. |
profile | string | Ladder preset, e.g. abr-1080p. Defaults to auto (per-title analysis). |
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 arbitrary 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 (max 100), starting_after and status filters. Responses are cursor-paginated via the has_more flag.
DELETE/v1/jobs/{id}
Cancels a job that has not reached packaging. Already-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. Assets are billed for storage until deleted.
GET/v1/assets/{id}
Returns manifest URLs, per-rendition byte sizes, duration and the extracted thumbnail set.
DELETE/v1/assets/{id}
Removes the asset and purges it from the edge. Purges propagate globally within roughly 30 seconds.
Playback tokens
For private content, sign a short-lived token server-side and append it to the manifest URL. Tokens carry an expiry and optionally pin the viewer's IP or country.
POST /v1/playback-tokens
{ "asset": "ast_5c19be20", "ttl": 3600, "restrict": { "country": ["PL","DE"] } }
Keep TTLs short. A token is a bearer credential for the duration of its life.
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,
"sent_at": "2026-09-13T18:11:47Z"
}
Verify the Rezeis-Signature header — an HMAC-SHA256 of the raw body using your endpoint secret — before trusting a payload. Compare digests in constant time, and treat redelivered events as idempotent: the same event id may arrive more than once.
Rate limits
Limits are per project, measured over a sliding minute.
| Plan | Requests / min | Concurrent jobs |
|---|---|---|
| Free | 60 | 2 |
| Studio | 600 | 20 |
| Scale | 3,000 | 200 |
Every response carries X-RateLimit-Remaining and X-RateLimit-Reset. On 429, honour the Retry-After header rather than retrying immediately.
Error codes
Errors use standard HTTP status codes with a machine-readable code.
| 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; upgrade or wait for the reset. |
| 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. |
{
"error": {
"code": "unsupported_source",
"message": "No decodable video stream found in input.",
"doc": "https://rezeis.click/docs.html#errors"
}
}