{"openapi":"3.0.0","paths":{"/cats/v1/folders":{"get":{"description":"Returns an object containing a list of folders and permissions for root folders.","operationId":"FolderController_list_v1","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderList"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List folders","tags":["folder"]},"post":{"operationId":"FolderController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreateCommand"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalFolder"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to create the folder."},"422":{"description":"Folder name is not unique."}},"security":[{"personal-access-token":[]}],"summary":"Create folder","tags":["folder"]}},"/cats/v1/folders/{id}":{"patch":{"operationId":"FolderController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdateCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalFolder"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to update the folder."},"404":{"description":"Folder not found."},"422":{"description":"Folder name is not unique."}},"security":[{"personal-access-token":[]}],"summary":"Update folder","tags":["folder"]},"delete":{"description":"The folder must be empty of assets and subfolders before it can be deleted.","operationId":"FolderController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to delete the folder."},"404":{"description":"Folder not found."},"422":{"description":"Folder is not empty."}},"security":[{"personal-access-token":[]}],"summary":"Delete folder","tags":["folder"]}},"/cats/v1/assets":{"get":{"description":"This API is intended to be used to build folder-based views of\n         signage content. It will return any content that can be assigned\n         to a folder. You can use the content-specific APIs (such as\n         `/playlists` and `/media`) and aggregate the content yourself if\n         you prefer.","operationId":"AssetController_list_v1","parameters":[{"name":"folderId","required":true,"in":"query","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["PLAYLIST","SCHEDULE","MEDIA"]}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/MediaAsset"},{"$ref":"#/components/schemas/PlaylistAsset"},{"$ref":"#/components/schemas/ScheduleAsset"}]}}}}]}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List assets","tags":["asset"]}},"/cats/v1/assets/move":{"post":{"description":"This API is a convenience API to move assets between folders.\n         You can use the content-specific APIs (such as `/playlists/:id` and\n         `/media/:id`) and move the assets directly if you prefer.","operationId":"AssetController_bulkMove_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMoveCommand"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalFolder"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"Bulk move assets","tags":["asset"]}},"/cats/v1/assets/delete":{"post":{"description":"This API is a convenience API to delete assets.\n         You can use the content-specific APIs (such as `/playlists/:id` and\n         `/media/:id`) and delete the assets directly if you prefer.","operationId":"AssetController_bulkDelete_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteCommand"}}}},"responses":{"204":{"description":""},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"Bulk delete assets","tags":["asset"]}},"/cats/v1/media":{"post":{"operationId":"MediaController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaCreateCommand"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalMedia"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to create media item."}},"security":[{"personal-access-token":[]}],"summary":"Create media","tags":["media"]},"get":{"operationId":"MediaController_list_v1","parameters":[{"name":"folderId","required":false,"in":"query","schema":{"type":"number"}},{"name":"mediaType","required":false,"in":"query","schema":{"type":"string","enum":["IMAGE","VIDEO","WIDGET","WEBSITE","CANVA","POWER_BI","TABLEAU","DESIGN","ZONE"]}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Media"}}}}]}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List media","tags":["media"]}},"/cats/v1/media/{id}/upload":{"post":{"description":"Prepares and returns an upload URL that can be used to upload a\n         file. Only use this for media items that have a `PROVIDED` source.\n         Clients must `PUT` the file against the returned URL.","operationId":"MediaController_startUpload_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadStartResponse"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to prepare a media upload."},"404":{"description":"Media not found."},"422":{"description":"Media upload already completed."}},"security":[{"personal-access-token":[]}],"summary":"Start a media upload","tags":["media"]},"patch":{"operationId":"MediaController_completeUpload_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadCompleteCommandDTO"}}}},"responses":{"200":{"description":""},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to complete a media upload."},"404":{"description":"Media not found."},"422":{"description":"Media upload already completed."}},"security":[{"personal-access-token":[]}],"summary":"Complete a media upload","tags":["media"]}},"/cats/v1/media/{id}/import/{correlationId}":{"put":{"description":"Requests an import of an externally edited media file (e.g. a\n         Canva design). The import will be processed asynchronously.","operationId":"MediaController_requestImportTask_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}},{"name":"correlationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"202":{"description":""},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to import this media item."},"404":{"description":"Media not found."},"422":{"description":"Media cannot be imported in its current state."}},"security":[{"personal-access-token":[]}],"summary":"Request a media import","tags":["media"]}},"/cats/v1/media/{id}":{"delete":{"description":"This will also delete any files that were uploaded.","operationId":"MediaController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to delete a media item."},"404":{"description":"Media not found."}},"security":[{"personal-access-token":[]}],"summary":"Delete media","tags":["media"]},"patch":{"operationId":"MediaController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUpdateCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalMedia"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to update the media item."},"404":{"description":"Media not found."}},"security":[{"personal-access-token":[]}],"summary":"Update media","tags":["media"]},"get":{"operationId":"MediaController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Media not found."}},"security":[{"personal-access-token":[]}],"summary":"Get media","tags":["media"]}},"/cats/v1/media/{id}/files":{"get":{"deprecated":true,"description":"This will return file metadata about the media file(s) we have\n         created as a result of processing your media uploads. Your\n         uploaded media is converted into formats suitable for digital\n         signage, so we may have more than one representation of your\n         media. The files can be downloaded using the URL of each file.","operationId":"MediaController_getFiles_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcessedFile"}}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Media not found."}},"security":[{"personal-access-token":[]}],"summary":"Get media files","tags":["media"]}},"/cats/v1/media/{id}/links":{"get":{"description":"This will return known URL links for the media file. The most\n         common use case is to download the media file, but other links\n         may be available - for example, editing the media file.","operationId":"MediaController_links_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MediaLink"}}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Media not found."}},"security":[{"personal-access-token":[]}],"summary":"Get media links","tags":["media"]}},"/cats/v1/screens/pair":{"post":{"operationId":"ScreenController_pair_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenPairCommand"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalScreen"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to pair the screen."},"422":{"description":"Update request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Pair screen","tags":["screen"]}},"/cats/v1/screens/{identity}":{"patch":{"operationId":"ScreenController_update_v1","parameters":[{"name":"identity","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenUpdateCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalScreen"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to configure the screen."},"422":{"description":"Update request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Configure screen","tags":["screen"]},"get":{"operationId":"ScreenController_getByIdentity_v1","parameters":[{"name":"identity","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Screen"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Screen not found."}},"security":[{"personal-access-token":[]}],"summary":"Get screen","tags":["screen"]},"delete":{"operationId":"ScreenController_delete_v1","parameters":[{"name":"identity","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Screen not found."}},"security":[{"personal-access-token":[]}],"summary":"Delete screen","tags":["screen"]}},"/cats/v1/screens/{identity}/screenshots":{"get":{"description":"Returns the most recent live screenshots taken of the screen.","operationId":"ScreenController_getScreenshotsByIdentity_v1","parameters":[{"name":"identity","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Screenshot"}}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Screen not found."},"422":{"description":"Screen not capable of taking screenshots."}},"security":[{"personal-access-token":[]}],"summary":"Get screenshots","tags":["screen"]}},"/cats/v1/screens":{"get":{"operationId":"ScreenController_list_v1","parameters":[{"name":"applicationVersion","required":false,"in":"query","description":"Filter by the application version.","schema":{"example":"1.0.3","type":"string"}},{"name":"runtime","required":false,"in":"query","description":"Filter by the application runtime - e.g. `ANDROID` or `BRIGHTSIGN`.","schema":{"type":"string","enum":["ANDROID","TIZEN","BRIGHTSIGN","WEB","WEBOS","WINDOWS","LINUX"]}},{"name":"tags","required":false,"in":"query","description":"Filter by a list of tags that all screens matching the filter must have.","schema":{"minItems":1,"type":"array","items":{"type":"string"}}},{"name":"groupId","required":false,"in":"query","description":"Filter by screens in a screen group.","schema":{"type":"number"}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Screen"}}}}]}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List screens","tags":["screen"]}},"/cats/v1/screens/{identity}/commands":{"post":{"description":"Dispatches a command to the screen. The screen must be online to\n         receive and process the command. This API response will include\n         the ID of the command, which can be used to query the status of\n         the command.","operationId":"ScreenController_dispatchCommand_v1","parameters":[{"name":"identity","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandDispatchRequestDTO"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Command"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Screen not found."},"422":{"description":"Command is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Dispatch command","tags":["screen"]}},"/cats/v1/screens/{identity}/commands/{id}":{"get":{"operationId":"ScreenController_getCommandById_v1","parameters":[{"name":"identity","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Command"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Screen or command not found."}},"security":[{"personal-access-token":[]}],"summary":"Get command","tags":["screen"]}},"/cats/v1/playlists":{"post":{"operationId":"PlaylistController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistCreateCommand"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalPlaylist"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to create the playlist."},"422":{"description":"Create request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Create playlist","tags":["playlist"]},"get":{"operationId":"PlaylistController_list_v1","parameters":[{"name":"folderId","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Playlist"}}}}]}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List playlists","tags":["playlist"]}},"/cats/v1/playlists/{id}/duplicate":{"post":{"description":"Duplicates a playlist, including all of its items. The new\n         playlist will be created in the same folder as the original and\n         will have the same name with the suffix `(duplicate)`.","operationId":"PlaylistController_duplicate_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalPlaylist"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to duplicate the playlist."}},"security":[{"personal-access-token":[]}],"summary":"Duplicate playlist","tags":["playlist"]}},"/cats/v1/playlists/{id}":{"patch":{"operationId":"PlaylistController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistUpdateCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalPlaylist"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to update the playlist."},"422":{"description":"Update request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Update playlist","tags":["playlist"]},"delete":{"description":"The deleted playlist will automatically be removed from playlists\n         where it is a sub playlist, and any zones that reference it. The\n         playlist will be unpublished from screens.","operationId":"PlaylistController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to delete the playlist."},"409":{"description":"Playlist does not exist."}},"security":[{"personal-access-token":[]}],"summary":"Delete playlist","tags":["playlist"]},"get":{"operationId":"PlaylistController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Playlist"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Playlist not found."}},"security":[{"personal-access-token":[]}],"summary":"Get playlist","tags":["playlist"]}},"/cats/v1/playlists/{id}/publish":{"post":{"description":"Publishes the playlist to the targeted screens or screen groups.\nThis process is asynchronous and will return once the targets have been\nvalidated. The status of the publishing process can be queried using the\nreturned job id.","operationId":"PlaylistController_publish_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistPublishCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishJob"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to publish the playlist, or to publish to the target screen or screen group."},"422":{"description":"Publish request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Publish playlist","tags":["playlist"]}},"/cats/v1/schedules":{"post":{"operationId":"ScheduleController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleCreateCommand"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalSchedule"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to create the schedule."},"422":{"description":"Create request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Create schedule","tags":["schedule"]},"get":{"operationId":"ScheduleController_list_v1","parameters":[{"name":"folderId","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Schedule"}}}}]}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List schedules","tags":["schedule"]}},"/cats/v1/schedules/{id}":{"patch":{"operationId":"ScheduleController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleUpdateCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalSchedule"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to update the schedule."},"422":{"description":"Update request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Update schedule","tags":["schedule"]},"delete":{"description":"The deleted schedule will automatically be removed from any\n         screens or screen groups that reference it.","operationId":"ScheduleController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to delete the schedule."},"409":{"description":"Schedule does not exist."}},"security":[{"personal-access-token":[]}],"summary":"Delete schedule","tags":["schedule"]},"get":{"operationId":"ScheduleController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Schedule not found."}},"security":[{"personal-access-token":[]}],"summary":"Get schedule","tags":["schedule"]}},"/cats/v1/schedules/{id}/duplicate":{"post":{"description":"Duplicates a schedule, including all of its events. The new\n         schedule will be created in the same folder as the original and\n         will have the same name with the suffix ` (duplicate)`.","operationId":"ScheduleController_duplicate_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalSchedule"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to duplicate the schedule."}},"security":[{"personal-access-token":[]}],"summary":"Duplicate schedule","tags":["schedule"]}},"/cats/v1/schedules/{id}/publish":{"post":{"description":"Publishes the schedule to the targeted screens or screen groups.\nThis process is asynchronous and will return once the targets have been\nvalidated. The status of the publishing process can be queried using the\nreturned job id.","operationId":"ScheduleController_publish_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePublishCommandDTO"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishJob"}}}},"400":{"description":"Bad request."},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to publish the schedule, or to publish to the target screen or screen group."},"422":{"description":"Publish request is invalid."}},"security":[{"personal-access-token":[]}],"summary":"Publish schedule","tags":["schedule"]}},"/cats/v1/tags":{"post":{"operationId":"TagController_create_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreateCommand"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalTag"}}}},"400":{"description":"Bad request."},"409":{"description":"Tag with the same name already exists."}},"security":[{"personal-access-token":[]}],"summary":"Create tag","tags":["tag"]},"get":{"operationId":"TagController_list_v1","parameters":[{"name":"name","required":false,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Tag"}}}}]}}}}},"security":[{"personal-access-token":[]}],"summary":"List tags","tags":["tag"]}},"/cats/v1/tags/{id}":{"get":{"operationId":"TagController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag"}}}},"404":{"description":"Tag not found."}},"security":[{"personal-access-token":[]}],"summary":"Get tag","tags":["tag"]},"patch":{"operationId":"TagController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagUpdateCommand"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag"}}}},"404":{"description":"Tag not found."},"409":{"description":"New name already exists."}},"security":[{"personal-access-token":[]}],"summary":"Update tag","tags":["tag"]},"delete":{"operationId":"TagController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""},"404":{"description":"Tag not found."}},"security":[{"personal-access-token":[]}],"summary":"Delete tag","tags":["tag"]}},"/cats/v1/screen-groups":{"get":{"operationId":"ScreenGroupController_list_v1","parameters":[{"name":"parentId","required":false,"in":"query","schema":{"nullable":true,"type":"number"}},{"name":"offset","required":true,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"minimum":1,"default":10,"type":"number"}},{"name":"sort","required":false,"in":"query","description":"Optional sort in the format `field:dir` where `dir` is `asc` or `desc`.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.]+:(asc|desc)$"},"examples":{"desc":{"value":"id:desc"},"asc":{"value":"id:asc"}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SwaggerPaginatedResult"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ScreenGroup"}}}}]}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."}},"security":[{"personal-access-token":[]}],"summary":"List screen groups","tags":["screen-group"]}},"/cats/v1/screen-groups/{id}":{"get":{"operationId":"ScreenGroupController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenGroup"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Screen group not found."}},"security":[{"personal-access-token":[]}],"summary":"Get screen group","tags":["screen-group"]}},"/cats/v1/publish/{id}":{"get":{"operationId":"PublishController_getJobById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishJob"}}}},"401":{"description":"Not authenticated."},"403":{"description":"Not authorised to access this resource."},"404":{"description":"Job not found."}},"security":[{"personal-access-token":[]}],"summary":"Get publish job","tags":["publish"]}}},"info":{"title":"Fusion Signage API","description":"","version":"1.0","contact":{}},"tags":[{"name":"folder","description":"Folders are used to organise digital signage content, including media, playlists and schedules, for easier management."},{"name":"asset","description":"Assets provide a unified, high-level representation of all supported digital signage content, such as media, playlists and schedules."},{"name":"media","description":"Media represents visual content such as images, videos, web pages and dynamic templates that can be added to playlists."},{"name":"playlist","description":"Playlists are collections of media items with specific playback settings. Playlists are used to deploy content to screens."},{"name":"schedule","description":"Schedules are collections of playlists with specific timing and recurrence rules. Schedules are used to automate content playback on screens across different dates and times."},{"name":"screen","description":"Screens are the hardware devices running the signage player application to display your content."},{"name":"tag","description":"Tags are custom attributes that can be applied to media and screens to help organise and filter your digital signage content."}],"servers":[],"components":{"securitySchemes":{"personal-access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","name":"Authorization","description":"Authenticate using a personal access token for your account.\n        \nReview [our support site](https://support.fusionsignage.com.au/en/articles/12636349-personal-access-tokens) for details on how to get a personal access token.\n        ","in":"header"}},"schemas":{"FolderCrudPermissions":{"type":"object","properties":{"create":{"type":"boolean"},"read":{"type":"boolean"},"update":{"type":"boolean"},"delete":{"type":"boolean"}},"required":["create","read","update","delete"]},"FolderAssetPermissions":{"type":"object","properties":{"create":{"type":"object"}},"required":["create"]},"FolderMediaPermissions":{"type":"object","properties":{"create":{"type":"object"}},"required":["create"]},"FolderPermissions":{"type":"object","properties":{"folder":{"$ref":"#/components/schemas/FolderCrudPermissions"},"asset":{"$ref":"#/components/schemas/FolderAssetPermissions"},"media":{"$ref":"#/components/schemas/FolderMediaPermissions"}},"required":["folder","asset","media"]},"Folder":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"type":{"type":"string","enum":["STANDARD","LOCATION"]},"parentId":{"type":"number"},"assetCount":{"type":"number"},"sortSequence":{"type":"number"},"permissions":{"$ref":"#/components/schemas/FolderPermissions"}},"required":["id","name","type","assetCount","sortSequence","permissions"]},"FolderListRootPermissions":{"type":"object","properties":{"folder":{"type":"object"}},"required":["folder"]},"FolderList":{"type":"object","properties":{"folders":{"type":"array","items":{"$ref":"#/components/schemas/Folder"}},"rootPermissions":{"$ref":"#/components/schemas/FolderListRootPermissions"}},"required":["folders","rootPermissions"]},"FolderCreateCommand":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":250},"parentId":{"type":"number","nullable":true,"description":"Leave null to create a root folder."},"sortSequence":{"type":"number","description":"A comparable number representing the sortable sequence of this folder\nrelative to its siblings. Does not need to be in a precise incremental\norder - e.g. 1, 2, 3 or 1, 10, 100 will be accepted.\n\nIf this matches the sort sequence of a sibling, then siblings will be\nshifted to achieve the desired sort order. There is no guarantee that the\nvalue you provide will be used exactly as-is."}},"required":["name"]},"MinimalFolder":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},"FolderUpdateCommandDTO":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":250},"parentId":{"type":"number","nullable":true,"description":"Leave null to create a root folder."},"sortSequence":{"type":"number","description":"A comparable number representing the sortable sequence of this folder\nrelative to its siblings. Does not need to be in a precise incremental\norder - e.g. 1, 2, 3 or 1, 10, 100 will be accepted.\n\nIf this matches the sort sequence of a sibling, then siblings will be\nshifted to achieve the desired sort order. There is no guarantee that the\nvalue you provide will be used exactly as-is."}}},"SwaggerPaginatedResult":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items that match the query across the entire dataset, not just the current page. Use this to calculate the number of pages (e.g., Math.ceil(total / limit))."},"offset":{"type":"number","description":"Zero-based index of the first item in this page relative to the full result set. Equivalent to SQL OFFSET or \"skip\". For the first page this is typically 0. Must be < total to contain data."},"limit":{"type":"number","description":"Maximum number of items requested per page. The actual number of items returned (data.length) may be less than or equal to this value, especially on the final page."},"data":{"additionalProperties":false,"description":"Items for the current page. Length is <= limit and may be 0 when there are no results or when offset >= total.","type":"array","items":{"type":"object"}}},"required":["total","offset","limit","data"]},"Origin":{"type":"object","properties":{"mediaType":{"type":"string","description":"The type of media you are creating.","enum":["IMAGE","VIDEO","WIDGET","WEBSITE","CANVA","POWER_BI","TABLEAU","DESIGN","ZONE"]},"source":{"type":"string","description":"The source of the media file. Media uploaded directly should use\n`PROVIDED`. The server will download `EXTERNAL` media on the caller's\nbehalf. `HOSTED` media will never be downloaded.\n\n**IMPORTANT:** `EXTERNAL` media is only downloaded from a domain allowlist\nthat we maintain. Please contact support to get your domain added to the\nallowlist.","enum":["PROVIDED","EXTERNAL","HOSTED"]},"url":{"type":"string","format":"uri"}},"required":["mediaType","source"]},"Dimensions":{"type":"object","properties":{"width":{"type":"number"},"height":{"type":"number"}},"required":["width","height"]},"Thumbnail":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]},"MinimalProcessedFile":{"type":"object","properties":{"format":{"type":"string"},"sizeInBytes":{"type":"number"}},"required":["format","sizeInBytes"]},"MediaAsset":{"type":"object","properties":{"type":{"enum":["PLAYLIST","SCHEDULE","MEDIA"],"type":"string","default":"MEDIA"},"origin":{"$ref":"#/components/schemas/Origin"},"status":{"type":"string","enum":["CREATED","IMPORTING","UPLOADING","PROCESSING","READY","FAILED"]},"durationInSeconds":{"type":"number"},"dimensions":{"$ref":"#/components/schemas/Dimensions"},"thumbnail":{"$ref":"#/components/schemas/Thumbnail"},"files":{"type":"array","items":{"$ref":"#/components/schemas/MinimalProcessedFile"}},"usageCount":{"type":"number"},"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"},"lastUpdated":{"format":"date-time","type":"string"}},"required":["type","origin","status","usageCount","id","name","folder"]},"PlaylistAsset":{"type":"object","properties":{"type":{"enum":["PLAYLIST","SCHEDULE","MEDIA"],"type":"string","default":"PLAYLIST"},"durationInSeconds":{"type":"number"},"itemCount":{"type":"number"},"usageCount":{"type":"number"},"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"},"lastUpdated":{"format":"date-time","type":"string"}},"required":["type","durationInSeconds","itemCount","usageCount","id","name","folder"]},"ScheduleAsset":{"type":"object","properties":{"type":{"enum":["PLAYLIST","SCHEDULE","MEDIA"],"type":"string","default":"SCHEDULE"},"itemCount":{"type":"number"},"usageCount":{"type":"number"},"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"},"lastUpdated":{"format":"date-time","type":"string"}},"required":["type","itemCount","usageCount","id","name","folder"]},"MinimalAsset":{"type":"object","properties":{"id":{"type":"number"},"type":{"type":"string","enum":["PLAYLIST","SCHEDULE","MEDIA"]}},"required":["id","type"]},"BulkMoveCommand":{"type":"object","properties":{"folderId":{"type":"number","description":"The destination folder id to move the assets to."},"assets":{"description":"The assets to move.","minItems":1,"type":"array","items":{"$ref":"#/components/schemas/MinimalAsset"}}},"required":["folderId","assets"]},"BulkDeleteCommand":{"type":"object","properties":{"assets":{"description":"The assets to delete.","minItems":1,"type":"array","items":{"$ref":"#/components/schemas/MinimalAsset"}}},"required":["assets"]},"WebsiteOptions":{"type":"object","properties":{"cookie":{"type":"string","description":"The cookie to use when accessing the website. \\\\","example":"cookieName=cookieValue"}}},"PowerBiOptions":{"type":"object","properties":{"pageName":{"type":"string","description":"The page to load when the Power BI report is opened."}}},"TableauOptions":{"type":"object","properties":{"viewId":{"type":"string","description":"The view to load when the Tableau report is opened."}}},"DesignOptions":{"type":"object","properties":{"overlay":{"type":"boolean","description":"Has the design been created to be used as an overlay? This setting affects\nhow the design is managed by players."},"backgroundVideoUrl":{"type":"string","description":"The background video to play behind the design. This video is assumed to\nbe a provided video that has already been uploaded into the CMS.","format":"uri"}},"required":["overlay"]},"WidgetOptions":{"type":"object","properties":{"viewMode":{"type":"string","description":"The view mode to use when rendering the widget. View modes include:\n* `DEFAULT` - The default view mode.\n* `OVERLAY` - The widget can be used as an overlay. It will be rendered in\nas a transparent overlay and can no longer be used as a standalone playlist\nitem.\n* `INTERACTIVE` - The widget can be used as an interactive widget. Use this\nto support kiosk-like widgets.","enum":["DEFAULT","OVERLAY","INTERACTIVE"]}},"required":["viewMode"]},"CanvaOptions":{"type":"object","properties":{"width":{"type":"number","minimum":1},"height":{"type":"number","minimum":1},"exportTarget":{"type":"string","enum":["VIDEO","IMAGE"]}},"required":["width","height","exportTarget"]},"MediaCreateCommand":{"type":"object","properties":{"options":{"description":"Specific options related to the media type.","anyOf":[{"$ref":"#/components/schemas/WebsiteOptions"},{"$ref":"#/components/schemas/PowerBiOptions"},{"$ref":"#/components/schemas/TableauOptions"},{"$ref":"#/components/schemas/DesignOptions"},{"$ref":"#/components/schemas/WidgetOptions"},{"$ref":"#/components/schemas/CanvaOptions"}]},"origin":{"description":"The origin of the media item. This includes the type of media and where it\nis located.","allOf":[{"$ref":"#/components/schemas/Origin"}]},"name":{"type":"string","description":"The publicly visible name of the media item. This could be the file name or\na human-readable name.","maxLength":150},"folderId":{"type":"number","description":"The folder to store the media item in."}},"required":["origin","name","folderId"]},"MinimalMedia":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"}},"required":["id","name","folder"]},"MediaUploadStartResponse":{"type":"object","properties":{"uploadUrl":{"type":"string"}},"required":["uploadUrl"]},"MediaUploadCompleteCommandDTO":{"type":"object","properties":{"uploadUrl":{"type":"string","format":"uri"},"contentType":{"type":"string"}},"required":["uploadUrl","contentType"]},"MediaUpdateCommandDTO":{"type":"object","properties":{"name":{"type":"string","maxLength":150},"folderId":{"type":"number","description":"The folder to move the media item to."}}},"Media":{"type":"object","properties":{"id":{"type":"number"},"origin":{"description":"The origin of the media item when it was uploaded.","allOf":[{"$ref":"#/components/schemas/Origin"}]},"name":{"type":"string","description":"The display name of the media item."},"folder":{"description":"The folder the media item is stored in.","allOf":[{"$ref":"#/components/schemas/MinimalFolder"}]},"status":{"description":"The status of the media item. A media item not in a READY status will not\nbe publishable to screens.","enum":["CREATED","IMPORTING","UPLOADING","PROCESSING","READY","FAILED"],"type":"string"},"options":{"type":"object","description":"Any user-provided configuration options related to the media item."},"thumbnail":{"description":"The thumbnail image for the media item.","allOf":[{"$ref":"#/components/schemas/Thumbnail"}]},"durationInSeconds":{"type":"number","description":"The duration of the media item in seconds, if relevant."},"dimensions":{"description":"The dimensions of the media item in pixels, if relevant.","allOf":[{"$ref":"#/components/schemas/Dimensions"}]},"created":{"format":"date-time","type":"string","description":"The UTC date and time the media was created."}},"required":["id","origin","name","folder","status","created"]},"ProcessedFile":{"type":"object","properties":{"format":{"type":"string"},"url":{"type":"string","format":"uri"},"sizeInBytes":{"type":"number"}},"required":["format","url","sizeInBytes"]},"MediaLink":{"type":"object","properties":{"type":{"type":"string","description":"The link type - for example, a `DOWNLOAD` link, an `EDIT` link.","enum":["DOWNLOAD","EDIT","VIEW"]},"url":{"type":"string","description":"The link destination URL.","format":"uri"}},"required":["type","url"]},"Metadata":{"type":"object","properties":{"tags":{"description":"An array of tags to assign to the screen.","type":"array","items":{"type":"string"}},"fields":{"type":"object","description":"Custom fields to assign to the screen."}},"required":["tags","fields"]},"ScreenPairCommand":{"type":"object","properties":{"pairingCode":{"type":"string","description":"The pairing code that is viewable on the screen."},"licenceNumber":{"type":"string","description":"The licence to assign to the screen. If not provided, then the next\navailable licence will be assigned."},"displayName":{"type":"string","description":"The screen name viewable in the CMS."},"ianaTimezone":{"type":"string","description":"The IANA timezone to assign to the screen."},"metadata":{"$ref":"#/components/schemas/Metadata"}},"required":["pairingCode","displayName","ianaTimezone"]},"MinimalScreen":{"type":"object","properties":{"identity":{"type":"string"},"displayName":{"type":"string"}},"required":["identity","displayName"]},"ScreenUpdateCommandDTO":{"type":"object","properties":{"displayName":{"type":"string","description":"The screen name viewable in the CMS."},"ianaTimezone":{"type":"string","description":"The IANA timezone to assign to the screen."},"metadata":{"$ref":"#/components/schemas/Metadata"}}},"MinimalLicence":{"type":"object","properties":{"licenceLevel":{"type":"string","enum":["BASIC","ADVANCED","PRO","DEMO","TRIAL"]},"licenceNumber":{"type":"string"},"term":{"type":"object"},"expiresAt":{"format":"date-time","type":"string"}},"required":["licenceLevel","licenceNumber","term","expiresAt"]},"MinimalScreenGroup":{"type":"object","properties":{"id":{"type":"number","description":"The ID of the screen group."},"name":{"type":"string","description":"The name of the screen group."}},"required":["id","name"]},"Configuration":{"type":"object","properties":{"displayName":{"type":"string","description":"The screen name viewable in the CMS."},"ianaTimezone":{"type":"string","description":"The assigned IANA timezone for this screen."},"metadata":{"description":"Metadata about the screen.","allOf":[{"$ref":"#/components/schemas/Metadata"}]},"licence":{"description":"The screen's assigned licence.","allOf":[{"$ref":"#/components/schemas/MinimalLicence"}]},"groups":{"description":"Groups that the screen is a member of.","type":"array","items":{"$ref":"#/components/schemas/MinimalScreenGroup"}}},"required":["displayName","ianaTimezone","metadata","groups"]},"OperatingSystem":{"type":"object","properties":{"name":{"type":"string","description":"The operating system name, such as Windows, BrightSign, Android, etc.\nThis will almost always typically mirror the `runtime`."},"version":{"type":"string","description":"The operating system version. This will typically be the major version -\nfor example, Windows would have versions 10 or 11; BrightSign has OS\nversions 8, 9, Android has 5 through 13, etc."},"build":{"type":"string","description":"Qualifying information about the operating system build. This might be\na Windows patch, or a firmware version, or the user agent, etc."}},"required":["name","version"]},"Memory":{"type":"object","properties":{"bytesAvailable":{"type":"number","description":"The number of bytes of RAM available to the device."},"bytesTotal":{"type":"number","description":"The number of bytes of RAM in total on the device."}},"required":["bytesAvailable","bytesTotal"]},"SystemInfo":{"type":"object","properties":{"brand":{"type":"string","description":"The device brand, such as Philips, Samsung, or LG."},"model":{"type":"string","description":"The device model, such as BDL4050D or QMC."},"os":{"description":"The device operating system version-related information.","allOf":[{"$ref":"#/components/schemas/OperatingSystem"}]},"serialNumber":{"type":"string","description":"The device serial number. This serial number is typically unique to the\nbrand and model."},"memory":{"description":"The most recent reported memory usage from the device.","allOf":[{"$ref":"#/components/schemas/Memory"}]},"cpuPercent":{"type":"number","description":"The most recent reported CPU usage from the device as an aggregated\npercentage. The specifics of how this is calculated will vary depending on\nthe device and its operating system.\n\nThe range will be between 0 and 100."},"temperatureCelsius":{"type":"object","description":"The most recent reported temperature from the device per source."}}},"Display":{"type":"object","properties":{"dimensions":{"$ref":"#/components/schemas/Dimensions"},"orientation":{"type":"string","enum":["PORTRAIT","LANDSCAPE","PORTRAIT_FLIPPED","LANDSCAPE_FLIPPED"]}}},"Application":{"type":"object","properties":{"runtime":{"type":"string","enum":["ANDROID","TIZEN","BRIGHTSIGN","WEB","WEBOS","WINDOWS","LINUX"]},"version":{"type":"string"}},"required":["runtime","version"]},"Health":{"type":"object","properties":{"lastSeen":{"format":"date-time","type":"string","description":"The last time this device contacted our servers."},"connectivity":{"type":"string","description":"The connectivity status. This may be inferred from the `lastSeen` date if\nmore accurate information is not available.","enum":["ONLINE","OFFLINE"]}},"required":["connectivity"]},"DeviceReport":{"type":"object","properties":{"systemInfo":{"description":"The device system information such as memory, model, and serial number.","allOf":[{"$ref":"#/components/schemas/SystemInfo"}]},"display":{"description":"The device's display information such as dimensions and orientation.\nThe display may be built-in or external.","allOf":[{"$ref":"#/components/schemas/Display"}]},"application":{"description":"The signage application that is currently running on the device.","allOf":[{"$ref":"#/components/schemas/Application"}]},"capabilities":{"type":"array","description":"A capability maps to a specific feature or attribute of a device. In the\ncase of attributes, such as reading the model or brand, you should expect\nthat a device without the capability will not return this information under\nthe deviceReport property.","items":{"type":"string","enum":["MODEL","BRAND","SERIAL_NUMBER","MEMORY","CPU","TEMPERATURE","RESTART_SYSTEM","TAKE_SCREENSHOT","UPLOAD_LOGS","UPGRADE_APPLICATION","DOWNGRADE_APPLICATION","CLEAR_CACHE"]}},"health":{"description":"Aggregated indicators about the health of the device.","allOf":[{"$ref":"#/components/schemas/Health"}]}},"required":["application","capabilities","health"]},"Content":{"type":"object","properties":{"type":{"type":"string","enum":["DIRECT","SCREEN_GROUP"]},"source":{"type":"string","description":"The source of the content that is playing.","enum":["PLAYLIST","SCHEDULE","INTERACTIVE"]},"id":{"type":"number","description":"The ID of the content that is playing. For example, this would be a\nplaylist ID if the source were `PLAYLIST`."},"name":{"type":"string","description":"The name of the content that is playing. For example, this would be the\nplaylist name if the source were `PLAYLIST`."},"playingSince":{"format":"date-time","type":"string","description":"The date and time when the content started playing on the screen."}},"required":["type","source","id","name","playingSince"]},"State":{"type":"object","properties":{"type":{"type":"string","enum":["IDLE","UNKNOWN","UPDATING_APPLICATION","PLAYING_CONTENT"]},"reportedAt":{"format":"date-time","type":"string"}},"required":["type","reportedAt"]},"Screen":{"type":"object","properties":{"identity":{"type":"string","description":"The short code that identifies the screen."},"configuration":{"description":"Configuration applied to the application running on the screen.","allOf":[{"$ref":"#/components/schemas/Configuration"}]},"deviceReport":{"description":"The most recent reported information from the device.","allOf":[{"$ref":"#/components/schemas/DeviceReport"}]},"content":{"description":"What content is the screen playing?","allOf":[{"$ref":"#/components/schemas/Content"}]},"state":{"description":"The reported or computed screen state. For example, a screen may be\nattempting an update or downloading content. At the time of writing, there\nare only a minimal number of state transitions supported.","allOf":[{"$ref":"#/components/schemas/State"}]},"permissions":{"type":"object","properties":{"read":{"type":"boolean"},"update":{"type":"boolean"},"delete":{"type":"boolean"}},"required":["read","update","delete"]}},"required":["identity","configuration","state","permissions"]},"Screenshot":{"type":"object","properties":{"url":{"type":"string","description":"The public URL of the screenshot that can be embedded in an <img/> tag.\nThis URL will expire. If long-term viewing is required, it should be either\ndownloaded or you can re-fetch the screenshot and get a new URL."},"takenAt":{"format":"date-time","type":"string","description":"The date and time that the screenshot was taken."}},"required":["url","takenAt"]},"CommandDispatchRequestDTO":{"type":"object","properties":{"type":{"enum":["TAKE_SCREENSHOT","UPGRADE_APPLICATION","CLEAR_CACHE"],"type":"string"},"payload":{"type":"object"}},"required":["type"]},"Command":{"type":"object","properties":{"id":{"type":"string"},"targetIdentity":{"type":"string"},"type":{"enum":["TAKE_SCREENSHOT","UPGRADE_APPLICATION","CLEAR_CACHE"],"type":"string"},"payload":{"type":"object"},"status":{"enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED"],"type":"string"}},"required":["id","targetIdentity","type","status"]},"AndPredicate":{"type":"object","properties":{"conditions":{"type":"array","minItems":1,"items":{"oneOf":[{"$ref":"#/components/schemas/AndPredicate"},{"$ref":"#/components/schemas/OrPredicate"},{"$ref":"#/components/schemas/NotPredicate"},{"$ref":"#/components/schemas/ScreenTagEqualsPredicate"},{"$ref":"#/components/schemas/DateRangePredicate"}]}},"type":{"enum":["AND","OR","NOT","SCREEN_TAG_EQUALS","DATE_RANGE"],"type":"string","default":"AND"}},"required":["conditions","type"]},"OrPredicate":{"type":"object","properties":{"conditions":{"type":"array","minItems":1,"items":{"oneOf":[{"$ref":"#/components/schemas/AndPredicate"},{"$ref":"#/components/schemas/OrPredicate"},{"$ref":"#/components/schemas/NotPredicate"},{"$ref":"#/components/schemas/ScreenTagEqualsPredicate"},{"$ref":"#/components/schemas/DateRangePredicate"}]}},"type":{"enum":["AND","OR","NOT","SCREEN_TAG_EQUALS","DATE_RANGE"],"type":"string","default":"OR"}},"required":["conditions","type"]},"NotPredicate":{"type":"object","properties":{"condition":{"oneOf":[{"$ref":"#/components/schemas/AndPredicate"},{"$ref":"#/components/schemas/OrPredicate"},{"$ref":"#/components/schemas/NotPredicate"},{"$ref":"#/components/schemas/ScreenTagEqualsPredicate"},{"$ref":"#/components/schemas/DateRangePredicate"}]},"type":{"enum":["AND","OR","NOT","SCREEN_TAG_EQUALS","DATE_RANGE"],"type":"string","default":"NOT"}},"required":["condition","type"]},"ScreenTagEqualsPredicate":{"type":"object","properties":{"type":{"enum":["AND","OR","NOT","SCREEN_TAG_EQUALS","DATE_RANGE"],"type":"string","default":"SCREEN_TAG_EQUALS"},"value":{"type":"string","maxLength":255}},"required":["type","value"]},"DateRangePredicate":{"type":"object","properties":{"type":{"enum":["AND","OR","NOT","SCREEN_TAG_EQUALS","DATE_RANGE"],"type":"string","default":"DATE_RANGE"},"startDate":{"type":"string","description":"The local date that this playlist item can start playing."},"endDate":{"type":"string","description":"The local date that this playlist item must stop playing."},"daysOfWeek":{"type":"array","description":"The days of the week that the playlist item should play. Must have at least\none day selected.","minItems":1,"items":{"type":"string","enum":["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]}},"fromTime":{"type":"string","description":"The time that this playlist item will start playing. This is evaluated\nseparately to the startDate and will be evaluated on each day of the week."},"toTime":{"type":"string","description":"The time that this playlist item will stop playing. This is evaluated\nseparately to the endDate and will be evaluated on each day of the week."}},"required":["type","startDate","daysOfWeek","fromTime","toTime"]},"PlaylistItemOptions":{"type":"object","properties":{"rules":{"description":"The rules that must be met for this playlist item to be played.\n\n**IMPORTANT**: This item is for advanced usage only. Please reach out to\nsupport@fusionsignage.com.au if you plan to use it. Only certain\ncombinations of rule predicates are supported currently.","oneOf":[{"$ref":"#/components/schemas/AndPredicate"},{"$ref":"#/components/schemas/OrPredicate"},{"$ref":"#/components/schemas/NotPredicate"},{"$ref":"#/components/schemas/ScreenTagEqualsPredicate"},{"$ref":"#/components/schemas/DateRangePredicate"}]},"fitSetting":{"type":"string","description":"The fit setting to apply to the playlist item. Fit settings adjust how the\nmedia is rendered when the media size does not match the resolution of the\nscreen.\n\nFor best performance we strongly recommend you use the setting `FIT`.\n\nIf not set we will use the default settings configured against your\naccount.","enum":["FIT","FILL","STRETCH"]}}},"MediaPlaylistItemRequestDTO":{"type":"object","properties":{"type":{"enum":["MEDIA","SUB_PLAYLIST"],"type":"string","default":"MEDIA"},"mediaId":{"type":"number","description":"The ID of the media item."},"durationInSeconds":{"type":"number","description":"The duration (in seconds) that the item should play for before the playlist\nmoves to the next item. If not provided, the account's default playlist\nitem duration will be applied.\n\nThis value has no effect on video media. The actual length of the video\nwill always supersede this value."},"enabled":{"type":"boolean","description":"When false, the playlist item will be treated as if it does not exist."},"options":{"description":"Optional settings to apply to the playlist item.","allOf":[{"$ref":"#/components/schemas/PlaylistItemOptions"}]}},"required":["type","mediaId","enabled"]},"SubPlaylistPlaylistItemRequestDTO":{"type":"object","properties":{"type":{"enum":["MEDIA","SUB_PLAYLIST"],"type":"string","default":"SUB_PLAYLIST"},"playlistId":{"type":"number","description":"The ID of the sub-playlist."},"enabled":{"type":"boolean","description":"When false, the playlist item will be treated as if it does not exist."},"options":{"description":"Optional settings to apply to the playlist item.","allOf":[{"$ref":"#/components/schemas/PlaylistItemOptions"}]}},"required":["type","playlistId","enabled"]},"Overlay":{"type":"object","properties":{"mediaId":{"type":"number","description":"The ID of the media item to overlay over the playlist. Must be a media item\nof type DESIGN that has been configured as an overlay in Designer."},"fitSetting":{"type":"string","description":"The fit setting to apply to the playlist item. Fit settings adjust how the\nmedia is rendered when the media size does not match the resolution of the\nscreen.\n\nFor best performance we strongly recommend you use the setting `FIT`.","enum":["FIT","FILL","STRETCH"]}},"required":["mediaId"]},"PlaylistCreateCommand":{"type":"object","properties":{"items":{"type":"array","description":"The items to play in this playlist. These can be media items or another\nplaylist.\n\nThe order of items in this list determines the order they will be played.","items":{"oneOf":[{"$ref":"#/components/schemas/MediaPlaylistItemRequestDTO"},{"$ref":"#/components/schemas/SubPlaylistPlaylistItemRequestDTO"}]}},"name":{"type":"string","description":"The name of the playlist that provides context for the content or details\nabout its purpose.","maxLength":150},"folderId":{"type":"number","description":"The folder to store playlist in."},"overlay":{"description":"An optional overlay to apply to the playlist. The configured media will\noverlay the entire playlist. Use this to display logos, clocks, tickers\nthroughout your entire playlist.","allOf":[{"$ref":"#/components/schemas/Overlay"}]}},"required":["items","name","folderId"]},"MinimalPlaylist":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"}},"required":["id","name","folder"]},"PlaylistUpdateCommandDTO":{"type":"object","properties":{"items":{"type":"array","description":"The items to play in this playlist. These can be media items or another\nplaylist.\n\nThe order of items in this list determines the order they will be played.","items":{"oneOf":[{"$ref":"#/components/schemas/MediaPlaylistItemRequestDTO"},{"$ref":"#/components/schemas/SubPlaylistPlaylistItemRequestDTO"}]}},"name":{"type":"string","description":"The name of the playlist that provides context for the content or details\nabout its purpose.","maxLength":150},"folderId":{"type":"number","description":"The folder to store playlist in."},"overlay":{"description":"An optional overlay to apply to the playlist. The configured media will\noverlay the entire playlist. Use this to display logos, clocks, tickers\nthroughout your entire playlist.","allOf":[{"$ref":"#/components/schemas/Overlay"}]}}},"ScreenTargets":{"type":"object","properties":{"identities":{"minItems":1,"type":"array","items":{"type":"string"}},"tags":{"minItems":1,"type":"array","items":{"type":"string"}},"groupIds":{"minItems":1,"type":"array","items":{"type":"number"}}}},"PlaylistPublishCommandDTO":{"type":"object","properties":{"targets":{"description":"The target screens to publish the playlist to.","allOf":[{"$ref":"#/components/schemas/ScreenTargets"}]}},"required":["targets"]},"PublishJobScreenState":{"type":"object","properties":{"identity":{"type":"string"},"status":{"type":"string","enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED"]},"updatedAt":{"format":"date-time","type":"string"}},"required":["identity","status","updatedAt"]},"PublishJob":{"type":"object","properties":{"id":{"type":"string"},"status":{"enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"screens":{"type":"array","items":{"$ref":"#/components/schemas/PublishJobScreenState"}}},"required":["id","status","createdAt","updatedAt","screens"]},"PlaylistItem":{"type":"object","properties":{"type":{"type":"string","enum":["MEDIA","SUB_PLAYLIST"]},"enabled":{"type":"boolean","description":"When false, the playlist item will be treated as if it does not exist."},"options":{"description":"Optional settings to apply to the playlist item.","allOf":[{"$ref":"#/components/schemas/PlaylistItemOptions"}]}},"required":["type","enabled"]},"Playlist":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"},"items":{"type":"array","items":{"$ref":"#/components/schemas/PlaylistItem"}},"overlay":{"$ref":"#/components/schemas/Overlay"},"permissions":{"type":"object","properties":{"update":{"type":"boolean"},"delete":{"type":"boolean"}},"required":["update","delete"]}},"required":["id","name","folder","items","permissions"]},"Event":{"type":"object","properties":{"playlistId":{"type":"number","description":"The ID of the playlist that will be played during this event."},"startDate":{"type":"string","description":"The local date that the playlist will start playing."},"endDate":{"type":"string","description":"The local date that the playlist will stop playing."},"daysOfWeek":{"type":"array","description":"The days of the week that the playlist will play. Must have at least\none day selected.","minItems":1,"items":{"type":"string","enum":["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]}},"fromTime":{"type":"string","description":"The local time that this playlist will start playing. This is evaluated\nseparately to the startDate and will be evaluated on each day of the week."},"toTime":{"type":"string","description":"The local time that this playlist will stop playing. This is evaluated\nseparately to the endDate and will be evaluated on each day of the week."}},"required":["playlistId","startDate","daysOfWeek","fromTime","toTime"]},"ScheduleCreateCommand":{"type":"object","properties":{"defaultPlaylistId":{"type":"number","description":"The ID of the playlist that will be played when no event is currently\nactive."},"name":{"type":"string","description":"The name of the schedule that provides context for the content or details\nabout its purpose.","maxLength":250},"folderId":{"type":"number","description":"The folder to store the schedule in."},"events":{"description":"A list of events associated with the schedule. Each event represents a\nspecific playlist to be displayed at a particular date and time","type":"array","items":{"$ref":"#/components/schemas/Event"}}},"required":["name","folderId","events"]},"MinimalSchedule":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"}},"required":["id","name","folder"]},"ScheduleUpdateCommandDTO":{"type":"object","properties":{"name":{"type":"string","description":"The name of the schedule that provides context for the content or details\nabout its purpose.","maxLength":250},"folderId":{"type":"number","description":"The folder to store the schedule in."},"events":{"description":"A list of events associated with the schedule. Each event represents a\nspecific playlist to be displayed at a particular date and time","type":"array","items":{"$ref":"#/components/schemas/Event"}},"defaultPlaylistId":{"type":"number","nullable":true,"description":"The ID of the playlist that will be played when no event is currently\nactive. Set to null to clear out an existing default playlist."}}},"SchedulePublishCommandDTO":{"type":"object","properties":{"targets":{"description":"The target screens to publish the schedule to.","allOf":[{"$ref":"#/components/schemas/ScreenTargets"}]}},"required":["targets"]},"SelectableEvent":{"type":"object","properties":{"startDate":{"type":"string","description":"The local date that the playlist will start playing."},"endDate":{"type":"string","description":"The local date that the playlist will stop playing."},"daysOfWeek":{"description":"The days of the week that the playlist will play. Must have at least\none day selected.","minItems":1,"type":"array","items":{"type":"string","enum":["MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","SUNDAY"]}},"fromTime":{"type":"string","description":"The local time that this playlist will start playing. This is evaluated\nseparately to the startDate and will be evaluated on each day of the week."},"toTime":{"type":"string","description":"The local time that this playlist will stop playing. This is evaluated\nseparately to the endDate and will be evaluated on each day of the week."},"playlist":{"$ref":"#/components/schemas/MinimalPlaylist"}},"required":["startDate","daysOfWeek","fromTime","toTime","playlist"]},"Schedule":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"folder":{"$ref":"#/components/schemas/MinimalFolder"},"events":{"type":"array","items":{"$ref":"#/components/schemas/SelectableEvent"}},"defaultPlaylist":{"$ref":"#/components/schemas/MinimalPlaylist"},"permissions":{"type":"object","properties":{"update":{"type":"boolean"},"delete":{"type":"boolean"}},"required":["update","delete"]}},"required":["id","name","folder","events","permissions"]},"TagCreateCommand":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"MinimalTag":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},"Tag":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"usageCount":{"type":"number"}},"required":["id","name","createdAt","usageCount"]},"TagUpdateCommand":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"ScreenGroupContent":{"type":"object","properties":{"source":{"type":"string","description":"The source of the content that is playing.","enum":["PLAYLIST","SCHEDULE","INTERACTIVE"]},"id":{"type":"number","description":"The ID of the content that is playing. For example, this would be a\nplaylist ID if the source were `PLAYLIST`."},"name":{"type":"string","description":"The name of the content that is playing. For example, this would be the\nplaylist name if the source were `PLAYLIST`."}},"required":["source","id","name"]},"ScreenGroup":{"type":"object","properties":{"id":{"type":"number","description":"The ID of the screen group."},"name":{"type":"string","description":"The name of the screen group."},"content":{"description":"What content has been published to the screen group?","allOf":[{"$ref":"#/components/schemas/ScreenGroupContent"}]},"permissions":{"type":"object","properties":{"read":{"type":"boolean"},"update":{"type":"boolean"},"delete":{"type":"boolean"}},"required":["read","update","delete"]}},"required":["id","name","permissions"]}}}}