mirror of
https://github.com/navidrome/navidrome.git
synced 2026-10-10 19:37:08 +02:00
537 lines
16 KiB
YAML
537 lines
16 KiB
YAML
|
|
openapi: 3.0.0
|
|||
|
|
info:
|
|||
|
|
version: 0.2.0
|
|||
|
|
title: Navidrome API
|
|||
|
|
description: >
|
|||
|
|
This spec describes the Navidrome API, which allows users to browse and manage their music library via a JSON:API
|
|||
|
|
based interface. The API provides endpoints for albums, tracks, artists, playlists and images, along with their
|
|||
|
|
relationships. Clients can retrieve information about the items in the library, filter and sort results, and
|
|||
|
|
perform actions such as creating and deleting playlists. With this API, developers can build music apps and
|
|||
|
|
services that integrate with Navidrome music server, providing a seamless experience for users to access and
|
|||
|
|
manage their music collection.
|
|||
|
|
contact:
|
|||
|
|
name: Navidrome
|
|||
|
|
url: https://navidrome.org
|
|||
|
|
servers:
|
|||
|
|
- url: /api/v2
|
|||
|
|
paths:
|
|||
|
|
/server:
|
|||
|
|
get:
|
|||
|
|
summary: Get server's global info
|
|||
|
|
operationId: getServerInfo
|
|||
|
|
responses:
|
|||
|
|
'200':
|
|||
|
|
description: The response’s data key maps to a resource object dictionary representing the server.
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
type: object
|
|||
|
|
required: [data]
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
$ref: '#/components/schemas/ServerInfo'
|
|||
|
|
'403':
|
|||
|
|
$ref: '#/components/responses/NotAuthorized'
|
|||
|
|
'500':
|
|||
|
|
$ref: '#/components/responses/InternalServerError'
|
|||
|
|
/tracks:
|
|||
|
|
get:
|
|||
|
|
summary: Get a list of tracks
|
|||
|
|
operationId: getTracks
|
|||
|
|
parameters:
|
|||
|
|
- $ref: '#/components/parameters/pageLimit'
|
|||
|
|
- $ref: '#/components/parameters/pageOffset'
|
|||
|
|
- $ref: '#/components/parameters/filterEquals'
|
|||
|
|
- $ref: '#/components/parameters/filterContains'
|
|||
|
|
- $ref: '#/components/parameters/filterLessThan'
|
|||
|
|
- $ref: '#/components/parameters/filterLessOrEqual'
|
|||
|
|
- $ref: '#/components/parameters/filterGreaterThan'
|
|||
|
|
- $ref: '#/components/parameters/filterGreaterOrEqual'
|
|||
|
|
- $ref: '#/components/parameters/filterStartsWith'
|
|||
|
|
- $ref: '#/components/parameters/filterEndsWith'
|
|||
|
|
- $ref: '#/components/parameters/sort'
|
|||
|
|
- $ref: '#/components/parameters/include'
|
|||
|
|
responses:
|
|||
|
|
'200':
|
|||
|
|
description: A list of tracks
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
type: object
|
|||
|
|
required: [data, links]
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/Track'
|
|||
|
|
links:
|
|||
|
|
$ref: '#/components/schemas/PaginationLinks'
|
|||
|
|
meta:
|
|||
|
|
$ref: '#/components/schemas/PaginationMeta'
|
|||
|
|
'400':
|
|||
|
|
$ref: '#/components/responses/BadRequest'
|
|||
|
|
'403':
|
|||
|
|
$ref: '#/components/responses/NotAuthorized'
|
|||
|
|
'500':
|
|||
|
|
$ref: '#/components/responses/InternalServerError'
|
|||
|
|
/tracks/{trackId}:
|
|||
|
|
get:
|
|||
|
|
summary: Retrieve an individual track
|
|||
|
|
operationId: getTrack
|
|||
|
|
parameters:
|
|||
|
|
- $ref: '#/components/parameters/include'
|
|||
|
|
- name: trackId
|
|||
|
|
in: path
|
|||
|
|
description: The unique identifier of the track
|
|||
|
|
required: true
|
|||
|
|
schema:
|
|||
|
|
type: string
|
|||
|
|
responses:
|
|||
|
|
'200':
|
|||
|
|
description: A track object
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
type: object
|
|||
|
|
required: [data]
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
$ref: '#/components/schemas/Track'
|
|||
|
|
'403':
|
|||
|
|
$ref: '#/components/responses/NotAuthorized'
|
|||
|
|
'404':
|
|||
|
|
$ref: '#/components/responses/NotFound'
|
|||
|
|
'500':
|
|||
|
|
$ref: '#/components/responses/InternalServerError'
|
|||
|
|
/artists:
|
|||
|
|
get:
|
|||
|
|
summary: Retrieve a list of artists
|
|||
|
|
operationId: getArtists
|
|||
|
|
parameters:
|
|||
|
|
- $ref: '#/components/parameters/pageLimit'
|
|||
|
|
- $ref: '#/components/parameters/pageOffset'
|
|||
|
|
- $ref: '#/components/parameters/filterEquals'
|
|||
|
|
- $ref: '#/components/parameters/filterContains'
|
|||
|
|
- $ref: '#/components/parameters/filterLessThan'
|
|||
|
|
- $ref: '#/components/parameters/filterLessOrEqual'
|
|||
|
|
- $ref: '#/components/parameters/filterGreaterThan'
|
|||
|
|
- $ref: '#/components/parameters/filterGreaterOrEqual'
|
|||
|
|
- $ref: '#/components/parameters/filterStartsWith'
|
|||
|
|
- $ref: '#/components/parameters/filterEndsWith'
|
|||
|
|
- $ref: '#/components/parameters/sort'
|
|||
|
|
- $ref: '#/components/parameters/include'
|
|||
|
|
responses:
|
|||
|
|
'200':
|
|||
|
|
description: A list of artists
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
type: object
|
|||
|
|
required: [data, links]
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/Artist'
|
|||
|
|
links:
|
|||
|
|
$ref: '#/components/schemas/PaginationLinks'
|
|||
|
|
meta:
|
|||
|
|
$ref: '#/components/schemas/PaginationMeta'
|
|||
|
|
'400':
|
|||
|
|
$ref: '#/components/responses/BadRequest'
|
|||
|
|
'403':
|
|||
|
|
$ref: '#/components/responses/NotAuthorized'
|
|||
|
|
'500':
|
|||
|
|
$ref: '#/components/responses/InternalServerError'
|
|||
|
|
/artists/{artistId}:
|
|||
|
|
get:
|
|||
|
|
summary: Retrieve an individual artist
|
|||
|
|
operationId: getArtist
|
|||
|
|
parameters:
|
|||
|
|
- $ref: '#/components/parameters/include'
|
|||
|
|
- name: artistId
|
|||
|
|
in: path
|
|||
|
|
description: The unique identifier of the artist
|
|||
|
|
required: true
|
|||
|
|
schema:
|
|||
|
|
type: string
|
|||
|
|
responses:
|
|||
|
|
'200':
|
|||
|
|
description: An artist object
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
type: object
|
|||
|
|
required: [data]
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
$ref: '#/components/schemas/Artist'
|
|||
|
|
'403':
|
|||
|
|
$ref: '#/components/responses/NotAuthorized'
|
|||
|
|
'404':
|
|||
|
|
$ref: '#/components/responses/NotFound'
|
|||
|
|
'500':
|
|||
|
|
$ref: '#/components/responses/InternalServerError'
|
|||
|
|
|
|||
|
|
components:
|
|||
|
|
parameters:
|
|||
|
|
pageOffset:
|
|||
|
|
name: page[offset]
|
|||
|
|
in: query
|
|||
|
|
description: The offset for pagination
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: integer
|
|||
|
|
format: int32
|
|||
|
|
minimum: 0
|
|||
|
|
default: 0
|
|||
|
|
pageLimit:
|
|||
|
|
name: page[limit]
|
|||
|
|
in: query
|
|||
|
|
description: The number of items per page
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: integer
|
|||
|
|
format: int32
|
|||
|
|
minimum: 0
|
|||
|
|
default: 10
|
|||
|
|
filterEquals:
|
|||
|
|
name: filter[equals]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any property with an exact match. Usage: filter[equals]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\w+'
|
|||
|
|
filterLessThan:
|
|||
|
|
name: filter[lessThan]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any numeric property less than a value. Usage: filter[lessThan]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\d+'
|
|||
|
|
filterLessOrEqual:
|
|||
|
|
name: filter[lessOrEqual]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any numeric property less than or equal to a value. Usage: filter[lessOrEqual]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\d+'
|
|||
|
|
filterGreaterThan:
|
|||
|
|
name: filter[greaterThan]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any numeric property greater than a value. Usage: filter[greaterThan]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\d+'
|
|||
|
|
filterGreaterOrEqual:
|
|||
|
|
name: filter[greaterOrEqual]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any numeric property greater than or equal to a value. Usage: filter[greaterOrEqual]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\d+'
|
|||
|
|
filterContains:
|
|||
|
|
name: filter[contains]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any property containing text. Usage: filter[contains]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\w+'
|
|||
|
|
filterStartsWith:
|
|||
|
|
name: filter[startsWith]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any property that starts with text. Usage: filter[startsWith]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\w+'
|
|||
|
|
filterEndsWith:
|
|||
|
|
name: filter[endsWith]
|
|||
|
|
in: query
|
|||
|
|
description: 'Filter by any property that ends with text. Usage: filter[endsWith]=property:value'
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
pattern: '^\w+:\w+'
|
|||
|
|
sort:
|
|||
|
|
name: sort
|
|||
|
|
in: query
|
|||
|
|
description: Sort the results by one or more properties, separated by commas. Prefix the property with '-' for descending order.
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: string
|
|||
|
|
include:
|
|||
|
|
name: include
|
|||
|
|
in: query
|
|||
|
|
description: Related resources to include in the response, separated by commas
|
|||
|
|
required: false
|
|||
|
|
schema:
|
|||
|
|
type: string
|
|||
|
|
schemas:
|
|||
|
|
ServerInfo:
|
|||
|
|
type: object
|
|||
|
|
required: [server, serverVersion, authRequired, features]
|
|||
|
|
properties:
|
|||
|
|
server:
|
|||
|
|
type: string
|
|||
|
|
description: The name of the server software.
|
|||
|
|
example: "navidrome"
|
|||
|
|
serverVersion:
|
|||
|
|
type: string
|
|||
|
|
description: The version number of the server.
|
|||
|
|
example: "0.60.0"
|
|||
|
|
authRequired:
|
|||
|
|
type: boolean
|
|||
|
|
description: Whether the user has access to the server.
|
|||
|
|
example: true
|
|||
|
|
features:
|
|||
|
|
type: array
|
|||
|
|
description: A list of optional features the server supports.
|
|||
|
|
items:
|
|||
|
|
type: string
|
|||
|
|
enum:
|
|||
|
|
- albums
|
|||
|
|
- artists
|
|||
|
|
- images
|
|||
|
|
ResourceObject:
|
|||
|
|
type: object
|
|||
|
|
required: [id, type]
|
|||
|
|
properties:
|
|||
|
|
id:
|
|||
|
|
type: string
|
|||
|
|
description: The unique identifier for the resource
|
|||
|
|
type:
|
|||
|
|
type: string
|
|||
|
|
description: The type of the resource
|
|||
|
|
ResourceList:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
oneOf:
|
|||
|
|
- $ref: '#/components/schemas/Track'
|
|||
|
|
- $ref: '#/components/schemas/Artist'
|
|||
|
|
- type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/ResourceObject'
|
|||
|
|
included:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/IncludedResource'
|
|||
|
|
links:
|
|||
|
|
$ref: '#/components/schemas/PaginationLinks'
|
|||
|
|
meta:
|
|||
|
|
$ref: '#/components/schemas/PaginationMeta'
|
|||
|
|
IncludedResource:
|
|||
|
|
oneOf:
|
|||
|
|
- $ref: '#/components/schemas/Track'
|
|||
|
|
- $ref: '#/components/schemas/Artist'
|
|||
|
|
discriminator:
|
|||
|
|
propertyName: type
|
|||
|
|
mapping:
|
|||
|
|
track: '#/components/schemas/Track'
|
|||
|
|
artist: '#/components/schemas/Artist'
|
|||
|
|
Track:
|
|||
|
|
allOf:
|
|||
|
|
- $ref: '#/components/schemas/ResourceObject'
|
|||
|
|
- type: object
|
|||
|
|
properties:
|
|||
|
|
attributes:
|
|||
|
|
$ref: '#/components/schemas/TrackAttributes'
|
|||
|
|
relationships:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
artists:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/TrackArtistRelationship'
|
|||
|
|
required:
|
|||
|
|
- artist
|
|||
|
|
TrackAttributes:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
title:
|
|||
|
|
type: string
|
|||
|
|
description: The title of the track
|
|||
|
|
artist:
|
|||
|
|
type: string
|
|||
|
|
description: The name of the artist who performed the track
|
|||
|
|
album:
|
|||
|
|
type: string
|
|||
|
|
description: The name of the album the track belongs to
|
|||
|
|
composer:
|
|||
|
|
type: string
|
|||
|
|
description: The name of the composer who created the track
|
|||
|
|
duration:
|
|||
|
|
type: number
|
|||
|
|
format: float
|
|||
|
|
description: The duration of the track in seconds
|
|||
|
|
required:
|
|||
|
|
- title
|
|||
|
|
- artist
|
|||
|
|
- album
|
|||
|
|
- duration
|
|||
|
|
TrackArtistRelationship:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
meta:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
role:
|
|||
|
|
$ref: '#/components/schemas/ArtistRole'
|
|||
|
|
required:
|
|||
|
|
- role
|
|||
|
|
data:
|
|||
|
|
$ref: '#/components/schemas/ResourceObject'
|
|||
|
|
required:
|
|||
|
|
- meta
|
|||
|
|
- data
|
|||
|
|
ArtistRole:
|
|||
|
|
type: string
|
|||
|
|
enum:
|
|||
|
|
- albumArtist
|
|||
|
|
- composer
|
|||
|
|
- vocalist
|
|||
|
|
description: The role of an artist in a track or album
|
|||
|
|
Artist:
|
|||
|
|
allOf:
|
|||
|
|
- $ref: '#/components/schemas/ResourceObject'
|
|||
|
|
- type: object
|
|||
|
|
properties:
|
|||
|
|
attributes:
|
|||
|
|
$ref: '#/components/schemas/ArtistAttributes'
|
|||
|
|
relationships:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
tracks:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
data:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/ArtistTrackRelationship'
|
|||
|
|
required:
|
|||
|
|
- data
|
|||
|
|
required:
|
|||
|
|
- tracks
|
|||
|
|
ArtistAttributes:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
name:
|
|||
|
|
type: string
|
|||
|
|
description: The name of the artist
|
|||
|
|
bio:
|
|||
|
|
type: string
|
|||
|
|
description: A short biography of the artist
|
|||
|
|
ArtistTrackRelationship:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
meta:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
role:
|
|||
|
|
$ref: '#/components/schemas/ArtistRole'
|
|||
|
|
required:
|
|||
|
|
- role
|
|||
|
|
data:
|
|||
|
|
$ref: '#/components/schemas/ResourceObject'
|
|||
|
|
required:
|
|||
|
|
- meta
|
|||
|
|
- data
|
|||
|
|
PaginationLinks:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
first:
|
|||
|
|
type: string
|
|||
|
|
format: uri
|
|||
|
|
prev:
|
|||
|
|
type: string
|
|||
|
|
format: uri
|
|||
|
|
next:
|
|||
|
|
type: string
|
|||
|
|
format: uri
|
|||
|
|
last:
|
|||
|
|
type: string
|
|||
|
|
format: uri
|
|||
|
|
PaginationMeta:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
currentPage:
|
|||
|
|
type: integer
|
|||
|
|
format: int32
|
|||
|
|
description: The current page in the collection
|
|||
|
|
totalPages:
|
|||
|
|
type: integer
|
|||
|
|
format: int32
|
|||
|
|
description: The total numeber of pages in the collection
|
|||
|
|
totalItems:
|
|||
|
|
type: integer
|
|||
|
|
format: int32
|
|||
|
|
description: The total number of items in the collection
|
|||
|
|
ErrorList:
|
|||
|
|
type: object
|
|||
|
|
required: [errors]
|
|||
|
|
properties:
|
|||
|
|
errors:
|
|||
|
|
type: array
|
|||
|
|
items:
|
|||
|
|
$ref: '#/components/schemas/ErrorObject'
|
|||
|
|
ErrorObject:
|
|||
|
|
type: object
|
|||
|
|
properties:
|
|||
|
|
id:
|
|||
|
|
type: string
|
|||
|
|
status:
|
|||
|
|
type: string
|
|||
|
|
title:
|
|||
|
|
type: string
|
|||
|
|
detail:
|
|||
|
|
type: string
|
|||
|
|
required:
|
|||
|
|
- errors
|
|||
|
|
responses:
|
|||
|
|
NotFound:
|
|||
|
|
description: Not Found
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
$ref: '#/components/schemas/ErrorList'
|
|||
|
|
NotAuthorized:
|
|||
|
|
description: Not Authorized
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
$ref: '#/components/schemas/ErrorList'
|
|||
|
|
BadRequest:
|
|||
|
|
description: Bad Request
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
$ref: '#/components/schemas/ErrorList'
|
|||
|
|
InternalServerError:
|
|||
|
|
description: Internal Server Error
|
|||
|
|
content:
|
|||
|
|
application/vnd.api+json:
|
|||
|
|
schema:
|
|||
|
|
$ref: '#/components/schemas/ErrorList'
|