Skip to content

Validated against 168 real-world encode cases, continuously.

Every number here is generated from the validation catalog: real jobs on real workers, with the produced media, manifests and pricing inspected.

No card needed · 30-second test encodes free · pay per output minute after

168

validation cases

110

real encodes to completion

33 / 40

capabilities validated

24

coverage categories

Of the 168 cases, 110 drive an encode to completion; the rest verify validation boundaries, pricing, and job lifecycle.

In progress — tracked, not yet validated

These features are accepted and priced by the API, but the encoder does not yet produce them end to end. Each still has a validation case that asserts the true intended behaviour — it stays here, counted honestly, until it passes.

  • DRM + HDR tone-map composed — 1.25×1.5 = 1.875×

    api refuses hdr.mode = tonemap pending the worker fix (worker#172): the tone-mapping filter cannot initialize on the shipped image, so the job can no longer be created

  • HDR10 tone-map → SDR on H.265 1080p — pricing feature multiplier 1.5×

    api refuses hdr.mode = tonemap pending the worker fix (worker#172): the tone-mapping filter cannot initialize on the shipped image, so the job can no longer be created

  • HDR10+ force on H.265 — output must carry PQ/BT.2020 10-bit AND dynamic HDR10+ metadata

    HDR10+ dynamic metadata (SMPTE ST 2094-40) is unimplemented: the worker encodes hdr10_plus through the same static-HDR10 branch as hdr10, so the output carries no per-scene metadata

  • HDR10+ tone-map→SDR — priced 1.5× and delivered as BT.709 SDR

    api refuses hdr.mode = tonemap pending the worker fix (worker#172): libplacebo tone-mapping cannot run on the shipped worker image — the emitted `target_peak` option does not exist in the pinned ffmpeg build and the base image ships no Vulkan loader, so every tone-map job failed at ffmpeg (the `bt2390`→`bt.2390` identifier, worker#171, is fixed in 1.28.1 but not sufficient). Found by the 2026-09-15 real-worker runs; the job can no longer be created at all.

  • HLG tone-map → SDR — pricing 1.5×

    api refuses hdr.mode = tonemap pending the worker fix (worker#172): the tone-mapping filter cannot initialize on the shipped image, so the job can no longer be created

  • tone-map requested against an SDR source fails at probe with input_not_hdr

    api refuses hdr.mode = tonemap pending the worker fix (worker#172): the tone-mapping filter cannot initialize on the shipped image, so the job can no longer be created

  • Retro-caption a hosted video — sidecar under the video prefix, attached with in_manifest=false

    retro-caption input: worker cannot read an HLS manifest input, and hosted videos keep no single-file source

What every case actually checks

A green case is not “the API returned 200”. It means a job ran end to end and the output held up under inspection.

  • Real jobs, real workers

    Each case provisions real object storage (Cloudflare R2), submits through the public API exactly as documented, and runs on real Hetzner worker VMs. No mocks, no stubs.

  • Media, probed

    Produced files are downloaded and inspected with ffprobe — codec, profile, pixel format, resolution, framerate, HDR and colour signalling are checked against what was requested.

  • Manifests, parsed

    HLS and DASH manifests are fetched and parsed for variant count, audio and subtitle renditions, and DRM encryption signalling — proving a stream was produced, not merely priced.

  • Pricing, recomputed

    The locked pricing snapshot returned on each output is recomputed from its components (codec, resolution, framerate, quality, feature, minimum) and checked for internal consistency.

  • Artifacts, counted

    Thumbnails, sprite WebVTT tracks, and subtitle sidecars are listed from storage and counted against what the job asked for.

  • Honest about gaps

    When the worker cannot yet produce a feature, the case keeps its true assertion and is tracked as a gap — reported, never quietly passed. Those gaps are listed in full above.

Coverage by category

Cases are grouped by what they exercise. “Validated” counts the cases the suite expects to pass today; anything in progress is called out separately.

  1. Input validation (rejections)

    38/39
    1 gap
  2. Codec × container

    11/11
  3. Codec settings

    10/10
  4. HDR

    5/9
    4 gaps
  5. Input formats

    8/8
  6. Pricing

    7/8
    1 gap
  7. Thumbnails

    8/8
  8. Quality (VMAF)

    7/7
  9. Streaming (HLS / DASH)

    7/7
  10. Adaptive bitrate

    6/6
  11. Content-aware encoding

    6/6
  12. Presets

    6/6
  13. Subtitles

    6/6
  14. Watermark / overlay

    6/6
  15. Audio

    5/5
  16. DRM

    5/5
  17. Path templates

    5/5
  18. Captions

    3/4
    1 gap
  19. Job lifecycle

    4/4
  20. Clip

    3/3
  21. Resolution

    2/2
  22. Encoding pipeline

    1/1
  23. Multi-output jobs

    1/1
  24. Encode-failure handling

    1/1

Capabilities exercised

Each value below is exactly what the API accepts on the wire. A value is validated only when a real job produces it and the harness asserts on the output. Values still in progress are not yet validated end to end — some are accepted-but-unproduced, others are gated at create.

Video codecs

H.264 H.265 (HEVC) VP9 AV1

Containers & packaging

MP4 WebM MKV MOV HLS DASH Adaptive (HLS + DASH)

DRM systems

Widevine FairPlay PlayReady

Encryption schemes

CENC CBCS

HDR formats

HDR10 HDR10+ · in progress HLG Dolby Vision (profile 5) · in progress Dolby Vision (profile 8) · in progress

HDR modes

Passthrough Tone-map · in progress Force

Subtitle operations

Passthrough Convert Burn-in Extract generate

Subtitle formats

SRT WebVTT TTML · in progress ASS/SSA · in progress

Thumbnail modes

Single frame Interval Sprite sheet Timestamps animated

Content-aware encoding

Per-title Auto-ABR · in progress

Why you can trust these numbers

This page is not hand-written. It is generated from the API's validation catalog and synced into the site as a snapshot; the same catalog is the production-readiness gate for the encoding pipeline. When a capability's coverage changes, the number here changes with it — and a drift check fails the build if the page and the catalog ever disagree.

Run your own case

Submit a job the way the catalog does. A free account includes 30-second test encodes, and the output is yours to probe.

No card needed · 30-second test encodes free · pay per output minute after