Wallboard API - Content Management (2.0)
| Operation | Endpoint | Notes |
|---|---|---|
| Read/List | /api/v2/deviceContent |
Unified endpoint for ALL content types |
| Create/Edit Content | /api/content |
Slides and multi-page layouts |
| Create/Edit Playlist | /api/simpleLoop |
Playlists only |
| Tagging | /api/v2/deviceContent/tags/* |
Bulk tag operations |
| Folder Browser | /api/deviceContent/view/summary |
Folders + items together |
Playlist version: Always create playlists with version: "2.0". The "1.0" version is legacy and should not be used for new playlists.
The deviceContentType field distinguishes content types:
deviceContentType |
UI Term | structureType |
Description |
|---|---|---|---|
content |
Content / Slide | COMPLEX or SLIDE |
Designed layouts |
simpleLoop |
Playlist | - | Content rotation |
Slides vs Interactive: When deviceContentType=content, check structureType:
SLIDE= single-page static layoutCOMPLEX= multi-page with widgets, data binding, interactivity
Using query params (recommended):
includeContents=false→ only playlistsincludeLoops=false→ only slides/contentincludeLoops=false&search=structureType=SLIDE→ only slides
Using WBQL search:
search=deviceContentType=content→ slides/contentsearch=deviceContentType=simpleLoop→ playlists
Pagination mode (shuffleDeviceContents):
true(default): mixed pagination, all types togetherfalse: sequential - playlists first, then content
| Concept | Description |
|---|---|
| Content Group | Folder for organizing content (hierarchical) |
| Template | Pre-made design for quick customization |
List all content (unified)
Retrieve a paginated list of all content types that can be assigned to devices.
Use this endpoint instead of individual list endpoints for Content or Playlist.
Filter by type using the includeContents and includeLoops parameters.
Content types:
- Content: Single layouts/designs
- Playlist: Simple content loops (API path:
/api/simpleLoop/)
Minimum role: VIEWER
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer [ 1 .. 1000 ] Default: 20 Number of elements per page (max 1000) |
| sort | string Example: sort=name,asc Sort expression. Format:
|
| select | string Field projection. |
| includeLoops | boolean Default: true Include Playlist content types |
| includeContents | boolean Default: true Include Content (single layout) types |
| shuffleDeviceContents | boolean Default: true When true (default): all content types mixed together in single paginated result (more efficient). When false: sequential pagination - playlists first, then content (separate queries per type). |
| includeReadOnlyInfo | boolean Default: false Include |
Responses
Response samples
- 200
{- "first": true,
- "last": true,
- "number": 0,
- "numberOfElements": 0,
- "totalElements": 0,
- "totalPages": 0,
- "size": 0,
- "content": [
- {
- "id": "string",
- "name": "string",
- "comment": "string",
- "lastSaved": 0,
- "customerId": 0,
- "contentGroupId": "string",
- "tags": [
- "string"
], - "contentGroupPath": "string",
- "displayTime": 0,
- "locked": true,
- "startDate": 0,
- "signageModeSecret": "string",
- "signageModeShortUrl": "string",
- "deviceContentType": "content",
- "width": 0,
- "height": 0,
- "advancedConfiguration": { },
- "structureType": "SLIDE",
- "simpleLoopType": "NORMAL",
- "version": "string",
- "contentMetaData": { },
- "simpleLoopMetaData": { },
- "displayerVersion": { },
- "lastPreviewUploadTime": 0,
- "lastSavedByEmail": "string",
- "lastActivity": 0,
- "lastSavedBy": {
- "id": 0,
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}, - "customer": {
- "id": 0,
- "name": "string"
}, - "contentGroup": {
- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}, - "assignedDeviceCount": 0,
- "assignedAsNextDeviceCount": 0,
- "assignedAsEmergencyDeviceCount": 0,
- "previewPath": "string",
- "data": { },
- "shortUrl": "string",
- "orientation": "LANDSCAPE",
- "readOnly": true,
- "campaignUsageDetails": { },
- "topLevelCampaignUsageDetails": { },
- "messageUsageDetails": { },
- "saveInfo": {
- "hasAutoSave": true,
- "lastAutoSaveDate": 0
}
}
]
}Export device contents to CSV
Export device content types to CSV format.
Minimum role: TECHNICIAN
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
Responses
Add tags to device contents
Add tags to device content types.
Minimum role: EDITOR
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
Request Body schema: application/json
Responses
Request samples
- Payload
[- "string"
]Set tags on device contents
Replace all tags on device content types.
Minimum role: EDITOR
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
Request Body schema: application/json
Responses
Request samples
- Payload
[- "string"
]Remove tags from device contents
Remove tags from device content types.
Minimum role: EDITOR
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
Request Body schema: application/json
Responses
Request samples
- Payload
[- "string"
]Upload content preview image
Upload a manual preview image for a device content.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentId required | string |
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
Request Body schema: image/*
Responses
Delete content preview image
Delete a manual preview image from a device content.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentId required | string |
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
Responses
Get device contents and groups summary
Retrieve device contents and content groups in a combined view.
Minimum role: VIEWER
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupSearch | string WBQL search for content groups |
| contentSearch | string WBQL search for contents |
| quickFilterId | string Quick filter ID |
| groupSelect | string WBQL select for groups |
| includeLoops | boolean Default: true |
| includeContents | boolean Default: true |
| shuffleDeviceContents | boolean Default: true When true (default): all content types mixed together in single paginated result. When false: sequential pagination - playlists first, then content. |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer [ 1 .. 1000 ] Default: 20 Number of elements per page (max 1000) |
| select | string Field projection. |
Responses
Response samples
- 200
{- "first": true,
- "last": true,
- "number": 0,
- "numberOfElements": 0,
- "totalElements": 0,
- "totalPages": 0,
- "size": 0,
- "content": [
- { }
]
}Get content group breadcrumb
Retrieve breadcrumb navigation path for a content group.
Minimum role: VIEWER
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId required | string |
Responses
Response samples
- 200
{- "path": [
- {
- "id": "string",
- "name": "string"
}
]
}Get content signage path
Get the signage URL path for a content.
Minimum role: TECHNICIAN
Authorizations:
path Parameters
| contentId required | string |
query Parameters
| reset | boolean Default: false Reset the path |
Responses
Response samples
- 200
{- "path": "string",
- "signageKey": "string"
}Get content displayer path
Get the displayer preview URL for a content.
Minimum role: VIEWER
Authorizations:
path Parameters
| contentId required | string |
query Parameters
| autoSaved | boolean |
| noSync | boolean |
| editorPreview | boolean |
| startLoopPaused | boolean |
| stopAfterOneCycle | boolean |
| page | string |
| timeZone | string |
| datarowlabel | string |
| datasourceId | string |
| deviceId | string |
| mute | boolean |
Responses
Response samples
- 200
{- "path": "string",
- "signageKey": "string"
}Update device content team assignments
Update team assignments for a device content.
Minimum role: OWNER
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| deviceContentId required | string |
Request Body schema: application/json
Array of objects Teams to assign the resource to | |
| removeFromTeamIds | Array of strings Team IDs to remove the resource from |
Responses
Request samples
- Payload
{- "assignToTeams": [
- {
- "teamId": "string",
- "readOnly": true
}
], - "removeFromTeamIds": [
- "string"
]
}Create content
Create new content design.
Minimum role: EDITOR with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId | string Parent content group (folder) ID |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Request Body schema: application/jsonrequired
| name | string Content name |
| comment | string Content description/comment |
| version | string Content engine version |
| data | object Content JSON data (editor structure) |
| advancedConfiguration | object Advanced configuration settings |
| tags | Array of strings Tags for categorization |
| structureType | string Default: "COMPLEX" Enum: "COMPLEX" "SLIDE" Content structure type:
|
Responses
Request samples
- Payload
- cURL
{- "name": "string",
- "comment": "string",
- "version": "string",
- "data": { },
- "advancedConfiguration": { },
- "tags": [
- "string"
], - "structureType": "COMPLEX"
}Response samples
- 200
{- "id": "string",
- "name": "string",
- "comment": "string",
- "lastSaved": 0,
- "customerId": 0,
- "contentGroupId": "string",
- "tags": [
- "string"
], - "contentGroupPath": "string",
- "displayTime": 0,
- "locked": true,
- "startDate": 0,
- "signageModeSecret": "string",
- "signageModeShortUrl": "string",
- "deviceContentType": "content",
- "width": 0,
- "height": 0,
- "advancedConfiguration": { },
- "structureType": "SLIDE",
- "simpleLoopType": "NORMAL",
- "version": "string",
- "contentMetaData": { },
- "simpleLoopMetaData": { },
- "displayerVersion": { },
- "lastPreviewUploadTime": 0,
- "lastSavedByEmail": "string",
- "lastActivity": 0,
- "lastSavedBy": {
- "id": 0,
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}, - "customer": {
- "id": 0,
- "name": "string"
}, - "contentGroup": {
- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}, - "assignedDeviceCount": 0,
- "assignedAsNextDeviceCount": 0,
- "assignedAsEmergencyDeviceCount": 0,
- "previewPath": "string",
- "data": { },
- "shortUrl": "string",
- "orientation": "LANDSCAPE",
- "readOnly": true,
- "campaignUsageDetails": { },
- "topLevelCampaignUsageDetails": { },
- "messageUsageDetails": { },
- "saveInfo": {
- "hasAutoSave": true,
- "lastAutoSaveDate": 0
}
}Update content
Update an existing content design.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentId required | string Content ID |
query Parameters
| autoSave required | boolean Whether this is an autosave (true) or final save (false) |
Request Body schema: application/jsonrequired
| name | string Content name |
| comment | string Content description/comment |
| version | string Content engine version |
| data | object Content JSON data (editor structure) |
| advancedConfiguration | object Advanced configuration settings |
| tags | Array of strings Tags for categorization |
| displayerVersion | string Enum: "LEGACY_LOOP" "LEGACY_CONTENT" "V2" Displayer version for rendering |
| resetDisplayerVersion | boolean Reset displayer version to default |
| structureType | string Enum: "COMPLEX" "SLIDE" Content structure type:
|
Responses
Request samples
- Payload
- cURL
{- "name": "string",
- "comment": "string",
- "version": "string",
- "data": { },
- "advancedConfiguration": { },
- "tags": [
- "string"
], - "displayerVersion": "LEGACY_LOOP",
- "resetDisplayerVersion": true,
- "structureType": "COMPLEX"
}Delete content
Delete a content design.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentId required | string Content ID |
query Parameters
| autoSave required | boolean Whether to also delete autosave version |
Responses
Request samples
- cURL
curl -X DELETE \ 'https://{server}/api/content/asd50b6232b4eb19bce33c16c6db148?autoSave=true' \ -H 'Authorization: Bearer <token>'
Duplicate content
Create a copy of existing content.
Minimum role: EDITOR with customer selector
Authorizations:
path Parameters
| contentId required | string Source content ID to duplicate |
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId | string Target content group ID for the duplicate |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Request Body schema: application/json
| name | string Name for the duplicated content |
| comment | string Comment/description |
| structureType | string Enum: "COMPLEX" "SLIDE" Content structure type:
|
Responses
Request samples
- Payload
- cURL
{- "name": "string",
- "comment": "string",
- "structureType": "COMPLEX"
}Response samples
- 200
{- "id": "string",
- "name": "string",
- "comment": "string",
- "lastSaved": 0,
- "customerId": 0,
- "contentGroupId": "string",
- "tags": [
- "string"
], - "contentGroupPath": "string",
- "displayTime": 0,
- "locked": true,
- "startDate": 0,
- "signageModeSecret": "string",
- "signageModeShortUrl": "string",
- "deviceContentType": "content",
- "width": 0,
- "height": 0,
- "advancedConfiguration": { },
- "structureType": "SLIDE",
- "simpleLoopType": "NORMAL",
- "version": "string",
- "contentMetaData": { },
- "simpleLoopMetaData": { },
- "displayerVersion": { },
- "lastPreviewUploadTime": 0,
- "lastSavedByEmail": "string",
- "lastActivity": 0,
- "lastSavedBy": {
- "id": 0,
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}, - "customer": {
- "id": 0,
- "name": "string"
}, - "contentGroup": {
- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}, - "assignedDeviceCount": 0,
- "assignedAsNextDeviceCount": 0,
- "assignedAsEmergencyDeviceCount": 0,
- "previewPath": "string",
- "data": { },
- "shortUrl": "string",
- "orientation": "LANDSCAPE",
- "readOnly": true,
- "campaignUsageDetails": { },
- "topLevelCampaignUsageDetails": { },
- "messageUsageDetails": { },
- "saveInfo": {
- "hasAutoSave": true,
- "lastAutoSaveDate": 0
}
}Create content from template
Create new content based on a template.
Minimum role: EDITOR with customer selector
Authorizations:
path Parameters
| templateId required | string Template ID to use as base |
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId | string Target content group ID |
| name | string Name for the new content |
| comment | string Comment/description for the new content |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Responses
Request samples
- cURL
curl -X POST \ 'https://{server}/api/content/fromTemplate/16ff4c6b85e14969ae081392fd9003bb?customerId=182&name=NewContent' \ -H 'Authorization: Bearer <token>'
Response samples
- 200
{- "id": "string",
- "name": "string",
- "comment": "string",
- "lastSaved": 0,
- "customerId": 0,
- "contentGroupId": "string",
- "tags": [
- "string"
], - "contentGroupPath": "string",
- "displayTime": 0,
- "locked": true,
- "startDate": 0,
- "signageModeSecret": "string",
- "signageModeShortUrl": "string",
- "deviceContentType": "content",
- "width": 0,
- "height": 0,
- "advancedConfiguration": { },
- "structureType": "SLIDE",
- "simpleLoopType": "NORMAL",
- "version": "string",
- "contentMetaData": { },
- "simpleLoopMetaData": { },
- "displayerVersion": { },
- "lastPreviewUploadTime": 0,
- "lastSavedByEmail": "string",
- "lastActivity": 0,
- "lastSavedBy": {
- "id": 0,
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}, - "customer": {
- "id": 0,
- "name": "string"
}, - "contentGroup": {
- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}, - "assignedDeviceCount": 0,
- "assignedAsNextDeviceCount": 0,
- "assignedAsEmergencyDeviceCount": 0,
- "previewPath": "string",
- "data": { },
- "shortUrl": "string",
- "orientation": "LANDSCAPE",
- "readOnly": true,
- "campaignUsageDetails": { },
- "topLevelCampaignUsageDetails": { },
- "messageUsageDetails": { },
- "saveInfo": {
- "hasAutoSave": true,
- "lastAutoSaveDate": 0
}
}Import content
Import content from a ZIP file (exported content package).
Minimum role: EDITOR with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId | string Target content group ID |
| fileFolderId | string Target file folder ID for media files |
| useOriginalFilesOnDuplicate | boolean Default: false Reuse existing files if duplicates are found |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Request Body schema: multipart/form-datarequired
| content | string <binary> ZIP file containing exported content |
Responses
Request samples
- cURL
curl -X POST \ 'https://{server}/api/content/import?customerId=182' \ -H 'Authorization: Bearer <token>' \ -F '[email protected]'
Export content
Export content to a ZIP file for backup or transfer.
Minimum role: EDITOR
Authorizations:
query Parameters
| search | string WBQL filter expression. Operators: |
Responses
Request samples
- cURL
curl -X POST \ 'https://{server}/api/content/export?search=name:myContent' \ -H 'Authorization: Bearer <token>' \ -o content-export.zip
Lock/unlock content
Lock or unlock content to prevent/allow editing.
Minimum role: APPROVER
Authorizations:
path Parameters
| contentId required | string Content ID |
| locked required | boolean Lock state (true to lock, false to unlock) |
Responses
Request samples
- cURL
curl -X POST \ 'https://{server}/api/content/lock/asd50b6232b4eb19bce33c16c6db148/true' \ -H 'Authorization: Bearer <token>'
Upload content preview
Upload a preview image for content.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentId required | string Content ID |
query Parameters
| fileName | string Preview file name |
| createdAt | integer <int64> Creation timestamp (Unix ms) |
Request Body schema: application/jsonrequired
| previewData | object Base64 encoded preview data |
Responses
Request samples
- Payload
{- "previewData": { }
}Export content as CSV
Export content list to CSV format.
Minimum role: VIEWER with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
Responses
Request samples
- cURL
curl -X GET \ 'https://{server}/api/content/csv?customerId=182' \ -H 'Authorization: Bearer <token>' \ -o content.csv
Get device online/offline ratio for content
Get the count of online and offline devices for each content.
Minimum role: VIEWER with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer [ 1 .. 1000 ] Default: 20 Number of elements per page (max 1000) |
| sort | string Example: sort=name,asc Sort expression. Format:
|
Responses
Response samples
- 200
{- "property1": {
- "onlineCount": 0,
- "offlineCount": 0
}, - "property2": {
- "onlineCount": 0,
- "offlineCount": 0
}
}Create content group
Create a new content group (folder) for organizing content.
Minimum role: EDITOR with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| parentGroupId | string Parent group ID for nested folders |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Request Body schema: application/jsonrequired
| name required | string Content group name |
| deviceContentType | string Enum: "content" "schedule" "simpleLoop" Type of content this group holds |
| isTemplateGroup | boolean Whether this is a template group |
Responses
Request samples
- Payload
- cURL
{- "name": "string",
- "deviceContentType": "content",
- "isTemplateGroup": true
}Response samples
- 200
{- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}List content groups
Retrieve a paginated list of content groups (folders).
Minimum role: VIEWER with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer [ 1 .. 1000 ] Default: 20 Number of elements per page (max 1000) |
| sort | string Example: sort=name,asc Sort expression. Format:
|
Responses
Request samples
- cURL
curl -X GET \ 'https://{server}/api/contentGroup/?customerId=182&page=0&size=15&sort=name' \ -H 'Authorization: Bearer <token>'
Response samples
- 200
{- "first": true,
- "last": true,
- "number": 0,
- "numberOfElements": 0,
- "totalElements": 0,
- "totalPages": 0,
- "size": 0,
- "content": [
- {
- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}
]
}Update content group
Update an existing content group.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentGroupId required | string Content group ID |
Request Body schema: application/jsonrequired
| name | string Content group name |
| isTemplateGroup | boolean Whether this is a template group |
Responses
Request samples
- Payload
- cURL
{- "name": "string",
- "isTemplateGroup": true
}Delete content group
Delete a content group. Optionally remove all content inside.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentGroupId required | string Content group ID |
query Parameters
| removeContents | boolean Default: false If true, also delete all content in the group |
Responses
Request samples
- cURL
curl -X DELETE \ 'https://{server}/api/contentGroup/asd50b6232b4eb19bce33c16c6db148?removeContents=true' \ -H 'Authorization: Bearer <token>'
Move content to group
Move content items and/or content groups to a target group.
Minimum role: EDITOR with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
Request Body schema: application/jsonrequired
| contentGroupIds | Array of strings Content group IDs to move |
| contentIds | Array of strings Content IDs to move |
| targetGroupId | string Target content group ID (null to move to root) |
Responses
Request samples
- Payload
- cURL
{- "contentGroupIds": [
- "string"
], - "contentIds": [
- "string"
], - "targetGroupId": "string"
}Lock/unlock contents in group
Lock or unlock all content items within a content group.
Minimum role: EDITOR
Authorizations:
path Parameters
| contentGroupId required | string Content group ID |
query Parameters
| locked required | boolean Lock state to apply |
| isRecursive | boolean Default: false Apply to nested groups as well |
Responses
Request samples
- cURL
curl -X PUT \ 'https://{server}/api/contentGroup/asd50b6232b4eb19bce33c16c6db148/lockContentsInGroup?locked=true' \ -H 'Authorization: Bearer <token>'
Update team assignments
Update team assignments for a content group.
Minimum role: OWNER with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId required | string Content group ID |
Request Body schema: application/jsonrequired
Array of objects Teams to assign the resource to | |
| removeFromTeamIds | Array of strings Team IDs to remove the resource from |
Responses
Request samples
- Payload
{- "assignToTeams": [
- {
- "teamId": "string",
- "readOnly": true
}
], - "removeFromTeamIds": [
- "string"
]
}List templates
Retrieve a paginated list of available templates.
Minimum role: VIEWER with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string WBQL filter expression. Operators: |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer [ 1 .. 1000 ] Default: 20 Number of elements per page (max 1000) |
| sort | string Example: sort=name,asc Sort expression. Format:
|
| includeGlobal | boolean Default: true Include global templates |
| includeDedicated | boolean Default: true Include customer-specific templates |
Responses
Request samples
- cURL
curl -X GET \ 'https://{server}/api/template/?customerId=182&page=0&size=15' \ -H 'Authorization: Bearer <token>'
Response samples
- 200
{- "first": true,
- "last": true,
- "number": 0,
- "numberOfElements": 0,
- "totalElements": 0,
- "totalPages": 0,
- "size": 0,
- "content": [
- {
- "id": "string",
- "name": "string",
- "comment": "string",
- "width": 0,
- "height": 0,
- "tags": [
- "string"
], - "global": true,
- "previewPath": "string",
- "lastSaved": 0,
- "lastPreviewUploadTime": 0,
- "lastSavedBy": {
- "id": 0,
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}
}
]
}Create simple loop (playlist)
Create a new simple loop (playlist) for content rotation.
Minimum role: EDITOR with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId | string Target content group ID |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Request Body schema: application/jsonrequired
| name | string Playlist name |
| comment | string Playlist description |
| version | string Default: "2.0" Enum: "1.0" "2.0" Playlist engine version. Always use |
| data | object Playlist JSON data |
| advancedConfiguration | object Advanced configuration |
| tags | Array of strings Playlist tags |
| simpleLoopType | string Enum: "NORMAL" "EINK" Playlist type (NORMAL or EINK for e-ink displays) |
Responses
Request samples
- Payload
- cURL
{- "name": "string",
- "comment": "string",
- "version": "1.0",
- "data": { },
- "advancedConfiguration": { },
- "tags": [
- "string"
], - "simpleLoopType": "NORMAL"
}Response samples
- 200
{- "id": "string",
- "name": "string",
- "comment": "string",
- "lastSaved": 0,
- "customerId": 0,
- "contentGroupId": "string",
- "tags": [
- "string"
], - "contentGroupPath": "string",
- "displayTime": 0,
- "locked": true,
- "startDate": 0,
- "signageModeSecret": "string",
- "signageModeShortUrl": "string",
- "deviceContentType": "content",
- "width": 0,
- "height": 0,
- "advancedConfiguration": { },
- "structureType": "SLIDE",
- "simpleLoopType": "NORMAL",
- "version": "string",
- "contentMetaData": { },
- "simpleLoopMetaData": { },
- "displayerVersion": { },
- "lastPreviewUploadTime": 0,
- "lastSavedByEmail": "string",
- "lastActivity": 0,
- "lastSavedBy": {
- "id": 0,
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}, - "customer": {
- "id": 0,
- "name": "string"
}, - "contentGroup": {
- "id": "string",
- "name": "string",
- "deviceContentType": "string",
- "customerId": 0,
- "parentId": "string",
- "isTemplateGroup": true,
- "simpleLoopCount": 0,
- "contentCount": 0,
- "scheduleCount": 0,
- "readOnly": true
}, - "assignedDeviceCount": 0,
- "assignedAsNextDeviceCount": 0,
- "assignedAsEmergencyDeviceCount": 0,
- "previewPath": "string",
- "data": { },
- "shortUrl": "string",
- "orientation": "LANDSCAPE",
- "readOnly": true,
- "campaignUsageDetails": { },
- "topLevelCampaignUsageDetails": { },
- "messageUsageDetails": { },
- "saveInfo": {
- "hasAutoSave": true,
- "lastAutoSaveDate": 0
}
}Update simple loop
Update an existing simple loop.
Minimum role: EDITOR
Authorizations:
path Parameters
| simpleLoopId required | string Simple loop ID |
query Parameters
| autoSave required | boolean Whether this is an autosave |
Request Body schema: application/jsonrequired
| name | string Playlist name |
| comment | string Playlist description |
| version | string Enum: "1.0" "2.0" Playlist engine version. Always use |
| data | object Playlist JSON data |
| advancedConfiguration | object Advanced configuration |
| tags | Array of strings Playlist tags |
| displayerVersion | string Enum: "LEGACY_LOOP" "LEGACY_CONTENT" "V2" Displayer version for rendering |
| resetDisplayerVersion | boolean Reset displayer version to default |
Responses
Request samples
- Payload
{- "name": "string",
- "comment": "string",
- "version": "1.0",
- "data": { },
- "advancedConfiguration": { },
- "tags": [
- "string"
], - "displayerVersion": "LEGACY_LOOP",
- "resetDisplayerVersion": true
}Duplicate simple loop
Create a copy of an existing simple loop.
Minimum role: EDITOR with customer selector
Authorizations:
path Parameters
| simpleLoopId required | string Source simple loop ID |
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| contentGroupId | string Target content group ID |
| teamIds | string Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false Team assignment filter. Format: |
Request Body schema: application/json
| name | string Name for the duplicated content |
| comment | string Comment/description |
| structureType | string Enum: "COMPLEX" "SLIDE" Content structure type:
|
Responses
Request samples
- Payload
{- "name": "string",
- "comment": "string",
- "structureType": "COMPLEX"
}Upload simple loop preview
Upload a preview image for a simple loop.
Minimum role: EDITOR
Authorizations:
path Parameters
| simpleLoopId required | string Simple loop ID |
query Parameters
| fileName | string Preview file name |
| createdAt | integer <int64> Creation timestamp (Unix ms) |
Request Body schema: application/jsonrequired
| previewData | object |
Responses
Request samples
- Payload
{- "previewData": { }
}Export simple loops as CSV
Export simple loops list to CSV format.
Minimum role: TECHNICIAN with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
Responses
Get device online/offline ratio for simple loops
Get the count of online and offline devices for each simple loop.
Minimum role: VIEWER with customer selector
Authorizations:
query Parameters
| customerId | integer Customer/tenant ID for multi-tenant filtering.
|
| search | string Search filter |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer [ 1 .. 1000 ] Default: 20 Number of elements per page (max 1000) |
| sort | string Example: sort=name,asc Sort expression. Format:
|
Responses
Response samples
- 200
{- "property1": {
- "onlineCount": 0,
- "offlineCount": 0
}, - "property2": {
- "onlineCount": 0,
- "offlineCount": 0
}
}