{"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"}}}}}