ShowMate API

Streams

Home · Health · Prometheus · OpenAPI · Status

Stream endpoints

MethodPathDescription
GET/play/<tmdb_id>Movie session → redirect to stream
GET/play/<tmdb_id>/<s>/<e>TV episode session
POST/play/batchBatch resolve (JSON body)
GET/watch/...Built-in HLS player (branded)
GET/s/<sid>Session entry (IP-locked, optional sig)
GET/proxy?sid=&url=Playlist/segment proxy (+ Range, ETag)

Session transfer

Move a session to another device without a new /play:

POST /transfer/create?sid=SESSION_ID
→ { "code": "A1B2C3D4", "expires_in": 300 }

GET /transfer/claim/A1B2C3D4
→ redirects to /s/<sid> on the new device IP

Idempotency & reuse

Send Idempotency-Key: <opaque> or ?reuse=1 on /play to prefer an existing recent session for the same IP + title.

Rate limits

Session creation is limited per IP. Responses include:

Errors (frozen contract)

{
  "error": "rate_limited",
  "title": "Too many requests",
  "message": "...",
  "status": 429,
  "hint": "...",
  "request_id": "..."
}

Send Accept: application/json for JSON error bodies. Every response includes X-Request-Id.

Ops

PathDescription
/health/liveLiveness (always 200 if process up)
/health/readyReadiness (503 in maintenance)
/healthAlias of ready
/metricsPrometheus text metrics
/openapi.jsonOpenAPI 3 document
/statusAdmin dashboard (STATUS_SECRET)
/docsThis page

Error codes

HTTPcodeMeaning
400bad_request / transfer_invalidInvalid input or transfer code
401unauthorizedMissing admin secret
403forbidden / title_blockedIP lock / blocklist / bad signature
404not_foundUnknown route
410session_expired / token_expiredSession or token gone
429rate_limited / max_sessions / bandwidth_limitLimits hit
500extraction_failed / stream_unavailableSource extract failed
502upstream_errorUpstream HTTP/network error
503maintenance / circuit_openMaintenance or circuit breaker