OpenSeek API

The reference registry runs at https://openseek.duckdns.org. It answers JSON over HTTP and serves the preview assets themselves from /s/. Endpoints are listed below as open or keyed; a keyed one answers 401 without a valid key.

Request shape

GET /v1/sprites?imdb_id=tt0111161&duration_ms=8280000
Host: openseek.duckdns.org
X-API-Key: <your key>

Episodes are looked up with show_imdb_id or show_tmdb_id plus season and episode. A lookup has no size parameter: the registry serves one tile size, 320×180.

Open endpoints

Keyed endpoints

No public job intake

Public intake is closed. POST /v1/contribute is the only public write, because the registry will not download a video URL supplied by a stranger: an open enqueue route would let anyone hand this host a URL to fetch, content it has no right to. There is a client that captures previews from the video a viewer is already playing, so there is nothing left to ask for.

POST /v1/jobs and POST /v1/requests therefore answer 404, with a body naming the replacement:

{"error": "public intake is closed - POST previews you captured with POST /v1/contribute"}

That is a deliberate 404, not a missing route and not a key problem: it comes back the same way with no key, so it never reads as "get a key and try again". POST /v1/jobs/lease, POST /v1/jobs/<id>/ack and POST /v1/jobs/<id>/fail still exist and still need a key, but they are the operator's own worker routes: something inside the deployment leases work it queued itself. They are not part of the public API and are not documented for clients.

A key does not bypass verification. Promotion refuses a contribution that has not been verified, and verification is a check on the upload itself: the WebVTT must parse, every cue must reference a sheet that was uploaded, sampled tiles must decode as non-blank JPEGs, the tile boxes must lie inside the sheet image, and the cue count and interval must be plausible.

Getting a key

Signing in with a Google account issues a key for the hosted registry, up to four active keys per account. The key is shown once, on a page that does not cache. Sign in with Google to get an API key.

Self-hosting needs no account at all: you run the registry, so you mint your own keys on your own host. See self-hosting.

On a registry host, an operator mints a key with:

python3 mint_key.py <name>

The key is printed once and only a hash of it is stored — a sha256 digest plus a six-character prefix for identification — so it cannot be shown again. Mint a replacement and revoke the old one by that prefix:

DELETE FROM keys WHERE key_prefix='<old prefix>';

Lookup example

curl -H 'X-API-Key: <your key>' \
  'https://openseek.duckdns.org/v1/sprites?imdb_id=tt0111161&duration_ms=8280000'
{
  "media_type": "movie",
  "title": "The Shawshank Redemption",
  "imdb_id": "tt0111161",
  "vtt_url": "https://openseek.duckdns.org/s/tt0111161-v1/thumbnails.vtt",
  "version": 1,
  "source_duration_ms": 8280000,
  "scale": 1.0,
  "status": "complete",
  "covered_until_ms": 8280000
}

vtt_url may point at object storage rather than at the registry. Fetch it, resolve the sheet names it references against the directory it came from, and do not rebuild those URLs from the origin. The lifecycle is described step by step on the SDK page.

Limits and current policy

Elsewhere