{
  "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.8"
  },
  "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"
          }
        }
      },
      "post": {
        "tags": [
          "Administration: General"
        ],
        "summary": "Create a new API key for a specified user.",
        "operationId": "adminCreateApiKey",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Api_Admin_NewApiKey"
              }
            }
          }
        },
        "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"
          }
        }
      }
    },
    "/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",
              "nullable": true,
              "default": false
            }
          }
        ],
        "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",
                        "members"
                      ]
                    }
                  }
                },
                "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}/playlists/export-config": {
      "get": {
        "tags": [
          "Stations: Playlists"
        ],
        "summary": "Export all of a station's playlists as a JSON configuration dump.",
        "operationId": "getStationPlaylistsExportConfig",
        "parameters": [
          {
            "$ref": "#/components/parameters/StationIdRequired"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/SuccessWithDownload"
          },
          "403": {
            "$ref": "#/components/responses/AccessDenied"
          },
          "500": {
            "$ref": "#/components/responses/GenericError"
          }
        }
      }
    },
    "/station/{station_id}/playlist/{id}/export-config": {
      "get": {
        "tags": [
          "Stations: Playlists"
        ],
        "summary": "Export a single playlist (and any group members) as a JSON configuration dump.",
        "operationId": "getStationPlaylistExportConfig",
        "parameters": [
          {
            "$ref": "#/components/parameters/StationIdRequired"
          },
          {
            "name": "id",
            "in": "path",
            "description": "Playlist 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}/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}/playlists/import-config": {
      "post": {
        "tags": [
          "Stations: Playlists"
        ],
        "summary": "Import playlists from a JSON configuration dump, creating new playlists on the station.",
        "operationId": "postStationPlaylistsImportConfig",
        "parameters": [
          {
            "$ref": "#/components/parameters/StationIdRequired"
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "config_file": {
                    "description": "The JSON configuration dump to import.",
                    "type": "string",
                    "format": "binary"
                  },
                  "name_prefix": {
                    "description": "Optional prefix prepended to every imported playlist name.",
                    "type": "string",
                    "nullable": true
                  }
                },
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "403": {
            "$ref": "#/components/responses/AccessDenied"
          },
          "500": {
            "$ref": "#/components/responses/GenericError"
          }
        }
      }
    },
    "/station/{station_id}/playlist/{id}/members": {
      "put": {
        "tags": [
          "Stations: Playlists"
        ],
        "summary": "Set the member playlists of the specified playlist group.",
        "operationId": "putStationPlaylistMembers",
        "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"
          },
          {
            "name": "filter[source]",
            "in": "query",
            "description": "Filter by playlist source. Repeat as filter[source][] to match several values.",
            "schema": {
              "$ref": "#/components/schemas/PlaylistSources"
            }
          },
          {
            "name": "filter[type]",
            "in": "query",
            "description": "Filter by playlist type. Repeat as filter[type][] to match several values.",
            "schema": {
              "$ref": "#/components/schemas/PlaylistTypes"
            }
          },
          {
            "name": "filter[order]",
            "in": "query",
            "description": "Filter by playback order. Repeat as filter[order][] to match several values.",
            "schema": {
              "$ref": "#/components/schemas/PlaylistOrders"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/StationPlaylist"
                      },
                      {
                        "$ref": "#/components/schemas/HasLinks"
                      },
                      {
                        "$ref": "#/components/schemas/Api_StationPlaylistComputedFields"
                      }
                    ]
                  }
                }
              }
            }
          },
          "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": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/StationPlaylist"
                    },
                    {
                      "$ref": "#/components/schemas/HasLinks"
                    },
                    {
                      "$ref": "#/components/schemas/Api_StationPlaylistComputedFields"
                    }
                  ]
                }
              }
            }
          },
          "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": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/StationPlaylist"
                    },
                    {
                      "$ref": "#/components/schemas/HasLinks"
                    },
                    {
                      "$ref": "#/components/schemas/Api_StationPlaylistComputedFields"
                    }
                  ]
                }
              }
            }
          },
          "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}/playlists/schedule": {
      "get": {
        "tags": [
          "Stations: Playlists"
        ],
        "summary": "Return calendar events for the station's playlist schedule.",
        "description": "Controller used to respond to AJAX requests from the playlist \"Schedule View\".",
        "operationId": "getStationPlaylistsSchedule",
        "parameters": [
          {
            "$ref": "#/components/parameters/StationIdRequired"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Api_StationSchedulePlaylistEvent"
                  }
                }
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/AccessDenied"
          },
          "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": {
                    "$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": {
                  "$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}/streamers/schedule": {
      "get": {
        "tags": [
          "Stations: Streamers/DJs"
        ],
        "summary": "Return calendar events for the station's streamer/DJ schedule.",
        "operationId": "getStationStreamersSchedule",
        "parameters": [
          {
            "$ref": "#/components/parameters/StationIdRequired"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Api_StationScheduleStreamerEvent"
                  }
                }
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/AccessDenied"
          },
          "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_NewApiKey": {
        "required": [
          "user"
        ],
        "properties": {
          "user": {
            "description": "User ID or e-mail address.",
            "anyOf": [
              {
                "type": "integer",
                "format": "int64"
              },
              {
                "type": "string"
              }
            ]
          },
          "comment": {
            "type": "string",
            "example": "Admin-generated API key"
          }
        },
        "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": "<b>Changes saved successfully.</b>"
          },
          "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": "<b>Error description.</b><br>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",
            "nullable": true,
            "enum": [
              "hit",
              "database",
              "station"
            ]
          }
        },
        "type": "object"
      },
      "Api_NowPlaying_SongHistory": {
        "required": [
          "sh_id",
          "played_at",
          "duration",
          "playlist",
          "playlist_chain",
          "playlist_source",
          "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
          },
          "playlist_chain": {
            "description": "Names of the playlist group chain the song was picked through if played from a group",
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "Main Rotation",
              "Rock",
              "Rock Hits"
            ],
            "nullable": true
          },
          "playlist_source": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlaylistSources"
              }
            ],
            "nullable": true,
            "description": "The source of the playlist that the song was played from, if available."
          },
          "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",
          "playlist_chain",
          "playlist_source",
          "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
          },
          "playlist_chain": {
            "description": "Names of the playlist group chain the song was picked through if played from a group",
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "Main Rotation",
              "Rock",
              "Rock Hits"
            ],
            "nullable": true
          },
          "playlist_source": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlaylistSources"
              }
            ],
            "nullable": true,
            "description": "The source of the playlist that the song was played from, if available."
          },
          "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_PlaylistConfigurationImportResult": {
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/Api_Status"
          },
          {
            "properties": {
              "playlists_created": {
                "type": "integer",
                "example": 3
              },
              "media_relinked": {
                "type": "integer",
                "example": 10
              },
              "media_generated": {
                "type": "integer",
                "example": 2
              },
              "members_created": {
                "type": "integer",
                "example": 1
              },
              "warnings": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "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
          },
          "size": {
            "description": "The file size (in bytes).",
            "type": "integer",
            "example": 19693056
          }
        },
        "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_StationPlaylistComputedFields": {
        "properties": {
          "short_name": {
            "description": "A URL-safe version of the playlist name.",
            "type": "string",
            "readOnly": true
          },
          "num_songs": {
            "description": "The number of songs in the playlist, if it is a song-based playlist.",
            "type": "integer",
            "readOnly": true,
            "example": 25,
            "nullable": true
          },
          "total_length": {
            "description": "The total length of the playlist in seconds, if it is a song-based playlist.",
            "type": "number",
            "format": "float",
            "readOnly": true,
            "example": 3600,
            "nullable": true
          },
          "playlist_groups": {
            "description": "The parent groups that this playlist is a member of.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Api_StationPlaylistParentGroup"
            },
            "readOnly": true
          }
        },
        "type": "object"
      },
      "Api_StationPlaylistParentGroup": {
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "description": "The unique identifier of the parent group.",
            "type": "integer",
            "example": 1
          },
          "name": {
            "description": "The name of the parent group.",
            "type": "string",
            "example": "My Group"
          }
        },
        "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 StationMedia record associating this track with the media",
            "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",
            "example": "playlist",
            "enum": [
              "playlist",
              "streamer"
            ]
          },
          "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_StationScheduleGroupMember": {
        "required": [
          "id",
          "name",
          "source",
          "order",
          "weight",
          "count",
          "consecutive_plays",
          "play_full_cycle",
          "is_enabled"
        ],
        "properties": {
          "id": {
            "description": "The unique identifier of the member playlist.",
            "type": "integer",
            "example": 1
          },
          "name": {
            "description": "The name of the member playlist.",
            "type": "string",
            "example": "Example Playlist"
          },
          "source": {
            "$ref": "#/components/schemas/PlaylistSources"
          },
          "order": {
            "$ref": "#/components/schemas/PlaylistOrders"
          },
          "weight": {
            "description": "The weighting of this member within the group.",
            "type": "integer",
            "example": 3
          },
          "count": {
            "description": "The number of songs or member playlists in this member, if applicable.",
            "type": "integer",
            "example": 25,
            "nullable": true
          },
          "consecutive_plays": {
            "description": "The number of consecutive plays configured for this member.",
            "type": "integer",
            "example": 1
          },
          "play_full_cycle": {
            "description": "Whether the member plays through its full cycle before advancing.",
            "type": "boolean",
            "example": false
          },
          "is_enabled": {
            "description": "Whether the member playlist is enabled.",
            "type": "boolean",
            "example": true
          }
        },
        "type": "object"
      },
      "Api_StationSchedulePlaylistEvent": {
        "required": [
          "id",
          "title",
          "type",
          "start",
          "end",
          "edit_url",
          "source",
          "order",
          "playlist_type",
          "play_per_songs",
          "play_per_minutes",
          "play_per_hour_minute",
          "weight",
          "is_jingle",
          "include_in_on_demand",
          "avoid_duplicates",
          "plays_via_group_schedule",
          "members",
          "num_songs",
          "total_length",
          "remote_url",
          "remote_type"
        ],
        "properties": {
          "id": {
            "description": "The unique identifier of the playlist.",
            "type": "integer",
            "example": 1
          },
          "title": {
            "description": "The playlist name representing the event title.",
            "type": "string",
            "example": "Example Playlist"
          },
          "type": {
            "description": "The type of this schedule event.",
            "type": "string",
            "example": "playlist",
            "enum": [
              "playlist"
            ]
          },
          "start": {
            "description": "The start time of this schedule event, in ISO 8601 format.",
            "type": "string",
            "example": "2020-02-19T03:00:00-06:00"
          },
          "end": {
            "description": "The end time of this schedule event, in ISO 8601 format.",
            "type": "string",
            "example": "2020-02-19T05:00:00-06:00"
          },
          "edit_url": {
            "description": "The API URL used to edit the underlying playlist.",
            "type": "string",
            "example": "/api/station/1/playlist/1"
          },
          "source": {
            "$ref": "#/components/schemas/PlaylistSources"
          },
          "order": {
            "$ref": "#/components/schemas/PlaylistOrders"
          },
          "playlist_type": {
            "$ref": "#/components/schemas/PlaylistTypes"
          },
          "play_per_songs": {
            "type": "integer",
            "example": 0
          },
          "play_per_minutes": {
            "type": "integer",
            "example": 0
          },
          "play_per_hour_minute": {
            "type": "integer",
            "example": 0
          },
          "weight": {
            "type": "integer",
            "example": 3
          },
          "is_jingle": {
            "type": "boolean",
            "example": false
          },
          "include_in_on_demand": {
            "type": "boolean",
            "example": false
          },
          "avoid_duplicates": {
            "type": "boolean",
            "example": false
          },
          "plays_via_group_schedule": {
            "description": "True if this playlist is a group member and an ancestor group's schedule covers this entire event, so it plays via that group instead of on its own. Partially covered events report false.",
            "type": "boolean",
            "readOnly": true,
            "example": false
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Api_StationScheduleGroupMember"
            }
          },
          "num_songs": {
            "description": "The number of songs in the playlist, if it is a song-based playlist.",
            "type": "integer",
            "example": 25,
            "nullable": true
          },
          "total_length": {
            "description": "The total length of the playlist in seconds, if it is a song-based playlist.",
            "type": "number",
            "format": "float",
            "example": 3600,
            "nullable": true
          },
          "remote_url": {
            "description": "The remote URL, if this is a remote URL playlist.",
            "type": "string",
            "example": "https://example.com/stream",
            "nullable": true
          },
          "remote_type": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlaylistRemoteTypes"
              }
            ],
            "nullable": true
          }
        },
        "type": "object"
      },
      "Api_StationScheduleStreamerEvent": {
        "required": [
          "id",
          "title",
          "type",
          "start",
          "end",
          "edit_url",
          "streamer_username",
          "comments",
          "has_custom_art",
          "art"
        ],
        "properties": {
          "id": {
            "description": "The unique identifier of the streamer.",
            "type": "integer",
            "example": 1
          },
          "title": {
            "description": "The streamer display name representing the event title.",
            "type": "string",
            "example": "Example Streamer"
          },
          "type": {
            "description": "The type of this schedule event.",
            "type": "string",
            "example": "streamer",
            "enum": [
              "streamer"
            ]
          },
          "start": {
            "description": "The start time of this schedule event, in ISO 8601 format.",
            "type": "string",
            "example": "2020-02-19T03:00:00-06:00"
          },
          "end": {
            "description": "The end time of this schedule event, in ISO 8601 format.",
            "type": "string",
            "example": "2020-02-19T05:00:00-06:00"
          },
          "edit_url": {
            "description": "The API URL used to edit the underlying streamer.",
            "type": "string",
            "example": "/api/station/1/streamer/1"
          },
          "streamer_username": {
            "description": "The streamer login username.",
            "type": "string",
            "example": "example_dj"
          },
          "comments": {
            "description": "Comments about the streamer.",
            "type": "string",
            "example": "Live every weekday evening.",
            "nullable": true
          },
          "has_custom_art": {
            "description": "Whether the streamer has custom artwork.",
            "type": "boolean",
            "example": true
          },
          "art": {
            "description": "The URL of the streamer artwork, if custom artwork is present.",
            "type": "string",
            "example": "/api/station/1/streamer/1/art/1.jpg",
            "nullable": 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": "<b>Changes saved successfully.</b>"
          }
        },
        "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",
            "example": 75,
            "maximum": 100,
            "minimum": 0
          },
          "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"
        ]
      },
      "PlaylistGroupAllowedRequests": {
        "type": "string",
        "enum": [
          "any",
          "playlist",
          "none"
        ],
        "x-enumNames": [
          "Any",
          "Playlist",
          "None"
        ]
      },
      "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",
          "playlists",
          "remote_url",
          "requests"
        ],
        "x-enumNames": [
          "Songs",
          "Playlists",
          "RemoteUrl",
          "Requests"
        ]
      },
      "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_liquidsoap_editing": {
            "description": "Allow stations to manually edit Liquidsoap code.",
            "type": "boolean",
            "example": "true"
          },
          "enable_all_webhooks": {
            "description": "Allow stations to dispatch webhooks.",
            "type": "boolean",
            "example": "true"
          },
          "filter_local_user_urls": {
            "description": "Prevent users from using local IPs or URLs in Webhooks, etc.",
            "type": "boolean",
            "example": "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
              },
              "requests_only_via_playlists": {
                "type": "boolean",
                "example": false
              },
              "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's public pages (player, on-demand streaming, etc.) are visible to non-authenticated users.",
                "type": "boolean",
                "example": true
              },
              "enable_public_api": {
                "description": "Whether the public-facing API endpoints (now playing, art, etc.) are visible to non-authenticated users. Automatically enabled if 'enable_public_page' is true.",
                "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"
          },
          "reset_sequential_queues_on_restart": {
            "description": "Reset the internal queue of sequential playlists when the station is restarted or its configuration is rewritten.",
            "type": "boolean",
            "example": false
          },
          "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"
          },
          "crossfade_smart_high": {
            "description": "The dB level above which a track is considered 'loud' ('high' parameter in 'cross.smart').",
            "type": "number",
            "format": "float"
          },
          "crossfade_smart_medium": {
            "description": "The dB level below which a track is considered 'quiet' ('medium' parameter in 'cross.smart').",
            "type": "number",
            "format": "float"
          },
          "crossfade_smart_margin": {
            "description": "The dB difference above which two tracks are considered too different to overlap ('margin' parameter in 'cross.smart').",
            "type": "number",
            "format": "float"
          },
          "duplicate_prevention_time_range": {
            "description": "The time range (in minutes) of the song history that duplicate prevention checks tracks and titles against, also applies to artists when duplicate_prevention_artist_time_range is not set.",
            "type": "integer",
            "example": 120
          },
          "duplicate_prevention_artist_time_range": {
            "description": "The time range (in minutes) of the song history that duplicate prevention checks artists against, uses duplicate_prevention_time_range if set to null.",
            "type": "integer",
            "example": 120,
            "nullable": true
          },
          "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
              },
              "preserve_queue_on_restart": {
                "description": "Don't reset this playlist's queue when the station is restarted or its configuration is rewritten.",
                "type": "boolean",
                "example": false
              },
              "schedule_items": {
                "type": "array",
                "items": {}
              },
              "podcasts": {
                "type": "array",
                "items": {}
              },
              "playlists": {
                "type": "array",
                "items": {}
              }
            },
            "type": "object"
          }
        ]
      },
      "StationPlaylistGroup": {
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/HasAutoIncrementId"
          },
          {
            "properties": {
              "name": {
                "description": "The playlist name.",
                "type": "string",
                "readOnly": true,
                "example": "My Playlist"
              },
              "weight": {
                "type": "integer",
                "example": 1
              },
              "consecutive_plays": {
                "type": "integer",
                "example": 0
              },
              "play_full_cycle": {
                "type": "boolean",
                "example": false
              },
              "preserve_queue_on_recursive_reset": {
                "description": "Keep the member's queue on a recursive queue reset of a parent playlist group, also keeps the queues of its nested members. If the same playlist is added to a group more than once, all of its entries share this setting.",
                "type": "boolean",
                "example": false
              },
              "allowed_requests": {
                "$ref": "#/components/schemas/PlaylistGroupAllowedRequests"
              }
            },
            "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
              },
              "prevent_requests": {
                "description": "Used to suppress the global request queue while this schedule window is active.",
                "type": "boolean",
                "example": false
              },
              "reset_queue_at_start": {
                "description": "Reset the playlist's internal queue when this schedule window becomes active.",
                "type": "boolean",
                "example": false
              },
              "reset_queue_recursive": {
                "description": "Also reset nested playlist groups and member playlists (playlist groups only). Members with preserve_queue_on_recursive_reset keep their queues.",
                "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": {
                "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": {
                "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"
      ]
    }
  ]
}
