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.

FieldTypeDescription
inputstringRequired. HTTP(S) or s3:// URL of the source file.
profilestringLadder preset, e.g. abr-1080p. Defaults to auto (per-title analysis).
outputsarrayAny of hls, dash, mp4. Defaults to ["hls"].
codecstringh264 (default), hevc or av1.
webhookstringURL notified on every status transition.
metadataobjectUp 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.

PlanRequests / minConcurrent jobs
Free602
Studio60020
Scale3,000200

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.

StatusCodeMeaning
400invalid_requestMalformed body or unknown field value.
401bad_credentialsMissing, malformed or revoked API key.
402quota_exhaustedPlan limit reached; upgrade or wait for the reset.
404not_foundNo such job or asset in this project.
409invalid_stateAction not allowed from the current status.
415unsupported_sourceThe probe could not decode the input.
429rate_limitedToo many requests this minute.
5xxinternalOur 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"
  }
}