openapi: 3.0.0
info:
title: AzuraCast
description: 'AzuraCast is a standalone, turnkey web radio management tool. Radio stations hosted by AzuraCast expose a public API for viewing now playing data, making requests and more.'
license:
name: 'GNU Affero General Public License v3.0 or later'
url: 'https://www.gnu.org/licenses/agpl-3.0.txt'
version: 0.23.2
servers:
-
url: 'https://demo.azuracast.com/api'
description: 'AzuraCast Public Demo Server'
paths:
'/admin/acme-log/{path}':
get:
tags:
- 'Administration: General'
summary: 'View the logs of a manually run ACME certificate renewal.'
operationId: adminAcmeViewLog
parameters:
-
name: path
in: path
description: 'Log path as returned by the Run action.'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_LogContents'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/acme:
put:
tags:
- 'Administration: General'
summary: 'Generate or renew ACME certificate.'
operationId: putAdminGenerateAcmeCert
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_TaskWithLog'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/api-keys:
get:
tags:
- 'Administration: General'
summary: 'List all current API keys across the system.'
operationId: adminListApiKeys
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/ApiKey' }, { $ref: '#/components/schemas/HasLinks' }]
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/api-key/{id}':
delete:
tags:
- 'Administration: General'
summary: 'Delete a single API key.'
operationId: adminDeleteApiKey
parameters:
-
name: id
in: path
description: 'API Key ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/auditlog:
get:
tags:
- 'Administration: General'
summary: 'List all Audit Log actions that have taken place on the installation.'
operationId: getAuditlog
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/AuditLog'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/backups/delete/{path}':
delete:
tags:
- 'Administration: Backups'
summary: 'Delete a given backup.'
operationId: deleteBackup
parameters:
-
name: path
in: path
description: 'Download path (base64-encoded "StorageLocationID | Path")'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/backups/download/{path}':
get:
tags:
- 'Administration: Backups'
summary: 'Download a given backup.'
operationId: downloadBackup
parameters:
-
name: path
in: path
description: 'Download path (base64-encoded "StorageLocationID | Path")'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/backups:
get:
tags:
- 'Administration: Backups'
summary: 'Return a list of all current backups.'
operationId: getBackups
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Backup'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/backups/log/{path}':
get:
tags:
- 'Administration: Backups'
summary: 'View a specific backup log contents.'
operationId: adminBackupsViewLog
parameters:
-
name: path
in: path
description: 'Log path as returned by the Run action.'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_LogContents'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/backups/run:
post:
tags:
- 'Administration: Backups'
summary: 'Initialize a manual backup.'
operationId: postAdminDoBackup
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_TaskWithLog'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/admin/custom_assets/{type}':
get:
tags:
- 'Administration: General'
summary: 'Get the details of the custom asset of the specified type.'
operationId: getAdminCustomAsset
parameters:
-
name: type
in: path
description: 'Asset Type'
required: true
schema:
type: string
enum:
- album_art
- background
- browser_icon
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_UploadedRecordStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: General'
summary: 'Upload a new custom asset of the specified type.'
operationId: postAdminCustomAsset
parameters:
-
name: type
in: path
description: 'Asset Type'
required: true
schema:
type: string
enum:
- album_art
- background
- browser_icon
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: General'
summary: 'Removes the custom asset of the specified type.'
operationId: deleteAdminCustomAsset
parameters:
-
name: type
in: path
description: 'Asset Type'
required: true
schema:
type: string
enum:
- album_art
- background
- browser_icon
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/custom_fields:
get:
tags:
- 'Administration: Custom Fields'
summary: 'List all current custom fields in the system.'
operationId: getCustomFields
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/CustomField' }, { $ref: '#/components/schemas/HasLinks' }]
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: Custom Fields'
summary: 'Create a new custom field.'
operationId: addCustomField
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CustomField'
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/CustomField' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/custom_field/{id}':
get:
tags:
- 'Administration: Custom Fields'
summary: 'Retrieve details for a single custom field.'
operationId: getCustomField
parameters:
-
name: id
in: path
description: 'Custom Field ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/CustomField' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: Custom Fields'
summary: 'Update details of a single custom field.'
operationId: editCustomField
parameters:
-
name: id
in: path
description: 'Custom Field ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CustomField'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: Custom Fields'
summary: 'Delete a single custom field.'
operationId: deleteCustomField
parameters:
-
name: id
in: path
description: 'Custom Field ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/debug/clear-cache:
put:
tags:
- 'Administration: Debugging'
summary: 'Clear the application cache (Redis).'
operationId: adminDebugClearCache
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/debug/clear-queue/{queue}':
put:
tags:
- 'Administration: Debugging'
summary: 'Clear the specified message queue.'
operationId: adminDebugClearQueue
parameters:
-
name: queue
in: path
description: 'Message queue type.'
required: true
schema:
type: string
enum:
- high_priority
- normal_priority
- low_priority
- search_index
- media
- podcast_media
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/debug/station/{station_id}/clearqueue':
put:
tags:
- 'Administration: Debugging'
summary: 'Clear the upcoming song queue and generate a new one.'
operationId: adminDebugClearStationQueue
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Debug_LogResult'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/debug/queues:
get:
tags:
- 'Administration: Debugging'
summary: 'List all message queues.'
operationId: getAdminDebugQueues
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Debug_Queue'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/debug/stations:
get:
tags:
- 'Administration: Debugging'
summary: 'List all stations with their debug links.'
operationId: getAdminDebugStations
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Debug_Station'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/debug/sync-tasks:
get:
tags:
- 'Administration: Debugging'
summary: 'List all sync tasks and details about their run times.'
operationId: getAdminDebugSyncTasks
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Debug_SyncTask'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/admin/debug/station/{station_id}/nextsong':
put:
tags:
- 'Administration: Debugging'
summary: 'Get the next song to be played by the AutoDJ for a given station.'
operationId: adminDebugStationNextSong
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Debug_LogResult'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/debug/station/{station_id}/nowplaying':
put:
tags:
- 'Administration: Debugging'
summary: 'Generate the raw Now Playing data for a given station.'
operationId: adminDebugStationNowPlaying
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Debug_LogResult'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/debug/sync/{task}':
put:
tags:
- 'Administration: Debugging'
summary: 'Manually run a scheduled synchronized task by name.'
operationId: adminDebugRunSyncTask
parameters:
-
name: task
in: path
description: 'Synchronized task (either class name or "all").'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Debug_LogResult'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/debug/station/{station_id}/telnet':
put:
tags:
- 'Administration: Debugging'
summary: 'Manually run a Telnet command on a station backend.'
operationId: putAdminDebugTelnetCommand
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Debug_LogResult'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/geolite:
get:
tags:
- 'Administration: General'
summary: 'Get the current MaxMindDB GeoLite Database status.'
operationId: getGeoLite
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_GeoLiteStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: General'
summary: 'Set the GeoLite MaxMindDB Database license key.'
operationId: postGeoLite
requestBody:
content:
application/json:
schema:
properties:
key:
type: string
nullable: true
type: object
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_GeoLiteStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/login_tokens:
get:
tags:
- 'Administration: Users'
summary: 'List all current unexpired login tokens in the system.'
operationId: getLoginTokens
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/UserLoginToken' }, { $ref: '#/components/schemas/HasLinks' }]
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: Users'
summary: 'Create a new login token.'
operationId: addLoginToken
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_NewLoginToken'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_NewLoginTokenResponse'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/login_token/{id}':
get:
tags:
- 'Administration: Users'
summary: 'Retrieve details for a single login token.'
operationId: getLoginToken
parameters:
-
name: id
in: path
description: 'Token identifier'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/UserLoginToken' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: Users'
summary: 'Delete a single login token.'
operationId: deleteLoginToken
parameters:
-
name: id
in: path
description: 'Token identifier'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/logs:
get:
tags:
- 'Administration: General'
summary: 'List all available log types for viewing.'
operationId: adminListLogs
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_LogList'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/log/{key}':
get:
tags:
- 'Administration: General'
summary: 'View a specific log contents.'
operationId: adminViewLog
parameters:
-
name: key
in: path
description: 'Log Key from listing return.'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_LogContents'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/permissions:
get:
tags:
- 'Administration: Roles'
summary: 'Return a list of all available permissions.'
operationId: getPermissions
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Permissions'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/relays/list:
get:
tags:
- 'Administration: General'
summary: 'Return a list of all currently active AzuraRelay instances.'
operationId: adminGetRelays
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Relay'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/roles:
get:
tags:
- 'Administration: Roles'
summary: 'List all current roles in the system.'
operationId: getRoles
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Role'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: Roles'
summary: 'Create a new role.'
operationId: addRole
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Role'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Role'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/admin/role/{id}':
get:
tags:
- 'Administration: Roles'
summary: 'Retrieve details for a single current role.'
operationId: getRole
parameters:
-
name: id
in: path
description: 'Role ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Role'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: Roles'
summary: 'Update details of a single role.'
operationId: editRole
parameters:
-
name: id
in: path
description: 'Role ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_Role'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: Roles'
summary: 'Delete a single role.'
operationId: deleteRole
parameters:
-
name: id
in: path
description: 'Role ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/rsas:
get:
tags:
- 'Administration: General'
summary: 'Get the current Rocket Streaming Audio Server (RSAS) status.'
operationId: getRsas
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_RsasStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: General'
summary: 'Upload a new Rocket Streaming Audio Server (RSAS) binary.'
operationId: postRsas
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: General'
summary: 'Removes the Rocket Streaming Audio Server (RSAS) installation.'
operationId: deleteRsas
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/rsas/license:
post:
tags:
- 'Administration: General'
summary: 'Upload a new Rocket Streaming Audio Server (RSAS) license key.'
operationId: postRsasLicense
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: General'
summary: 'Removes the Rocket Streaming Audio Server (RSAS) license.'
operationId: deleteRsasLicense
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/send-test-message:
post:
tags:
- 'Administration: General'
summary: 'Send a test e-mail to confirm mail delivery settings.'
operationId: adminSendTestEmail
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/server/stats:
get:
tags:
- 'Administration: General'
summary: 'Return a list of all CPU usage stats.'
operationId: getServerStats
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_ServerStats'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/services:
get:
tags:
- 'Administration: General'
summary: 'List the status of essential system services.'
operationId: getServiceDetails
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_ServiceData'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/services/restart/{service}':
post:
tags:
- 'Administration: General'
summary: 'Restart the specified service.'
operationId: restartService
parameters:
-
name: service
in: path
description: 'Service name.'
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CustomField'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/settings:
get:
tags:
- 'Administration: Settings'
summary: 'List the current values of all editable system settings.'
operationId: getSettings
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Settings'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: Settings'
summary: 'Update settings to modify any settings provided.'
operationId: editSettings
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Settings'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/shoutcast:
get:
tags:
- 'Administration: General'
summary: 'Get details about the Shoutcast installation.'
operationId: getShoutcast
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_ShoutcastStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: General'
summary: 'Upload a new Shoutcast binary.'
operationId: postShoutcast
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: General'
summary: 'Removes the installed Shoutcast binary.'
operationId: deleteShoutcast
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/station/{id}/clone':
post:
tags:
- 'Administration: Stations'
summary: 'Clone a station, preserving certain settings.'
operationId: postAdminStationsClone
parameters:
-
name: id
in: path
description: 'Station ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
properties:
name:
description: 'The name of the newly cloned station.'
type: string
description:
description: 'The description of the newly cloned station.'
type: string
clone:
description: 'Which parts of the original station to clone.'
type: array
items: { type: string, enum: [media_storage, recordings_storage, podcasts_storage, playlists, mounts, remotes, streamers, permissions, webhooks] }
type: object
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/stations/storage-locations:
get:
tags:
- 'Administration: Stations'
summary: 'List storage locations available for assignment to a station.'
operationId: getAdminStationStorageLocations
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
additionalProperties:
$ref: '#/components/schemas/Api_Form_SimpleOptions'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/stations:
get:
tags:
- 'Administration: Stations'
summary: 'List all current stations in the system.'
operationId: adminGetStations
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Station'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: Stations'
summary: 'Create a new station.'
operationId: adminAddStation
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Station'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Station'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/station/{id}':
get:
tags:
- 'Administration: Stations'
summary: 'Retrieve details for a single station.'
operationId: adminGetStation
parameters:
-
name: id
in: path
description: ID
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Station'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: Stations'
summary: 'Update details of a single station.'
operationId: adminEditStation
parameters:
-
name: id
in: path
description: ID
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Station'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: Stations'
summary: 'Delete a single station.'
operationId: adminDeleteStation
parameters:
-
name: id
in: path
description: ID
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/stereo_tool:
get:
tags:
- 'Administration: General'
summary: 'Get information about the Stereo Tool installation.'
operationId: getStereoTool
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_StereoToolStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: General'
summary: 'Upload a new Stereo Tool binary.'
operationId: postStereoTool
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: General'
summary: 'Removes the installed Stereo Tool binary.'
operationId: deleteStereoTool
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/storage_locations:
get:
tags:
- 'Administration: Storage Locations'
summary: 'List all current storage locations in the system.'
operationId: getStorageLocations
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/StorageLocation' }, { $ref: '#/components/schemas/Api_Admin_StorageLocation' }]
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: Storage Locations'
summary: 'Create a new storage location.'
operationId: addStorageLocation
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_StorageLocation'
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/StorageLocation' }
- { $ref: '#/components/schemas/Api_Admin_StorageLocation' }
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/storage_location/{id}':
get:
tags:
- 'Administration: Storage Locations'
summary: 'Retrieve details for a single storage location.'
operationId: getStorageLocation
parameters:
-
name: id
in: path
description: 'User ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/StorageLocation' }
- { $ref: '#/components/schemas/Api_Admin_StorageLocation' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: Storage Locations'
summary: 'Update details of a single storage location.'
operationId: editStorageLocation
parameters:
-
name: id
in: path
description: 'Storage Location ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StorageLocation'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: Storage Locations'
summary: 'Delete a single storage location.'
operationId: deleteStorageLocation
parameters:
-
name: id
in: path
description: 'Storage Location ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/admin/updates:
get:
tags:
- 'Administration: General'
summary: 'Show information about this installation and its update status.'
operationId: getUpdateStatus
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_UpdateDetails'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: General'
summary: 'Attempts to trigger a web-based update.'
operationId: putWebUpdate
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/admin/users:
get:
tags:
- 'Administration: Users'
summary: 'List all current users in the system.'
operationId: getUsers
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_UserWithDetails'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Administration: Users'
summary: 'Create a new user.'
operationId: addUser
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/User'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_UserWithDetails'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/admin/user/{id}':
get:
tags:
- 'Administration: Users'
summary: 'Retrieve details for a single current user.'
operationId: getUser
parameters:
-
name: id
in: path
description: 'User ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Admin_UserWithDetails'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Administration: Users'
summary: 'Update details of a single user.'
operationId: editUser
parameters:
-
name: id
in: path
description: 'User ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/User'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Administration: Users'
summary: 'Delete a single user.'
operationId: deleteUser
parameters:
-
name: id
in: path
description: 'User ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/account/api-keys:
get:
tags:
- 'My Account'
summary: 'List all API keys associated with your account.'
operationId: getMyApiKeys
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/ApiKey' }, { $ref: '#/components/schemas/HasLinks' }]
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'My Account'
summary: 'Create a new API key associated with your account.'
operationId: addMyApiKey
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ApiKey'
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/Api_Account_NewApiKey' }
- { $ref: '#/components/schemas/ApiKey' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/frontend/account/api-key/{id}':
get:
tags:
- 'My Account'
summary: 'Retrieve details for a single API key.'
operationId: getMyApiKey
parameters:
-
name: id
in: path
description: 'API Key ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/ApiKey' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'My Account'
summary: 'Delete a single API key associated with your account.'
operationId: deleteMyApiKey
parameters:
-
name: id
in: path
description: 'API Key ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/account/two-factor:
get:
tags:
- 'My Account'
summary: 'Get the current two-factor authentication status of your account.'
operationId: getMyTwoFactor
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Account_TwoFactorStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'My Account'
summary: 'Register a new two-factor authentication method.'
operationId: putAccountTwoFactor
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'My Account'
summary: 'Remove two-factor authentication from your account.'
operationId: deleteMyTwoFactor
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/account/me:
get:
tags:
- 'My Account'
summary: 'Show the details for your current logged-in account.'
operationId: getMe
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'My Account'
summary: 'Save changes to your logged in account.'
operationId: putMe
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/account/passkeys:
get:
tags:
- 'My Account'
summary: 'List currently registered passkeys.'
operationId: getAccountListPasskeys
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/frontend/account/passkey/{id}':
get:
tags:
- 'My Account'
summary: 'Get the details of a single passkey.'
operationId: getAccountGetPasskey
parameters:
-
name: id
in: path
description: 'Passkey ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'My Account'
summary: 'Delete a specified passkey by ID.'
operationId: deleteAccountPasskey
parameters:
-
name: id
in: path
description: 'Passkey ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/account/password:
put:
tags:
- 'My Account'
summary: 'Change the password of your account.'
operationId: changeMyPassword
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Account_ChangePassword'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/frontend/account/webauthn/register:
get:
tags:
- 'My Account'
summary: 'Get registration details for WebAuthn registration.'
operationId: getAccountWebAuthnRegister
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'My Account'
summary: 'Submit a new registration request for WebAuthn.'
operationId: putAccountWebAuthnRegister
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/dashboard/charts:
put:
tags:
- Miscellaneous
summary: 'Get the measurements for the dashboard charts.'
operationId: getDashboardCharts
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/frontend/dashboard/notifications:
get:
tags:
- Miscellaneous
summary: 'Show all notifications your current account should see.'
operationId: getNotifications
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Notification'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
/frontend/dashboard/stations:
get:
tags:
- Miscellaneous
summary: 'List stations that can be managed by the current user account on the dashboard.'
operationId: getDashboardStations
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/Api_NowPlaying' }, { $ref: '#/components/schemas/HasLinks' }]
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/status:
get:
tags:
- 'Public: Miscellaneous'
summary: 'Returns an affirmative response if the API is active.'
operationId: getStatus
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_SystemStatus'
security: []
/time:
get:
tags:
- 'Public: Miscellaneous'
description: "Returns the time (with formatting) in GMT and the user's local time zone, if logged in."
operationId: getTime
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Time'
security: []
/internal/relays:
get:
tags:
- 'Administration: General'
description: "Returns all necessary information to relay all 'relayable' stations."
operationId: internalGetRelayDetails
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Relay'
/nowplaying:
get:
tags:
- 'Public: Now Playing'
description: "Returns a full summary of all stations' current state."
operationId: getAllNowPlaying
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_NowPlaying'
security: []
'/nowplaying/{station_id}':
get:
tags:
- 'Public: Now Playing'
description: "Returns a full summary of the specified station's current state."
operationId: getStationNowPlaying
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_NowPlaying'
'404':
$ref: '#/components/responses/RecordNotFound'
security: []
'/nowplaying/{station_id}/art':
get:
tags:
- 'Public: Now Playing'
summary: 'Always redirects to the current art for the given station.'
operationId: getStationNowPlayingArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'302':
description: 'A temporary redirect to the correct resource.'
headers:
location:
description: 'The current URL of the resource.'
schema:
type: string
'404':
$ref: '#/components/responses/RecordNotFound'
security: []
/openapi.yml:
get:
tags:
- 'Public: Miscellaneous'
summary: 'Returns the OpenAPI specification document for this installation.'
operationId: getOpenApiSpec
responses:
'200':
description: Success
content:
text/x-yaml:
schema:
description: 'The OpenAPI specification document for this installation.'
type: string
format: binary
security: []
/prometheus:
get:
tags:
- Miscellaneous
summary: 'Returns the Prometheus measurements for this installation.'
operationId: getPrometheus
responses:
'200':
description: Success
content:
text/plain:
schema:
description: 'The Prometheus measurements for this installation.'
type: string
format: binary
'/station/{station_id}/art/{media_id}':
get:
tags:
- 'Public: Stations'
summary: 'Returns the album art for a song, or a generic image.'
operationId: getMediaArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'The station media unique ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithImage'
'302':
description: 'Image not found; generic filler image.'
headers:
location:
description: 'The current URL of the resource.'
schema:
type: string
security: []
post:
tags:
- 'Stations: Media'
summary: 'Sets the album art for a track.'
operationId: postMediaArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'Media ID'
required: true
schema:
anyOf:
-
type: integer
format: int64
-
type: string
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Media'
summary: 'Removes the album art for a track.'
operationId: deleteMediaArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'Media ID'
required: true
schema:
anyOf:
-
type: integer
format: int64
-
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/bulk':
get:
tags:
- 'Stations: Media'
summary: 'Download a CSV containing details about all station media.'
operationId: getStationBulkMediaDownload
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
text/csv:
schema:
description: 'A CSV file containing bulk media details.'
type: string
format: binary
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Media'
summary: 'Upload a CSV containing details about all station media.'
operationId: postStationBulkMediaUpload
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/bulk/preview':
post:
tags:
- 'Stations: Media'
summary: 'Preview changes from a CSV containing details about all station media.'
operationId: postStationBulkMediaPreview
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/custom_assets/{type}':
get:
tags:
- 'Stations: General'
summary: 'Get the details of the custom asset of the specified type.'
operationId: getStationCustomAsset
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: type
in: path
description: 'Asset Type'
required: true
schema:
type: string
enum:
- album_art
- background
- browser_icon
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_UploadedRecordStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: General'
summary: 'Upload a new custom asset of the specified type.'
operationId: postStationCustomAsset
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: type
in: path
description: 'Asset Type'
required: true
schema:
type: string
enum:
- album_art
- background
- browser_icon
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: General'
summary: 'Removes the custom asset of the specified type.'
operationId: deleteStationCustomAsset
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: type
in: path
description: 'Asset Type'
required: true
schema:
type: string
enum:
- album_art
- background
- browser_icon
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/fallback':
get:
tags:
- 'Stations: General'
summary: 'Get the custom fallback track for a station.'
operationId: getStationFallback
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_UploadedRecordStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: General'
summary: 'Update the custom fallback track for the station.'
operationId: postStationFallback
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: General'
summary: 'Removes the custom fallback track for a station.'
operationId: deleteStationFallback
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/batch':
put:
tags:
- 'Stations: Media'
summary: 'Perform a batch action on a collection of files/directories.'
operationId: putStationFileBatchAction
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/download':
get:
tags:
- 'Stations: Media'
summary: 'Download a file by relative path.'
operationId: getStationFileDownload
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: file
in: query
description: 'The relative path of the file in the Media filesystem.'
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/upload':
post:
tags:
- 'Stations: Media'
summary: 'Upload and process a new media file.'
operationId: postUploadFile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/list':
get:
tags:
- 'Stations: Media'
summary: 'List files in the media directory by path.'
operationId: getStationFileList
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: currentDirectory
in: query
required: true
schema:
type: string
-
name: searchPhrase
in: query
schema:
type: string
nullable: true
-
name: flushCache
in: query
schema:
type: boolean
default: false
nullable: true
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_FileList'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/directories':
get:
tags:
- 'Stations: Media'
summary: 'List directories in a station media library for moving/renaming.'
operationId: getStationFileDirectories
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/mkdir':
post:
tags:
- 'Stations: Media'
summary: 'Create a directory in a station media directory.'
operationId: postStationFilesMkdir
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/file/{id}/play':
get:
tags:
- 'Stations: Media'
summary: 'Download or play a given file by ID.'
operationId: getPlayFile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'Media ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/file/{song_id}/play':
get:
tags:
- 'Stations: Media'
summary: 'Download or play a given file by song_id.'
operationId: getPlayFileSongId
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: song_id
in: path
description: 'Media ID'
required: true
schema:
type: string
format: guid
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files/rename':
put:
tags:
- 'Stations: Media'
summary: 'Rename the specified files in the station media directory.'
operationId: postStationFilesRename
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/files':
get:
tags:
- 'Stations: Media'
summary: 'List all current uploaded files.'
operationId: getFiles
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationMedia'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Media'
summary: 'Upload a new file.'
operationId: addFile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_UploadFile'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationMedia'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/file/{id}':
get:
tags:
- 'Stations: Media'
summary: 'Retrieve details for a single file.'
operationId: getFile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'Media ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationMedia'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Media'
summary: 'Update details of a single file.'
operationId: editFile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'Media ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationMedia'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Media'
summary: 'Delete a single file.'
operationId: deleteFile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'Media ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/quota':
get:
tags:
- 'Stations: General'
summary: 'Get the current usage and quota for a given station storage location.'
operationId: getQuota
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationQuota'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/quota/{type}':
get:
tags:
- 'Stations: General'
summary: 'Get the current usage and quota for a given station storage location.'
operationId: getQuotaOfType
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: type
in: path
description: 'The storage location type (i.e. station_media, station_recordings, station_podcasts)'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationQuota'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/history':
get:
tags:
- 'Stations: Reports'
summary: 'Return song playback history items for a given station.'
operationId: getStationHistory
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: start
in: query
description: 'The start date for records, in PHP-supported date/time format. (https://www.php.net/manual/en/datetime.formats.php)'
required: false
schema:
type: string
-
name: end
in: query
description: 'The end date for records, in PHP-supported date/time format. (https://www.php.net/manual/en/datetime.formats.php)'
required: false
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_DetailedSongHistory'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/hls_streams':
get:
tags:
- 'Stations: HLS Streams'
summary: 'List all current HLS streams.'
operationId: getHlsStreams
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/StationHlsStream'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: HLS Streams'
summary: 'Create a new HLS stream.'
operationId: addHlsStream
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationHlsStream'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationHlsStream'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/hls_stream/{id}':
get:
tags:
- 'Stations: HLS Streams'
summary: 'Retrieve details for a single HLS stream.'
operationId: getHlsStream
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'HLS Stream ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationHlsStream'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: HLS Streams'
summary: 'Update details of a single HLS stream.'
operationId: editHlsStream
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'HLS Stream ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationHlsStream'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: HLS Streams'
summary: 'Delete a single HLS stream.'
operationId: deleteHlsStream
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'HLS Stream ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
/stations:
get:
tags:
- 'Public: Stations'
summary: 'Returns a list of stations.'
operationId: getStations
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_NowPlaying_Station'
security: []
'/station/{station_id}':
get:
tags:
- 'Public: Stations'
summary: 'Return information about a single station.'
operationId: getStation
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_NowPlaying_Station'
'404':
$ref: '#/components/responses/RecordNotFound'
security: []
'/station/{station_id}/liquidsoap-config/export':
get:
tags:
- 'Stations: Broadcasting'
summary: 'Generate an archive of all Liquidsoap configuration on your station, including custom config.'
operationId: exportStationLiquidsoapConfig
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/liquidsoap-config':
get:
tags:
- 'Stations: Broadcasting'
summary: 'Get the generated and editable sections of the station Liquidsoap configuration.'
operationId: getStationLiquidsoapConfig
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Broadcasting'
summary: 'Save the editable sections of the station Liquidsoap configuration.'
operationId: putStationLiquidsoapConfig
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/liquidsoap-config/import':
post:
tags:
- 'Stations: Broadcasting'
summary: 'Import a previously exported Liquidsoap configuration archive and replace custom config sections.'
operationId: importStationLiquidsoapConfig
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/listeners':
get:
tags:
- 'Stations: Reports'
summary: 'Return detailed information about current listeners.'
operationId: getStationListeners
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Listener'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/logs':
get:
tags:
- 'Stations: General'
summary: 'Return a list of available logs for the given station.'
operationId: getStationLogs
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_LogType'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/log/{key}':
get:
tags:
- 'Stations: General'
summary: 'View a specific log contents for the given station.'
operationId: getStationLog
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: key
in: path
description: 'Log Key from listing return.'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_LogContents'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/mount/{id}/intro':
get:
tags:
- 'Stations: Mount Points'
summary: 'Get the intro track for a mount point.'
operationId: getMountIntro
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Mount Point ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Mount Points'
summary: 'Update the intro track for a mount point.'
operationId: postMountIntro
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Mount Point ID'
required: true
schema:
type: integer
format: int64
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Mount Points'
summary: 'Removes the intro track for a mount point.'
operationId: deleteMountIntro
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Mount Point ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/mounts':
get:
tags:
- 'Stations: Mount Points'
summary: 'List all current mount points.'
operationId: getStationMounts
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/StationMount'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Mount Points'
summary: 'Create a new mount point.'
operationId: addMount
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationMount'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationMount'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/mount/{id}':
get:
tags:
- 'Stations: Mount Points'
summary: 'Retrieve details for a single mount point.'
operationId: getMount
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Mount Point ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationMount'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Mount Points'
summary: 'Update details of a single mount point.'
operationId: editMount
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Mount Point ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationMount'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Mount Points'
summary: 'Delete a single mount point.'
operationId: deleteMount
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Mount Point ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/ondemand/download/{media_id}':
get:
tags:
- 'Public: Stations'
summary: 'Download an on-demand playlist file by media unique ID.'
operationId: getStationOnDemandDownload
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: media_id
in: path
description: 'The media unique ID to download.'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/ondemand':
get:
tags:
- 'Public: Stations'
summary: 'List all tracks available on-demand for this station.'
operationId: getStationOnDemand
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationOnDemand'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/playlist/{id}/clone':
post:
tags:
- 'Stations: Playlists'
summary: 'Create a copy of the specified playlist.'
operationId: postStationPlaylistClone
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
properties:
name:
description: 'The name of the newly cloned playlist.'
type: string
clone:
description: 'Which parts of the original playlist to clone.'
type: array
items: { type: string, enum: [schedule, media] }
type: object
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/queue':
get:
tags:
- 'Stations: Playlists'
summary: 'Get the current playback queue for the specified playlist.'
operationId: getStationPlaylistQueue
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationPlaylistQueue'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Playlists'
summary: 'Reset the internal playback queue of a shuffled, song-based playlist.'
operationId: deletePlaylistQueue
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/empty':
delete:
tags:
- 'Stations: Playlists'
summary: 'Empty the contents of a song-based playlist.'
operationId: deleteEmptyPlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/export/{format}':
get:
tags:
- 'Stations: Playlists'
summary: 'Export a playlist contents in standard media player playlist format.'
operationId: getExportPlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
-
name: format
in: path
description: 'Export Playlist Format'
required: true
schema:
type: string
default: pls
enum:
- pls
- m3u
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/apply-to':
get:
tags:
- 'Stations: Playlists'
summary: 'Get a list of directories that the given playlist can apply to.'
operationId: getStationPlaylistApplyTo
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Playlists'
summary: 'Apply the specified playlist to the specified directories.'
operationId: putStationPlaylistApplyTo
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/order':
get:
tags:
- 'Stations: Playlists'
summary: 'Get the current order of sequential tracks in the specified playlist.'
operationId: getStationPlaylistOrder
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Playlists'
summary: 'Set the order of sequential tracks in the specified playlist.'
operationId: putStationPlaylistOrder
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/import':
post:
tags:
- 'Stations: Playlists'
summary: 'Import the contents of an uploaded playlist (PLS/M3U) file into the specified playlist.'
operationId: postStationPlaylistImport
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/reshuffle':
put:
tags:
- 'Stations: Playlists'
summary: 'Re-shuffle a playlist whose playback order is "shuffled".'
operationId: putReshufflePlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}/toggle':
put:
tags:
- 'Stations: Playlists'
summary: 'Toggle a playlist between enabled and disabled status.'
operationId: putTogglePlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlists':
get:
tags:
- 'Stations: Playlists'
summary: 'List all current playlists.'
operationId: getPlaylists
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/StationPlaylist'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Playlists'
summary: 'Create a new playlist.'
operationId: addPlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationPlaylist'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationPlaylist'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/playlist/{id}':
get:
tags:
- 'Stations: Playlists'
summary: 'Retrieve details for a single playlist.'
operationId: getPlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationPlaylist'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Playlists'
summary: 'Update details of a single playlist.'
operationId: editPlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationPlaylist'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Playlists'
summary: 'Delete a single playlist.'
operationId: deletePlaylist
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Playlist ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcast/{podcast_id}/episodes':
get:
tags:
- 'Stations: Podcasts'
summary: 'List all current episodes for a given podcast ID.'
operationId: getEpisodes
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_PodcastEpisode'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Podcasts'
summary: 'Create a new podcast episode.'
operationId: addEpisode
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_PodcastEpisode'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_PodcastEpisode'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcast/{podcast_id}/episode/{id}':
get:
tags:
- 'Stations: Podcasts'
summary: 'Retrieve details for a single podcast episode.'
operationId: getEpisode
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_PodcastEpisode'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Podcasts'
summary: 'Update details of a single podcast episode.'
operationId: editEpisode
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_PodcastEpisode'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Podcasts'
summary: 'Delete a single podcast episode.'
operationId: deleteEpisode
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcast/{podcast_id}/art':
get:
tags:
- 'Public: Stations'
summary: 'Gets the album art for a podcast.'
operationId: getPodcastArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithImage'
'302':
description: 'A temporary redirect to the correct resource.'
headers:
location:
description: 'The current URL of the resource.'
schema:
type: string
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
post:
tags:
- 'Stations: Podcasts'
summary: 'Sets the album art for a podcast.'
operationId: postPodcastArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Podcasts'
summary: 'Removes the album art for a podcast.'
operationId: deletePodcastArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcast/{podcast_id}/batch':
post:
tags:
- 'Stations: Playlists'
summary: 'Import the contents of an uploaded playlist (PLS/M3U) file into the specified playlist.'
operationId: postStationPodcastBatch
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
properties:
do:
description: 'The action to take with the specified rows.'
type: string
enum: [list, delete, edit]
episodes:
description: 'The IDs to perform batch actions on.'
type: array
items: { type: string }
type: object
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_PodcastBatchResult'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcast/{podcast_id}/episode/{episode_id}/art':
get:
tags:
- 'Public: Stations'
summary: 'Gets the album art for a podcast episode.'
operationId: getPodcastEpisodeArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithImage'
'302':
description: 'A temporary redirect to the correct resource.'
headers:
location:
description: 'The current URL of the resource.'
schema:
type: string
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
post:
tags:
- 'Stations: Podcasts'
summary: 'Sets the album art for a podcast episode.'
operationId: postPodcastEpisodeArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Podcasts'
summary: 'Removes the album art for a podcast episode.'
operationId: deletePodcastEpisodeArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Status'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/public/podcast/{podcast_id}/episode/{episode_id}':
get:
tags:
- 'Public: Stations'
summary: 'Get information for a public episode of a public podcast.'
operationId: getStationPublicPodcastEpisode
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_PodcastEpisode'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/public/podcast/{podcast_id}/episodes':
get:
tags:
- 'Public: Stations'
summary: 'List all visible episodes for a given podcast.'
operationId: getStationPublicPodcastEpisodes
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_PodcastEpisode'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/podcast/{podcast_id}/episode/{episode_id}/media':
get:
tags:
- 'Public: Stations'
summary: 'Gets the media for a podcast episode.'
operationId: getPodcastEpisodeMedia
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
post:
tags:
- 'Stations: Podcasts'
summary: 'Sets the media for a podcast episode.'
operationId: postPodcastEpisodeMedia
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Podcasts'
summary: 'Removes the media for a podcast episode.'
operationId: deletePodcastEpisodeMedia
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
-
name: episode_id
in: path
description: 'Podcast Episode ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/public/podcast/{podcast_id}':
get:
tags:
- 'Public: Stations'
summary: 'Get the public information for a given podcast.'
operationId: getStationPublicPodcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Podcast'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/public/podcasts':
get:
tags:
- 'Public: Stations'
summary: 'List all visible public podcasts.'
operationId: getStationPublicPodcasts
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: podcast_id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Podcast'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/podcasts/playlists':
get:
tags:
- 'Stations: Podcasts'
summary: 'Get a list of playlists that can be associated with a podcast.'
operationId: getStationPodcastPlaylists
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Form_SimpleOptions'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcasts':
get:
tags:
- 'Stations: Podcasts'
summary: 'List all current podcasts.'
operationId: getPodcasts
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_Podcast'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Podcasts'
summary: 'Create a new podcast.'
operationId: addPodcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Podcast'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Podcast'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/podcast/{id}':
get:
tags:
- 'Stations: Podcasts'
summary: 'Retrieve details for a single podcast.'
operationId: getPodcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Podcast'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Podcasts'
summary: 'Update details of a single podcast.'
operationId: editPodcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Podcast'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Podcasts'
summary: 'Delete a single podcast.'
operationId: deletePodcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Podcast ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/profile':
get:
tags:
- 'Stations: General'
summary: 'Retrieve the profile of the given station.'
operationId: getStationProfile
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationProfile'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/profile/edit':
get:
tags:
- 'Stations: General'
summary: 'Get the editable profile for the current station.'
description: "This controller handles the specific \"Edit Profile\" function on a station's profile, which has different permissions\nand possible actions than the Admin Station Edit function."
operationId: getStationProfileEdit
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: General'
summary: 'Save the station profile for the current station.'
operationId: putStationProfileEdit
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/queue':
get:
tags:
- 'Stations: Queue'
summary: 'Return information about the upcoming song playback queue.'
operationId: getQueue
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: App\Entity\StationQueue }, { $ref: '#/components/schemas/Api_StationQueueDetailed' }]
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/queue/{id}':
get:
tags:
- 'Stations: Queue'
summary: 'Retrieve details of a single queued item.'
operationId: getQueueItem
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Queue Item ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: App\Entity\StationQueue }
- { $ref: '#/components/schemas/Api_StationQueueDetailed' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Queue'
summary: 'Delete a single queued item.'
operationId: deleteQueueItem
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Queue Item ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/remotes':
get:
tags:
- 'Stations: Remote Relays'
summary: 'List all current remote relays.'
operationId: getRelays
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
allOf: [{ $ref: '#/components/schemas/StationRemote' }, { $ref: '#/components/schemas/HasLinks' }]
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Remote Relays'
summary: 'Create a new remote relay.'
operationId: addRelay
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationRemote'
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/StationRemote' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/remote/{id}':
get:
tags:
- 'Stations: Remote Relays'
summary: 'Retrieve details for a single remote relay.'
operationId: getRelay
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Remote Relay ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
allOf:
- { $ref: '#/components/schemas/StationRemote' }
- { $ref: '#/components/schemas/HasLinks' }
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Remote Relays'
summary: 'Update details of a single remote relay.'
operationId: editRelay
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Remote Relay ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationRemote'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Remote Relays'
summary: 'Delete a single remote relay.'
operationId: deleteRelay
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Remote Relay ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/best-and-worst':
get:
tags:
- 'Stations: Reports'
summary: 'Get the "Best and Worst Performing Songs" report for a station.'
operationId: getStationReportBestAndWorst
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/by-browser':
get:
tags:
- 'Stations: Reports'
summary: 'Get the "Listeners by Browser" report for a station.'
operationId: getStationReportByBrowser
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/by-client':
get:
tags:
- 'Stations: Reports'
summary: 'Get the "Listeners by Client" report for a station.'
operationId: getStationReportByClient
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/by-country':
get:
tags:
- 'Stations: Reports'
summary: 'Get the "Listeners by Country" report for a station.'
operationId: getStationReportByCountry
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/by-listening-time':
get:
tags:
- 'Stations: Reports'
summary: 'Get the "Listeners by Listening Time" report for a station.'
operationId: getStationReportByListeningTime
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/by-stream':
get:
tags:
- 'Stations: Reports'
summary: 'Get the "Listeners by Stream" report for a station.'
operationId: getStationReportByStream
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/overview/charts':
get:
tags:
- 'Stations: Reports'
summary: 'Get chart data for the station reports.'
operationId: getStationReportCharts
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/requests':
get:
tags:
- 'Stations: Reports'
summary: 'List station requests.'
operationId: getStationRequestsReport
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/requests/clear':
post:
tags:
- 'Stations: Reports'
summary: 'Clear all unplayed station requests.'
operationId: postStationRequestsClear
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/requests/{request_id}':
delete:
tags:
- 'Stations: Reports'
summary: 'Delete an individual station request.'
operationId: deleteStationRequest
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: request_id
in: path
description: 'Request ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/reports/soundexchange':
get:
tags:
- 'Stations: Reports'
summary: 'Generate a SoundExchange royalty report.'
description: 'Produce a report in SoundExchange (the US webcaster licensing agency) format.'
operationId: getStationSoundExchangeReport
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: start_date
in: query
required: false
schema:
type: string
format: date
-
name: end_date
in: query
required: false
schema:
type: string
format: date
responses:
'200':
description: Success
content:
text/plain:
schema:
description: 'A CSV report for the given time range.'
type: string
format: binary
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/requests':
get:
tags:
- 'Public: Stations'
summary: 'Return a list of requestable songs.'
operationId: getRequestableSongs
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationRequest'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/request/{request_id}':
post:
tags:
- 'Public: Stations'
summary: 'Submit a song request.'
operationId: submitSongRequest
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: request_id
in: path
description: 'The requestable song ID'
required: true
schema:
type: string
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/schedule':
get:
tags:
- 'Public: Stations'
summary: 'Return upcoming and currently ongoing schedule entries.'
operationId: getSchedule
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: now
in: query
description: 'The date/time to compare schedule items to. Defaults to the current date and time.'
required: false
schema:
type: string
-
name: rows
in: query
description: 'The number of upcoming/ongoing schedule entries to return. Defaults to 5.'
required: false
schema:
type: integer
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationSchedule'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
'/station/{station_id}/status':
get:
tags:
- 'Stations: Broadcasting'
summary: 'Retrieve the current status of all serivces associated with the radio broadcast.'
operationId: getServiceStatus
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_StationServiceStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/restart':
post:
tags:
- 'Stations: Broadcasting'
summary: 'Restart all services associated with the radio broadcast.'
operationId: restartServices
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/frontend/{action}':
post:
tags:
- 'Stations: Broadcasting'
summary: 'Perform service control actions on the radio frontend (Icecast, Shoutcast, etc.)'
operationId: doFrontendServiceAction
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: action
in: path
description: 'The action to perform.'
required: true
schema:
type: string
default: restart
enum:
- start
- stop
- reload
- restart
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/backend/{action}':
post:
tags:
- 'Stations: Broadcasting'
summary: 'Perform service control actions on the radio backend (Liquidsoap)'
operationId: doBackendServiceAction
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: action
in: path
description: 'The action to perform.'
required: true
schema:
type: string
default: restart
enum:
- skip
- disconnect
- start
- stop
- reload
- restart
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/sftp-users':
get:
tags:
- 'Stations: SFTP Users'
summary: 'List all current SFTP users.'
operationId: getSftpUsers
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/SftpUser'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: SFTP Users'
summary: 'Create a new SFTP user.'
operationId: addSftpUser
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SftpUser'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/SftpUser'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/sftp-user/{id}':
get:
tags:
- 'Stations: SFTP Users'
summary: 'Retrieve details for a single SFTP user.'
operationId: getSftpUser
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'SFTP User ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/SftpUser'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: SFTP Users'
summary: 'Update details of a single SFTP user.'
operationId: editSftpUser
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'SFTP User ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SftpUser'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: SFTP Users'
summary: 'Delete a single SFTP user.'
operationId: deleteSftpUser
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'SFTP User ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/stereo-tool-configuration':
get:
tags:
- 'Stations: Broadcasting'
summary: 'Get the Stereo Tool configuration file for a station.'
operationId: getStereoToolConfiguration
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_UploadedRecordStatus'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Broadcasting'
summary: 'Update the Stereo Tool configuration file for a station.'
operationId: postStereoToolConfiguration
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Broadcasting'
summary: 'Removes the Stereo Tool configuration file for a station.'
operationId: deleteStereoToolConfiguration
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamer/{id}/art':
get:
tags:
- 'Public: Stations'
summary: 'Gets the default album art for a streamer.'
operationId: getStreamerArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/SuccessWithImage'
'302':
description: 'A temporary redirect to the correct resource.'
headers:
location:
description: 'The current URL of the resource.'
schema:
type: string
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
security: []
post:
tags:
- 'Stations: Streamers/DJs'
summary: 'Sets the default album art for a streamer.'
operationId: postStreamerArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
requestBody:
$ref: '#/components/requestBodies/FlowFileUpload'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Streamers/DJs'
summary: 'Removes the default album art for a streamer.'
operationId: deleteStreamerArt
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamer/{id}/broadcasts/batch':
post:
tags:
- 'Stations: Streamers/DJs'
summary: 'Perform batch actions on the specified broadcasts.'
operationId: postStationStreamerBroadcastsBatch
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
properties:
do:
description: 'The action to take with the specified rows.'
type: string
enum: [delete]
rows:
description: 'The IDs to perform batch actions on.'
type: array
items: { type: integer, format: int64 }
type: object
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_GenericBatchResult'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamers/broadcasts':
get:
tags:
- 'Stations: Streamers/DJs'
summary: 'List all broadcasts associated with the station.'
operationId: getStationAllBroadcasts
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationStreamerBroadcast'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamer/{id}/broadcasts':
get:
tags:
- 'Stations: Streamers/DJs'
summary: 'List all broadcasts associated with the specified streamer.'
operationId: getStationStreamerBroadcasts
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Api_StationStreamerBroadcast'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamer/{id}/broadcast/{broadcast_id}/download':
get:
tags:
- 'Stations: Streamers/DJs'
summary: 'Download a single broadcast from a streamer.'
operationId: getStationStreamerDownloadBroadcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
-
name: broadcast_id
in: path
description: 'Broadcast ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/SuccessWithDownload'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamer/{id}/broadcast/{broadcast_id}':
delete:
tags:
- 'Stations: Streamers/DJs'
summary: 'Remove a single broadcast from a streamer.'
operationId: getStationStreamerDeleteBroadcast
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
-
name: broadcast_id
in: path
description: 'Broadcast ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamers':
get:
tags:
- 'Stations: Streamers/DJs'
summary: 'List all current Streamer/DJ accounts for the specified station.'
operationId: getStreamers
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/StationStreamer'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Streamers/DJs'
summary: 'Create a new Streamer/DJ account.'
operationId: addStreamer
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationStreamer'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationStreamer'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/streamer/{id}':
get:
tags:
- 'Stations: Streamers/DJs'
summary: 'Retrieve details for a single Streamer/DJ account.'
operationId: getStreamer
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationStreamer'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Streamers/DJs'
summary: 'Update details of a single Streamer/DJ account.'
operationId: editStreamer
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Streamer ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationStreamer'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Streamers/DJs'
summary: 'Delete a single Streamer/DJ account.'
operationId: deleteStreamer
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'StationStreamer ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/nowplaying/update':
post:
tags:
- 'Stations: General'
summary: 'Manually update the Now Playing metadata for the station.'
operationId: postStationNowPlayingUpdate
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/waveform/{media_id}':
get:
tags:
- 'Stations: Media'
summary: 'Get waveform data for a media ID (for the Visual Cue Editor).'
operationId: getStationMediaWaveform
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Media ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Media'
summary: 'Save cached waveform data for a media ID (for the Visual Cue Editor).'
operationId: postStationMediaWaveform
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Media ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/webhook/{id}/test':
put:
tags:
- 'Stations: Web Hooks'
summary: 'Send a test dispatch of a webhook with the current Now Playing data for the station.'
operationId: putStationWebhookTest
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_TaskWithLog'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/webhooks/{id}/test-log/{path}':
get:
tags:
- 'Stations: Web Hooks'
summary: 'View a specific webhook test dispatch log contents.'
operationId: getWebhookTestLog
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
-
name: path
in: path
description: 'Log path as returned by the Test action.'
required: true
schema:
type: string
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_LogContents'
'403':
$ref: '#/components/responses/AccessDenied'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/webhook/{id}/toggle':
put:
tags:
- 'Stations: Web Hooks'
summary: 'Toggle the enabled/disabled status of a webhook.'
operationId: putStationWebhookToggle
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/webhooks':
get:
tags:
- 'Stations: Web Hooks'
summary: 'List all current web hooks.'
operationId: getWebhooks
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/StationWebhook'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
post:
tags:
- 'Stations: Web Hooks'
summary: 'Create a new web hook.'
operationId: addWebhook
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationWebhook'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationWebhook'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/webhook/{id}':
get:
tags:
- 'Stations: Web Hooks'
summary: 'Retrieve details for a single web hook.'
operationId: getWebhook
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationWebhook'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
put:
tags:
- 'Stations: Web Hooks'
summary: 'Update details of a single web hook.'
operationId: editWebhook
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StationWebhook'
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
delete:
tags:
- 'Stations: Web Hooks'
summary: 'Delete a single web hook.'
operationId: deleteWebhook
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
$ref: '#/components/responses/Success'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
'/station/{station_id}/webhook/{id}/clone':
post:
tags:
- 'Stations: Web Hooks'
summary: 'Duplicate a single web hook.'
operationId: cloneWebhook
parameters:
-
$ref: '#/components/parameters/StationIdRequired'
-
name: id
in: path
description: 'Web Hook ID'
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/StationWebhook'
'403':
$ref: '#/components/responses/AccessDenied'
'404':
$ref: '#/components/responses/RecordNotFound'
'500':
$ref: '#/components/responses/GenericError'
components:
schemas:
Api_Account_ChangePassword:
required:
- current_password
- new_password
properties:
current_password:
description: 'The current account password.'
type: string
writeOnly: true
new_password:
description: 'The new account password.'
type: string
writeOnly: true
type: object
Api_Account_NewApiKey:
required:
- key
properties:
key:
description: 'The newly generated API key.'
type: string
readOnly: true
type: object
Api_Account_TwoFactorStatus:
required:
- two_factor_enabled
properties:
two_factor_enabled:
description: 'The current two-factor status for this account.'
type: boolean
readOnly: true
type: object
Api_Admin_AuditLogChangeset:
required:
- field
- from
- to
properties:
field:
type: string
from:
type: string
to:
type: string
type: object
Api_Admin_Backup:
required:
- path
- basename
- pathEncoded
- timestamp
- size
- storageLocationId
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
path:
type: string
basename:
type: string
pathEncoded:
type: string
timestamp:
type: integer
size:
type: integer
storageLocationId:
type: integer
type: object
Api_Admin_Debug_Queue:
required:
- name
- count
- url
properties:
name:
type: string
enum:
- high_priority
- normal_priority
- low_priority
- search_index
- media
- podcast_media
count:
type: integer
url:
type: string
type: object
Api_Admin_Debug_Station:
required:
- id
- name
- clearQueueUrl
- getNextSongUrl
- getNowPlayingUrl
properties:
id:
type: integer
name:
type: string
clearQueueUrl:
type: string
getNextSongUrl:
type: string
getNowPlayingUrl:
type: string
type: object
Api_Admin_Debug_LogEntry:
required:
- datetime
- channel
- level
- message
- context
- extra
- formatted
properties:
datetime:
type: string
format: date-time
channel:
type: string
level:
type: integer
enum:
- 100
- 200
- 250
- 300
- 400
- 500
- 550
- 600
message:
type: string
context:
type: array
items:
type: '{}'
extra:
type: array
items:
type: '{}'
formatted:
type: '{}'
type: object
Api_Admin_Debug_LogResult:
required:
- logs
properties:
logs:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Debug_LogEntry'
type: object
Api_Admin_Debug_SyncTask:
required:
- task
- pattern
- time
- nextRun
- url
properties:
task:
type: string
pattern:
type: string
nullable: true
time:
type: integer
nextRun:
type: integer
nullable: true
url:
type: string
type: object
Api_Admin_GeoLiteStatus:
required:
- version
- key
properties:
version:
type: string
nullable: true
key:
type: string
nullable: true
type: object
Api_Admin_LogList:
required:
- globalLogs
- stationLogs
properties:
globalLogs:
type: array
items:
$ref: '#/components/schemas/Api_LogType'
stationLogs:
type: array
items:
$ref: '#/components/schemas/Api_Admin_StationLogList'
type: object
Api_Admin_NewLoginToken:
required:
- user
properties:
user:
description: 'User ID or e-mail address.'
anyOf:
-
type: integer
format: int64
-
type: string
type:
oneOf:
-
$ref: '#/components/schemas/LoginTokenTypes'
nullable: true
comment:
type: string
example: 'SSO Login'
nullable: true
expires_minutes:
type: integer
type: object
Api_Admin_NewLoginTokenResponse:
required:
- success
- message
- formatted_message
- record
- links
properties:
success:
type: boolean
example: true
message:
type: string
example: 'Changes saved successfully.'
formatted_message:
type: string
example: 'Changes saved successfully.'
record:
$ref: '#/components/schemas/UserLoginToken'
links:
type: object
readOnly: true
additionalProperties:
type: string
type: object
Api_Admin_Permission:
required:
- id
- name
properties:
id:
type: string
name:
type: string
type: object
Api_Admin_Permissions:
required:
- global
- station
properties:
global:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Permission'
station:
type: array
items:
$ref: '#/components/schemas/Api_Admin_Permission'
type: object
Api_Admin_Relay:
properties:
id:
description: 'Station ID'
type: integer
example: 1
name:
description: 'Station name'
type: string
example: 'AzuraTest Radio'
nullable: true
shortcode:
description: 'Station "short code", used for URL and folder paths'
type: string
example: azuratest_radio
nullable: true
description:
description: 'Station description'
type: string
example: 'An AzuraCast station!'
nullable: true
url:
description: 'Station homepage URL'
type: string
example: 'https://www.azuracast.com/'
nullable: true
genre:
description: 'The genre of the station'
type: string
example: Variety
nullable: true
type:
description: 'Which broadcasting software (frontend) the station uses'
type: string
example: shoutcast2
nullable: true
port:
description: 'The port used by this station to serve its broadcasts.'
type: integer
example: 8000
nullable: true
relay_pw:
description: 'The relay password for the frontend (if applicable).'
type: string
example: p4ssw0rd
admin_pw:
description: 'The administrator password for the frontend (if applicable).'
type: string
example: p4ssw0rd
mounts:
type: array
items:
$ref: '#/components/schemas/Api_NowPlaying_StationMount'
type: object
Api_Admin_Role:
required:
- name
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
id:
type: integer
readOnly: true
name:
type: string
example: 'Super Administrator'
permissions:
$ref: '#/components/schemas/Api_Admin_RolePermissions'
is_super_admin:
description: 'Whether this role is the protected "Super Administrator" role.'
type: boolean
readOnly: true
type: object
Api_Admin_RolePermissions:
required:
- global
- station
properties:
global:
type: array
items:
$ref: '#/components/schemas/GlobalPermissions'
station:
type: array
items:
$ref: '#/components/schemas/Api_Admin_RoleStationPermission'
type: object
Api_Admin_RoleStationPermission:
required:
- id
- permissions
properties:
id:
description: 'The station ID.'
type: integer
permissions:
type: array
items:
$ref: '#/components/schemas/StationPermissions'
type: object
Api_Admin_RsasStatus:
required:
- version
- hasLicense
properties:
version:
type: string
nullable: true
hasLicense:
type: boolean
type: object
Api_Admin_ServerStats_CpuStats:
required:
- total
- cores
- load
properties:
total:
$ref: '#/components/schemas/Api_Admin_ServerStats_CpuStatsSection'
cores:
type: array
items:
$ref: '#/components/schemas/Api_Admin_ServerStats_CpuStatsSection'
load:
type: array
items:
type: integer
format: int64
type: object
Api_Admin_ServerStats_CpuStatsSection:
required:
- name
- usage
- idle
- io_wait
- steal
properties:
name:
type: string
usage:
type: string
idle:
type: string
io_wait:
type: string
steal:
type: string
type: object
Api_Admin_ServerStats_MemoryStats:
required:
- total_bytes
- total_readable
- free_bytes
- free_readable
- buffers_bytes
- buffers_readable
- cached_bytes
- cached_readable
- sReclaimable_bytes
- sReclaimable_readable
- shmem_bytes
- shmem_readable
- used_bytes
- used_readable
properties:
total_bytes:
type: string
total_readable:
type: string
free_bytes:
type: string
free_readable:
type: string
buffers_bytes:
type: string
buffers_readable:
type: string
cached_bytes:
type: string
cached_readable:
type: string
sReclaimable_bytes:
type: string
sReclaimable_readable:
type: string
shmem_bytes:
type: string
shmem_readable:
type: string
used_bytes:
type: string
used_readable:
type: string
type: object
Api_Admin_ServerStats_NetworkInterfaceReceived:
required:
- speed_bytes
- speed_readable
- packets
- errs
- drop
- fifo
- frame
- compressed
- multicast
properties:
speed_bytes:
type: string
speed_readable:
type: string
packets:
type: string
errs:
type: string
drop:
type: string
fifo:
type: string
frame:
type: string
compressed:
type: string
multicast:
type: string
type: object
Api_Admin_ServerStats_NetworkInterfaceStats:
required:
- interface_name
- received
- transmitted
properties:
interface_name:
type: string
received:
$ref: '#/components/schemas/Api_Admin_ServerStats_NetworkInterfaceReceived'
transmitted:
$ref: '#/components/schemas/Api_Admin_ServerStats_NetworkInterfaceTransmitted'
type: object
Api_Admin_ServerStats_NetworkInterfaceTransmitted:
required:
- speed_bytes
- speed_readable
- packets
- errs
- drop
- fifo
- frame
- carrier
- compressed
properties:
speed_bytes:
type: string
speed_readable:
type: string
packets:
type: string
errs:
type: string
drop:
type: string
fifo:
type: string
frame:
type: string
carrier:
type: string
compressed:
type: string
type: object
Api_Admin_ServerStats:
required:
- cpu
- memory
- swap
- disk
- network
properties:
cpu:
$ref: '#/components/schemas/Api_Admin_ServerStats_CpuStats'
memory:
$ref: '#/components/schemas/Api_Admin_ServerStats_MemoryStats'
swap:
$ref: '#/components/schemas/Api_Admin_ServerStats_StorageStats'
disk:
$ref: '#/components/schemas/Api_Admin_ServerStats_StorageStats'
network:
type: array
items:
$ref: '#/components/schemas/Api_Admin_ServerStats_NetworkInterfaceStats'
type: object
Api_Admin_ServerStats_StorageStats:
required:
- total_bytes
- total_readable
- free_bytes
- free_readable
- used_bytes
- used_readable
properties:
total_bytes:
type: string
total_readable:
type: string
free_bytes:
type: string
free_readable:
type: string
used_bytes:
type: string
used_readable:
type: string
type: object
Api_Admin_ServiceData:
required:
- name
- description
- running
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
name:
type: string
description:
type: string
running:
type: boolean
type: object
Api_Admin_ShoutcastStatus:
required:
- version
properties:
version:
type: string
nullable: true
type: object
Api_Admin_StationLogList:
required:
- id
- name
- logs
properties:
id:
type: integer
name:
type: string
logs:
type: array
items:
$ref: '#/components/schemas/Api_LogType'
type: object
Api_Admin_StereoToolStatus:
required:
- version
properties:
version:
type: string
nullable: true
type: object
Api_Admin_StorageLocation:
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
storageUsedPercent:
type: integer
example: '75'
nullable: true
isFull:
type: boolean
example: 'true'
uri:
description: 'The URI associated with the storage location.'
type: string
example: /var/azuracast/www
stations:
description: 'The stations using this storage location, if any.'
type: array
items:
type: string
example: 'AzuraTest Radio'
nullable: true
type: object
Api_Admin_UpdateDetails:
properties:
current_release:
description: 'The stable-equivalent branch your installation currently appears to be on.'
type: string
example: 0.20.3
nullable: true
latest_release:
description: 'The current latest stable release of the software.'
type: string
example: 0.20.4
nullable: true
needs_rolling_update:
description: 'If you are on the Rolling Release, whether your installation needs to be updated.'
type: boolean
needs_release_update:
description: 'Whether a newer stable release is available than the version you are currently using.'
type: boolean
rolling_updates_available:
description: 'If you are on the Rolling Release, the number of updates released since your version.'
type: integer
can_switch_to_stable:
description: 'Whether you can seamlessly move from the Rolling Release channel to Stable without issues.'
type: boolean
type: object
Api_Admin_UserWithDetails:
required:
- is_me
type: object
allOf:
-
$ref: '#/components/schemas/User'
-
$ref: '#/components/schemas/HasLinks'
-
properties:
is_me:
description: 'Whether this user record represents the currently logged-in user.'
type: boolean
example: true
type: object
Api_Admin_Vue_BackupProps:
required:
- isDocker
- storageLocations
properties:
isDocker:
type: boolean
storageLocations:
type: object
additionalProperties:
type: string
type: object
Api_Admin_Vue_CustomFieldProps:
required:
- autoAssignTypes
properties:
autoAssignTypes:
type: object
additionalProperties:
type: string
type: object
Api_Admin_Vue_PermissionsProps:
required:
- stations
- globalPermissions
- stationPermissions
properties:
stations:
type: object
additionalProperties:
type: string
globalPermissions:
type: object
additionalProperties:
type: string
stationPermissions:
type: object
additionalProperties:
type: string
type: object
Api_Admin_Vue_SettingsProps:
required:
- releaseChannel
properties:
releaseChannel:
type: string
type: object
Api_Admin_Vue_StationsFormProps:
required:
- timezones
- countries
- isRsasInstalled
- isShoutcastInstalled
- isStereoToolInstalled
properties:
timezones:
type: object
additionalProperties:
type: string
countries:
type: object
additionalProperties:
type: string
isRsasInstalled:
type: boolean
isShoutcastInstalled:
type: boolean
isStereoToolInstalled:
type: boolean
type: object
Api_Admin_Vue_StationsProps:
required:
- formProps
- frontendTypes
- backendTypes
properties:
formProps:
$ref: '#/components/schemas/Api_Admin_Vue_StationsFormProps'
frontendTypes:
type: object
backendTypes:
type: object
type: object
Api_Admin_Vue_UpdateProps:
required:
- releaseChannel
- enableWebUpdates
- initialUpdateInfo
properties:
releaseChannel:
type: string
enableWebUpdates:
type: boolean
initialUpdateInfo:
oneOf:
-
$ref: '#/components/schemas/Api_Admin_UpdateDetails'
nullable: true
type: object
Api_Admin_Vue_UsersProps:
required:
- roles
properties:
roles:
type: object
additionalProperties:
type: string
type: object
Api_BatchResult:
required:
- success
- errors
properties:
success:
type: boolean
errors:
type: array
items:
type: string
type: object
Api_DetailedSongHistory:
type: object
allOf:
-
$ref: '#/components/schemas/Api_NowPlaying_SongHistory'
-
properties:
listeners_start:
description: 'Number of listeners when the song playback started.'
type: integer
example: 94
listeners_end:
description: 'Number of listeners when song playback ended.'
type: integer
example: 105
delta_total:
description: "The sum total change of listeners between the song's start and ending."
type: integer
example: 11
is_visible:
description: 'Whether the entry is visible on public playlists.'
type: boolean
example: true
type: object
Api_Error:
required:
- code
- type
- message
- formatted_message
- extra_data
- success
properties:
code:
description: 'The numeric code of the error.'
type: integer
example: 500
type:
description: 'The programmatic class of error.'
type: string
example: NotLoggedInException
message:
description: 'The text description of the error.'
type: string
example: 'Error description.'
formatted_message:
description: 'The HTML-formatted text description of the error.'
type: string
example: 'Error description.
Detailed error text.'
nullable: true
extra_data:
description: 'Stack traces and other supplemental data.'
type: array
items:
type: any
success:
description: 'Used for API calls that expect an \Entity\Api\Status type response.'
type: boolean
example: false
type: object
Api_FileList:
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
path:
type: string
path_short:
type: string
text:
type: string
type:
$ref: '#/components/schemas/FileTypes'
timestamp:
type: integer
size:
type: integer
nullable: true
media:
oneOf:
-
$ref: '#/components/schemas/Api_StationMedia'
nullable: true
dir:
oneOf:
-
$ref: '#/components/schemas/Api_FileListDir'
nullable: true
type: object
Api_FileListDir:
properties:
playlists:
type: array
items:
$ref: '#/components/schemas/Api_StationMediaPlaylist'
type: object
Api_Form_Option:
required:
- value
- text
properties:
value: { }
text:
type: string
description:
type: string
nullable: true
type: object
Api_Form_OptionGroup:
required:
- options
- label
properties:
options:
type: array
items:
$ref: '#/components/schemas/Api_Form_Option'
label:
type: string
type: object
Api_GenericForm:
type: object
additionalProperties:
type: '{}'
Api_Form_NestedOptions:
type: array
items:
anyOf:
-
$ref: '#/components/schemas/Api_Form_Option'
-
$ref: '#/components/schemas/Api_Form_OptionGroup'
Api_Form_SimpleOptions:
type: array
items:
$ref: '#/components/schemas/Api_Form_Option'
Api_GenericBatchResult:
required:
- records
type: object
allOf:
-
$ref: '#/components/schemas/Api_BatchResult'
-
properties:
records:
type: array
items:
required:
- id
- title
properties:
id: { type: integer, format: int64 }
title: { type: string }
type: object
type: object
HashMap:
description: 'A hash-map array represented as an object.'
type: object
Api_Listener:
properties:
ip:
description: "The listener's IP address"
type: string
example: 127.0.0.1
user_agent:
description: "The listener's HTTP User-Agent"
type: string
example: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36'
hash:
description: 'A unique identifier for this listener/user agent (used for unique calculations).'
type: string
example: ''
mount_is_local:
description: 'Whether the user is connected to a local mount point or a remote one.'
type: boolean
example: false
mount_name:
description: 'The display name of the mount point.'
type: string
example: /radio.mp3
connected_on:
description: 'UNIX timestamp that the user first connected.'
type: integer
example: 1609480800
connected_until:
description: 'UNIX timestamp that the user disconnected (or the latest timestamp if they are still connected).'
type: integer
example: 1609480800
connected_time:
description: 'Number of seconds that the user has been connected.'
type: integer
example: 30
device:
$ref: '#/components/schemas/Api_ListenerDevice'
location:
$ref: '#/components/schemas/Api_ListenerLocation'
type: object
Api_LogContents:
required:
- contents
- eof
- position
properties:
contents:
type: string
readOnly: true
eof:
description: 'Whether the log file has ended at this point or has additional data.'
type: boolean
readOnly: true
position:
type: integer
readOnly: true
nullable: true
type: object
Api_LogType:
required:
- key
- name
- path
- tail
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
key:
type: string
readOnly: true
name:
type: string
readOnly: true
path:
type: string
readOnly: true
tail:
type: boolean
readOnly: true
type: object
Api_MediaBatchResult:
required:
- files
- directories
- responseRecord
type: object
allOf:
-
$ref: '#/components/schemas/Api_BatchResult'
-
properties:
files:
type: array
items:
type: string
directories:
type: array
items:
type: string
responseRecord:
type: array
items:
type: any
nullable: true
type: object
Api_Notification:
required:
- id
- title
- body
- type
- actionLabel
- actionUrl
properties:
id:
type: string
title:
type: string
body:
type: string
type:
$ref: '#/components/schemas/FlashLevels'
actionLabel:
type: string
nullable: true
actionUrl:
type: string
nullable: true
type: object
Api_NowPlaying_CurrentSong:
required:
- elapsed
- remaining
type: object
allOf:
-
$ref: '#/components/schemas/Api_NowPlaying_SongHistory'
-
properties:
elapsed:
description: "Elapsed time of the song's playback since it started."
type: integer
example: 25
remaining:
description: 'Remaining time in the song, in seconds.'
type: integer
example: 155
type: object
Api_NowPlaying_Listeners:
required:
- total
- unique
- current
properties:
total:
description: 'Total non-unique current listeners'
type: integer
example: 20
unique:
description: 'Total unique current listeners'
type: integer
example: 15
current:
description: 'Total non-unique current listeners (Legacy field, may be retired in the future.)'
type: integer
example: 20
type: object
Api_NowPlaying_Live:
required:
- is_live
- streamer_name
- broadcast_start
- art
properties:
is_live:
description: 'Whether the stream is known to currently have a live DJ.'
type: boolean
example: false
streamer_name:
description: 'The current active streamer/DJ, if one is available.'
type: string
example: 'DJ Jazzy Jeff'
broadcast_start:
description: 'The start timestamp of the current broadcast, if one is available.'
type: integer
example: '1591548318'
nullable: true
art:
description: 'URL to the streamer artwork (if available).'
type: string
example: 'https://picsum.photos/1200/1200'
nullable: true
type: object
Api_NowPlaying:
required:
- station
- listeners
- live
- now_playing
- playing_next
- song_history
- is_online
- cache
properties:
station:
$ref: '#/components/schemas/Api_NowPlaying_Station'
listeners:
$ref: '#/components/schemas/Api_NowPlaying_Listeners'
live:
$ref: '#/components/schemas/Api_NowPlaying_Live'
now_playing:
oneOf:
-
$ref: '#/components/schemas/Api_NowPlaying_CurrentSong'
nullable: true
playing_next:
oneOf:
-
$ref: '#/components/schemas/Api_NowPlaying_StationQueue'
nullable: true
song_history:
type: array
items:
$ref: '#/components/schemas/Api_NowPlaying_SongHistory'
is_online:
description: 'Whether the stream is currently online.'
type: boolean
example: true
cache:
description: 'Debugging information about where the now playing data comes from.'
type: string
enum:
- hit
- database
- station
nullable: true
type: object
Api_NowPlaying_SongHistory:
required:
- sh_id
- played_at
- duration
- playlist
- streamer
- is_request
- song
properties:
sh_id:
description: 'Song history unique identifier'
type: integer
played_at:
description: 'UNIX timestamp when playback started.'
type: integer
example: 1609480800
duration:
description: 'Duration of the song in seconds'
type: integer
example: 180
playlist:
description: 'Indicates the playlist that the song was played from, if available, or empty string if not.'
type: string
example: 'Top 100'
nullable: true
streamer:
description: 'Indicates the current streamer that was connected, if available, or empty string if not.'
type: string
example: 'Test DJ'
nullable: true
is_request:
description: 'Indicates whether the song is a listener request.'
type: boolean
song:
$ref: '#/components/schemas/Api_Song'
type: object
Api_NowPlaying_Station:
required:
- id
- name
- shortcode
- description
- frontend
- backend
- timezone
- listen_url
- url
- public_player_url
- playlist_pls_url
- playlist_m3u_url
- is_public
- requests_enabled
- mounts
- remotes
- hls_enabled
- hls_is_default
- hls_url
- hls_listeners
properties:
id:
description: 'Station ID'
type: integer
example: 1
name:
description: 'Station name'
type: string
example: 'AzuraTest Radio'
shortcode:
description: 'Station "short code", used for URL and folder paths'
type: string
example: azuratest_radio
description:
description: 'Station description'
type: string
example: 'An AzuraCast station!'
frontend:
description: 'Which broadcasting software (frontend) the station uses'
type: string
example: shoutcast2
backend:
description: 'Which AutoDJ software (backend) the station uses'
type: string
example: liquidsoap
timezone:
description: "The station's IANA time zone"
type: string
example: America/Chicago
listen_url:
description: 'The full URL to listen to the default mount of the station'
type: string
example: 'http://localhost:8000/radio.mp3'
url:
description: 'The public URL of the station.'
type: string
example: 'https://example.com/'
nullable: true
public_player_url:
description: 'The public player URL for the station.'
type: string
example: 'https://example.com/public/example_station'
playlist_pls_url:
description: 'The playlist download URL in PLS format.'
type: string
example: 'https://example.com/public/example_station/playlist.pls'
playlist_m3u_url:
description: 'The playlist download URL in M3U format.'
type: string
example: 'https://example.com/public/example_station/playlist.m3u'
is_public:
description: 'If the station is public (i.e. should be shown in listings of all stations)'
type: boolean
example: true
requests_enabled:
description: 'If the station has song requests enabled.'
type: boolean
example: true
mounts:
type: array
items:
$ref: '#/components/schemas/Api_NowPlaying_StationMount'
remotes:
type: array
items:
$ref: '#/components/schemas/Api_NowPlaying_StationRemote'
hls_enabled:
description: 'If the station has HLS streaming enabled.'
type: boolean
example: true
hls_is_default:
description: 'If the HLS stream should be the default one for the station.'
type: boolean
example: true
hls_url:
description: 'The full URL to listen to the HLS stream for the station.'
type: string
example: 'https://example.com/hls/azuratest_radio/live.m3u8'
nullable: true
hls_listeners:
description: 'HLS Listeners'
type: integer
example: 1
type: object
Api_NowPlaying_StationMount:
required:
- path
- is_default
type: object
allOf:
-
$ref: '#/components/schemas/Api_NowPlaying_StationRemote'
-
properties:
path:
description: 'The relative path that corresponds to this mount point'
type: string
example: /radio.mp3
is_default:
description: 'If the mount is the default mount for the parent station'
type: boolean
example: true
type: object
Api_NowPlaying_StationQueue:
required:
- cued_at
- played_at
- duration
- playlist
- is_request
- song
properties:
cued_at:
description: 'UNIX timestamp when the AutoDJ is expected to queue the song for playback.'
type: integer
example: 1609480800
played_at:
description: 'UNIX timestamp when playback is expected to start.'
type: integer
example: 1609480800
nullable: true
duration:
description: 'Duration of the song in seconds'
type: number
format: float
example: 180
playlist:
description: 'Indicates the playlist that the song was played from, if available, or empty string if not.'
type: string
example: 'Top 100'
nullable: true
is_request:
description: 'Indicates whether the song is a listener request.'
type: boolean
song:
$ref: '#/components/schemas/Api_Song'
type: object
Api_NowPlaying_StationRemote:
required:
- id
- name
- url
- bitrate
- format
- listeners
properties:
id:
description: 'Mount/Remote ID number.'
type: integer
example: 1
name:
description: 'Mount point name/URL'
type: string
example: /radio.mp3
url:
description: 'Full listening URL specific to this mount'
type: string
example: 'http://localhost:8000/radio.mp3'
bitrate:
description: 'Bitrate (kbps) of the broadcasted audio (if known)'
type: integer
example: 128
nullable: true
format:
description: 'Audio encoding format of broadcasted audio (if known)'
type: string
example: mp3
nullable: true
listeners:
$ref: '#/components/schemas/Api_NowPlaying_Listeners'
type: object
Api_NowPlaying_Vue_Props:
required:
- stationShortName
- useStatic
- useSse
properties:
stationShortName:
type: string
useStatic:
type: boolean
useSse:
type: boolean
type: object
Api_Podcast:
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
id:
type: string
storage_location_id:
type: integer
source:
type: string
playlist_id:
type: integer
nullable: true
playlist_auto_publish:
type: boolean
title:
type: string
link:
type: string
nullable: true
description:
type: string
description_short:
type: string
explicit:
type: boolean
is_enabled:
type: boolean
branding_config:
$ref: '#/components/schemas/PodcastBrandingConfiguration'
language:
type: string
language_name:
type: string
author:
type: string
email:
type: string
has_custom_art:
type: boolean
art:
type: string
art_updated_at:
type: integer
guid:
description: 'The UUIDv5 global unique identifier for this podcast, based on its RSS feed URL.'
type: string
is_published:
type: boolean
episodes:
type: integer
categories:
type: array
items:
$ref: '#/components/schemas/Api_PodcastCategory'
type: object
Api_PodcastBatchResult:
required:
- episodes
- records
type: object
allOf:
-
$ref: '#/components/schemas/Api_BatchResult'
-
properties:
episodes:
type: array
items:
required:
- id
- title
properties:
id: { type: string }
title: { type: string }
type: object
records:
type: array
items:
$ref: '#/components/schemas/Api_PodcastEpisode'
nullable: true
type: object
Api_PodcastCategory:
properties:
category:
type: string
text:
type: string
title:
type: string
subtitle:
type: string
nullable: true
type: object
Api_PodcastEpisode:
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
id:
type: string
title:
type: string
link:
type: string
nullable: true
description:
type: string
description_short:
type: string
explicit:
type: boolean
season_number:
type: integer
nullable: true
episode_number:
type: integer
nullable: true
created_at:
type: integer
publish_at:
type: integer
is_published:
type: boolean
has_media:
type: boolean
playlist_media_id:
type: string
nullable: true
playlist_media:
oneOf:
-
$ref: '#/components/schemas/Api_Song'
nullable: true
media:
oneOf:
-
$ref: '#/components/schemas/Api_PodcastMedia'
nullable: true
has_custom_art:
type: boolean
art:
type: string
nullable: true
art_updated_at:
type: integer
type: object
Api_PodcastMedia:
properties:
id:
type: string
nullable: true
original_name:
type: string
nullable: true
length:
type: number
format: float
length_text:
type: string
nullable: true
path:
type: string
nullable: true
type: object
Api_ResolvableUrl:
type: string
Api_Song:
type: object
allOf:
-
$ref: '#/components/schemas/Api_HasSongFields'
-
properties:
id:
description: "The song's 32-character unique identifier hash"
type: string
example: 9f33bbc912c19603e51be8e0987d076b
art:
description: 'URL to the album artwork (if available).'
type: string
example: 'https://picsum.photos/1200/1200'
custom_fields:
type: array
items:
type: string
example: custom_field_value
type: object
Api_StationMedia:
type: object
allOf:
-
$ref: '#/components/schemas/Api_HasSongFields'
-
$ref: '#/components/schemas/HasLinks'
-
properties:
id:
description: "The media's identifier."
type: integer
example: 1
unique_id:
description: "A unique identifier for this specific media item in the station's library. Each entry in the media table has a unique ID, even if it refers to a song that exists elsewhere."
type: string
example: 69b536afc7ebbf16457b8645
song_id:
description: "The media file's 32-character unique song identifier hash. This hash is based on track metadata, so the same song uploaded multiple times will have the same `song_id`."
type: string
example: 9f33bbc912c19603e51be8e0987d076b
art:
description: 'URL to the album art.'
type: string
example: 'https://picsum.photos/1200/1200'
path:
description: 'The relative path of the media file.'
type: string
example: test.mp3
mtime:
description: 'The UNIX timestamp when the database was last modified.'
type: integer
example: 1609480800
uploaded_at:
description: 'The UNIX timestamp when the item was first imported into the database.'
type: integer
example: 1609480800
art_updated_at:
description: 'The latest time (UNIX timestamp) when album art was updated.'
type: integer
example: 1609480800
length:
description: 'The song duration in seconds.'
type: number
format: float
example: 240
length_text:
description: 'The formatted song duration (in mm:ss format)'
type: string
example: '4:00'
custom_fields:
$ref: '#/components/schemas/HashMap'
extra_metadata:
$ref: '#/components/schemas/HashMap'
playlists:
type: array
items:
oneOf:
- { $ref: '#/components/schemas/Api_StationMediaPlaylist' }
- { type: integer, writeOnly: true }
type: object
Api_StationMediaPlaylist:
properties:
id:
description: 'The playlist identifier.'
type: integer
example: 1
name:
type: string
readOnly: true
short_name:
type: string
readOnly: true
folder:
type: string
readOnly: true
nullable: true
count:
type: integer
readOnly: true
type: object
Api_StationOnDemand:
properties:
track_id:
description: 'Track ID unique identifier'
type: string
example: 1
download_url:
description: 'URL to download/play track.'
type: string
example: /api/station/1/ondemand/download/1
media:
$ref: '#/components/schemas/Api_Song'
playlist:
type: string
type: object
Api_StationPlaylistQueue:
properties:
spm_id:
description: 'ID of the StationPlaylistMedia record associating this track with the playlist'
type: integer
example: 1
media_id:
description: 'ID of the StationPlaylistMedia record associating this track with the playlist'
type: integer
example: 1
song_id:
description: "The song's 32-character unique identifier hash"
type: string
example: 9f33bbc912c19603e51be8e0987d076b
artist:
description: 'The song artist.'
type: string
example: 'Chet Porter'
title:
description: 'The song title.'
type: string
example: 'Aluko River'
last_played:
description: 'The UNIX timestamp when this specific track was last played.'
type: integer
nullable: true
type: object
Api_StationProfile:
required:
- station
- services
- schedule
properties:
station:
$ref: '#/components/schemas/Api_NowPlaying_Station'
services:
$ref: '#/components/schemas/Api_StationServiceStatus'
schedule:
type: array
items:
$ref: '#/components/schemas/Api_StationSchedule'
type: object
Api_StationQueueDetailed:
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
sent_to_autodj:
description: 'Indicates whether the song has been sent to the AutoDJ.'
type: boolean
is_played:
description: 'Indicates whether the song has already been marked as played.'
type: boolean
autodj_custom_uri:
description: 'Custom AutoDJ playback URI, if it exists.'
type: string
example: ''
nullable: true
log:
description: 'Log entries on how the specific queue item was picked by the AutoDJ.'
type: array
items:
type: any
nullable: true
type: object
Api_StationQuota:
required:
- used
- used_bytes
- used_percent
- available
- available_bytes
- quota
- quota_bytes
- is_full
- num_files
properties:
used:
type: string
used_bytes:
type: string
used_percent:
type: integer
available:
type: string
available_bytes:
type: string
quota:
type: string
nullable: true
quota_bytes:
type: string
nullable: true
is_full:
type: boolean
num_files:
type: integer
nullable: true
type: object
Api_StationRequest:
properties:
request_id:
description: 'Requestable ID unique identifier'
type: string
example: 1
request_url:
description: 'URL to directly submit request'
type: string
example: /api/station/1/request/1
song:
$ref: '#/components/schemas/Api_Song'
type: object
Api_StationSchedule:
properties:
id:
description: 'Unique identifier for this schedule entry.'
type: integer
example: 1
type:
description: 'The type of this schedule entry.'
type: string
enum:
- playlist
- streamer
example: playlist
name:
description: "Either the playlist or streamer's display name."
type: string
example: 'Example Schedule Entry'
title:
description: 'The name of the event.'
type: string
example: 'Example Schedule Entry'
description:
description: 'The full name of the type and name combined.'
type: string
example: 'Playlist: Example Schedule Entry'
start_timestamp:
description: 'The start time of the schedule entry, in UNIX format.'
type: integer
example: 1609480800
start:
description: 'The start time of the schedule entry, in ISO 8601 format.'
type: string
example: '020-02-19T03:00:00-06:00'
end_timestamp:
description: 'The end time of the schedule entry, in UNIX format.'
type: integer
example: 1609480800
end:
description: 'The start time of the schedule entry, in ISO 8601 format.'
type: string
example: '020-02-19T05:00:00-06:00'
is_now:
description: 'Whether the event is currently ongoing.'
type: boolean
example: true
type: object
Api_StationServiceStatus:
required:
- backendRunning
- frontendRunning
properties:
backendRunning:
type: boolean
example: true
frontendRunning:
type: boolean
example: true
type: object
Api_StationStreamer:
required:
- id
- streamer_username
- display_name
properties:
id:
type: integer
streamer_username:
type: string
display_name:
type: string
type: object
Api_StationStreamerBroadcast:
required:
- id
- timestampStart
- timestampEnd
- streamer
- recording
type: object
allOf:
-
$ref: '#/components/schemas/HasLinks'
-
properties:
id:
type: integer
timestampStart:
type: string
format: date-time
timestampEnd:
type: string
format: date-time
nullable: true
streamer:
oneOf:
-
$ref: '#/components/schemas/Api_StationStreamer'
nullable: true
recording:
oneOf:
-
$ref: '#/components/schemas/Api_StationStreamerBroadcastRecording'
nullable: true
type: object
Api_StationStreamerBroadcastRecording:
required:
- path
- size
- downloadUrl
properties:
path:
type: string
size:
type: integer
downloadUrl:
type: string
type: object
Api_Stations_Vue_FilesProps:
required:
- initialPlaylists
- customFields
- validMimeTypes
- supportsImmediateQueue
properties:
initialPlaylists:
type: array
items:
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
type: object
customFields:
type: array
items:
$ref: '#/components/schemas/CustomField'
validMimeTypes:
type: array
items:
type: string
supportsImmediateQueue:
type: boolean
type: object
Api_Stations_Vue_PodcastsProps:
required:
- languageOptions
- categoriesOptions
properties:
languageOptions:
type: object
additionalProperties:
type: string
categoriesOptions:
$ref: '#/components/schemas/Api_Form_NestedOptions'
type: object
Api_Stations_Vue_ProfileProps:
required:
- nowPlayingProps
- publicPageEmbedUrl
- publicOnDemandEmbedUrl
- publicRequestEmbedUrl
- publicHistoryEmbedUrl
- publicScheduleEmbedUrl
- publicPodcastsEmbedUrl
- frontendAdminUri
- frontendAdminPassword
- frontendSourcePassword
- frontendRelayPassword
- frontendPort
properties:
nowPlayingProps:
$ref: '#/components/schemas/Api_NowPlaying_Vue_Props'
publicPageEmbedUrl:
type: string
publicOnDemandEmbedUrl:
type: string
publicRequestEmbedUrl:
type: string
publicHistoryEmbedUrl:
type: string
publicScheduleEmbedUrl:
type: string
publicPodcastsEmbedUrl:
type: string
frontendAdminUri:
type: string
frontendAdminPassword:
type: string
frontendSourcePassword:
type: string
frontendRelayPassword:
type: string
frontendPort:
type: integer
nullable: true
type: object
Api_Stations_Vue_SftpUsersProps:
required:
- connectionUrl
- connectionIp
- connectionPort
properties:
connectionUrl:
type: string
connectionIp:
type: string
nullable: true
connectionPort:
type: integer
type: object
Api_Stations_Vue_StreamersProps:
required:
- recordStreams
- connectionServerUrl
- connectionStreamPort
- connectionIp
- connectionDjMountPoint
properties:
recordStreams:
type: boolean
connectionServerUrl:
type: string
connectionStreamPort:
type: integer
nullable: true
connectionIp:
type: string
nullable: true
connectionDjMountPoint:
type: string
type: object
Api_Status:
required:
- success
- message
- formatted_message
properties:
success:
type: boolean
example: true
message:
type: string
example: 'Changes saved successfully.'
formatted_message:
type: string
example: 'Changes saved successfully.'
type: object
Api_SystemStatus:
required:
- online
- timestamp
properties:
online:
description: 'Whether the service is online or not (should always be true)'
type: boolean
example: true
timestamp:
description: 'The current UNIX timestamp'
type: integer
example: 1609480800
type: object
Api_TaskWithLog:
required:
- logUrl
properties:
logUrl:
description: 'The URL to view logs of the ongoing background task.'
type: string
format: uri
type: object
Api_Time:
required:
- timestamp
- utc_datetime
- utc_date
- utc_time
- utc_json
properties:
timestamp:
description: 'The current UNIX timestamp'
type: integer
example: 1497652397
utc_datetime:
type: string
example: '2017-06-16 10:33:17'
utc_date:
type: string
example: 'June 16, 2017'
utc_time:
type: string
example: '10:33pm'
utc_json:
type: string
example: '2012-12-25T16:30:00.000000Z'
type: object
Api_ToastNotification:
required:
- message
- title
- variant
properties:
message:
type: string
title:
type: string
nullable: true
variant:
$ref: '#/components/schemas/FlashLevels'
type: object
HasLinks:
properties:
links:
type: object
readOnly: true
additionalProperties:
type: string
type: object
Api_HasSongFields:
properties:
text:
description: 'The song title, usually "Artist - Title"'
type: string
example: 'Chet Porter - Aluko River'
artist:
description: 'The song artist.'
type: string
example: 'Chet Porter'
nullable: true
title:
description: 'The song title.'
type: string
example: 'Aluko River'
nullable: true
album:
description: 'The song album.'
type: string
example: 'Moving Castle'
nullable: true
genre:
description: 'The song genre.'
type: string
example: Rock
nullable: true
isrc:
description: 'The International Standard Recording Code (ISRC) of the file.'
type: string
example: US28E1600021
nullable: true
lyrics:
description: 'Lyrics to the song.'
type: string
example: ''
nullable: true
type: object
Api_UploadFile:
required:
- path
- file
properties:
path:
description: 'The destination path of the uploaded file.'
type: string
example: relative/path/to/file.mp3
file:
description: 'The base64-encoded contents of the file to upload.'
type: string
example: ''
type: object
Api_UploadedRecordStatus:
required:
- hasRecord
- url
properties:
hasRecord:
type: boolean
url:
type: string
nullable: true
type: object
Vue_AppGlobals:
required:
- locale
- localeShort
- localeWithDashes
- timeConfig
- apiCsrf
- dashboardProps
- user
- notifications
- componentProps
properties:
locale:
type: string
localeShort:
type: string
localeWithDashes:
type: string
timeConfig:
type: object
nullable: true
apiCsrf:
type: string
nullable: true
dashboardProps:
oneOf:
-
$ref: '#/components/schemas/Vue_DashboardGlobals'
nullable: true
user:
oneOf:
-
$ref: '#/components/schemas/Vue_UserGlobals'
nullable: true
notifications:
type: array
items:
$ref: '#/components/schemas/Api_ToastNotification'
componentProps:
type: array
items:
type: '{}'
nullable: true
type: object
Vue_DashboardGlobals:
required:
- instanceName
- homeUrl
- logoutUrl
- version
- isDocker
- platform
- showCharts
- showAlbumArt
- supportedLocales
- analyticsLevel
properties:
instanceName:
type: string
homeUrl:
type: string
logoutUrl:
type: string
version:
type: string
isDocker:
type: boolean
platform:
type: string
showCharts:
type: boolean
showAlbumArt:
type: boolean
supportedLocales:
type: object
additionalProperties:
type: string
analyticsLevel:
$ref: '#/components/schemas/AnalyticsLevel'
type: object
Vue_StationFeatures:
required:
- media
- sftp
- podcasts
- streamers
- webhooks
- requests
- mountPoints
- hlsStreams
- remoteRelays
- customLiquidsoapConfig
- autoDjQueue
properties:
media:
type: boolean
sftp:
type: boolean
podcasts:
type: boolean
streamers:
type: boolean
webhooks:
type: boolean
requests:
type: boolean
mountPoints:
type: boolean
hlsStreams:
type: boolean
remoteRelays:
type: boolean
customLiquidsoapConfig:
type: boolean
autoDjQueue:
type: boolean
type: object
Vue_StationGlobals:
required:
- id
- name
- shortName
- description
- isEnabled
- hasStarted
- needsRestart
- timezone
- offlineText
- maxBitrate
- maxMounts
- maxHlsStreams
- enablePublicPages
- publicPageUrl
- enableOnDemand
- onDemandUrl
- enableStreamers
- webDjUrl
- publicPodcastsUrl
- publicScheduleUrl
- enableRequests
- features
- ipGeoAttribution
- backendType
- frontendType
- canReload
- useManualAutoDj
properties:
id:
type: integer
name:
type: string
nullable: true
shortName:
type: string
description:
type: string
nullable: true
isEnabled:
type: boolean
hasStarted:
type: boolean
needsRestart:
type: boolean
timezone:
type: string
offlineText:
type: string
nullable: true
maxBitrate:
type: integer
maxMounts:
type: integer
maxHlsStreams:
type: integer
enablePublicPages:
type: boolean
publicPageUrl:
type: string
enableOnDemand:
type: boolean
onDemandUrl:
type: string
enableStreamers:
type: boolean
webDjUrl:
type: string
publicPodcastsUrl:
type: string
publicScheduleUrl:
type: string
enableRequests:
type: boolean
features:
$ref: '#/components/schemas/Vue_StationFeatures'
ipGeoAttribution:
type: string
backendType:
$ref: '#/components/schemas/BackendAdapters'
frontendType:
$ref: '#/components/schemas/FrontendAdapters'
canReload:
type: boolean
useManualAutoDj:
type: boolean
type: object
Vue_UserGlobals:
required:
- id
- displayName
- permissions
properties:
id:
type: integer
displayName:
type: string
nullable: true
permissions:
$ref: '#/components/schemas/Api_Admin_RolePermissions'
type: object
Api_WidgetCustomization:
properties:
primaryColor:
description: 'Primary accent color (hex without #).'
type: string
example: 2196F3
nullable: true
backgroundColor:
description: 'Background color (hex without #).'
type: string
example: ffffff
nullable: true
textColor:
description: 'Text color (hex without #).'
type: string
example: '000000'
nullable: true
showAlbumArt:
description: 'Whether album art should be shown.'
type: boolean
example: true
roundedCorners:
description: 'Whether the widget should use rounded corners.'
type: boolean
example: false
autoplay:
description: 'Whether autoplay should be requested.'
type: boolean
example: false
showVolumeControls:
description: 'Whether the volume controls are visible.'
type: boolean
example: true
showTrackProgress:
description: 'Whether track progress is visible.'
type: boolean
example: true
showStreamSelection:
description: 'Whether stream selection controls are visible.'
type: boolean
example: true
showHistoryButton:
description: 'Whether the history button is visible.'
type: boolean
example: false
showRequestButton:
description: 'Whether the request button is visible.'
type: boolean
example: false
showPlaylistButton:
description: 'Whether the playlist download button is visible.'
type: boolean
example: false
initialVolume:
description: 'Initial player volume (0-100).'
type: integer
maximum: 100
minimum: 0
example: 75
layout:
description: 'Layout variant for the widget.'
type: string
example: horizontal
enablePopupPlayer:
description: 'Whether to show an "open popup" button.'
type: boolean
example: false
continuousPlay:
description: 'Whether to persist playback state across pages.'
type: boolean
example: false
customCss:
description: 'Additional CSS applied to the widget.'
type: string
example: '.radio-player-widget { border-radius: 12px; }'
nullable: true
type: object
ApiKey:
type: object
allOf:
-
$ref: '#/components/schemas/HasSplitTokenFields'
-
properties:
user:
$ref: '#/components/schemas/User'
comment:
type: string
type: object
AuditLog:
required:
- timestamp
- operation
- operationText
- class
- identifier
- targetClass
- target
- changes
- user
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
timestamp:
type: string
format: date-time
operation:
enum:
- 1
- 2
- 3
operationText:
type: string
class:
type: string
identifier:
type: string
targetClass:
type: string
nullable: true
target:
type: string
nullable: true
changes:
type: array
items:
$ref: '#/components/schemas/Api_Admin_AuditLogChangeset'
user:
type: string
nullable: true
type: object
CustomField:
required:
- name
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
name:
type: string
short_name:
description: 'The programmatic name for the field. Can be auto-generated from the full name.'
type: string
auto_assign:
description: 'An ID3v2 field to automatically assign to this value, if it exists in the media file.'
type: string
nullable: true
type: object
AnalyticsLevel:
type: string
enum:
- all
- no_ip
- none
x-enumNames:
- All
- NoIp
- None
FileTypes:
type: string
enum:
- directory
- media
- cover_art
- unprocessable_file
- other
x-enumNames:
- Directory
- Media
- CoverArt
- UnprocessableFile
- Other
IpSources:
type: string
enum:
- local
- xff
- cloudflare
x-enumNames:
- Local
- XForwardedFor
- Cloudflare
LoginTokenTypes:
type: string
enum:
- reset_password
- login
x-enumNames:
- ResetPassword
- Login
PlaylistOrders:
type: string
enum:
- random
- shuffle
- sequential
x-enumNames:
- Random
- Shuffle
- Sequential
PlaylistRemoteTypes:
type: string
enum:
- stream
- playlist
- other
x-enumNames:
- Stream
- Playlist
- Other
PlaylistSources:
type: string
enum:
- songs
- remote_url
x-enumNames:
- Songs
- RemoteUrl
PlaylistTypes:
type: string
enum:
- default
- once_per_x_songs
- once_per_x_minutes
- once_per_hour
- custom
x-enumNames:
- Standard
- OncePerXSongs
- OncePerXMinutes
- OncePerHour
- Advanced
PodcastSources:
type: string
enum:
- manual
- playlist
x-enumNames:
- Manual
- Playlist
StationBackendPerformanceModes:
type: string
enum:
- less_memory
- less_cpu
- balanced
- disabled
x-enumNames:
- LessMemory
- LessCpu
- Balanced
- Disabled
StorageLocationAdapters:
type: string
enum:
- local
- s3
- dropbox
- sftp
x-enumNames:
- Local
- S3
- Dropbox
- Sftp
StorageLocationTypes:
type: string
enum:
- backup
- station_media
- station_recordings
- station_podcasts
x-enumNames:
- Backup
- StationMedia
- StationRecordings
- StationPodcasts
Api_ListenerDevice:
properties:
client:
description: 'Summary of the listener client.'
type: string
example: 'Firefox 121.0, Windows'
nullable: true
is_browser:
description: 'If the listener device is likely a browser.'
type: boolean
example: true
is_mobile:
description: 'If the listener device is likely a mobile device.'
type: boolean
example: true
is_bot:
description: 'If the listener device is likely a crawler.'
type: boolean
example: true
browser_family:
description: 'Summary of the listener browser family.'
type: string
example: Firefox
nullable: true
os_family:
description: 'Summary of the listener OS family.'
type: string
example: Windows
nullable: true
type: object
Api_ListenerLocation:
properties:
description:
description: 'A description of the location.'
type: string
example: 'Austin, Texas, US'
region:
description: 'The approximate region/state of the listener.'
type: string
example: Texas
nullable: true
city:
description: 'The approximate city of the listener.'
type: string
example: Austin
nullable: true
country:
description: 'The approximate country of the listener.'
type: string
example: 'United States'
nullable: true
lat:
description: Latitude.
type: number
format: float
example: '30.000000'
nullable: true
lon:
description: Longitude.
type: number
format: float
example: '-97.000000'
nullable: true
type: object
PodcastBrandingConfiguration:
properties:
public_custom_html:
type: string
nullable: true
enable_op3_prefix:
type: boolean
type: object
Relay:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
base_url:
type: string
example: 'https://custom-url.example.com'
name:
type: string
example: Relay
nullable: true
is_visible_on_public_pages:
type: boolean
example: true
created_at:
type: string
format: date-time
example: '2025-01-31T21:31:58+00:00'
updated_at:
type: string
format: date-time
example: '2025-01-31T21:31:58+00:00'
type: object
Settings:
properties:
app_unique_identifier:
type: string
base_url:
description: 'Site Base URL'
type: string
example: 'https://your.azuracast.site'
nullable: true
instance_name:
description: 'AzuraCast Instance Name'
type: string
example: 'My AzuraCast Instance'
nullable: true
prefer_browser_url:
description: 'Prefer Browser URL (If Available)'
type: boolean
example: 'false'
use_radio_proxy:
description: 'Use Web Proxy for Radio'
type: boolean
example: 'false'
history_keep_days:
description: 'Days of Playback History to Keep'
type: integer
always_use_ssl:
description: 'Always Use HTTPS'
type: boolean
example: 'false'
api_access_control:
description: "API 'Access-Control-Allow-Origin' header"
type: string
example: '*'
nullable: true
enable_static_nowplaying:
description: 'Whether to use high-performance static JSON for Now Playing data updates.'
type: boolean
example: 'false'
analytics:
oneOf:
-
$ref: '#/components/schemas/AnalyticsLevel'
nullable: true
description: 'Listener Analytics Collection'
check_for_updates:
description: 'Check for Updates and Announcements'
type: boolean
example: 'true'
update_results:
oneOf:
-
$ref: '#/components/schemas/Api_Admin_UpdateDetails'
nullable: true
description: 'Results of the latest update check.'
example: ''
update_last_run:
description: 'The UNIX timestamp when updates were last checked.'
type: integer
example: 1609480800
public_theme:
oneOf:
-
$ref: '#/components/schemas/SupportedThemes'
nullable: true
description: 'Base Theme for Public Pages'
example: light
hide_album_art:
description: 'Hide Album Art on Public Pages'
type: boolean
example: 'false'
homepage_redirect_url:
description: 'Homepage Redirect URL'
type: string
example: 'https://example.com/'
nullable: true
default_album_art_url:
description: 'Default Album Art URL'
type: string
example: 'https://example.com/image.jpg'
nullable: true
use_external_album_art_when_processing_media:
description: 'Attempt to fetch album art from external sources when processing media.'
type: boolean
example: 'false'
use_external_album_art_in_apis:
description: 'Attempt to fetch album art from external sources in API requests.'
type: boolean
example: 'false'
last_fm_api_key:
description: 'An API key to connect to Last.fm services, if provided.'
type: string
example: SAMPLE-API-KEY
nullable: true
hide_product_name:
description: 'Hide AzuraCast Branding on Public Pages'
type: boolean
example: 'false'
public_custom_css:
description: 'Custom CSS for Public Pages'
type: string
example: ''
nullable: true
public_custom_js:
description: 'Custom JS for Public Pages'
type: string
example: ''
nullable: true
internal_custom_css:
description: 'Custom CSS for Internal Pages'
type: string
example: ''
nullable: true
backup_enabled:
description: 'Whether backup is enabled.'
type: boolean
example: 'false'
backup_time_code:
description: 'The timecode (i.e. 400 for 4:00AM) when automated backups should run.'
type: string
example: 400
nullable: true
backup_exclude_media:
description: 'Whether to exclude media in automated backups.'
type: boolean
example: 'false'
backup_keep_copies:
description: 'Number of backups to keep, or infinite if zero/null.'
type: integer
example: 2
backup_storage_location:
description: 'The storage location ID for automated backups.'
type: integer
example: 1
nullable: true
backup_format:
description: 'The output format for the automated backup.'
type: string
example: zip
nullable: true
backup_last_run:
description: 'The UNIX timestamp when automated backup was last run.'
type: integer
example: 1609480800
backup_last_output:
description: 'The output of the latest automated backup task.'
type: string
example: ''
nullable: true
setup_complete_time:
description: 'The UNIX timestamp when setup was last completed.'
type: integer
example: 1609480800
sync_disabled:
description: 'Temporarily disable all sync tasks.'
type: boolean
example: 'false'
sync_last_run:
description: 'The last run timestamp for the unified sync task.'
type: integer
example: 1609480800
external_ip:
description: "This installation's external IP."
type: string
example: 192.168.1.1
nullable: true
geolite_license_key:
description: 'The license key for the Maxmind Geolite download.'
type: string
example: ''
nullable: true
geolite_last_run:
description: 'The UNIX timestamp when the Maxmind Geolite was last downloaded.'
type: integer
example: 1609480800
mail_enabled:
description: 'Enable e-mail delivery across the application.'
type: boolean
example: 'true'
mail_sender_name:
description: 'The name of the sender of system e-mails.'
type: string
example: AzuraCast
nullable: true
mail_sender_email:
description: 'The e-mail address of the sender of system e-mails.'
type: string
example: example@example.com
nullable: true
mail_smtp_host:
description: 'The host to send outbound SMTP mail.'
type: string
example: smtp.example.com
nullable: true
mail_smtp_port:
description: 'The port for sending outbound SMTP mail.'
type: integer
example: 465
mail_smtp_username:
description: 'The username when connecting to SMTP mail.'
type: string
example: username
nullable: true
mail_smtp_password:
description: 'The password when connecting to SMTP mail.'
type: string
example: password
nullable: true
mail_smtp_secure:
description: 'Whether to use a secure (TLS) connection when sending SMTP mail.'
type: boolean
example: 'true'
avatar_service:
description: 'The external avatar service to use when fetching avatars.'
type: string
example: libravatar
nullable: true
avatar_default_url:
description: 'The default avatar URL.'
type: string
example: ''
nullable: true
acme_email:
description: 'ACME (LetsEncrypt) e-mail address.'
type: string
example: ''
nullable: true
acme_domains:
description: 'ACME (LetsEncrypt) domain name(s).'
type: string
example: ''
nullable: true
ip_source:
oneOf:
-
$ref: '#/components/schemas/IpSources'
nullable: true
description: 'IP Address Source'
type: object
SftpUser:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
username:
type: string
password:
type: string
publicKeys:
type: string
nullable: true
type: object
Station:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
name:
description: 'The full display name of the station.'
type: string
example: 'AzuraTest Radio'
short_name:
description: 'The URL-friendly name for the station, typically auto-generated from the full station name.'
type: string
example: azuratest_radio
is_enabled:
description: "If set to 'false', prevents the station from broadcasting but leaves it in the database."
type: boolean
example: true
frontend_type:
$ref: '#/components/schemas/FrontendAdapters'
frontend_config:
$ref: '#/components/schemas/StationFrontendConfiguration'
backend_type:
$ref: '#/components/schemas/BackendAdapters'
backend_config:
$ref: '#/components/schemas/StationBackendConfiguration'
description:
type: string
example: 'A sample radio station.'
nullable: true
url:
type: string
example: 'https://demo.azuracast.com/'
nullable: true
genre:
type: string
example: Various
nullable: true
radio_base_dir:
type: string
example: /var/azuracast/stations/azuratest_radio
enable_requests:
description: 'Whether listeners can request songs to play on this station.'
type: boolean
example: true
request_delay:
type: integer
example: 5
nullable: true
request_threshold:
type: integer
example: 15
nullable: true
disconnect_deactivate_streamer:
type: integer
example: 0
nullable: true
enable_streamers:
description: 'Whether streamers are allowed to broadcast to this station at all.'
type: boolean
example: false
is_streamer_live:
description: 'Whether a streamer is currently active on the station.'
type: boolean
example: false
enable_public_page:
description: 'Whether this station is visible as a public page and in a now-playing API response.'
type: boolean
example: true
enable_on_demand:
description: "Whether this station has a public 'on-demand' streaming and download page."
type: boolean
example: true
enable_on_demand_download:
description: "Whether the 'on-demand' page offers download capability."
type: boolean
example: true
enable_hls:
description: 'Whether HLS streaming is enabled.'
type: boolean
example: true
api_history_items:
description: "The number of 'last played' history items to show for a station in API responses."
type: integer
example: 5
timezone:
description: 'The time zone that station operations should take place in.'
type: string
example: UTC
max_bitrate:
description: 'The maximum bitrate at which a station may broadcast, in Kbps. 0 for unlimited'
type: integer
example: 128
max_mounts:
description: 'The maximum number of mount points the station can have, 0 for unlimited'
type: integer
example: 3
max_hls_streams:
description: 'The maximum number of HLS streams the station can have, 0 for unlimited'
type: integer
example: 3
branding_config:
$ref: '#/components/schemas/StationBrandingConfiguration'
type: object
StationBackendConfiguration:
properties:
charset:
type: string
dj_port:
type: integer
nullable: true
telnet_port:
type: integer
nullable: true
record_streams:
type: boolean
record_streams_format:
type: string
record_streams_bitrate:
type: integer
use_manual_autodj:
type: boolean
autodj_queue_length:
type: integer
dj_mount_point:
type: string
dj_buffer:
type: integer
audio_processing_method:
type: string
post_processing_include_live:
type: boolean
stereo_tool_license_key:
type: string
nullable: true
stereo_tool_configuration_path:
type: string
nullable: true
master_me_preset:
type: string
nullable: true
master_me_loudness_target:
type: integer
enable_replaygain_metadata:
type: boolean
crossfade_type:
type: string
crossfade:
type: number
format: float
duplicate_prevention_time_range:
type: integer
performance_mode:
type: string
hls_segment_length:
type: integer
hls_segments_in_playlist:
type: integer
hls_segments_overhead:
type: integer
hls_enable_on_public_player:
type: boolean
hls_is_default:
type: boolean
live_broadcast_text:
type: string
enable_auto_cue:
type: boolean
write_playlists_to_liquidsoap:
type: boolean
share_encoders:
type: boolean
custom_config_top:
description: 'Custom Liquidsoap Configuration: Top Section'
type: string
nullable: true
custom_config_pre_playlists:
description: 'Custom Liquidsoap Configuration: Pre-Playlists Section'
type: string
nullable: true
custom_config_pre_live:
description: 'Custom Liquidsoap Configuration: Pre-Live Section'
type: string
nullable: true
custom_config_pre_fade:
description: 'Custom Liquidsoap Configuration: Pre-Fade Section'
type: string
nullable: true
custom_config:
description: 'Custom Liquidsoap Configuration: Pre-Broadcast Section'
type: string
nullable: true
custom_config_bottom:
description: 'Custom Liquidsoap Configuration: Post-Broadcast Section'
type: string
nullable: true
type: object
StationBrandingConfiguration:
properties:
default_album_art_url:
type: string
nullable: true
public_custom_css:
type: string
nullable: true
public_custom_js:
type: string
nullable: true
offline_text:
type: string
nullable: true
type: object
StationFrontendConfiguration:
properties:
custom_config:
type: string
nullable: true
source_pw:
type: string
admin_pw:
type: string
relay_pw:
type: string
streamer_pw:
type: string
port:
type: integer
nullable: true
max_listeners:
type: integer
nullable: true
banned_ips:
type: string
nullable: true
banned_user_agents:
type: string
nullable: true
banned_countries:
type: array
items:
type: string
nullable: true
allowed_ips:
type: string
nullable: true
sc_license_id:
type: string
nullable: true
sc_user_id:
type: string
nullable: true
type: object
StationHlsStream:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
name:
type: string
example: aac_lofi
format:
oneOf:
-
$ref: '#/components/schemas/HlsStreamProfiles'
nullable: true
example: aac
bitrate:
type: integer
example: 128
nullable: true
type: object
StationMediaMetadata:
properties:
amplify:
description: 'Value (in dB) to amplify the current track to produce a uniform loudness.'
type: number
format: float
example: '-1.5'
nullable: true
fade_in:
description: 'Seconds from the start of the track to end fading in.'
type: number
format: float
example: '2.0'
nullable: true
fade_out:
description: 'Seconds from the end of the track to begin fading out.'
type: number
format: float
example: '2.0'
nullable: true
cue_in:
description: 'Seconds from the start of the track to start playback (cue in).'
type: number
format: float
example: '3.5'
nullable: true
cue_out:
description: 'Seconds from the start of the track to end playback (cue out).'
type: number
format: float
example: '181.5'
nullable: true
cross_start_next:
description: 'Seconds from the start of the track to begin fading in the next track.'
type: number
format: float
example: '180.0'
nullable: true
type: object
StationMount:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
name:
type: string
example: /radio.mp3
display_name:
type: string
example: '128kbps MP3'
is_visible_on_public_pages:
type: boolean
example: true
is_default:
type: boolean
example: false
is_public:
type: boolean
example: false
fallback_mount:
type: string
example: /error.mp3
nullable: true
relay_url:
type: string
example: 'https://radio.example.com:8000/radio.mp3'
nullable: true
authhash:
type: string
example: ''
nullable: true
max_listener_duration:
type: integer
example: 43200
enable_autodj:
type: boolean
example: true
autodj_format:
oneOf:
-
$ref: '#/components/schemas/StreamFormats'
nullable: true
example: mp3
autodj_bitrate:
type: integer
example: 128
nullable: true
custom_listen_url:
type: string
example: 'https://custom-listen-url.example.com/stream.mp3'
nullable: true
frontend_config:
type: string
nullable: true
listeners_unique:
description: 'The most recent number of unique listeners.'
type: integer
example: 10
listeners_total:
description: 'The most recent number of total (non-unique) listeners.'
type: integer
example: 12
type: object
StationPlaylist:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
name:
type: string
example: 'Test Playlist'
description:
type: string
example: 'A playlist containing my favorite songs'
nullable: true
type:
$ref: '#/components/schemas/PlaylistTypes'
source:
$ref: '#/components/schemas/PlaylistSources'
order:
$ref: '#/components/schemas/PlaylistOrders'
remote_url:
type: string
example: 'https://remote-url.example.com/stream.mp3'
nullable: true
remote_type:
oneOf:
-
$ref: '#/components/schemas/PlaylistRemoteTypes'
nullable: true
example: stream
remote_buffer:
description: 'The total time (in seconds) that Liquidsoap should buffer remote URL streams.'
type: integer
example: 0
is_enabled:
type: boolean
example: true
is_jingle:
description: 'If yes, do not send jingle metadata to AutoDJ or trigger web hooks.'
type: boolean
example: false
play_per_songs:
type: integer
example: 5
play_per_minutes:
type: integer
example: 120
play_per_hour_minute:
type: integer
example: 15
weight:
description: 'The relative weight of the playlist. Larger numbers play more often than playlists with lower number weights.'
type: integer
example: 3
include_in_requests:
type: boolean
example: true
include_in_on_demand:
description: "Whether this playlist's media is included in 'on demand' download/streaming if enabled."
type: boolean
example: true
backend_options:
type: array
items:
type: string
example: 'interrupt,loop_once,single_track,merge'
avoid_duplicates:
type: boolean
example: true
schedule_items:
description: StationSchedule>
type: array
items: { }
podcasts:
description: Podcast>
type: array
items: { }
type: object
StationRemote:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
display_name:
type: string
example: '128kbps MP3'
is_visible_on_public_pages:
type: boolean
example: true
type:
$ref: '#/components/schemas/RemoteAdapters'
is_editable:
type: boolean
readOnly: true
example: 'true'
enable_autodj:
type: boolean
example: false
autodj_format:
oneOf:
-
$ref: '#/components/schemas/StreamFormats'
nullable: true
example: mp3
autodj_bitrate:
type: integer
example: 128
nullable: true
custom_listen_url:
type: string
example: 'https://custom-listen-url.example.com/stream.mp3'
nullable: true
url:
type: string
example: 'https://custom-url.example.com'
mount:
type: string
example: /stream.mp3
nullable: true
admin_password:
type: string
example: password
nullable: true
source_port:
type: integer
example: 8000
nullable: true
source_mount:
type: string
example: /
nullable: true
source_username:
type: string
example: source
nullable: true
source_password:
type: string
example: password
nullable: true
is_public:
type: boolean
example: false
listeners_unique:
description: 'The most recent number of unique listeners.'
type: integer
example: 10
listeners_total:
description: 'The most recent number of total (non-unique) listeners.'
type: integer
example: 12
type: object
StationSchedule:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
start_time:
type: integer
example: 900
end_time:
type: integer
example: 2200
days:
description: 'Array of ISO-8601 days (1 for Monday, 7 for Sunday)'
type: array
items:
type: integer
example: '0,1,2,3'
loop_once:
type: boolean
example: false
type: object
StationStreamer:
description: 'Station streamers (DJ accounts) allowed to broadcast to a station.'
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
streamer_username:
type: string
example: dj_test
streamer_password:
type: string
example: ''
display_name:
type: string
example: 'Test DJ'
comments:
type: string
example: 'This is a test DJ account.'
nullable: true
is_active:
type: boolean
example: true
enforce_schedule:
type: boolean
example: false
reactivate_at:
type: integer
example: 1609480800
nullable: true
schedule_items:
description: StationSchedule>
type: array
items: { }
type: object
StationStreamerBroadcast:
description: 'Each individual broadcast associated with a streamer.'
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
StationWebhook:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
name:
description: 'The nickname of the webhook connector.'
type: string
example: 'Twitter Post'
nullable: true
type:
$ref: '#/components/schemas/WebhookTypes'
is_enabled:
type: boolean
example: true
triggers:
description: 'List of events that should trigger the webhook notification.'
type: array
items: { }
config:
description: 'Detailed webhook configuration (if applicable)'
type: array
items: { }
metadata:
description: 'Internal details used by the webhook to preserve state.'
type: array
items: { }
type: object
StorageLocation:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
type:
$ref: '#/components/schemas/StorageLocationTypes'
adapter:
$ref: '#/components/schemas/StorageLocationAdapters'
path:
description: 'The local path, if the local adapter is used, or path prefix for S3/remote adapters.'
type: string
example: /var/azuracast/stations/azuratest_radio/media
s3CredentialKey:
description: 'The credential key for S3 adapters.'
type: string
example: your-key-here
nullable: true
s3CredentialSecret:
description: 'The credential secret for S3 adapters.'
type: string
example: your-secret-here
nullable: true
s3Region:
description: 'The region for S3 adapters.'
type: string
example: your-region
nullable: true
s3Version:
description: 'The API version for S3 adapters.'
type: string
example: latest
nullable: true
s3Bucket:
description: 'The S3 bucket name for S3 adapters.'
type: string
example: your-bucket-name
nullable: true
s3Endpoint:
description: 'The optional custom S3 endpoint S3 adapters.'
type: string
example: 'https://your-region.digitaloceanspaces.com'
nullable: true
s3UsePathStyle:
type: boolean
example: false
nullable: true
dropboxAppKey:
description: 'The optional Dropbox App Key.'
type: string
example: ''
nullable: true
dropboxAppSecret:
description: 'The optional Dropbox App Secret.'
type: string
example: ''
nullable: true
dropboxAuthToken:
description: 'The optional Dropbox Auth Token.'
type: string
example: ''
nullable: true
sftpHost:
description: 'The host for SFTP adapters'
type: string
example: 127.0.0.1
nullable: true
sftpUsername:
description: 'The username for SFTP adapters'
type: string
example: root
nullable: true
sftpPassword:
description: 'The password for SFTP adapters'
type: string
example: abc123
nullable: true
sftpPort:
description: 'The port for SFTP adapters'
type: integer
example: 20
nullable: true
sftpPrivateKey:
description: 'The private key for SFTP adapters'
type: string
nullable: true
sftpPrivateKeyPassPhrase:
description: 'The private key pass phrase for SFTP adapters'
type: string
nullable: true
storageQuotaBytes:
example: '120000'
nullable: true
storageQuota:
type: string
example: '50 GB'
nullable: true
storageUsedBytes:
example: '60000'
storageUsed:
type: string
example: '1 GB'
storageAvailableBytes:
example: '120000'
nullable: true
storageAvailable:
type: string
example: '1 GB'
type: object
HasAutoIncrementId:
required:
- id
properties:
id:
type: integer
readOnly: true
type: object
HasSongFields:
properties:
song_id:
type: string
text:
type: string
nullable: true
artist:
type: string
nullable: true
title:
type: string
nullable: true
album:
type: string
nullable: true
type: object
HasSplitTokenFields:
properties:
id:
type: string
readOnly: true
verifier:
type: string
readOnly: true
type: object
HasUniqueId:
required:
- id
properties:
id:
type: string
readOnly: true
type: object
User:
type: object
allOf:
-
$ref: '#/components/schemas/HasAutoIncrementId'
-
properties:
email:
type: string
example: demo@azuracast.com
auth_password:
type: string
example: ''
name:
type: string
example: 'Demo Account'
nullable: true
locale:
type: string
example: en_US
nullable: true
show_24_hour_time:
type: boolean
example: true
nullable: true
two_factor_secret:
type: string
example: A1B2C3D4
nullable: true
created_at:
type: integer
example: 1609480800
updated_at:
type: integer
example: 1609480800
roles:
description: Role>
type: array
items: { }
type: object
UserLoginToken:
type: object
allOf:
-
$ref: '#/components/schemas/HasSplitTokenFields'
-
properties:
user:
$ref: '#/components/schemas/User'
type:
$ref: '#/components/schemas/LoginTokenTypes'
comment:
type: string
example: 'SSO Login'
nullable: true
created_at:
type: integer
example: 1640998800
expires_at:
type: integer
example: 1640998800
type: object
FlashLevels:
type: string
enum:
- success
- warning
- danger
- info
x-enumNames:
- Success
- Warning
- Error
- Info
GlobalPermissions:
type: string
enum:
- 'administer all'
- 'view administration'
- 'view system logs'
- 'administer settings'
- 'administer api keys'
- 'administer stations'
- 'administer custom fields'
- 'administer backups'
- 'administer storage locations'
x-enumNames:
- All
- View
- Logs
- Settings
- ApiKeys
- Stations
- CustomFields
- Backups
- StorageLocations
ReleaseChannel:
type: string
enum:
- latest
- stable
x-enumNames:
- RollingRelease
- Stable
StationPermissions:
type: string
enum:
- 'administer all'
- 'view station management'
- 'view station reports'
- 'view station logs'
- 'manage station profile'
- 'manage station broadcasting'
- 'manage station streamers'
- 'manage station mounts'
- 'manage station remotes'
- 'manage station media'
- 'delete station media'
- 'manage station automation'
- 'manage station web hooks'
- 'manage station podcasts'
x-enumNames:
- All
- View
- Reports
- Logs
- Profile
- Broadcasting
- Streamers
- MountPoints
- RemoteRelays
- Media
- DeleteMedia
- Automation
- WebHooks
- Podcasts
SupportedLocales:
type: string
enum:
- en_US.UTF-8
- cs_CZ.UTF-8
- nl_NL.UTF-8
- fr_FR.UTF-8
- de_DE.UTF-8
- el_GR.UTF-8
- it_IT.UTF-8
- ja_JP.UTF-8
- ko_KR.UTF-8
- nb_NO.UTF-8
- pl_PL.UTF-8
- pt_PT.UTF-8
- pt_BR.UTF-8
- ru_RU.UTF-8
- zh_CN.UTF-8
- es_ES.UTF-8
- sv_SE.UTF-8
- tr_TR.UTF-8
- uk_UA.UTF-8
x-enumNames:
- English
- Czech
- Dutch
- French
- German
- Greek
- Italian
- Japanese
- Korean
- Norwegian
- Polish
- Portuguese
- PortugueseBrazilian
- Russian
- SimplifiedChinese
- Spanish
- Swedish
- Turkish
- Ukrainian
SupportedThemes:
type: string
enum:
- browser
- light
- dark
x-enumNames:
- Browser
- Light
- Dark
AudioProcessingMethods:
type: string
enum:
- none
- nrj
- master_me
- stereo_tool
x-enumNames:
- None
- Liquidsoap
- MasterMe
- StereoTool
BackendAdapters:
type: string
enum:
- liquidsoap
- none
x-enumNames:
- Liquidsoap
- None
CrossfadeModes:
type: string
enum:
- normal
- smart
- none
x-enumNames:
- Normal
- Smart
- Disabled
FrontendAdapters:
type: string
enum:
- icecast
- shoutcast2
- rsas
- remote
x-enumNames:
- Icecast
- Shoutcast
- Rsas
- Remote
HlsStreamProfiles:
type: string
enum:
- aac
- aac_he
- aac_he_v2
x-enumNames:
- AacLowComplexity
- AacHighEfficiencyV1
- AacHighEfficiencyV2
MasterMePresets:
type: string
enum:
- music_general
- speech_general
- ebu_r128
- apple_podcasts
- youtube
x-enumNames:
- MusicGeneral
- SpeechGeneral
- EbuR128
- ApplePodcasts
- YouTube
RemoteAdapters:
type: string
enum:
- shoutcast1
- shoutcast2
- icecast
- azurarelay
x-enumNames:
- Shoutcast1
- Shoutcast2
- Icecast
- AzuraRelay
StreamFormats:
type: string
enum:
- mp3
- ogg
- aac
- opus
- flac
x-enumNames:
- Mp3
- Ogg
- Aac
- Opus
- Flac
WebhookTriggers:
type: string
enum:
- song_changed
- song_changed_live
- listener_gained
- listener_lost
- live_connect
- live_disconnect
- station_offline
- station_online
x-enumNames:
- SongChanged
- SongChangedLive
- ListenerGained
- ListenerLost
- LiveConnect
- LiveDisconnect
- StationOffline
- StationOnline
WebhookTypes:
type: string
enum:
- generic
- email
- tunein
- radiode
- radioreg
- getmeradio
- discord
- telegram
- groupme
- mastodon
- bluesky
- google_analytics_v4
- matomo_analytics
- twitter
- google_analytics
x-enumNames:
- Generic
- Email
- TuneIn
- RadioDe
- RadioReg
- GetMeRadio
- Discord
- Telegram
- GroupMe
- Mastodon
- Bluesky
- GoogleAnalyticsV4
- MatomoAnalytics
- Twitter
- GoogleAnalyticsV3
responses:
SuccessWithImage:
description: 'A successful response with a binary image download.'
content:
'image/*':
schema:
description: 'An image (album art, background, etc) in binary format.'
type: string
format: binary
SuccessWithDownload:
description: 'A successful response with a binary file download.'
content:
application/octet-stream:
schema:
description: 'A media (music, podcast, etc) download in binary format.'
type: string
format: binary
Success:
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Status'
AccessDenied:
description: 'Access denied.'
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Error'
RecordNotFound:
description: 'Record not found.'
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Error'
GenericError:
description: 'A generic exception has occurred.'
content:
application/json:
schema:
$ref: '#/components/schemas/Api_Error'
parameters:
StationIdRequired:
name: station_id
in: path
required: true
schema:
anyOf:
-
type: integer
format: int64
-
type: string
format: string
requestBodies:
FlowFileUpload:
content:
multipart/form-data:
schema:
properties:
file:
description: 'The body of the file to upload.'
type: string
format: binary
type: object
securitySchemes:
ApiKey:
type: apiKey
name: X-API-Key
in: header
security:
-
ApiKey: []
tags:
-
name: 'Public: Now Playing'
description: 'Endpoints that provide full summaries of the current state of stations.'
-
name: 'Public: Stations'
-
name: 'Public: Miscellaneous'
-
name: 'Stations: General'
-
name: 'Stations: Broadcasting'
-
name: 'Stations: HLS Streams'
-
name: 'Stations: Media'
-
name: 'Stations: Mount Points'
-
name: 'Stations: Playlists'
-
name: 'Stations: Podcasts'
-
name: 'Stations: Queue'
-
name: 'Stations: Remote Relays'
-
name: 'Stations: Reports'
-
name: 'Stations: SFTP Users'
-
name: 'Stations: Streamers/DJs'
-
name: 'Stations: Web Hooks'
-
name: 'Administration: General'
-
name: 'Administration: Debugging'
-
name: 'Administration: Backups'
-
name: 'Administration: Custom Fields'
-
name: 'Administration: Users'
-
name: 'Administration: Roles'
-
name: 'Administration: Settings'
-
name: 'Administration: Stations'
-
name: 'Administration: Storage Locations'
-
name: 'My Account'
-
name: Miscellaneous
externalDocs:
description: 'AzuraCast on GitHub'
url: 'https://github.com/AzuraCast/AzuraCast'
x-tagGroups:
-
name: 'Public Endpoints'
tags:
- 'Public: Now Playing'
- 'Public: Stations'
- 'Public: Miscellaneous'
-
name: 'Station Management'
tags:
- 'Stations: General'
- 'Stations: Broadcasting'
- 'Stations: Song Requests'
- 'Stations: HLS Streams'
- 'Stations: Media'
- 'Stations: Mount Points'
- 'Stations: Playlists'
- 'Stations: Podcasts'
- 'Stations: Queue'
- 'Stations: Remote Relays'
- 'Stations: Reports'
- 'Stations: SFTP Users'
- 'Stations: Streamers/DJs'
- 'Stations: Web Hooks'
-
name: Administration
tags:
- 'Administration: General'
- 'Administration: Debugging'
- 'Administration: Backups'
- 'Administration: Custom Fields'
- 'Administration: Users'
- 'Administration: Roles'
- 'Administration: Settings'
- 'Administration: Stations'
- 'Administration: Storage Locations'