API Reference

All endpoints return JSON. Protected endpoints require a JWT token via Authorization: Bearer <token> header or ?token=<token> query parameter.

Authentication

MethodEndpointAuthDescription
POST/api/auth/setupNoSet initial admin password (first-boot only)
POST/api/auth/loginNoAuthenticate → returns JWT
GET/api/auth/meYesCurrent user info
POST/api/auth/change-passwordYesChange own password

POST /api/auth/login

Body:

{ "username": "alice", "password": "secret" }

Response:

{ "token": "eyJhbG...", "user": { "id": 1, "username": "alice", "isAdmin": true } }

Cloud Authentication

MethodEndpointAuthDescription
POST/api/auth/cloud-loginNoAuthenticate via h3xed.app cloud token
POST/api/auth/setup-from-cloudNoLink server to h3xed.app during initial setup

Server

MethodEndpointAuthDescription
GET/api/serverNoServer name, version, platform
GET/api/statusYesDetailed server status (library/user/session counts)

Libraries

MethodEndpointAuthDescription
GET/api/librariesYesList accessible libraries with item counts
GET/api/libraries/:id/itemsYesBrowse items in a library (paginated)
GET/api/libraries/:id/recentYesRecently added items in a library
POST/api/librariesAdminCreate a new library
PUT/api/libraries/:uuidAdminUpdate a library
DELETE/api/libraries/:uuidAdminDelete a library
POST/api/libraries/:uuid/scanAdminTrigger a library scan
POST/api/libraries/:uuid/refreshAdminRefresh all metadata in a library
GET/api/libraries/:id/recommendedYesRecommended items for a library
GET/api/scan-statusAdminCheck scan progress

GET /api/libraries/:id/items

Query params: offset (default 0), limit (default 50)

Response:

{
  "library": { "id": "uuid", "name": "Movies", "type": "movie" },
  "items": [
    {
      "id": "rating-key",
      "type": "movie",
      "title": "Movie Title",
      "year": 2024,
      "summary": "...",
      "thumb": "/api/artwork/rating-key/thumb",
      "addedAt": 1700000000
    }
  ],
  "totalCount": 150,
  "offset": 0,
  "limit": 50
}

Invites

MethodEndpointAuthDescription
POST/api/invitesAdminCreate a new invite
GET/api/invitesAdminList all invites
DELETE/api/invites/:idAdminRevoke an invite
POST/api/invites/:token/acceptNoAccept an invite and create account
GET/api/invite-info/:tokenNoGet server info for an invite (public)

Media

MethodEndpointDescription
GET/api/media/:ratingKeyItem details (movie/show)
GET/api/media/:ratingKey/childrenSeasons (show) or episodes (season)
GET/api/media/:ratingKey/episodesAll episodes of a season
GET/api/cast/:ratingKeyCast and crew
GET/api/artwork/:ratingKey/thumbPoster image
GET/api/artwork/:ratingKey/artBackground art

GET /api/media/:ratingKey (Movie)

{
  "id": "abc123",
  "type": "movie",
  "title": "Movie Title",
  "year": 2024,
  "summary": "...",
  "rating": 8.5,
  "duration": 7200000,
  "thumb": "/api/artwork/abc123/thumb",
  "art": "/api/artwork/abc123/art",
  "files": [
    {
      "id": 42,
      "streamUrl": "/api/stream/42",
      "container": "mkv",
      "videoCodec": "hevc",
      "audioCodec": "aac",
      "videoResolution": "1080",
      "width": 1920,
      "height": 1080
    }
  ]
}

Playback & Streaming

MethodEndpointDescription
GET/api/stream/:fileIdDirect play file (supports range requests)
GET/api/media/:fileId/playback-infoCan this file direct play? Or needs transcode?
POST/api/transcode/:fileIdStart HLS transcode session
GET/api/transcode/:sessionId/stream.m3u8HLS playlist
GET/api/transcode/:sessionId/:segmentHLS segment
DELETE/api/transcode/:sessionIdStop transcode
GET/api/media/:fileId/infoFull probe info (codecs, audio tracks, subtitles)
GET/api/media/:fileId/subtitle/:indexExternal subtitle file (auto-converts SRT to VTT)

Watch Progress

MethodEndpointDescription
POST/api/progressReport playback position
POST/api/progress/watchedMark as watched
DELETE/api/progress/:ratingKeyMark as unwatched
GET/api/continue-watchingItems with partial progress
GET/api/watch-state?keys=a,b,cBatch watch state lookup

POST /api/progress

{ "ratingKey": "file-rating-key", "offset": 120000 }

Watchlist

MethodEndpointDescription
GET/api/watchlistGet the current user's watchlist
POST/api/watchlist/:ratingKeyAdd an item to the watchlist
DELETE/api/watchlist/:ratingKeyRemove an item from the watchlist

Mark Watched / Unwatched

MethodEndpointDescription
POST/api/mark-watched/:ratingKeyMark an item as watched
POST/api/mark-unwatched/:ratingKeyMark an item as unwatched

Discovery

MethodEndpointDescription
GET/api/search?q=querySearch media by title
GET/api/discover/recentRecently added across all libraries

Users (Admin)

MethodEndpointDescription
GET/api/usersList all users
POST/api/usersCreate a user
PUT/api/users/:idUpdate a user
DELETE/api/users/:idDelete a user
GET/api/users/:id/share-linkGenerate JWT share link
GET/api/users/:id/restrictionsGet user content restrictions
PUT/api/users/:id/restrictionsUpdate user content restrictions (ratings, labels)

Admin

MethodEndpointDescription
GET/api/hardwareDetected transcoding hardware
PUT/api/hardwareUpdate transcoder settings
GET/api/browse-fs?path=/Browse server filesystem
GET/api/genresList all genres
GET/api/logsRecent request logs

Metadata Management

MethodEndpointDescription
POST/api/match/:ratingKey/searchSearch TMDb for a metadata match
POST/api/match/:ratingKey/applyApply a TMDb match
POST/api/match/:ratingKey/refreshRefresh metadata from TMDb
GET/api/media-item/:ratingKeyGet editable metadata
PUT/api/media-item/:ratingKeyManually edit metadata