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: 'Apache 2.0' url: 'http://www.apache.org/licenses/LICENSE-2.0.html' version: 0.12.4 servers: - url: 'https://demo.azuracast.com/api' description: 'AzuraCast Public Demo Server' paths: /admin/custom_fields: get: tags: - 'Administration: Custom Fields' description: 'List all current custom fields in the system.' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/CustomField' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Administration: Custom Fields' description: 'Create a new custom field.' requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomField' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/CustomField' '403': description: 'Access denied' security: - api_key: [] '/admin/custom_field/{id}': get: tags: - 'Administration: Custom Fields' description: 'Retrieve details for a single custom field.' 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/CustomField' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Administration: Custom Fields' description: 'Update details of a single custom field.' parameters: - name: id in: path description: ID required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomField' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Administration: Custom Fields' description: 'Delete a single custom field.' 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/Api_Status' '403': description: 'Access denied' security: - api_key: [] /admin/permissions: get: tags: - 'Administration: Roles' description: 'Return a list of all available permissions.' operationId: 'App\Controller\Api\Admin\PermissionsController::__invoke' responses: '200': description: Success '403': description: 'Access denied' security: - api_key: [] /internal/relays: get: tags: - 'Administration: Relays' description: 'Returns all necessary information to relay all ''relayable'' stations.' operationId: 'App\Controller\Api\Admin\RelaysController::__invoke' parameters: [] responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_Admin_Relay' /admin/roles: get: tags: - 'Administration: Roles' description: 'List all current roles in the system.' operationId: 'App\Controller\Api\Admin\RolesController::fromArray' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Role' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Administration: Roles' description: 'Create a new role.' operationId: 'App\Controller\Api\Admin\RolesController::fromArray' requestBody: content: application/json: schema: $ref: '#/components/schemas/Role' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Role' '403': description: 'Access denied' security: - api_key: [] '/admin/role/{id}': get: tags: - 'Administration: Roles' description: 'Retrieve details for a single current role.' operationId: 'App\Controller\Api\Admin\RolesController::fromArray' 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/Role' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Administration: Roles' description: 'Update details of a single role.' operationId: 'App\Controller\Api\Admin\RolesController::fromArray' parameters: - name: id in: path description: 'Role ID' required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: '#/components/schemas/Role' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Administration: Roles' description: 'Delete a single role.' operationId: 'App\Controller\Api\Admin\RolesController::fromArray' 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_Status' '403': description: 'Access denied' security: - api_key: [] /admin/settings: get: tags: - 'Administration: Settings' description: 'List the current values of all editable system settings.' operationId: 'App\Controller\Api\Admin\SettingsController::listAction' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Settings' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Administration: Settings' description: 'Update settings to modify any settings provided.' operationId: 'App\Controller\Api\Admin\SettingsController::updateAction' requestBody: content: application/json: schema: $ref: '#/components/schemas/Settings' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] /admin/stations: get: tags: - 'Administration: Stations' description: 'List all current stations in the system.' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Station' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Administration: Stations' description: 'Create a new station.' requestBody: content: application/json: schema: $ref: '#/components/schemas/Station' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Station' '403': description: 'Access denied' security: - api_key: [] '/admin/station/{id}': get: tags: - 'Administration: Stations' description: 'Retrieve details for a single station.' 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': description: 'Access denied' security: - api_key: [] put: tags: - 'Administration: Stations' description: 'Update details of a single station.' 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Administration: Stations' description: 'Delete a single station.' 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/Api_Status' '403': description: 'Access denied' security: - api_key: [] /admin/storage_locations: get: tags: - 'Administration: Storage Locations' description: 'List all current storage locations in the system.' operationId: 'App\Controller\Api\Admin\StorageLocationsController::listAction' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_Admin_StorageLocation' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Administration: Storage Locations' description: 'Create a new storage location.' operationId: 'App\Controller\Api\Admin\StorageLocationsController::listAction' requestBody: content: application/json: schema: $ref: '#/components/schemas/Api_Admin_StorageLocation' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Admin_StorageLocation' '403': description: 'Access denied' security: - api_key: [] '/admin/storage_location/{id}': get: tags: - 'Administration: Storage Locations' description: 'Retrieve details for a single storage location.' operationId: 'App\Controller\Api\Admin\StorageLocationsController::listAction' 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_StorageLocation' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Administration: Storage Locations' description: 'Update details of a single storage location.' operationId: 'App\Controller\Api\Admin\StorageLocationsController::listAction' parameters: - name: id in: path description: 'Storage Location ID' required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: '#/components/schemas/Api_Admin_StorageLocation' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Administration: Storage Locations' description: 'Delete a single storage location.' operationId: 'App\Controller\Api\Admin\StorageLocationsController::listAction' parameters: - name: id in: path description: 'Storage Location ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] /admin/users: get: tags: - 'Administration: Users' description: 'List all current users in the system.' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/User' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Administration: Users' description: 'Create a new user.' requestBody: content: application/json: schema: $ref: '#/components/schemas/User' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/User' '403': description: 'Access denied' security: - api_key: [] '/admin/user/{id}': get: tags: - 'Administration: Users' description: 'Retrieve details for a single current user.' 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/User' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Administration: Users' description: 'Update details of a single user.' 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Administration: Users' description: 'Delete a single user.' operationId: 'App\Controller\Api\Admin\UsersController::deleteAction' 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_Status' '403': description: 'Access denied' security: - api_key: [] /status: get: tags: - Miscellaneous description: 'Returns an affirmative response if the API is active.' operationId: 'App\Controller\Api\IndexController::statusAction' parameters: [] responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_SystemStatus' /time: get: tags: - Miscellaneous description: 'Returns the time (with formatting) in GMT and the user''s local time zone, if logged in.' operationId: 'App\Controller\Api\IndexController::timeAction' parameters: [] responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Time' /nowplaying: get: tags: - 'Now Playing' description: 'Returns a full summary of all stations'' current state.' operationId: 'App\Controller\Api\NowplayingController::__invoke' parameters: [] responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_NowPlaying' '/nowplaying/{station_id}': get: tags: - 'Now Playing' description: 'Returns a full summary of the specified station''s current state.' operationId: 'App\Controller\Api\NowplayingController::__invoke' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_NowPlaying' '404': description: 'Station not found' '/station/{station_id}/art/{media_id}': get: tags: - 'Stations: Media' description: 'Returns the album art for a song, or a generic image.' operationId: 'App\Controller\Api\Stations\Art\GetArtAction::__invoke' parameters: - $ref: '#/components/parameters/station_id_required' - name: media_id in: path description: 'The station media unique ID' required: true schema: type: string responses: '200': description: 'The requested album artwork' '404': description: 'Image not found; generic filler image.' '/station/{station_id}/files': get: tags: - 'Stations: Media' description: 'List all current uploaded files.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/StationMedia' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Media' description: 'Upload a new file.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/Api_UploadFile' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationMedia' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/file/{id}': get: tags: - 'Stations: Media' description: 'Retrieve details for a single file.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Media ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationMedia' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Media' description: 'Update details of a single file.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Media ID' required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: '#/components/schemas/StationMedia' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Media' description: 'Delete a single file.' parameters: - $ref: '#/components/parameters/station_id_required' - name: 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_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/history': get: tags: - 'Stations: History' description: 'Return song playback history items for a given station.' operationId: 'App\Controller\Api\Stations\HistoryController::__invoke' parameters: - $ref: '#/components/parameters/station_id_required' - name: start in: query description: 'The start date for records, in YYYY-MM-DD format.' required: false schema: type: string - name: end in: query description: 'The end date for records, in YYYY-MM-DD format.' required: false schema: type: string responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_DetailedSongHistory' '404': description: 'Station not found' '403': description: 'Access denied' security: - api_key: [] /stations: get: tags: - 'Stations: General' description: 'Returns a list of stations.' operationId: 'App\Controller\Api\Stations\IndexController::listAction' parameters: [] responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_Station' '/station/{station_id}': get: tags: - 'Stations: General' description: 'Return information about a single station.' operationId: 'App\Controller\Api\Stations\IndexController::indexAction' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Station' '404': description: 'Station not found' '/station/{station_id}/listeners': get: tags: - 'Stations: Listeners' description: 'Return detailed information about current listeners.' operationId: 'App\Controller\Api\Stations\ListenersAction::__invoke' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_Listener' '404': description: 'Station not found' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/mounts': get: tags: - 'Stations: Mount Points' description: 'List all current mount points.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/StationMount' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Mount Points' description: 'Create a new mount point.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/StationMount' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationMount' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/mount/{id}': get: tags: - 'Stations: Mount Points' description: 'Retrieve details for a single mount point.' parameters: - $ref: '#/components/parameters/station_id_required' - 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/StationMount' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Mount Points' description: 'Update details of a single mount point.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Streamer ID' required: true schema: type: integer format: int64 requestBody: content: application/json: schema: $ref: '#/components/schemas/StationMount' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Mount Points' description: 'Delete a single mount point.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'StationMount ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/playlists': get: tags: - 'Stations: Playlists' description: 'List all current playlists.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/StationPlaylist' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Playlists' description: 'Create a new playlist.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/StationPlaylist' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationPlaylist' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/playlist/{id}': get: tags: - 'Stations: Playlists' description: 'Retrieve details for a single playlist.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Playlists' description: 'Update details of a single playlist.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Playlists' description: 'Delete a single playlist relay.' parameters: - $ref: '#/components/parameters/station_id_required' - 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/Api_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/podcast/{podcast_id}/episodes': get: tags: - 'Stations: Podcasts' description: 'List all current episodes for a given podcast ID.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Podcasts' description: 'Create a new podcast episode.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] '/station/{station_id}/podcast/{podcast_id}/episode/{id}': get: tags: - 'Stations: Podcasts' description: 'Retrieve details for a single podcast episode.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Podcasts' description: 'Update details of a single podcast episode.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Podcasts' description: 'Delete a single podcast episode.' parameters: - $ref: '#/components/parameters/station_id_required' - 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_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/podcasts': get: tags: - 'Stations: Podcasts' description: 'List all current podcasts.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_Podcast' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Podcasts' description: 'Create a new podcast.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/Api_Podcast' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Podcast' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/podcast/{id}': get: tags: - 'Stations: Podcasts' description: 'Retrieve details for a single podcast.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Podcasts' description: 'Update details of a single podcast.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Podcast ID' required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/Api_Podcast' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Podcasts' description: 'Delete a single podcast.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Podcast ID' required: true schema: type: string responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/queue': get: tags: - 'Stations: Queue' description: 'Return information about the upcoming song playback queue.' operationId: 'App\Controller\Api\Stations\QueueController::listAction' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/Api_StationQueueDetailed' '404': description: 'Station not found' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/queue/{id}': get: tags: - 'Stations: Queue' description: 'Retrieve details of a single queued item.' parameters: - name: id in: path description: 'Queue Item ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_StationQueueDetailed' '404': description: 'Station or Queue ID not found' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Queue' description: 'Delete a single queued item.' parameters: - name: id in: path description: 'Queue Item ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '404': description: 'Station or Queue ID not found' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/remotes': get: tags: - 'Stations: Remote Relays' description: 'List all current remote relays.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/StationRemote' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Remote Relays' description: 'Create a new remote relay.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/StationRemote' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationRemote' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/remote/{id}': get: tags: - 'Stations: Remote Relays' description: 'Retrieve details for a single remote relay.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Remote Relay ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationRemote' '403': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Remote Relays' description: 'Update details of a single remote relay.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Remote Relays' description: 'Delete a single remote relay.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'Remote Relay ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/requests': get: tags: - 'Stations: Song Requests' description: 'Return a list of requestable songs.' operationId: 'App\Controller\Api\Stations\RequestsController::listAction' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success '404': description: 'Station not found' '403': description: 'Station does not support requests' '/station/{station_id}/request/{request_id}': post: tags: - 'Stations: Song Requests' description: 'Submit a song request.' operationId: 'App\Controller\Api\Stations\RequestsController::submitAction' parameters: - $ref: '#/components/parameters/station_id_required' - name: request_id in: path description: 'The requestable song ID' required: true schema: type: integer format: int64 responses: '200': description: Success '404': description: 'Station not found' '403': description: 'Station does not support requests' '/station/{station_id}/schedule': get: tags: - 'Stations: Schedules' description: 'Return upcoming and currently ongoing schedule entries.' operationId: 'App\Controller\Api\Stations\ScheduleController::__invoke' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Station not found' '403': description: 'Access denied' '/station/{station_id}/status': get: tags: - 'Stations: Service Control' description: 'Retrieve the current status of all serivces associated with the radio broadcast.' operationId: 'App\Controller\Api\Stations\ServicesController::statusAction' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success '403': description: 'Access Forbidden' security: - api_key: [] '/station/{station_id}/restart': post: tags: - 'Stations: Service Control' description: 'Restart all services associated with the radio broadcast.' operationId: 'App\Controller\Api\Stations\ServicesController::restartAction' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success '403': description: 'Access Forbidden' security: - api_key: [] '/station/{station_id}/frontend/{action}': post: tags: - 'Stations: Service Control' description: 'Perform service control actions on the radio frontend (Icecast, SHOUTcast, etc.)' operationId: 'App\Controller\Api\Stations\ServicesController::frontendAction' parameters: - $ref: '#/components/parameters/station_id_required' - name: action in: path description: 'The action to perform (start, stop, restart)' required: false schema: type: string content: restart responses: '200': description: Success '403': description: 'Access Forbidden' security: - api_key: [] '/station/{station_id}/backend/{action}': post: tags: - 'Stations: Service Control' description: 'Perform service control actions on the radio backend (Liquidsoap)' operationId: 'App\Controller\Api\Stations\ServicesController::backendAction' parameters: - $ref: '#/components/parameters/station_id_required' - name: action in: path description: 'The action to perform (for all: start, stop, restart; for Liquidsoap only: skip, disconnect)' required: false schema: type: string content: restart responses: '200': description: Success '403': description: 'Access Forbidden' security: - api_key: [] '/station/{station_id}/streamers': get: tags: - 'Stations: Streamers/DJs' description: 'List all current Streamer/DJ accounts for the specified station.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/StationStreamer' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Streamers/DJs' description: 'Create a new Streamer/DJ account.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/StationStreamer' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationStreamer' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/streamer/{id}': get: tags: - 'Stations: Streamers/DJs' description: 'Retrieve details for a single Streamer/DJ account.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Streamers/DJs' description: 'Update details of a single Streamer/DJ account.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Streamers/DJs' description: 'Delete a single Streamer/DJ account.' parameters: - $ref: '#/components/parameters/station_id_required' - name: id in: path description: 'StationStreamer ID' required: true schema: type: integer format: int64 responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/webhooks': get: tags: - 'Stations: Web Hooks' description: 'List all current web hooks.' parameters: - $ref: '#/components/parameters/station_id_required' responses: '200': description: Success content: application/json: schema: type: array items: $ref: '#/components/schemas/StationWebhook' '403': description: 'Access denied' security: - api_key: [] post: tags: - 'Stations: Web Hooks' description: 'Create a new web hook.' parameters: - $ref: '#/components/parameters/station_id_required' requestBody: content: application/json: schema: $ref: '#/components/schemas/StationWebhook' responses: '200': description: Success content: application/json: schema: $ref: '#/components/schemas/StationWebhook' '403': description: 'Access denied' security: - api_key: [] '/station/{station_id}/webhook/{id}': get: tags: - 'Stations: Web Hooks' description: 'Retrieve details for a single web hook.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: 'Access denied' security: - api_key: [] put: tags: - 'Stations: Web Hooks' description: 'Update details of a single web hook.' parameters: - $ref: '#/components/parameters/station_id_required' - 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': description: Success content: application/json: schema: $ref: '#/components/schemas/Api_Status' '403': description: 'Access denied' security: - api_key: [] delete: tags: - 'Stations: Web Hooks' description: 'Delete a single web hook relay.' parameters: - $ref: '#/components/parameters/station_id_required' - 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_Status' '403': description: 'Access denied' security: - api_key: [] components: schemas: Api_Admin_Relay: 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!' 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 port: description: 'The port used by this station to serve its broadcasts.' type: integer example: 8000 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_StationMount' type: object Api_Admin_StorageLocation: type: object allOf: - $ref: '#/components/schemas/HasLinks' - properties: id: type: integer example: 1 type: type: string example: station_media adapter: type: string example: local path: type: string example: /var/azuracast/stations/azuratest_radio/media nullable: true s3CredentialKey: type: string example: your-key-here nullable: true s3CredentialSecret: type: string example: your-secret-here nullable: true s3Region: type: string example: your-region nullable: true s3Version: type: string example: latest nullable: true s3Bucket: type: string example: your-bucket-name nullable: true s3Endpoint: type: string example: 'https://your-region.digitaloceanspaces.com' nullable: true storageQuota: type: string example: '50 GB' nullable: true storageUsed: type: string example: '1 GB' nullable: 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 Api_DetailedSongHistory: allOf: - $ref: '#/components/schemas/Api_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 type: object Api_Error: properties: code: description: 'The numeric code of the error.' type: integer example: 500 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: { } success: description: 'Used for API calls that expect an \Entity\Api\Status type response.' type: boolean example: false 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\n\nphpcs:disable Generic.Files.LineLength" 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' client: description: 'The listener''s client details (extracted from user-agent)' type: string example: '' is_mobile: description: 'Whether the user-agent is likely a mobile browser.' type: boolean example: true 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: 1621831102 connected_until: description: 'UNIX timestamp that the user disconnected (or the latest timestamp if they are still connected).' type: integer example: 1621831102 connected_time: description: 'Number of seconds that the user has been connected.' type: integer example: 30 location: description: 'Location metadata, if available' type: array items: { } type: object Api_NewRecord: allOf: - $ref: '#/components/schemas/Api_Status' - properties: links: type: array items: type: string example: 'http://localhost/api/record/1' type: object Api_NowPlaying: properties: station: $ref: '#/components/schemas/Api_Station' listeners: $ref: '#/components/schemas/Api_NowPlayingListeners' live: $ref: '#/components/schemas/Api_NowPlayingLive' now_playing: nullable: true oneOf: - $ref: '#/components/schemas/Api_NowPlayingCurrentSong' playing_next: nullable: true oneOf: - $ref: '#/components/schemas/Api_StationQueue' song_history: type: array items: $ref: '#/components/schemas/Api_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_NowPlayingCurrentSong: allOf: - $ref: '#/components/schemas/Api_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_NowPlayingListeners: 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_NowPlayingLive: 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 type: object Api_Podcast: type: object allOf: - $ref: '#/components/schemas/HasLinks' - properties: id: type: string nullable: true storage_location_id: type: integer nullable: true title: type: string nullable: true link: type: string nullable: true description: type: string nullable: true language: type: string nullable: true has_custom_art: type: boolean art: type: string nullable: true art_updated_at: type: integer categories: items: type: string episodes: items: type: string Api_PodcastEpisode: type: object allOf: - $ref: '#/components/schemas/HasLinks' - properties: id: type: string nullable: true title: type: string nullable: true description: type: string nullable: true explicit: type: boolean publish_at: type: integer nullable: true has_media: type: boolean media: $ref: '#/components/schemas/Api_PodcastMedia' has_custom_art: type: boolean art: type: string nullable: true art_updated_at: type: integer 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_Song: properties: id: description: 'The song''s 32-character unique identifier hash' type: string example: 9f33bbc912c19603e51be8e0987d076b 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' title: description: 'The song title.' type: string example: 'Aluko River' album: description: 'The song album.' type: string example: 'Moving Castle' genre: description: 'The song genre.' type: string example: Rock lyrics: description: 'Lyrics to the song.' type: string example: '' art: description: 'URL to the album artwork (if available).' example: 'https://picsum.photos/1200/1200' custom_fields: type: array items: type: string example: custom_field_value type: object Api_SongHistory: properties: sh_id: description: 'Song history unique identifier' type: integer played_at: description: 'UNIX timestamp when playback started.' type: integer example: 1621831102 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_Station: 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 listen_url: description: 'The full URL to listen to the default mount of the station' example: 'http://localhost:8000/radio.mp3' url: description: 'The public URL of the station.' type: string example: 'http://example.com/' nullable: true public_player_url: description: 'The public player URL for the station.' example: 'http://example.com/public/example_station' playlist_pls_url: description: 'The playlist download URL in PLS format.' example: 'http://example.com/public/example_station/playlist.pls' playlist_m3u_url: description: 'The playlist download URL in M3U format.' example: 'http://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 mounts: type: array items: $ref: '#/components/schemas/Api_StationMount' remotes: type: array items: $ref: '#/components/schemas/Api_StationRemote' type: object Api_StationMount: allOf: - $ref: '#/components/schemas/Api_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_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 nullable: true 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' type: object Api_StationQueue: properties: cued_at: description: 'UNIX timestamp when playback is expected to start.' type: integer example: 1621831102 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 is_request: description: 'Indicates whether the song is a listener request.' type: boolean song: $ref: '#/components/schemas/Api_Song' type: object Api_StationQueueDetailed: allOf: - $ref: '#/components/schemas/HasLinks' - $ref: '#/components/schemas/Api_StationQueue' - properties: autodj_custom_uri: description: 'Custom AutoDJ playback URI, if it exists.' type: string example: '' nullable: true type: object Api_StationRemote: 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' 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_NowPlayingListeners' 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' start_timestamp: description: 'The start time of the schedule entry, in UNIX format.' type: integer example: 1621831102 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: 1621831102 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: properties: backend_running: type: boolean example: true frontend_running: type: boolean example: true type: object Api_Status: 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: 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: 1621831102 type: object Api_Time: 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 HasLinks: properties: links: type: array items: type: string example: 'http://localhost/api/stations/1/queue/1' type: object Api_UploadFile: properties: path: type: string example: relative/path/to/file.mp3 file: type: string example: '' type: object CustomField: properties: id: type: integer nullable: true name: type: string short_name: description: 'The programmatic name for the field. Can be auto-generated from the full name.' type: string nullable: true 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 Relay: properties: id: type: integer example: 1 nullable: true base_url: type: string example: 'http://custom-url.example.com' name: type: string example: Relay nullable: true is_visible_on_public_pages: type: boolean example: true created_at: type: integer example: 1621831102 updated_at: type: integer example: 1621831102 type: object Role: properties: id: type: integer example: 1 nullable: true name: type: string example: 'Super Administrator' permissions: items: { } type: object Settings: properties: app_unique_identifier: description: 'The unique identifier for this installation (for update checks).' example: '' 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_websockets: description: 'Whether to use Websockets for Now Playing data updates.' type: boolean example: 'false' analytics: description: 'Listener Analytics Collection' type: string nullable: true check_for_updates: description: 'Check for Updates and Announcements' type: boolean example: 'true' update_results: description: 'Results of the latest update check.' example: '' update_last_run: description: 'The UNIX timestamp when updates were last checked.' type: integer example: 1621831102 public_theme: description: 'Base Theme for Public Pages' type: string example: light nullable: true 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_last_run: description: 'The UNIX timestamp when automated backup was last run.' type: integer example: 1621831102 backup_last_result: description: 'The result of the latest automated backup task.' type: string example: '' nullable: true 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: 1621831102 nowplaying: description: 'The current cached now playing data.' example: '' sync_nowplaying_last_run: description: 'The UNIX timestamp when the now playing sync task was last run.' type: integer example: 1621831102 sync_short_last_run: description: 'The UNIX timestamp when the 60-second "short" sync task was last run.' type: integer example: 1621831102 sync_medium_last_run: description: 'The UNIX timestamp when the 5-minute "medium" sync task was last run.' type: integer example: 1621831102 sync_long_last_run: description: 'The UNIX timestamp when the 1-hour "long" sync task was last run.' type: integer example: 1621831102 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: 1621831102 enable_advanced_features: description: 'Whether to enable "advanced" functionality in the system that is intended for power users.' type: boolean example: false 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 type: object Station: properties: id: type: integer example: 1 nullable: true name: description: 'The full display name of the station.' type: string example: 'AzuraTest Radio' nullable: true short_name: description: 'The URL-friendly name for the station, typically auto-generated from the full station name.' type: string example: azuratest_radio nullable: true is_enabled: description: 'If set to "false", prevents the station from broadcasting but leaves it in the database.' type: boolean example: true frontend_type: description: 'The frontend adapter (icecast,shoutcast,remote,etc)' type: string example: icecast nullable: true frontend_config: description: 'An array containing station-specific frontend configuration' type: array items: { } nullable: true backend_type: description: 'The backend adapter (liquidsoap,etc)' type: string example: liquidsoap nullable: true backend_config: description: 'An array containing station-specific backend configuration' type: array items: { } nullable: true 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 nullable: true automation_settings: type: array items: { } nullable: true 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 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 api_history_items: description: 'The number of "last played" history items to show for a station in the Now Playing API responses.' type: integer example: 5 nullable: true timezone: description: 'The time zone that station operations should take place in.' type: string example: UTC nullable: true default_album_art_url: description: 'The station-specific default album artwork URL.' type: string example: 'https://example.com/image.jpg' nullable: true type: object StationMedia: type: object allOf: - $ref: '#/components/schemas/UniqueId' - properties: id: type: integer example: 1 nullable: true album: description: 'The name of the media file''s album.' type: string example: 'Test Album' nullable: true genre: description: 'The genre of the media file.' type: string example: Rock nullable: true lyrics: description: 'Full lyrics of the track, if available.' type: string example: '...Never gonna give you up...' nullable: true isrc: description: 'The track ISRC (International Standard Recording Code), used for licensing purposes.' type: string example: GBARL0600786 nullable: true 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' nullable: true 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: 1621831102 nullable: true amplify: description: 'The amount of amplification (in dB) to be applied to the radio source;' type: number format: float example: -14 nullable: true fade_overlap: description: 'The length of time (in seconds) before the next song starts in the fade;' type: number format: float example: 2 nullable: true fade_in: description: 'The length of time (in seconds) to fade in the next track;' type: number format: float example: 3 nullable: true fade_out: description: 'The length of time (in seconds) to fade out the previous track;' type: number format: float example: 3 nullable: true cue_in: description: 'The length of time (in seconds) from the start of the track to start playing;' type: number format: float example: 30 nullable: true cue_out: description: 'The length of time (in seconds) from the CUE-IN of the track to stop playing;' type: number format: float example: 30 nullable: true art_updated_at: description: 'The latest time (UNIX timestamp) when album art was updated.' type: integer example: 1621831102 playlists: items: { } StationMount: properties: id: type: integer example: 1 nullable: true name: type: string example: /radio.mp3 display_name: type: string example: '128kbps MP3' nullable: true 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: 'http://radio.example.com:8000/radio.mp3' nullable: true authhash: type: string example: '' nullable: true enable_autodj: type: boolean example: true autodj_format: type: string example: mp3 nullable: true 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 items: { } 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: properties: id: type: integer example: 1 nullable: true name: type: string example: 'Test Playlist' type: type: string example: default source: type: string example: songs order: type: string example: shuffle remote_url: type: string example: 'http://remote-url.example.com/stream.mp3' nullable: true remote_type: type: string example: stream nullable: true 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: 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 include_in_automation: type: boolean example: false backend_options: type: string example: 'interrupt,loop_once,single_track,merge' avoid_duplicates: type: boolean example: true schedule_items: items: { } type: object StationRemote: properties: id: type: integer example: 1 nullable: true display_name: type: string example: '128kbps MP3' nullable: true is_visible_on_public_pages: type: boolean example: true type: type: string example: icecast enable_autodj: type: boolean example: false autodj_format: type: string example: mp3 nullable: true 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: 'http://custom-url.example.com' nullable: true 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: properties: id: type: integer example: 1 nullable: true 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: string example: '0,1,2,3' type: object StationStreamer: properties: id: type: integer example: 1 nullable: true streamer_username: type: string example: dj_test streamer_password: type: string example: '' display_name: type: string example: 'Test DJ' nullable: true 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: 1621831102 nullable: true schedule_items: items: { } type: object StationStreamerBroadcast: properties: id: type: integer example: 1 nullable: true type: object StationWebhook: properties: id: type: integer example: 1 nullable: true name: description: 'The nickname of the webhook connector.' type: string example: 'Twitter Post' nullable: true type: description: 'The type of webhook connector to use.' type: string example: twitter 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 UniqueId: properties: unique_id: description: 'A unique identifier associated with this record.' type: string example: 69b536afc7ebbf16457b8645 type: object User: properties: id: type: integer example: 1 nullable: true email: type: string example: demo@azuracast.com nullable: true new_password: type: string example: '' nullable: true name: type: string example: 'Demo Account' nullable: true locale: type: string example: en_US nullable: true theme: type: string example: dark nullable: true two_factor_secret: type: string example: A1B2C3D4 nullable: true created_at: type: integer example: 1621831102 updated_at: type: integer example: 1621831102 roles: items: { } type: object responses: todo: description: 'This API call has no documented response (yet)' parameters: station_id_required: name: station_id in: path description: 'The station ID' required: true schema: type: integer format: int64 example: 1 securitySchemes: api_key: type: apiKey name: X-API-Key in: header tags: - name: 'Now Playing' description: 'Endpoints that provide full summaries of the current state of stations.' - name: 'Stations: General' - name: 'Stations: Song Requests' - name: 'Stations: Service Control' - name: 'Stations: History' - name: 'Stations: Listeners' - name: 'Stations: Schedules' - name: 'Stations: Media' - name: 'Stations: Mount Points' - name: 'Stations: Playlists' - name: 'Stations: Podcasts' - name: 'Stations: Queue' - name: 'Stations: Remote Relays' - name: 'Stations: Streamers/DJs' - name: 'Stations: Web Hooks' - name: 'Administration: Custom Fields' - name: 'Administration: Users' - name: 'Administration: Relays' - name: 'Administration: Roles' - name: 'Administration: Settings' - name: 'Administration: Stations' - name: 'Administration: Storage Locations' - name: Miscellaneous externalDocs: description: 'AzuraCast on GitHub' url: 'https://github.com/AzuraCast/AzuraCast'