Skip to main content

Wallboard API - Webhooks (2.0)

API Support: [email protected]

Webhook management endpoints for the Wallboard digital signage platform.

Overview

Webhooks allow external systems to trigger actions in Wallboard. When a webhook URL receives a request with a valid API key, it executes the configured action (e.g., enable emergency mode, restart devices).

Why Actions Instead of Direct API

Aspect Direct API Calls Webhook Actions
Setup Write custom integration code Configure in UI, no code needed
Permissions Grant full API access Scoped API keys with minimal permissions
Complexity Build full request logic for each operation Send eventId + optional payload
Maintenance Code changes required for updates Reconfigure in UI
Error handling External system manages retries Wallboard handles async execution
Multi-action Multiple API calls needed One webhook triggers multiple actions

Key Concepts

Concept Description
Webhook Event Action Configuration defining what happens when a webhook is triggered
Webhook API Key Authentication key for incoming webhook requests
Action The operation to perform (emergency mode, restart, content control, etc.)
Target Which devices/groups/tags/campaigns to affect

How Webhooks Work

  1. Create a Webhook API Key for authentication
  2. Create a Webhook Event Action defining what should happen
  3. External system calls webhook URL with API key header
  4. Wallboard executes the configured action (asynchronously)

Authentication

Webhook triggers require an API key passed via the X-Webhook-Apikey header (or apiKey query param for GET requests).

API Key Format:

  • Keys are HMAC-signed JWTs (HS256/HS384/HS512)
  • Each key has scopes that determine what actions it can perform
  • Keys are created via the management API (requires TECHNICIAN role)

Available Scopes:

Scope Description
WEBHOOK_CALL Can trigger webhook actions
PROOF_OF_PLAY_READ Can read proof of play statistics
DATASOURCE_DATA_READ Can read data source data
INTERNAL_DATASOURCE_WRITE Can write to internal data sources

Webhook URL Format

POST https://{server}/public-api/integration/webhooks
Header: X-Webhook-Apikey: <your-api-key>
Content-Type: application/json
Body: {"event_id": "your-event-id", ...}

Trigger Payload Parameters

The webhook trigger accepts a JSON payload with the following parameters:

Parameter Type Required Description
event_id string Yes Event ID matching a configured webhook action
keySelector string No Key path for data source operations (e.g., "visitors", "scores.team1")
value string No Value for data source set/increase/decrease operations
data string No JSON data for merge/array operations
contentId string No Content ID for assignment actions
message string No Message text for toast message actions
sensorData string No JSON sensor data for sensor event actions
volumeLevel string No Volume level (0-100) for volume change actions
priority string No Priority value for campaign priority changes
saturation string No Saturation value for campaign saturation changes
url string No Dynamic URL for URL loading actions

Note: Both camelCase (eventId) and snake_case (event_id) parameter names are accepted.

Available Action Categories

Category Actions
Emergency Mode Enable/Disable on device, tag, group, or all devices
URL Loading Load custom URL on device, tag, group, or all devices
Content Control Pause, Resume, Refresh content on devices
Content Assignment Assign or preview content on devices
Data Source Set, merge, increase/decrease values, array operations
Sensor Events Send custom sensor events to devices
Device Control Restart, Wake up, Snooze devices
Display Control Show toast messages, change volume
Folder Sync Force sync shared folders, upload files
Channel Control Enable/Disable, change saturation/priority of channels

Target Scopes

Scope Suffix Description
*_DEVICE Specific device by ID
*_DEVICE_TAG All devices with specific tag
*_DEVICE_GROUP All devices in a group
*_DEVICE_ALL All devices in customer account
*_CAMPAIGN Specific channel/campaign by ID
*_CAMPAIGN_BY_TAGS Channels/campaigns matching tags
*_DATASOURCE Specific data source by ID
*_DATASOURCE_ALL All data sources
*_FOLDER Specific folder by ID

Trigger Examples by Action Type

Emergency Mode

# Enable emergency on all devices
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "emergency-enable-all"}'

# Disable emergency on specific device (targetIds set in webhook config)
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "emergency-disable-device"}'

Data Source Operations

# Set a value in internal data source
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "set-counter", "keySelector": "visitors", "value": "150"}'

# Increase a numeric value
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "increase-counter", "keySelector": "score", "value": "10"}'

# Decrease a numeric value
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "decrease-counter", "keySelector": "tickets", "value": "1"}'

# Merge data into data source (JSON object)
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "merge-data", "value": "{\"name\":\"John\",\"score\":100}"}'

# Insert to array in data source
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "add-to-queue", "keySelector": "queue", "value": "{\"id\":123,\"name\":\"Item\"}"}'

# Remove from array
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "remove-from-queue", "keySelector": "queue", "value": "123"}'

Device Control

# Restart all devices
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "restart-all"}'

# Wake up devices with specific tag
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "wake-up-lobby"}'

# Snooze device group
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "snooze-floor-1"}'

Content Control

# Refresh content on all devices
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "refresh-all"}'

# Pause content on device group
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "pause-reception"}'

# Resume content
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "resume-reception"}'

URL Loading

# Load custom URL on all devices (URL set in webhook action config)
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "show-alert-page"}'

Sensor Events

# Send sensor event to devices (for custom interactivity)
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "sensor-trigger", "sensorData": "{\"type\":\"motion\",\"zone\":\"entrance\"}"}'

Display Control

# Show toast message on all devices
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "show-message", "message": "Meeting starts in 5 minutes"}'

# Change volume on device group
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "set-volume", "volume": "50"}'

Channel/Campaign Control

# Enable a campaign/channel
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "enable-promo-channel"}'

# Disable a campaign/channel
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -d '{"event_id": "disable-promo-channel"}'

# Change campaign priority
curl -X POST 'https://{server}/public-api/integration/webhooks' \
  -H 'X-Webhook-Apikey: your_api_key' \
  -H 'Content-Type: application/json' \
  -d '{"event_id": "set-priority", "priority": "100"}'

Using GET Method (for simple integrations)

# Base64 encode: {"event_id":"emergency-on"} = eyJldmVudF9pZCI6ImVtZXJnZW5jeS1vbiJ9
curl 'https://{server}/public-api/integration/webhooks?apiKey=your_api_key&payload=eyJldmVudF9pZCI6ImVtZXJnZW5jeS1vbiJ9'

webhook trigger

Endpoints to trigger webhook actions

Trigger webhook (GET request)

Trigger a webhook action using a GET request with Base64-encoded payload.

This endpoint allows external systems to trigger webhook actions using URL parameters, which is useful when the calling system cannot easily send POST requests (e.g., simple automation systems, bookmarks, or QR codes).

How it works:

  1. Encode your JSON payload as Base64
  2. Include the API key and encoded payload as query parameters
  3. The webhook action matching the event_id in the payload is executed

Important: Webhook calls are asynchronous - the response is returned immediately, but the actual action is executed in the background.

Payload format:

{"event_id": "your-event-id", "keySelector": "optional-selector", ...}

The event_id field is required and must match an existing webhook event action. Additional fields in the payload are passed to the action as parameters.

query Parameters
apiKey
required
string

Webhook API key (JWT format)

payload
required
string <base64>
Example: payload=eyJldmVudF9pZCI6ImRlY3JlYXNlIiwia2V5U2VsZWN0b3IiOiJ0ZXN0In0=

Base64-encoded JSON payload. Must contain at least event_id field matching an existing webhook action.

Responses

Request samples

# Payload: {"event_id":"decrease","keySelector":"test"}
# Base64 encoded: eyJldmVudF9pZCI6ImRlY3JlYXNlIiwia2V5U2VsZWN0b3IiOiJ0ZXN0In0=

curl -X GET \
  'https://{server}/public-api/integration/webhooks?apiKey=your_api_key&payload=eyJldmVudF9pZCI6ImRlY3JlYXNlIiwia2V5U2VsZWN0b3IiOiJ0ZXN0In0='

Response samples

Content type
application/json
{
  • "message": "Webhook triggered"
}

Trigger webhook (POST request)

Trigger a webhook action using a POST request with JSON payload.

This is the recommended method for triggering webhooks as it provides better security (API key in header) and supports larger payloads.

How it works:

  1. Set the X-Webhook-Apikey header with your API key
  2. Send a JSON body with event_id and any additional parameters
  3. The webhook action matching the event_id is executed

Important: Webhook calls are asynchronous - the response is returned immediately, but the actual action is executed in the background.

Payload format:

{"event_id": "your-event-id", "keySelector": "optional-selector", ...}

The event_id field is required and must match an existing webhook event action. Additional fields in the payload are passed to the action as parameters.

header Parameters
X-Webhook-Apikey
required
string
Example: wh_abc123xyz789...

Webhook API key

Request Body schema: application/json
required

JSON payload with the event ID and optional parameters. The event_id is required and must match an existing webhook event action.

event_id
required
string

The event ID of the webhook action to trigger. This must match the eventId field of an existing webhook event action. Both event_id (snake_case) and eventId (camelCase) are accepted.

keySelector
string

Key path for data source operations. Supports nested paths with dot notation (e.g., scores.team1). Used with SET_INTERNAL_DATASOURCE, INCREASE_VALUE_IN_DATASOURCE, etc.

value
string

Value for data source operations.

  • For SET: The new value to set
  • For INCREASE/DECREASE: The amount to add/subtract
  • For array insert: JSON object to insert
  • For array remove: The key value to match for removal
data
string

JSON data for merge and array operations. Used with MERGE_INTERNAL_DATASOURCE to merge objects.

contentId
string

Content UUID for content assignment actions. Used with ASSIGN_CONTENT_* and PREVIEW_CONTENT_* actions.

message
string

Message text for toast message actions. Used with SHOW_TOAST_MESSAGE_* actions.

sensorData
string

JSON sensor data for sensor event actions. Used with SEND_SENSOR_EVENT_* actions.

volume
string

Volume level (0-100) for volume change actions. Used with CHANGE_VOLUME_* actions.

priority
string

Priority value for campaign priority changes. Used with CHANGE_PRIORITY_CAMPAIGN* actions.

saturation
string

Saturation value for campaign saturation changes. Used with CHANGE_SATURATION_CAMPAIGN* actions.

url
string

Dynamic URL for URL loading actions. Overrides the URL configured in the webhook action. Used with LOAD_URL_* actions.

property name*
additional property
string

Additional parameters passed to the webhook action

Responses

Request samples

Content type
application/json
Example
{
  • "event_id": "emergency-on"
}

Response samples

Content type
application/json
{
  • "message": "Webhook triggered"
}

webhook event action

Webhook event action configuration

List webhook event actions

Retrieve a paginated list of webhook event actions.

Minimum role: TECHNICIAN 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)
  • Set to -1 to query all tenants (ADMIN only)
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
  • Nested fields: sort=content.name,asc
search
string

WBQL filter expression. Operators: : (contains), = (equals), , , ^ (starts with), >, , <, , (in set). Logic: , (AND), | (OR). Special: NULL, !NULL. Example: name:lobby,deviceStatus=ONLINE

Responses

Request samples

curl -X GET \
  'https://{server}/api/webhookEvent/actions?customerId=123&page=0&size=15&sort=name' \
  -H 'Authorization: Bearer <token>'

Response samples

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

Create webhook event action

Create a new webhook event action.

Minimum role: TECHNICIAN 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)
  • Set to -1 to query all tenants (ADMIN only)
teamIds
string
Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false

Team assignment filter. Format: {teamId}:{readOnly},{teamId}:{readOnly}

Request Body schema: application/json
required
name
required
string

Human-readable name for the webhook action

eventId
string

Custom event ID for webhook URL. If not provided, a UUID will be generated. Must be unique within the customer account.

enabled
boolean
Default: false

Whether to enable this action immediately

action
required
string (WebhookActionType)
Enum: "ENABLE_EMERGENCY_ON_DEVICE" "ENABLE_EMERGENCY_ON_DEVICE_TAG" "ENABLE_EMERGENCY_ON_DEVICE_GROUP" "ENABLE_EMERGENCY_ON_DEVICE_ALL" "DISABLE_EMERGENCY_ON_DEVICE" "DISABLE_EMERGENCY_ON_DEVICE_TAG" "DISABLE_EMERGENCY_ON_DEVICE_GROUP" "DISABLE_EMERGENCY_ON_DEVICE_ALL" "LOAD_URL_ON_DEVICE" "LOAD_URL_ON_DEVICE_TAG" "LOAD_URL_ON_DEVICE_GROUP" "LOAD_URL_ON_DEVICE_ALL" "PAUSE_CONTENT_ON_DEVICE" "PAUSE_CONTENT_ON_DEVICE_TAG" "PAUSE_CONTENT_ON_DEVICE_GROUP" "PAUSE_CONTENT_ON_DEVICE_ALL" "RESUME_CONTENT_ON_DEVICE" "RESUME_CONTENT_ON_DEVICE_TAG" "RESUME_CONTENT_ON_DEVICE_GROUP" "RESUME_CONTENT_ON_DEVICE_ALL" "REFRESH_CONTENT_ON_DEVICE" "REFRESH_CONTENT_ON_DEVICE_TAG" "REFRESH_CONTENT_ON_DEVICE_GROUP" "REFRESH_CONTENT_ON_DEVICE_ALL" "REFRESH_DATASOURCE" "REFRESH_DATASOURCE_ALL" "SET_INTERNAL_DATASOURCE" "INCREASE_VALUE_IN_DATASOURCE" "DECREASE_VALUE_IN_DATASOURCE" "MERGE_INTERNAL_DATASOURCE" "INSERT_CAP_DATASOURCE" "DELETE_BY_KEY_INTERNAL_DATASOURCE" "INSERT_TO_ARRAY_INTERNAL_DATASOURCE" "REMOVE_FROM_ARRAY_INTERNAL_DATASOURCE" "EMPTY_ARRAY_INTERNAL_DATASOURCE" "ROTATE_ARRAY_INTERNAL_DATASOURCE" "REPLACE_OR_MERGE_ELEMENT_IN_ARRAY_INTERNAL_DATASOURCE" "SEND_SENSOR_EVENT_TO_DEVICE" "SEND_SENSOR_EVENT_TO_DEVICE_TAG" "SEND_SENSOR_EVENT_TO_DEVICE_GROUP" "SEND_SENSOR_EVENT_TO_DEVICE_ALL" "RESTART_DEVICE" "RESTART_DEVICE_TAG" "RESTART_DEVICE_GROUP" "RESTART_DEVICE_ALL" "ASSIGN_CONTENT_ON_DEVICE" "ASSIGN_CONTENT_ON_DEVICE_TAG" "ASSIGN_CONTENT_ON_DEVICE_GROUP" "ASSIGN_CONTENT_ON_DEVICE_ALL" "PREVIEW_CONTENT_ON_DEVICE" "PREVIEW_CONTENT_ON_DEVICE_TAG" "PREVIEW_CONTENT_ON_DEVICE_GROUP" "PREVIEW_CONTENT_ON_DEVICE_ALL" "WAKE_UP_DEVICE" "WAKE_UP_DEVICE_TAG" "WAKE_UP_DEVICE_GROUP" "WAKE_UP_DEVICE_ALL" "SNOOZE_DEVICE" "SNOOZE_DEVICE_TAG" "SNOOZE_DEVICE_GROUP" "SNOOZE_DEVICE_ALL" "SHOW_TOAST_MESSAGE_DEVICE" "SHOW_TOAST_MESSAGE_DEVICE_TAG" "SHOW_TOAST_MESSAGE_DEVICE_GROUP" "SHOW_TOAST_MESSAGE_DEVICE_ALL" "CHANGE_VOLUME_DEVICE" "CHANGE_VOLUME_DEVICE_TAG" "CHANGE_VOLUME_DEVICE_GROUP" "CHANGE_VOLUME_DEVICE_ALL" "FORCE_SYNC_SHARED_FOLDER" "UPLOAD_FILE_TO_FOLDER" "ENABLE_CAMPAIGN" "DISABLE_CAMPAIGN" "CHANGE_SATURATION_CAMPAIGN" "CHANGE_PRIORITY_CAMPAIGN" "ENABLE_CAMPAIGN_BY_TAGS" "DISABLE_CAMPAIGN_BY_TAGS" "CHANGE_SATURATION_CAMPAIGN_BY_TAGS" "CHANGE_PRIORITY_CAMPAIGN_BY_TAGS"

Action to execute when webhook is triggered.

Emergency Mode Actions:

  • ENABLE_EMERGENCY_ON_DEVICE - Enable emergency mode on specific device
  • ENABLE_EMERGENCY_ON_DEVICE_TAG - Enable emergency mode on devices with tag
  • ENABLE_EMERGENCY_ON_DEVICE_GROUP - Enable emergency mode on device group
  • ENABLE_EMERGENCY_ON_DEVICE_ALL - Enable emergency mode on all devices
  • DISABLE_EMERGENCY_ON_DEVICE - Disable emergency mode on specific device
  • DISABLE_EMERGENCY_ON_DEVICE_TAG - Disable emergency mode on devices with tag
  • DISABLE_EMERGENCY_ON_DEVICE_GROUP - Disable emergency mode on device group
  • DISABLE_EMERGENCY_ON_DEVICE_ALL - Disable emergency mode on all devices

URL Loading Actions:

  • LOAD_URL_ON_DEVICE - Load custom URL on specific device
  • LOAD_URL_ON_DEVICE_TAG - Load custom URL on devices with tag
  • LOAD_URL_ON_DEVICE_GROUP - Load custom URL on device group
  • LOAD_URL_ON_DEVICE_ALL - Load custom URL on all devices

Content Control Actions:

  • PAUSE_CONTENT_ON_DEVICE - Pause content on specific device
  • PAUSE_CONTENT_ON_DEVICE_TAG - Pause content on devices with tag
  • PAUSE_CONTENT_ON_DEVICE_GROUP - Pause content on device group
  • PAUSE_CONTENT_ON_DEVICE_ALL - Pause content on all devices
  • RESUME_CONTENT_ON_DEVICE - Resume content on specific device
  • RESUME_CONTENT_ON_DEVICE_TAG - Resume content on devices with tag
  • RESUME_CONTENT_ON_DEVICE_GROUP - Resume content on device group
  • RESUME_CONTENT_ON_DEVICE_ALL - Resume content on all devices
  • REFRESH_CONTENT_ON_DEVICE - Refresh content on specific device
  • REFRESH_CONTENT_ON_DEVICE_TAG - Refresh content on devices with tag
  • REFRESH_CONTENT_ON_DEVICE_GROUP - Refresh content on device group
  • REFRESH_CONTENT_ON_DEVICE_ALL - Refresh content on all devices

Content Assignment Actions:

  • ASSIGN_CONTENT_ON_DEVICE - Assign content to specific device
  • ASSIGN_CONTENT_ON_DEVICE_TAG - Assign content to devices with tag
  • ASSIGN_CONTENT_ON_DEVICE_GROUP - Assign content to device group
  • ASSIGN_CONTENT_ON_DEVICE_ALL - Assign content to all devices
  • PREVIEW_CONTENT_ON_DEVICE - Preview content on specific device
  • PREVIEW_CONTENT_ON_DEVICE_TAG - Preview content on devices with tag
  • PREVIEW_CONTENT_ON_DEVICE_GROUP - Preview content on device group
  • PREVIEW_CONTENT_ON_DEVICE_ALL - Preview content on all devices

Data Source Actions:

  • REFRESH_DATASOURCE - Refresh specific data source
  • REFRESH_DATASOURCE_ALL - Refresh all data sources
  • SET_INTERNAL_DATASOURCE - Set value in internal data source
  • INCREASE_VALUE_IN_DATASOURCE - Increase numeric value in data source
  • DECREASE_VALUE_IN_DATASOURCE - Decrease numeric value in data source
  • MERGE_INTERNAL_DATASOURCE - Merge data into internal data source
  • INSERT_CAP_DATASOURCE - Insert capacity data into data source
  • DELETE_BY_KEY_INTERNAL_DATASOURCE - Delete key from internal data source
  • INSERT_TO_ARRAY_INTERNAL_DATASOURCE - Insert element to array in data source
  • REMOVE_FROM_ARRAY_INTERNAL_DATASOURCE - Remove element from array in data source
  • EMPTY_ARRAY_INTERNAL_DATASOURCE - Empty array in data source
  • ROTATE_ARRAY_INTERNAL_DATASOURCE - Rotate array in data source
  • REPLACE_OR_MERGE_ELEMENT_IN_ARRAY_INTERNAL_DATASOURCE - Replace or merge array element

Sensor Event Actions:

  • SEND_SENSOR_EVENT_TO_DEVICE - Send sensor event to specific device
  • SEND_SENSOR_EVENT_TO_DEVICE_TAG - Send sensor event to devices with tag
  • SEND_SENSOR_EVENT_TO_DEVICE_GROUP - Send sensor event to device group
  • SEND_SENSOR_EVENT_TO_DEVICE_ALL - Send sensor event to all devices

Device Control Actions:

  • RESTART_DEVICE - Restart specific device
  • RESTART_DEVICE_TAG - Restart devices with tag
  • RESTART_DEVICE_GROUP - Restart device group
  • RESTART_DEVICE_ALL - Restart all devices
  • WAKE_UP_DEVICE - Wake up specific device
  • WAKE_UP_DEVICE_TAG - Wake up devices with tag
  • WAKE_UP_DEVICE_GROUP - Wake up device group
  • WAKE_UP_DEVICE_ALL - Wake up all devices
  • SNOOZE_DEVICE - Snooze specific device
  • SNOOZE_DEVICE_TAG - Snooze devices with tag
  • SNOOZE_DEVICE_GROUP - Snooze device group
  • SNOOZE_DEVICE_ALL - Snooze all devices

Display Control Actions:

  • SHOW_TOAST_MESSAGE_DEVICE - Show toast message on specific device
  • SHOW_TOAST_MESSAGE_DEVICE_TAG - Show toast message on devices with tag
  • SHOW_TOAST_MESSAGE_DEVICE_GROUP - Show toast message on device group
  • SHOW_TOAST_MESSAGE_DEVICE_ALL - Show toast message on all devices
  • CHANGE_VOLUME_DEVICE - Change volume on specific device
  • CHANGE_VOLUME_DEVICE_TAG - Change volume on devices with tag
  • CHANGE_VOLUME_DEVICE_GROUP - Change volume on device group
  • CHANGE_VOLUME_DEVICE_ALL - Change volume on all devices

Folder Actions:

  • FORCE_SYNC_SHARED_FOLDER - Force sync shared folder
  • UPLOAD_FILE_TO_FOLDER - Upload file to folder

Channel/Campaign Actions:

  • ENABLE_CAMPAIGN - Enable specific channel/campaign
  • DISABLE_CAMPAIGN - Disable specific channel/campaign
  • CHANGE_SATURATION_CAMPAIGN - Change saturation of channel/campaign
  • CHANGE_PRIORITY_CAMPAIGN - Change priority of channel/campaign
  • ENABLE_CAMPAIGN_BY_TAGS - Enable channels/campaigns by tags
  • DISABLE_CAMPAIGN_BY_TAGS - Disable channels/campaigns by tags
  • CHANGE_SATURATION_CAMPAIGN_BY_TAGS - Change saturation by tags
  • CHANGE_PRIORITY_CAMPAIGN_BY_TAGS - Change priority by tags
object

Additional parameters for the action

targetId
string

Single target ID (alternative to targetData for single target)

object (TargetData)

Target specification for the webhook action

Responses

Request samples

Content type
application/json
Example
{
  • "name": "Fire Alarm Emergency",
  • "enabled": true,
  • "action": "ENABLE_EMERGENCY_ON_DEVICE",
  • "targetData": {
    }
}

Response samples

Content type
application/json
{
  • "id": 133,
  • "name": "Emergency Alert Trigger",
  • "eventId": "fire-alarm-trigger",
  • "enabled": true,
  • "action": "ENABLE_EMERGENCY_ON_DEVICE",
  • "actionParams": {},
  • "targetData": {
    },
  • "targetName": "Lobby Display",
  • "targetId": "device-uuid-123",
  • "customerId": 182,
  • "readOnly": false
}

Update webhook event action

Update an existing webhook event action.

Minimum role: TECHNICIAN

Authorizations:
bearer
path Parameters
actionId
required
integer <int64>

Webhook event action ID

Request Body schema: application/json
required
name
string

Human-readable name for the webhook action

eventId
string

Custom event ID for webhook URL

enabled
boolean

Whether this action is enabled

action
string (WebhookActionType)
Enum: "ENABLE_EMERGENCY_ON_DEVICE" "ENABLE_EMERGENCY_ON_DEVICE_TAG" "ENABLE_EMERGENCY_ON_DEVICE_GROUP" "ENABLE_EMERGENCY_ON_DEVICE_ALL" "DISABLE_EMERGENCY_ON_DEVICE" "DISABLE_EMERGENCY_ON_DEVICE_TAG" "DISABLE_EMERGENCY_ON_DEVICE_GROUP" "DISABLE_EMERGENCY_ON_DEVICE_ALL" "LOAD_URL_ON_DEVICE" "LOAD_URL_ON_DEVICE_TAG" "LOAD_URL_ON_DEVICE_GROUP" "LOAD_URL_ON_DEVICE_ALL" "PAUSE_CONTENT_ON_DEVICE" "PAUSE_CONTENT_ON_DEVICE_TAG" "PAUSE_CONTENT_ON_DEVICE_GROUP" "PAUSE_CONTENT_ON_DEVICE_ALL" "RESUME_CONTENT_ON_DEVICE" "RESUME_CONTENT_ON_DEVICE_TAG" "RESUME_CONTENT_ON_DEVICE_GROUP" "RESUME_CONTENT_ON_DEVICE_ALL" "REFRESH_CONTENT_ON_DEVICE" "REFRESH_CONTENT_ON_DEVICE_TAG" "REFRESH_CONTENT_ON_DEVICE_GROUP" "REFRESH_CONTENT_ON_DEVICE_ALL" "REFRESH_DATASOURCE" "REFRESH_DATASOURCE_ALL" "SET_INTERNAL_DATASOURCE" "INCREASE_VALUE_IN_DATASOURCE" "DECREASE_VALUE_IN_DATASOURCE" "MERGE_INTERNAL_DATASOURCE" "INSERT_CAP_DATASOURCE" "DELETE_BY_KEY_INTERNAL_DATASOURCE" "INSERT_TO_ARRAY_INTERNAL_DATASOURCE" "REMOVE_FROM_ARRAY_INTERNAL_DATASOURCE" "EMPTY_ARRAY_INTERNAL_DATASOURCE" "ROTATE_ARRAY_INTERNAL_DATASOURCE" "REPLACE_OR_MERGE_ELEMENT_IN_ARRAY_INTERNAL_DATASOURCE" "SEND_SENSOR_EVENT_TO_DEVICE" "SEND_SENSOR_EVENT_TO_DEVICE_TAG" "SEND_SENSOR_EVENT_TO_DEVICE_GROUP" "SEND_SENSOR_EVENT_TO_DEVICE_ALL" "RESTART_DEVICE" "RESTART_DEVICE_TAG" "RESTART_DEVICE_GROUP" "RESTART_DEVICE_ALL" "ASSIGN_CONTENT_ON_DEVICE" "ASSIGN_CONTENT_ON_DEVICE_TAG" "ASSIGN_CONTENT_ON_DEVICE_GROUP" "ASSIGN_CONTENT_ON_DEVICE_ALL" "PREVIEW_CONTENT_ON_DEVICE" "PREVIEW_CONTENT_ON_DEVICE_TAG" "PREVIEW_CONTENT_ON_DEVICE_GROUP" "PREVIEW_CONTENT_ON_DEVICE_ALL" "WAKE_UP_DEVICE" "WAKE_UP_DEVICE_TAG" "WAKE_UP_DEVICE_GROUP" "WAKE_UP_DEVICE_ALL" "SNOOZE_DEVICE" "SNOOZE_DEVICE_TAG" "SNOOZE_DEVICE_GROUP" "SNOOZE_DEVICE_ALL" "SHOW_TOAST_MESSAGE_DEVICE" "SHOW_TOAST_MESSAGE_DEVICE_TAG" "SHOW_TOAST_MESSAGE_DEVICE_GROUP" "SHOW_TOAST_MESSAGE_DEVICE_ALL" "CHANGE_VOLUME_DEVICE" "CHANGE_VOLUME_DEVICE_TAG" "CHANGE_VOLUME_DEVICE_GROUP" "CHANGE_VOLUME_DEVICE_ALL" "FORCE_SYNC_SHARED_FOLDER" "UPLOAD_FILE_TO_FOLDER" "ENABLE_CAMPAIGN" "DISABLE_CAMPAIGN" "CHANGE_SATURATION_CAMPAIGN" "CHANGE_PRIORITY_CAMPAIGN" "ENABLE_CAMPAIGN_BY_TAGS" "DISABLE_CAMPAIGN_BY_TAGS" "CHANGE_SATURATION_CAMPAIGN_BY_TAGS" "CHANGE_PRIORITY_CAMPAIGN_BY_TAGS"

Action to execute when webhook is triggered.

Emergency Mode Actions:

  • ENABLE_EMERGENCY_ON_DEVICE - Enable emergency mode on specific device
  • ENABLE_EMERGENCY_ON_DEVICE_TAG - Enable emergency mode on devices with tag
  • ENABLE_EMERGENCY_ON_DEVICE_GROUP - Enable emergency mode on device group
  • ENABLE_EMERGENCY_ON_DEVICE_ALL - Enable emergency mode on all devices
  • DISABLE_EMERGENCY_ON_DEVICE - Disable emergency mode on specific device
  • DISABLE_EMERGENCY_ON_DEVICE_TAG - Disable emergency mode on devices with tag
  • DISABLE_EMERGENCY_ON_DEVICE_GROUP - Disable emergency mode on device group
  • DISABLE_EMERGENCY_ON_DEVICE_ALL - Disable emergency mode on all devices

URL Loading Actions:

  • LOAD_URL_ON_DEVICE - Load custom URL on specific device
  • LOAD_URL_ON_DEVICE_TAG - Load custom URL on devices with tag
  • LOAD_URL_ON_DEVICE_GROUP - Load custom URL on device group
  • LOAD_URL_ON_DEVICE_ALL - Load custom URL on all devices

Content Control Actions:

  • PAUSE_CONTENT_ON_DEVICE - Pause content on specific device
  • PAUSE_CONTENT_ON_DEVICE_TAG - Pause content on devices with tag
  • PAUSE_CONTENT_ON_DEVICE_GROUP - Pause content on device group
  • PAUSE_CONTENT_ON_DEVICE_ALL - Pause content on all devices
  • RESUME_CONTENT_ON_DEVICE - Resume content on specific device
  • RESUME_CONTENT_ON_DEVICE_TAG - Resume content on devices with tag
  • RESUME_CONTENT_ON_DEVICE_GROUP - Resume content on device group
  • RESUME_CONTENT_ON_DEVICE_ALL - Resume content on all devices
  • REFRESH_CONTENT_ON_DEVICE - Refresh content on specific device
  • REFRESH_CONTENT_ON_DEVICE_TAG - Refresh content on devices with tag
  • REFRESH_CONTENT_ON_DEVICE_GROUP - Refresh content on device group
  • REFRESH_CONTENT_ON_DEVICE_ALL - Refresh content on all devices

Content Assignment Actions:

  • ASSIGN_CONTENT_ON_DEVICE - Assign content to specific device
  • ASSIGN_CONTENT_ON_DEVICE_TAG - Assign content to devices with tag
  • ASSIGN_CONTENT_ON_DEVICE_GROUP - Assign content to device group
  • ASSIGN_CONTENT_ON_DEVICE_ALL - Assign content to all devices
  • PREVIEW_CONTENT_ON_DEVICE - Preview content on specific device
  • PREVIEW_CONTENT_ON_DEVICE_TAG - Preview content on devices with tag
  • PREVIEW_CONTENT_ON_DEVICE_GROUP - Preview content on device group
  • PREVIEW_CONTENT_ON_DEVICE_ALL - Preview content on all devices

Data Source Actions:

  • REFRESH_DATASOURCE - Refresh specific data source
  • REFRESH_DATASOURCE_ALL - Refresh all data sources
  • SET_INTERNAL_DATASOURCE - Set value in internal data source
  • INCREASE_VALUE_IN_DATASOURCE - Increase numeric value in data source
  • DECREASE_VALUE_IN_DATASOURCE - Decrease numeric value in data source
  • MERGE_INTERNAL_DATASOURCE - Merge data into internal data source
  • INSERT_CAP_DATASOURCE - Insert capacity data into data source
  • DELETE_BY_KEY_INTERNAL_DATASOURCE - Delete key from internal data source
  • INSERT_TO_ARRAY_INTERNAL_DATASOURCE - Insert element to array in data source
  • REMOVE_FROM_ARRAY_INTERNAL_DATASOURCE - Remove element from array in data source
  • EMPTY_ARRAY_INTERNAL_DATASOURCE - Empty array in data source
  • ROTATE_ARRAY_INTERNAL_DATASOURCE - Rotate array in data source
  • REPLACE_OR_MERGE_ELEMENT_IN_ARRAY_INTERNAL_DATASOURCE - Replace or merge array element

Sensor Event Actions:

  • SEND_SENSOR_EVENT_TO_DEVICE - Send sensor event to specific device
  • SEND_SENSOR_EVENT_TO_DEVICE_TAG - Send sensor event to devices with tag
  • SEND_SENSOR_EVENT_TO_DEVICE_GROUP - Send sensor event to device group
  • SEND_SENSOR_EVENT_TO_DEVICE_ALL - Send sensor event to all devices

Device Control Actions:

  • RESTART_DEVICE - Restart specific device
  • RESTART_DEVICE_TAG - Restart devices with tag
  • RESTART_DEVICE_GROUP - Restart device group
  • RESTART_DEVICE_ALL - Restart all devices
  • WAKE_UP_DEVICE - Wake up specific device
  • WAKE_UP_DEVICE_TAG - Wake up devices with tag
  • WAKE_UP_DEVICE_GROUP - Wake up device group
  • WAKE_UP_DEVICE_ALL - Wake up all devices
  • SNOOZE_DEVICE - Snooze specific device
  • SNOOZE_DEVICE_TAG - Snooze devices with tag
  • SNOOZE_DEVICE_GROUP - Snooze device group
  • SNOOZE_DEVICE_ALL - Snooze all devices

Display Control Actions:

  • SHOW_TOAST_MESSAGE_DEVICE - Show toast message on specific device
  • SHOW_TOAST_MESSAGE_DEVICE_TAG - Show toast message on devices with tag
  • SHOW_TOAST_MESSAGE_DEVICE_GROUP - Show toast message on device group
  • SHOW_TOAST_MESSAGE_DEVICE_ALL - Show toast message on all devices
  • CHANGE_VOLUME_DEVICE - Change volume on specific device
  • CHANGE_VOLUME_DEVICE_TAG - Change volume on devices with tag
  • CHANGE_VOLUME_DEVICE_GROUP - Change volume on device group
  • CHANGE_VOLUME_DEVICE_ALL - Change volume on all devices

Folder Actions:

  • FORCE_SYNC_SHARED_FOLDER - Force sync shared folder
  • UPLOAD_FILE_TO_FOLDER - Upload file to folder

Channel/Campaign Actions:

  • ENABLE_CAMPAIGN - Enable specific channel/campaign
  • DISABLE_CAMPAIGN - Disable specific channel/campaign
  • CHANGE_SATURATION_CAMPAIGN - Change saturation of channel/campaign
  • CHANGE_PRIORITY_CAMPAIGN - Change priority of channel/campaign
  • ENABLE_CAMPAIGN_BY_TAGS - Enable channels/campaigns by tags
  • DISABLE_CAMPAIGN_BY_TAGS - Disable channels/campaigns by tags
  • CHANGE_SATURATION_CAMPAIGN_BY_TAGS - Change saturation by tags
  • CHANGE_PRIORITY_CAMPAIGN_BY_TAGS - Change priority by tags
object

Additional parameters for the action

targetId
string

Single target ID

object (TargetData)

Target specification for the webhook action

Responses

Request samples

Content type
application/json
{
  • "name": "Updated Emergency Alert",
  • "eventId": "updated-fire-alarm",
  • "enabled": false,
  • "action": "ENABLE_EMERGENCY_ON_DEVICE",
  • "actionParams": {
    },
  • "targetId": "string",
  • "targetData": {
    }
}

Response samples

Content type
application/json
{
  • "id": 133,
  • "name": "Emergency Alert Trigger",
  • "eventId": "fire-alarm-trigger",
  • "enabled": true,
  • "action": "ENABLE_EMERGENCY_ON_DEVICE",
  • "actionParams": {},
  • "targetData": {
    },
  • "targetName": "Lobby Display",
  • "targetId": "device-uuid-123",
  • "customerId": 182,
  • "readOnly": false
}

Delete webhook event action

Delete a webhook event action.

Minimum role: TECHNICIAN

Authorizations:
bearer
path Parameters
actionId
required
integer <int64>

Webhook event action ID

Responses

Request samples

curl -X DELETE \
  'https://{server}/api/webhookEvent/actions/133' \
  -H 'Authorization: Bearer <token>'

Update team assignments

Update team assignments for a webhook event action.

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)
  • Set to -1 to query all tenants (ADMIN only)
actionId
required
integer <int64>

Webhook event action 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": [
    ]
}

webhook api key

Webhook API key management

List webhook API keys

Retrieve a paginated list of webhook API keys.

Minimum role: TECHNICIAN 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)
  • Set to -1 to query all tenants (ADMIN only)
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
  • Nested fields: sort=content.name,asc
search
string

WBQL filter expression. Operators: : (contains), = (equals), , , ^ (starts with), >, , <, , (in set). Logic: , (AND), | (OR). Special: NULL, !NULL. Example: name:lobby,deviceStatus=ONLINE

Responses

Request samples

curl -X GET \
  'https://{server}/api/webhooks/apikey?customerId=182&page=0&size=15&sort=name' \
  -H 'Authorization: Bearer <token>'

Response samples

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

Create webhook API key

Create a new webhook API key.

Important: The token field is only returned once during creation. Store it securely as it cannot be retrieved again.

Minimum role: TECHNICIAN 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)
  • Set to -1 to query all tenants (ADMIN only)
teamIds
string
Example: teamIds=000c08d294df48efb1b0f5aa754d7ef9:true,00a22e86602c4a88914614aa9516a481:false

Team assignment filter. Format: {teamId}:{readOnly},{teamId}:{readOnly}

Request Body schema: application/json
required
name
required
string

Human-readable name for the API key

restricted
boolean
Default: false

Whether to restrict this key to team resources

object (ScopesObject)

API key scope configuration. Scopes determine what actions the API key can perform.

Scope Description
WEBHOOK_CALL Can trigger webhook actions
PROOF_OF_PLAY_READ Can read proof of play statistics
DATASOURCE_DATA_READ Can read data source data
INTERNAL_DATASOURCE_WRITE Can write to internal data sources
object (TeamAccessList)

Responses

Request samples

Content type
application/json
Example
{
  • "name": "Integration Key",
  • "restricted": false
}

Response samples

Content type
application/json
{
  • "id": "981eb1fb92a045bf96a919f8c810cfd4",
  • "token": "wh_abc123xyz789...",
  • "name": "External System Integration",
  • "createdAt": "2024-01-15T10:30:00Z",
  • "restricted": false,
  • "scopes": {
    },
  • "teamAccessList": {
    },
  • "customerId": 182,
  • "readOnly": false
}

Update webhook API key

Update an existing webhook API key.

Minimum role: TECHNICIAN

Authorizations:
bearer
path Parameters
id
required
string

Webhook API key ID (UUID format)

Request Body schema: application/json
required
name
string

Human-readable name for the API key

restricted
boolean

Whether to restrict this key to team resources

object (TeamAccessList)

Responses

Request samples

Content type
application/json
{
  • "name": "Updated Integration Key",
  • "restricted": true,
  • "teamAccessList": {
    }
}

Response samples

Content type
application/json
{
  • "id": "981eb1fb92a045bf96a919f8c810cfd4",
  • "token": "wh_abc123xyz789...",
  • "name": "External System Integration",
  • "createdAt": "2024-01-15T10:30:00Z",
  • "restricted": false,
  • "scopes": {
    },
  • "teamAccessList": {
    },
  • "customerId": 182,
  • "readOnly": false
}

Delete webhook API key

Delete a webhook API key.

Minimum role: TECHNICIAN

Authorizations:
bearer
path Parameters
id
required
string

Webhook API key ID (UUID format)

Responses

Request samples

curl -X DELETE \
  'https://{server}/api/webhooks/apikey/981eb1fb92a045bf96a919f8c810cfd4' \
  -H 'Authorization: Bearer <token>'

Update team assignments

Update team assignments for a webhook API key.

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)
  • Set to -1 to query all tenants (ADMIN only)
webhookApiKeyId
required
string

Webhook API key ID (UUID format)

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": [
    ]
}