Skip to main content

Wallboard API - Channel/Schedule (2.0)

API Support: [email protected]

Channel & Schedule Management API

This API manages two fundamentally different systems that share the same underlying data model (Campaign). Understanding the distinction is critical for correct API usage.


Channels vs Schedules: Key Differences

Aspect Channel Schedule
Purpose Hierarchical content container for normal playback Temporary content override
Assignment Device groups (via folder/tag/team targeting) Individual devices (manual or dynamic)
Hierarchy Contains sub-channel groups → sub-channels → content Single content item only
Duration Permanent (always available when scheduled) Temporary (replaces content during active period)
Conflict Resolution Saturation balancing between channels Priority number (higher = wins)
API Identifier level: WIDGET level: TOP

Channel System

Channels are hierarchical content containers assigned to device groups. They organize content into a multi-level structure with sophisticated playback balancing.

Channel Structure

Channel (Campaign with level=WIDGET)
├── Sub-channel Groups (Message Groups) - organizational containers
│   ├── Sub-channel A (Message) - contains content + device tags + schedule
│   └── Sub-channel B (Message) - contains content + device tags + schedule
├── Saturation Setting - proportional playback weight
├── Device Group Targeting - folder/tag/team-based assignment
└── Working Time Restrictions - when channel is active

Channel Content Types (mutually exclusive)

  • Content: Slides, playlists, multi-page interactive content
  • Media: Images, videos, PDFs
  • Sub-channels: Nested sub-channel groups only
  • SSP (Vistar): Programmatic advertising

Channel Playback Logic

  • Channels play sequentially based on order
  • Saturation controls relative airtime between channels (e.g., saturation 2 = 2x airtime)
  • Playback slots control how many items play before switching channels

Schedule System

Schedules are temporary content overrides that replace a device's assigned content during specific time periods. When the schedule ends, devices return to their base content.

Schedule Structure

Schedule (Campaign with level=TOP)
├── Single Content Item - exactly one playlist/slide/content
├── Priority Number - higher number wins conflicts
├── Device Targeting - specific devices (manual or dynamic)
└── Time Rules - when override is active

Schedule Priority System

  1. Active Schedules - priority-based (higher number wins)
  2. Base Assigned Content - default when no schedule active

Schedule Example

Device: Lobby Screen
Base Content: "Daily Playlist"
Schedule A: "Lunch Menu" (Priority 1, 11:30-13:00)
Schedule B: "CEO Announcement" (Priority 2, 12:00-12:15)

Timeline:
- 11:30-12:00 → Lunch Menu (Priority 1 active)
- 12:00-12:15 → CEO Announcement (Priority 2 overrides)
- 12:15-13:00 → Lunch Menu (back to Priority 1)
- After 13:00 → Daily Playlist (schedule ended)

API Terminology Mapping

UI Term API Term Field/Concept
Channel Campaign level: WIDGET
Schedule Campaign level: TOP
Sub-channel Group Message Group Container for sub-channels
Sub-channel Message Content item within channel

Common Operations

Creating a Channel

  1. POST /api/campaign - Create campaign (level defaults to WIDGET = Channel)
  2. POST /api/campaign/{id}/messageGroup - Add sub-channel groups
  3. POST /api/campaign/{id}/message - Add sub-channels with content

Creating a Schedule

  1. POST /api/campaign with level: TOP - Create schedule
  2. Assign single content item directly
  3. Set priority and device targeting

Filtering with WBQL

Use the search parameter with WBQL syntax:

Filter Field Example
By team teamAssignments.team.id search=teamAssignments.team.id=team1
By name name search=name:welcome
Channels only level search=level=WIDGET
Schedules only level search=level=TOP
Active enabled search=enabled=true

See Getting Started for full WBQL syntax.

campaign

Channel and Schedule management. Channels (level: WIDGET) are hierarchical content containers assigned to device groups with saturation balancing. Schedules (level: TOP) are temporary content overrides with priority-based conflict resolution.

List campaigns

Retrieve a paginated list of campaigns (channels).

Minimum role: VIEWER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
search
string

WBQL (Wallboard Query Language) search expression for filtering.

Value operators:

  • : - contains (strings) / equals (other types)
  • = - exact match
  • >, >=, <, <= - comparison operators

Logical operators:

  • , - AND
  • | - OR

Examples:

  • name:mycamp - name contains "mycamp"
  • enabled=true - only enabled campaigns
  • weight<5 - priority higher than 5 (lower weight = higher priority)
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: field,direction

  • Directions: asc, desc
  • Multiple sorts: sort=name,asc&sort=lastActivity,desc
select
string

WBQL select expression to specify returned fields.

Syntax:

  • * - all primitive attributes (default)
  • field1,field2 - specific fields
  • relation(field1,field2) - fields from related entities

Examples:

  • select=id,name,enabled
  • select=*,customer(id,name)

Responses

Request samples

curl -X GET 'https://{server}/api/v2/campaign?customerId=182&page=0&size=15&sort=name' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Response samples

Content type
application/json
{
  • "first": true,
  • "last": true,
  • "number": 0,
  • "numberOfElements": 0,
  • "totalElements": 0,
  • "totalPages": 0,
  • "size": 0,
  • "content": [
    ]
}

Create campaign

Create a new campaign (channel).

Minimum role: APPROVER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
teamIds
string
Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false

Team assignment for new resources. Format: {teamId}:{readOnly},{teamId}:{readOnly} Required for users who belong to teams and have roles lower than OWNER.

Request Body schema: application/json
required
name
string

Campaign name

comment
string

Campaign comment

version
string

Version identifier

level
string
Enum: "TOP" "WIDGET"

Campaign level (TOP = Schedule, WIDGET = Channel)

locked
boolean

Whether the campaign is locked

validFrom
string

Start date (format YYYY-MM-DD)

validTo
string

End date (format YYYY-MM-DD)

duration
integer

Total duration in seconds

defaultDuration
integer

Default duration for media items without length

minimumDuration
integer <int64>

Minimum duration in seconds

weight
integer

Priority (lower number = higher priority)

contentShuffleMode
string (CampaignContentShuffleMode)
Enum: "BALANCED" "SERIAL"

Content shuffle mode for playback

saturation
number <float>

Proportional playback frequency

audioOnly
boolean

Audio-only campaign

supportedMediaTypes
Array of strings

Supported media types

dspExcludedCreativeIds
Array of strings

Excluded DSP creative IDs

dspBlockedCategories
Array of strings

Blocked DSP categories

dspOrderId
string

DSP order ID

skipDefaultPage
boolean
Default: false
skipInvalidFiles
boolean
Default: false
enabled
boolean
Default: true
object (WorkingTime)

Daily time range configuration (JSON)

object (WorkingDays)

Days of the week configuration (JSON)

object (WorkingDateRanges)

Date range intervals

object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

type
string (CampaignPlayedAssetType)
Enum: "CONTENT" "CONTENT_DYNAMIC" "MESSAGE_GROUP" "ASSETS_STATIC" "ASSETS_DYNAMIC" "CONTENT_QUICK_FILTER" "ASSET_QUICK_FILTER" "DSP_VISTAR_MEDIA"

Type of assets played by the campaign

orderingMode
string (CampaignOrderingMode)
Enum: "RANDOM" "ALPHABET" "DEFAULT"

Content ordering mode

advertiserId
string
object (TeamAccessList)

Team access configuration (JSON)

object (TeamAccessList)

Team access configuration (JSON)

playMultipleItemsInSinglePlaybackSlot
boolean
Default: false
playbackSlotItemType
string (CampaignPlaybackSlotItemType)
Enum: "SIMPLE_LOOP" "SIMPLE_LOOP_SLIDE" "CONTENT" "CONTENT_PAGE" "MESSAGE_GROUP" "MESSAGE" "MESSAGE_ITEM"

Type of item in playback slot

playAllItemsInSinglePlaybackSlot
boolean
Default: true
playbackSlotDuration
integer <int64>
playbackSlotNumberOfElementsToPlay
integer <int64>
tags
Array of strings
object (CampaignMessageGroupAssignmentDto)
object (CampaignDeviceAssignmentDto)
object (CampaignDeviceGroupAssignmentDto)
object (CampaignContentAssignmentDto)
object (CampaignContentGroupAssignmentDto)
object (CampaignFileFolderAssignmentDto)
object (CampaignFileAssignmentDto)
contentQuickFilterId
string
fileQuickFilterId
string
deviceQuickFilterId
string
deviceSelectionMode
string (CampaignDeviceSelectionMode)
Enum: "STATIC" "DYNAMIC" "QUICK_FILTER"

Device selection mode

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "comment": "string",
  • "version": "string",
  • "level": "TOP",
  • "locked": true,
  • "validFrom": "string",
  • "validTo": "string",
  • "duration": 0,
  • "defaultDuration": 0,
  • "minimumDuration": 0,
  • "weight": 0,
  • "contentShuffleMode": "BALANCED",
  • "saturation": 0.1,
  • "audioOnly": true,
  • "supportedMediaTypes": [
    ],
  • "dspExcludedCreativeIds": [
    ],
  • "dspBlockedCategories": [
    ],
  • "dspOrderId": "string",
  • "skipDefaultPage": false,
  • "skipInvalidFiles": false,
  • "enabled": true,
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "affectedDateRanges": {
    },
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "type": "CONTENT",
  • "orderingMode": "RANDOM",
  • "advertiserId": "string",
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "playMultipleItemsInSinglePlaybackSlot": false,
  • "playbackSlotItemType": "SIMPLE_LOOP",
  • "playAllItemsInSinglePlaybackSlot": true,
  • "playbackSlotDuration": 0,
  • "playbackSlotNumberOfElementsToPlay": 0,
  • "tags": [
    ],
  • "messageGroupAssignment": {
    },
  • "deviceAssignment": {
    },
  • "deviceGroupAssignment": {
    },
  • "contentAssignment": {
    },
  • "contentGroupAssignment": {
    },
  • "fileFolderAssignment": {
    },
  • "fileAssignment": {
    },
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "validFrom": "string",
  • "validTo": "string",
  • "duration": 0,
  • "defaultDuration": 0,
  • "weight": 0,
  • "contentShuffleMode": "BALANCED",
  • "saturation": 0.1,
  • "skipDefaultPage": true,
  • "skipInvalidFiles": true,
  • "enabled": true,
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "affectedDateRanges": {
    },
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "type": "CONTENT",
  • "orderingMode": "RANDOM",
  • "customerId": 0,
  • "advertiserId": "string",
  • "affectedScreenCount": 0,
  • "creatorEmail": "string",
  • "lastSavedByEmail": "string",
  • "createdDate": 0,
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "playMultipleItemsInSinglePlaybackSlot": true,
  • "playAllItemsInSinglePlaybackSlot": true,
  • "playbackSlotDuration": 0,
  • "playbackSlotNumberOfElementsToPlay": 0,
  • "tags": [
    ],
  • "level": "TOP",
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC",
  • "readOnly": true
}

List campaigns (legacy)

Retrieve a paginated list of campaigns. Use /api/v2/campaign for improved response format.

Minimum role: VIEWER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
search
string

WBQL (Wallboard Query Language) search expression for filtering.

Value operators:

  • : - contains (strings) / equals (other types)
  • = - exact match
  • >, >=, <, <= - comparison operators

Logical operators:

  • , - AND
  • | - OR

Examples:

  • name:mycamp - name contains "mycamp"
  • enabled=true - only enabled campaigns
  • weight<5 - priority higher than 5 (lower weight = higher priority)
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: field,direction

  • Directions: asc, desc
  • Multiple sorts: sort=name,asc&sort=lastActivity,desc
includeAffectedScreenCount
boolean
Default: false

Include count of affected screens

Responses

Response samples

Content type
application/json
{
  • "first": true,
  • "last": true,
  • "number": 0,
  • "numberOfElements": 0,
  • "totalElements": 0,
  • "totalPages": 0,
  • "size": 0,
  • "content": [
    ]
}

Update campaign

Update an existing campaign.

Minimum role: APPROVER

Authorizations:
bearer
path Parameters
campaignId
required
integer

Campaign ID

Request Body schema: application/json
required
id
integer
name
string
comment
string

Campaign comment

version
string

Version identifier

level
string
Enum: "TOP" "WIDGET"

Campaign level (TOP = Schedule, WIDGET = Channel)

locked
boolean

Whether the campaign is locked

validFrom
string
validTo
string
duration
integer
defaultDuration
integer
minimumDuration
integer <int64>

Minimum duration in seconds

weight
integer
contentShuffleMode
string (CampaignContentShuffleMode)
Enum: "BALANCED" "SERIAL"

Content shuffle mode for playback

saturation
number <float>
audioOnly
boolean

Audio-only campaign

supportedMediaTypes
Array of strings

Supported media types

dspExcludedCreativeIds
Array of strings

Excluded DSP creative IDs

dspBlockedCategories
Array of strings

Blocked DSP categories

dspOrderId
string

DSP order ID

resetDspOrderId
boolean

Reset DSP order ID

skipDefaultPage
boolean
skipInvalidFiles
boolean
enabled
boolean
object (WorkingTime)

Daily time range configuration (JSON)

object (WorkingDays)

Days of the week configuration (JSON)

object (WorkingDateRanges)

Date range intervals

object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

orderingMode
string (CampaignOrderingMode)
Enum: "RANDOM" "ALPHABET" "DEFAULT"

Content ordering mode

advertiserId
string
object (CampaignMessageGroupAssignmentDto)
object (CampaignDeviceAssignmentDto)
object (CampaignDeviceGroupAssignmentDto)
object (CampaignContentAssignmentDto)
object (CampaignContentGroupAssignmentDto)
object (CampaignFileAssignmentDto)
object (CampaignFileFolderAssignmentDto)
resetValidTo
boolean

If true, clears the validTo date

resetDuration
boolean
resetDefaultDuration
boolean
resetAdvertiserId
boolean
object (TeamAccessList)

Team access configuration (JSON)

object (TeamAccessList)

Team access configuration (JSON)

playMultipleItemsInSinglePlaybackSlot
boolean
playbackSlotItemType
string (CampaignPlaybackSlotItemType)
Enum: "SIMPLE_LOOP" "SIMPLE_LOOP_SLIDE" "CONTENT" "CONTENT_PAGE" "MESSAGE_GROUP" "MESSAGE" "MESSAGE_ITEM"

Type of item in playback slot

playAllItemsInSinglePlaybackSlot
boolean
playbackSlotDuration
integer <int64>
playbackSlotNumberOfElementsToPlay
integer <int64>
resetPlaybackSlotDuration
boolean
resetPlaybackSlotNumberOfElementsToPlay
boolean
tags
Array of strings
contentQuickFilterId
string
fileQuickFilterId
string
deviceQuickFilterId
string
deviceSelectionMode
string (CampaignDeviceSelectionMode)
Enum: "STATIC" "DYNAMIC" "QUICK_FILTER"

Device selection mode

Responses

Request samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "comment": "string",
  • "version": "string",
  • "level": "TOP",
  • "locked": true,
  • "validFrom": "string",
  • "validTo": "string",
  • "duration": 0,
  • "defaultDuration": 0,
  • "minimumDuration": 0,
  • "weight": 0,
  • "contentShuffleMode": "BALANCED",
  • "saturation": 0.1,
  • "audioOnly": true,
  • "supportedMediaTypes": [
    ],
  • "dspExcludedCreativeIds": [
    ],
  • "dspBlockedCategories": [
    ],
  • "dspOrderId": "string",
  • "resetDspOrderId": true,
  • "skipDefaultPage": true,
  • "skipInvalidFiles": true,
  • "enabled": true,
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "affectedDateRanges": {
    },
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "orderingMode": "RANDOM",
  • "advertiserId": "string",
  • "messageGroupAssignment": {
    },
  • "deviceAssignment": {
    },
  • "deviceGroupAssignment": {
    },
  • "contentAssignment": {
    },
  • "contentGroupAssignment": {
    },
  • "fileAssignment": {
    },
  • "fileFolderAssignment": {
    },
  • "resetValidTo": true,
  • "resetDuration": true,
  • "resetDefaultDuration": true,
  • "resetAdvertiserId": true,
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "playMultipleItemsInSinglePlaybackSlot": true,
  • "playbackSlotItemType": "SIMPLE_LOOP",
  • "playAllItemsInSinglePlaybackSlot": true,
  • "playbackSlotDuration": 0,
  • "playbackSlotNumberOfElementsToPlay": 0,
  • "resetPlaybackSlotDuration": true,
  • "resetPlaybackSlotNumberOfElementsToPlay": true,
  • "tags": [
    ],
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "validFrom": "string",
  • "validTo": "string",
  • "duration": 0,
  • "defaultDuration": 0,
  • "weight": 0,
  • "contentShuffleMode": "BALANCED",
  • "saturation": 0.1,
  • "skipDefaultPage": true,
  • "skipInvalidFiles": true,
  • "enabled": true,
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "affectedDateRanges": {
    },
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "type": "CONTENT",
  • "orderingMode": "RANDOM",
  • "customerId": 0,
  • "advertiserId": "string",
  • "affectedScreenCount": 0,
  • "creatorEmail": "string",
  • "lastSavedByEmail": "string",
  • "createdDate": 0,
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "playMultipleItemsInSinglePlaybackSlot": true,
  • "playAllItemsInSinglePlaybackSlot": true,
  • "playbackSlotDuration": 0,
  • "playbackSlotNumberOfElementsToPlay": 0,
  • "tags": [
    ],
  • "level": "TOP",
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC",
  • "readOnly": true
}

Delete campaign

Delete a campaign.

Minimum role: APPROVER

Authorizations:
bearer
path Parameters
campaignId
required
integer

Campaign ID

Responses

Request samples

curl -X DELETE 'https://{server}/api/campaign/653' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Get devices playing a campaign

Retrieve devices that are assigned to play the specified campaign.

Minimum role: VIEWER

Authorizations:
bearer
query Parameters
campaignId
required
integer

Campaign ID

Responses

Request samples

curl -X GET 'https://{server}/api/campaign/playerDevices?campaignId=653' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Response samples

Content type
application/json
[
  • {
    }
]

Delete campaigns by date

Delete campaigns that have a validTo date before the specified date.

Minimum role: OWNER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
date
required
string
Example: date=2024-01-01

Delete campaigns with validTo before this date (format YYYY-MM-DD)

level
string
Default: "WIDGET"
Enum: "WIDGET" "TOP"

Campaign level filter (WIDGET = Channel, TOP = Schedule)

Responses

Request samples

curl -X DELETE 'https://{server}/api/campaign/deleteCampaignsByDate?customerId=182&date=2024-01-01' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Update campaign team assignments

Update team assignments for a campaign. Controls which teams have access to the campaign.

Minimum role: OWNER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
campaignId
required
integer

Campaign ID

Request Body schema: application/json
required
Array of objects

Teams to assign the resource to

removeFromTeamIds
Array of strings

Team IDs to remove the resource from

Responses

Request samples

Content type
application/json
{
  • "assignToTeams": [
    ],
  • "removeFromTeamIds": [
    ]
}

message group

Sub-channel group management. Sub-channel groups are organizational containers that group related sub-channels within a channel.

List message groups

Retrieve a paginated list of message groups (sub-channel groups).

Minimum role: VIEWER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
search
string

WBQL (Wallboard Query Language) search expression for filtering.

Value operators:

  • : - contains (strings) / equals (other types)
  • = - exact match
  • >, >=, <, <= - comparison operators

Logical operators:

  • , - AND
  • | - OR

Examples:

  • name:mycamp - name contains "mycamp"
  • enabled=true - only enabled campaigns
  • weight<5 - priority higher than 5 (lower weight = higher priority)
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: field,direction

  • Directions: asc, desc
  • Multiple sorts: sort=name,asc&sort=lastActivity,desc

Responses

Request samples

curl -X GET 'https://{server}/api/messageGroup?customerId=182&page=0&size=15&sort=name' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Response samples

Content type
application/json
{
  • "first": true,
  • "last": true,
  • "number": 0,
  • "numberOfElements": 0,
  • "totalElements": 0,
  • "totalPages": 0,
  • "size": 0,
  • "content": [
    ]
}

Create message group

Create a new message group (sub-channel group).

Minimum role: APPROVER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
teamIds
string
Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false

Team assignment for new resources. Format: {teamId}:{readOnly},{teamId}:{readOnly} Required for users who belong to teams and have roles lower than OWNER.

Request Body schema: application/json
required
name
string

Message group name

comment
string

Message group comment

weight
integer

Priority (lower number = higher priority)

saturation
number <float>
shuffleMode
string (CampaignContentShuffleMode)
Enum: "BALANCED" "SERIAL"

Content shuffle mode for playback

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "comment": "string",
  • "weight": 0,
  • "saturation": 0.1,
  • "shuffleMode": "BALANCED"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "weight": 0,
  • "saturation": 0.1,
  • "shuffleMode": "BALANCED",
  • "customerId": 0,
  • "readOnly": true
}

Update message group

Update an existing message group.

Minimum role: APPROVER

Authorizations:
bearer
path Parameters
messageGroupId
required
integer

Message group ID

Request Body schema: application/json
required
name
string
comment
string

Message group comment

weight
integer
saturation
number <float>
shuffleMode
string (CampaignContentShuffleMode)
Enum: "BALANCED" "SERIAL"

Content shuffle mode for playback

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "comment": "string",
  • "weight": 0,
  • "saturation": 0.1,
  • "shuffleMode": "BALANCED"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "weight": 0,
  • "saturation": 0.1,
  • "shuffleMode": "BALANCED",
  • "customerId": 0,
  • "readOnly": true
}

Delete message group

Delete a message group.

Minimum role: APPROVER

Authorizations:
bearer
path Parameters
messageGroupId
required
integer

Message group ID

Responses

Request samples

curl -X DELETE 'https://{server}/api/messageGroup/1264' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Update message group team assignments

Update team assignments for a message group.

Minimum role: OWNER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
messageGroupId
required
integer

Message group ID

Request Body schema: application/json
required
Array of objects

Teams to assign the resource to

removeFromTeamIds
Array of strings

Team IDs to remove the resource from

Responses

Request samples

Content type
application/json
{
  • "assignToTeams": [
    ],
  • "removeFromTeamIds": [
    ]
}

message

Sub-channel management. Sub-channels are content items within channels, each with its own device tags, scheduling rules, and content assignment.

List messages (sub-channels)

Retrieve a paginated list of messages (sub-channels).

Minimum role: VIEWER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
search
string

WBQL (Wallboard Query Language) search expression for filtering.

Value operators:

  • : - contains (strings) / equals (other types)
  • = - exact match
  • >, >=, <, <= - comparison operators

Logical operators:

  • , - AND
  • | - OR

Examples:

  • name:mycamp - name contains "mycamp"
  • enabled=true - only enabled campaigns
  • weight<5 - priority higher than 5 (lower weight = higher priority)
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: field,direction

  • Directions: asc, desc
  • Multiple sorts: sort=name,asc&sort=lastActivity,desc
select
string

WBQL select expression to specify returned fields.

Syntax:

  • * - all primitive attributes (default)
  • field1,field2 - specific fields
  • relation(field1,field2) - fields from related entities

Examples:

  • select=id,name,enabled
  • select=*,customer(id,name)

Responses

Request samples

curl -X GET 'https://{server}/api/v2/message?customerId=182&page=0&size=15&sort=name' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Response samples

Content type
application/json
{
  • "first": true,
  • "last": true,
  • "number": 0,
  • "numberOfElements": 0,
  • "totalElements": 0,
  • "totalPages": 0,
  • "size": 0,
  • "content": [
    ]
}

Create message (sub-channel)

Create a new message (sub-channel) in a campaign.

Minimum role: EDITOR with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
teamIds
string
Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false

Team assignment for new resources. Format: {teamId}:{readOnly},{teamId}:{readOnly} Required for users who belong to teams and have roles lower than OWNER.

Request Body schema: application/json
required
text
string

Message text/name

comment
string

Message comment

version
string

Version identifier

locked
boolean
Default: false

Whether the message is locked

isPlayedElementsCappedByItemCount
boolean
Default: true

Cap played elements by item count

widgetOverrides
object

Widget override configuration (JSON)

validFrom
string

Start date

validTo
string

End date

object (TeamAccessList)

Team access configuration (JSON)

object (TeamAccessList)

Team access configuration (JSON)

type
string (MessagePlayedAssetType)
Enum: "CONTENT" "ASSETS_STATIC" "ASSETS_DYNAMIC" "TEXT" "CONTENT_DYNAMIC" "CONTENT_QUICK_FILTER" "ASSET_QUICK_FILTER"

Type of assets played by the message

contentId
string

Content to play

weight
integer

Priority (lower number = higher priority)

skipDefaultPage
boolean
enabled
boolean
Default: true
object (WorkingTime)

Daily time range configuration (JSON)

object (WorkingDays)

Days of the week configuration (JSON)

messageGroupId
integer

Parent message group ID

name
string
deviceGroupId
string
saturation
number <float>
tags
Array of strings
defaultDuration
integer
orderingMode
string (CampaignOrderingMode)
Enum: "RANDOM" "ALPHABET" "DEFAULT"

Content ordering mode

contentShuffleMode
string (CampaignContentShuffleMode)
Enum: "BALANCED" "SERIAL"

Content shuffle mode for playback

object (WorkingDateRanges)

Date range intervals

advertiserId
string
object (MessageFileAssignmentDto)
object (MessageFileFolderAssignmentDto)
object (MessageDeviceAssignmentDto)
object (MessageDeviceGroupAssignmentDto)
object (MessageContentAssignmentDto)
object (MessageContentGroupAssignmentDto)
object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

contentQuickFilterId
string
fileQuickFilterId
string
deviceQuickFilterId
string
deviceSelectionMode
string (CampaignDeviceSelectionMode)
Enum: "STATIC" "DYNAMIC" "QUICK_FILTER"

Device selection mode

Responses

Request samples

Content type
application/json
{
  • "text": "string",
  • "comment": "string",
  • "version": "string",
  • "locked": false,
  • "isPlayedElementsCappedByItemCount": true,
  • "widgetOverrides": { },
  • "validFrom": "string",
  • "validTo": "string",
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "type": "CONTENT",
  • "contentId": "string",
  • "weight": 0,
  • "skipDefaultPage": true,
  • "enabled": true,
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "messageGroupId": 0,
  • "name": "string",
  • "deviceGroupId": "string",
  • "saturation": 0.1,
  • "tags": [
    ],
  • "defaultDuration": 0,
  • "orderingMode": "RANDOM",
  • "contentShuffleMode": "BALANCED",
  • "affectedDateRanges": {
    },
  • "advertiserId": "string",
  • "fileAssignment": {
    },
  • "fileFolderAssignment": {
    },
  • "deviceAssignment": {
    },
  • "deviceGroupAssignment": {
    },
  • "contentAssignment": {
    },
  • "contentGroupAssignment": {
    },
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "validFrom": "string",
  • "validTo": "string",
  • "weight": 0,
  • "text": "string",
  • "type": "CONTENT",
  • "skipDefaultPage": true,
  • "enabled": true,
  • "contentId": "string",
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "messageGroupId": 0,
  • "name": "string",
  • "deviceGroupId": "string",
  • "customerId": 0,
  • "creatorEmail": "string",
  • "lastSavedByEmail": "string",
  • "createDate": 0,
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "saturation": 0.1,
  • "tags": [
    ],
  • "defaultDuration": 0,
  • "orderingMode": "RANDOM",
  • "contentShuffleMode": "BALANCED",
  • "affectedDateRanges": {
    },
  • "advertiserId": "string",
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC",
  • "readOnly": true,
  • "deviceGroupName": "string",
  • "contentName": "string"
}

List messages (legacy)

Retrieve a paginated list of messages. Use /api/v2/message for improved response format.

Minimum role: VIEWER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
search
string

WBQL (Wallboard Query Language) search expression for filtering.

Value operators:

  • : - contains (strings) / equals (other types)
  • = - exact match
  • >, >=, <, <= - comparison operators

Logical operators:

  • , - AND
  • | - OR

Examples:

  • name:mycamp - name contains "mycamp"
  • enabled=true - only enabled campaigns
  • weight<5 - priority higher than 5 (lower weight = higher priority)
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: field,direction

  • Directions: asc, desc
  • Multiple sorts: sort=name,asc&sort=lastActivity,desc
includeDeviceGroupName
boolean
Default: false

Include device group name in response

includeContentName
boolean
Default: false

Include content name in response

Responses

Response samples

Content type
application/json
{
  • "first": true,
  • "last": true,
  • "number": 0,
  • "numberOfElements": 0,
  • "totalElements": 0,
  • "totalPages": 0,
  • "size": 0,
  • "content": [
    ]
}

Update message

Update an existing message (sub-channel).

Minimum role: EDITOR

Authorizations:
bearer
path Parameters
messageId
required
integer

Message ID

Request Body schema: application/json
required
text
string
comment
string

Message comment

version
string

Version identifier

locked
boolean

Whether the message is locked

isPlayedElementsCappedByItemCount
boolean

Cap played elements by item count

validFrom
string
validTo
string
object (TeamAccessList)

Team access configuration (JSON)

object (TeamAccessList)

Team access configuration (JSON)

contentId
string
resetContentId
boolean

If true, clears the content assignment

weight
integer
skipDefaultPage
boolean
enabled
boolean
object (WorkingTime)

Daily time range configuration (JSON)

object (WorkingDays)

Days of the week configuration (JSON)

name
string
deviceGroupId
string
resetDeviceGroup
boolean
widgetOverrides
object
resetValidTo
boolean
saturation
number <float>
tags
Array of strings
defaultDuration
integer
orderingMode
string (CampaignOrderingMode)
Enum: "RANDOM" "ALPHABET" "DEFAULT"

Content ordering mode

contentShuffleMode
string (CampaignContentShuffleMode)
Enum: "BALANCED" "SERIAL"

Content shuffle mode for playback

object (WorkingDateRanges)

Date range intervals

advertiserId
string
resetAdvertiserId
boolean
object (MessageFileAssignmentDto)
object (MessageFileFolderAssignmentDto)
object (MessageDeviceAssignmentDto)
object (MessageDeviceGroupAssignmentDto)
object (MessageContentAssignmentDto)
object (MessageContentGroupAssignmentDto)
object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

object (TagCondition)

Tag-based filtering condition (JSON)

contentQuickFilterId
string
fileQuickFilterId
string
deviceQuickFilterId
string
deviceSelectionMode
string (CampaignDeviceSelectionMode)
Enum: "STATIC" "DYNAMIC" "QUICK_FILTER"

Device selection mode

Responses

Request samples

Content type
application/json
{
  • "text": "string",
  • "comment": "string",
  • "version": "string",
  • "locked": true,
  • "isPlayedElementsCappedByItemCount": true,
  • "validFrom": "string",
  • "validTo": "string",
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "contentId": "string",
  • "resetContentId": true,
  • "weight": 0,
  • "skipDefaultPage": true,
  • "enabled": true,
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "name": "string",
  • "deviceGroupId": "string",
  • "resetDeviceGroup": true,
  • "widgetOverrides": { },
  • "resetValidTo": true,
  • "saturation": 0.1,
  • "tags": [
    ],
  • "defaultDuration": 0,
  • "orderingMode": "RANDOM",
  • "contentShuffleMode": "BALANCED",
  • "affectedDateRanges": {
    },
  • "advertiserId": "string",
  • "resetAdvertiserId": true,
  • "fileAssignment": {
    },
  • "fileFolderAssignment": {
    },
  • "deviceAssignment": {
    },
  • "deviceGroupAssignment": {
    },
  • "contentAssignment": {
    },
  • "contentGroupAssignment": {
    },
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "validFrom": "string",
  • "validTo": "string",
  • "weight": 0,
  • "text": "string",
  • "type": "CONTENT",
  • "skipDefaultPage": true,
  • "enabled": true,
  • "contentId": "string",
  • "affectedHours": {
    },
  • "affectedDays": {
    },
  • "messageGroupId": 0,
  • "name": "string",
  • "deviceGroupId": "string",
  • "customerId": 0,
  • "creatorEmail": "string",
  • "lastSavedByEmail": "string",
  • "createDate": 0,
  • "teamAccessList": {
    },
  • "playedAssetTeamAccessList": {
    },
  • "saturation": 0.1,
  • "tags": [
    ],
  • "defaultDuration": 0,
  • "orderingMode": "RANDOM",
  • "contentShuffleMode": "BALANCED",
  • "affectedDateRanges": {
    },
  • "advertiserId": "string",
  • "deviceTagCondition": {
    },
  • "contentTagCondition": {
    },
  • "fileTagCondition": {
    },
  • "contentQuickFilterId": "string",
  • "fileQuickFilterId": "string",
  • "deviceQuickFilterId": "string",
  • "deviceSelectionMode": "STATIC",
  • "readOnly": true,
  • "deviceGroupName": "string",
  • "contentName": "string"
}

Delete message

Delete a message (sub-channel).

Minimum role: EDITOR

Authorizations:
bearer
path Parameters
messageId
required
integer

Message ID

Responses

Request samples

curl -X DELETE 'https://{server}/api/message/744' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Delete messages by date

Delete messages that have a validTo date before the specified date.

Minimum role: OWNER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
date
required
string
Example: date=2024-01-01

Delete messages with validTo before this date (format YYYY-MM-DD)

Responses

Update message team assignments

Update team assignments for a message.

Minimum role: OWNER with customer selector

Authorizations:
bearer
query Parameters
customerId
integer

Customer/tenant ID for multi-tenant filtering.

  • Required for ADMIN users to select tenant context
  • Non-admin users can omit (defaults to their tenant)
messageId
required
integer

Message ID

Request Body schema: application/json
required
Array of objects

Teams to assign the resource to

removeFromTeamIds
Array of strings

Team IDs to remove the resource from

Responses

Request samples

Content type
application/json
{
  • "assignToTeams": [
    ],
  • "removeFromTeamIds": [
    ]
}