Skip to main content
Version: 3.15.0

API Docs

danger

🔥 🔥 The API, and all of Maintainerr for that matter, does not have an authentication method. There are certain API calls, that if you make your instance public facing, will expose your entire settings configuration. This could include all of your service's API keys. Proceed with extreme caution if you choose to expose Maintainerr to the public. 🔥 🔥

API endpoints​

info

The Docusaurus site does not yet embed the generated Swagger reference. Use the live Swagger UI in your Maintainerr instance at http://<maintainerr_url>/api/swagger for the current API surface, including newer modules such as overlays and storage metrics.

The repository also carries a bundled OpenAPI YAML at static/openapi-spec/maintainerr_api_specs.yaml, but the live Swagger UI should still be treated as the source of truth for the running instance.

Notable current endpoints​

These are some of the newer user-facing API groups that are relevant to the current docs set.

Health​

Maintainerr exposes lightweight health endpoints under /api/health (prefixed with BASE_PATH when set) for orchestration probes and uptime monitoring.

EndpointPurpose
GET /api/health/liveLiveness probe; returns 200 while the process is running and does not touch the database
GET /api/health/readyReadiness probe; runs a database SELECT 1 check and returns 200 or 503
GET /api/healthConvenience alias that mirrors /api/health/ready

GET /api/health/live returns a lightweight envelope such as:

{
"status": "ok",
"uptimeSeconds": 1234,
"timestamp": "2026-06-05T12:00:00.000Z"
}

GET /api/health/ready and GET /api/health include database status:

// 200
{ "status": "ok", "uptimeSeconds": 1234, "database": "ok", "timestamp": "..." }
// 503
{ "status": "degraded", "uptimeSeconds": 1234, "database": "unreachable", "timestamp": "..." }
  • Only the database gates readiness. External integrations such as Plex/Jellyfin, the *arr stack, Seerr, Tautulli, and Streamystats are intentionally excluded so transient upstream outages do not take Maintainerr out of rotation.
  • The bundled Docker image ships a HEALTHCHECK that calls /api/health/ready and honours both BASE_PATH and UI_PORT.
  • For Kubernetes, use /api/health/live as the livenessProbe and /api/health/ready as the readinessProbe. If BASE_PATH is set, prefix both probe paths accordingly.

Collections​

EndpointPurpose
GET /api/collections/overlay-dataReturns collections with full media membership for overlay consumers, including the Calendar page
POST /api/collections/media/handleRun the configured collection action immediately for one item from the collection detail modal
GET /api/collections/:id/posterReturn the stored custom collection poster as image/jpeg, or 404 when none exists
POST /api/collections/:id/posterUpload a custom collection poster with multipart field poster; returns { pushed, attempted }
DELETE /api/collections/:id/posterClear the stored poster and return { cleared, refreshRequested }

Metadata​

EndpointPurpose
GET /api/metadata/backdrop/:typeResolve a backdrop image for a movie or show from the configured metadata providers
GET /api/metadata/image/:typeResolve a poster image for a movie or show from the configured metadata providers
GET /api/settings/tmdbRead the saved TMDB API key state
POST /api/settings/tmdbSave a TMDB API key
DELETE /api/settings/tmdbRemove the saved TMDB API key
GET /api/settings/tvdbRead the saved TVDB API key state
POST /api/settings/tvdbSave a TVDB API key
DELETE /api/settings/tvdbRemove the saved TVDB API key
GET /api/settings/metadata-providerRead which metadata provider is currently primary
POST /api/settings/metadata-providerChange the primary metadata provider
POST /api/settings/metadata/refresh/:providerClear cached metadata for TMDB or TVDB and queue a media-server refresh pass

Media server settings​

EndpointPurpose
GET /api/settings/embyRead the saved Emby URL, API key, and selected admin user
POST /api/settings/emby/testTest an Emby URL and API key, and return available admin users
POST /api/settings/embySave Emby connection settings
DELETE /api/settings/embyRemove the saved Emby connection settings
POST /api/settings/emby/loginAuthenticate with an Emby admin username/password and return an API key plus admin-user choices

Download Client​

EndpointPurpose
GET /api/settings/download-clientRead the saved qBittorrent connection and cleanup options
POST /api/settings/download-clientSave qBittorrent connection and cleanup options
DELETE /api/settings/download-clientRemove the saved download-client connection settings
POST /api/settings/test/download-clientTest the qBittorrent Web UI URL, credentials, and cleanup options before saving

Streamystats (Jellyfin only)​

EndpointPurpose
GET /api/settings/streamystatsRead the saved Streamystats base URL
POST /api/settings/test/streamystatsTest a Streamystats URL using the currently configured Jellyfin API key
POST /api/settings/streamystatsSave the Streamystats base URL
DELETE /api/settings/streamystatsRemove the saved Streamystats base URL
GET /api/streamystats/infoReturn the configured Streamystats URL plus the resolved Jellyfin server id used for deep links
GET /api/streamystats/items/:itemIdReturn Streamystats watch-history totals, per-user stats, and episode progress for one Jellyfin item

Overlays​

EndpointPurpose
GET /api/overlays/settingsRead global overlay settings
PUT /api/overlays/settingsUpdate global overlay settings
GET /api/overlays/sectionsList media server library sections used by the template preview picker
GET /api/overlays/random-itemGet a random media item for poster-template preview
GET /api/overlays/random-episodeGet a random episode for title-card preview
GET /api/overlays/posterProxy media artwork for template preview
GET /api/overlays/statusRead the latest overlay processing status
POST /api/overlays/processRun overlay processing for all eligible collections
POST /api/overlays/process/:collectionIdRun overlay processing for one collection
POST /api/overlays/revert/:collectionIdRevert overlays for one collection
DELETE /api/overlays/resetRevert all overlays
GET /api/overlays/fontsList available fonts
GET /api/overlays/fonts/:nameRead a bundled or uploaded font file
POST /api/overlays/fontsUpload a .ttf, .otf, or .woff font
GET /api/overlays/imagesList uploaded overlay image assets
GET /api/overlays/images/:nameRead an uploaded overlay image asset
POST /api/overlays/imagesUpload a .png, .jpg/.jpeg, or .webp image for template image elements
DELETE /api/overlays/images/:nameDelete an uploaded overlay image asset
GET /api/overlays/templatesList overlay templates
GET /api/overlays/templates/:idFetch one template
POST /api/overlays/templatesCreate a template
PUT /api/overlays/templates/:idUpdate a template
DELETE /api/overlays/templates/:idDelete a non-preset template
POST /api/overlays/templates/:id/duplicateClone a template into an editable copy
POST /api/overlays/templates/:id/defaultSet a template as the default for its mode
POST /api/overlays/templates/:id/exportExport a template as JSON
POST /api/overlays/templates/importImport a template from JSON
POST /api/overlays/templates/:id/previewRender a server-side preview of a template on real artwork

POST /api/overlays/process accepts an optional { force: true } body to reapply overlays even when the saved day-count state is already current. Its run summary now always reports processed, reverted, skipped, and errors.

POST /api/overlays/process and DELETE /api/overlays/reset both return 409 Conflict if another overlay-processing run is already active.

Storage Metrics​

EndpointPurpose
GET /api/storage-metricsReturn aggregated disk usage, instance health, collection-size summaries, and cumulative cleanup totals
GET /api/storage-metrics/library-sizesCompute per-library sizes on demand; potentially slow on large libraries

GET /api/storage-metrics now includes cleanupTotals counters for itemsHandled, moviesHandled, showsHandled, seasonsHandled, and episodesHandled, plus reclaimed-byte totals in bytesHandled, movieBytesHandled, showBytesHandled, seasonBytesHandled, and episodeBytesHandled.

The same response also includes collectionSummary type breakdowns for movieSizeBytes, showSizeBytes, seasonSizeBytes, episodeSizeBytes, and per-type reclaimable collection counts such as reclaimableMovieCount.

Collection payloads also now carry an optional mediaServerSort key. It stores the collection's saved media-server sort order as {field}.{order} (for example deleteSoonest.asc) when the connected server supports collection sorting.