{ "openapi": "3.0.3", "info": { "title": "Navidrome API", "version": "1.0.0", "description": "Navidrome API v1. Spec-first, additive within v1. Clients discover implemented\ncapability modules through `GET /server` and never sniff versions.\n\nEnums are open: new values may be added to any enum within v1. Clients must\naccept values they do not recognise instead of failing.\n\nEvery operation declares `x-stability-level`: `alpha` operations may change or\ndisappear without notice, `beta` and `stable` operations only change additively.\nA level is only ever raised, never lowered.\n\n`HEAD` is accepted wherever `GET` is. A `405` response lists the allowed methods\nin its `Allow` header.\n", "license": { "name": "GPL-3.0", "url": "https://www.gnu.org/licenses/gpl-3.0.html" } }, "servers": [ { "url": "/api/v1" } ], "tags": [ { "name": "server", "description": "Server discovery and the published OpenAPI document." } ], "paths": { "/server": { "get": { "operationId": "getServerInfo", "x-module": "core", "x-stability-level": "alpha", "tags": [ "server" ], "summary": "Describe the server", "description": "Returns the public server description. No authentication required.\nAuthenticated requests will additionally receive the implemented capability modules\nonce authentication is available.\n", "responses": { "200": { "description": "Server description.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ServerInfo" } } } }, "500": { "$ref": "#/components/responses/InternalError" } } } }, "/openapi.json": { "get": { "operationId": "getOpenAPISpecJSON", "x-module": "core", "x-stability-level": "alpha", "tags": [ "server" ], "summary": "Get the OpenAPI document (JSON)", "description": "The bundled OpenAPI document of the running server version. Supports ETag revalidation.", "responses": { "200": { "description": "The OpenAPI document.", "headers": { "ETag": { "$ref": "#/components/headers/ETag" } }, "content": { "application/json": { "schema": { "type": "object", "description": "OpenAPI 3.0 document." } } } }, "304": { "$ref": "#/components/responses/NotModified" } } } }, "/openapi.yaml": { "get": { "operationId": "getOpenAPISpecYAML", "x-module": "core", "x-stability-level": "alpha", "tags": [ "server" ], "summary": "Get the OpenAPI document (YAML)", "description": "The bundled OpenAPI document of the running server version. Supports ETag revalidation.", "responses": { "200": { "description": "The OpenAPI document.", "headers": { "ETag": { "$ref": "#/components/headers/ETag" } }, "content": { "application/yaml": { "schema": { "type": "object", "description": "OpenAPI 3.0 document." } } } }, "304": { "$ref": "#/components/responses/NotModified" } } } } }, "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT", "description": "Short-lived access token minted from a device grant. Not yet applied to any operation." } }, "schemas": { "ServerInfo": { "type": "object", "description": "Public server description. Everything an add-server screen needs before login.", "required": [ "name", "serverVersion", "specVersion", "setupRequired", "loginMethods" ], "properties": { "name": { "type": "string", "description": "Human-readable server product name." }, "serverVersion": { "type": "string", "description": "Version of the running server build." }, "specVersion": { "type": "string", "description": "Version of the OpenAPI document this server implements." }, "setupRequired": { "type": "boolean", "description": "True until the first admin user has been created." }, "loginMethods": { "type": "array", "description": "Login methods this server accepts. New methods may be added; clients ignore values they do not recognise.", "items": { "type": "string", "enum": [ "password" ] } } } }, "Problem": { "type": "object", "description": "RFC 9457 problem details, returned for every 4xx and 5xx response.", "required": [ "title", "status", "code" ], "properties": { "type": { "type": "string", "description": "URI reference identifying the problem type. Omitted while the problem carries no semantics\nbeyond its HTTP status code, which RFC 9457 defines as `about:blank`. Problems with their\nown semantics get their own URI; switch on `code` instead.\n" }, "title": { "type": "string", "description": "Short human-readable summary, the same for all occurrences of this problem type." }, "status": { "type": "integer", "description": "HTTP status code of this response." }, "detail": { "type": "string", "description": "Human-readable explanation specific to this occurrence. Omitted for internal errors." }, "code": { "type": "string", "description": "Machine-readable error code, and the value clients switch on. New codes may be added.", "enum": [ "validation", "unauthorized", "forbidden", "not_found", "method_not_allowed", "unavailable", "internal" ] }, "errors": { "type": "array", "description": "Per-field failures. Present only when `code` is `validation`.", "items": { "$ref": "#/components/schemas/ValidationError" } } } }, "ValidationError": { "type": "object", "description": "One field-level validation failure.", "required": [ "field", "message" ], "properties": { "field": { "type": "string", "description": "Name of the offending query parameter, path parameter, or body field (dotted for nested)." }, "message": { "type": "string", "description": "Why the value was rejected." } } } }, "responses": { "InternalError": { "description": "Unexpected server failure. Details are in the server log.", "content": { "application/problem+json": { "schema": { "$ref": "#/components/schemas/Problem" } } } }, "NotModified": { "description": "Not modified.", "headers": { "ETag": { "$ref": "#/components/headers/ETag" } } } }, "headers": { "ETag": { "description": "Entity tag for `If-None-Match` revalidation.", "schema": { "type": "string" } } } } }