Event types: content, programs, devices, apps
The subscribable event types from media, scenes, programs, marketplace, fleet, app runtime, playback, analytics, and advertising, plus the platform types that never arrive.
17 minute readWebhooksUpdated: 10/25/2026
On this page
Before you start
- For
- Anyone who chooses the events of an endpoint or reads the body of a delivery.
- Prerequisite
- None for reading. To subscribe, an endpoint under Settings › Organization › Webhooks.
The subscribable event types from media, scenes, programs, marketplace, fleet, app runtime, playback, analytics, and advertising. Most integrations begin with these events.
How to read the tables
- Event type is the string you subscribe to on the endpoint. It arrives in the header
X-Event-Typewith every delivery. Instead of single types you can also subscribe to a whole area (composition.*) or to everything with*. There are no other forms, and the server rejects anything else, see Fetch the event catalog through the API. - Core payload names two to four of the most important fields that are in the body of the delivery. It is an excerpt. Each area determines the full shape, which can carry more fields. The time, the event identifier, and the trigger do not travel in the body.
- When it is raised is a short phrase for context, not a statement about frequency.
Under Subscribed events, the portal offers exactly the types of this page and of the page Event types: organization, accounts, billing for selection, the same list that GET /v1/webhooks/event-types returns. Everything else cannot be subscribed to, and creating an endpoint rejects it. Which types these are is described under What never arrives. Only what is raised in the context of your organization is delivered.
In the fields, playerId refers to a display (identifier ply_…) and deviceId to the device it is attached to.
The event types
Media
Files from upload to finished processing, folders, and automatic collections. asset.ready completes the processing of the variants, and asset.deleted triggers the check of the scenes that use the file.
| Event type | Core payload | When it is raised |
|---|---|---|
media-library.asset.upload-initiated |
assetId, sha256, sizeBytes, mimeType |
An upload was started. |
media-library.asset.upload-aborted |
assetId, abortedById |
An upload was canceled. |
media-library.asset.uploaded |
assetId, sha256, sizeBytes, deduplicated |
The file is complete, and deduplicated says whether it already existed. |
media-library.asset.processing-started |
assetId, tenantId |
Processing of the file has begun. |
media-library.asset.ready |
assetId, variantKinds |
All variants are generated, and the file is ready for use. |
media-library.asset.processing-failed |
assetId, reason |
Processing failed. |
media-library.asset.updated |
assetId, updatedById, changedFields |
Details of a file were changed. |
media-library.asset.deleted |
assetId, deletedById |
A file was deleted. Scenes that use it are checked. |
media-library.asset.restored |
assetId, restoredById |
A deleted file was restored. |
media-library.folder.created |
folderId, path, createdById |
A folder was created. |
media-library.folder.moved |
folderId, oldPath, newPath, affectedDescendants |
A folder was moved. |
media-library.folder.deleted |
folderId, path, cascadeAssetCount |
A folder was deleted, and cascadeAssetCount counts the files deleted with it. |
media-library.tag.assigned |
assetId, tags, assignedById |
Tags were assigned. |
media-library.smart-bucket.created |
smartBucketId, name, createdById |
An automatic collection was created. |
Scenes and templates
Scenes, their versions, and layout templates. scene-version.created is the trigger that playback and programs follow.
| Event type | Core payload | When it is raised |
|---|---|---|
composition.scene.created |
sceneId, tenantId, createdById |
A scene was created. |
composition.scene.updated |
sceneId, version, updatedById |
A scene was edited (every change). |
composition.scene.published |
sceneId, sceneVersionId, versionNumber, contentHash |
A scene was published, and contentHash identifies the state. |
composition.scene.archived |
sceneId, archivedById, reason |
A scene was archived. |
composition.scene.restored |
sceneId, restoredById |
An archived scene was brought back. |
composition.scene.deleted |
sceneId, deletedById |
A scene was deleted. |
composition.scene-version.created |
sceneVersionId, versionNumber, contentHash, assetIds |
A new version of a scene was created, and assetIds lists the files used. |
composition.layout-template.created |
layoutTemplateId, createdById |
A layout template was created. |
composition.layout-template.updated |
layoutTemplateId, updatedById |
A layout template was changed. |
composition.layout-template.deleted |
layoutTemplateId, deletedById |
A layout template was deleted. |
composition.integrity-issue.detected |
issueId, sceneId, type, severity |
A problem in a scene was detected, such as a missing file. |
composition.integrity-issue.resolved |
issueId, sceneId, resolution |
A detected problem was resolved. |
Playlists and programs
Playlists, programs, the assignment to displays, and the plan revisions. schedule-item.changed and player-program.changed are deliberately one collective event each, with an action field. timeline.invalidated gives the cause in reason: timeline-invalidated or media-source-changed (the media selection of an automatic playlist has shifted). plan-revision.recorded records the plan of a display for the next 48 hours. Analytics and advertising calculate the planned time and the target for upcoming hours from it.
| Event type | Core payload | When it is raised |
|---|---|---|
scheduling.playlist.created |
playlistId, itemCount, assetIds, createdById |
A playlist was created. |
scheduling.playlist.updated |
playlistId, version, assetIds, updatedById |
A playlist was changed, and assetIds lists the files it contains. |
scheduling.playlist.deleted |
playlistId, deletedById |
A playlist was deleted. |
scheduling.schedule.created |
scheduleId, tenantId, createdById |
A program was created. |
scheduling.schedule.updated |
scheduleId, version, changedFields, updatedById |
A program was changed. |
scheduling.schedule.deleted |
scheduleId, deletedById |
A program was deleted. |
scheduling.schedule-item.changed |
scheduleId, itemId, action (created/updated/deleted) |
An entry of a program was created, changed, or deleted. It is a collective event with action. |
scheduling.player-program.changed |
playerId, action (assigned/cleared/override-set/override-cleared) |
The assignment on a display has changed. It is a collective event with action. |
scheduling.timeline.invalidated |
tenantId, affectedPlayerIds, reason |
The timelines of the named displays are recomputed, and reason gives the cause. |
scheduling.plan-revision.recorded |
playerId, revisionId, effectiveFrom |
A new plan revision applies to a display from effectiveFrom. It is created when a change moves its plan, and at the latest when the previous revision reaches less than one day ahead. A change that does not move the plan triggers none. |
Marketplace: installed apps
Apps from the point of view of your organization: installation, update, acceptance and refusal, the requests to the owners, the switch at the end of a phase-out period, uninstallation, and the deletion of the app data afterward.
| Event type | Core payload | When it is raised |
|---|---|---|
marketplace.app.installed |
grantId, appId, version, acceptedById |
An app was installed. |
marketplace.app.install-requested |
appId, version, requestedById, message |
A manager asks the owners to install an app. |
marketplace.app.upgraded |
grantId, appId, oldVersion, newVersion |
An installed app was moved to a new version: silently, after your acceptance, or at the end of a phase-out period. |
marketplace.app.pending-reacceptance |
grantId, appId, newManifestHash, addedPermissionKeys |
A new version requires new permissions, access, or terms, or the installed version is being phased out, and acceptance is pending. |
marketplace.app.update-decision-requested |
appId, fromVersion, toVersion, requestedById, message |
A manager asks the owners to decide on the pending update of an app. |
marketplace.app.reaccepted |
grantId, appId, manifestHash, acceptedById |
An update that was waiting for acceptance was accepted. |
marketplace.app.update-declined |
grantId, appId, installedVersion, declinedVersion |
An update was declined. The app stays on installedVersion until a version higher than declinedVersion appears. |
marketplace.app.update-withdrawn |
grantId, appId, installedVersion, withdrawnVersion |
The version whose acceptance the app was waiting for was withdrawn. The app runs on installedVersion again. |
marketplace.app.release-switched |
grantId, appId, fromVersion, toVersion |
The phase-out period of the installed version has ended, and the app runs with its scenes on toVersion. |
marketplace.app.uninstalled |
grantId, appId, uninstalledById |
An app was uninstalled. |
marketplace.app.data-deletion-scheduled |
appId, requestedById, dueAt, total |
The data of an uninstalled app will be deleted for good once the period dueAt ends. Until then the deletion can be canceled. |
marketplace.app.data-deletion-cancelled |
appId, cancelledById |
The deletion of the app data was canceled or the app was installed again. The data is kept. |
marketplace.app.data-purged |
appId, purgedAt, resources, total |
The data of an uninstalled app was deleted for good once the period ended. |
marketplace.acceptance-record.created |
recordId, grantId, appId, manifestHash |
An acceptance of the permissions of an app was recorded. |
Fleet: devices, displays, locations, video walls
Devices, displays, commands, tags, locations, video walls, locations, and system updates. There is no event per check-in: player.status-changed is how online and offline show up. The display-group.* events concern the video walls, and their memberPlayerIds lists the affected displays. The ota-* events carry the device identifier (deviceId), because a system state belongs to the device, not to the individual display.
| Event type | Core payload | When it is raised |
|---|---|---|
fleet.device.claimed |
deviceId, tenantId, claimedByUserId, playerIds |
A device was assigned to the organization, and playerIds lists the displays that were created. |
fleet.device.capabilities-changed |
deviceId, playerIds, capabilities |
The reported capabilities of a device have changed. |
fleet.device.channel-changed |
deviceId, channel, previousChannel, changedById |
The channel of a device was set, and from now on it follows the releases of the new channel. |
fleet.player.created |
playerId, deviceId, screenIndex |
A display was created. |
fleet.player.updated |
playerId, changedFields |
Details of a display were changed. |
fleet.player.config-updated |
playerId, changedConfig |
The configuration of a display was changed. |
fleet.player.tagged |
playerId, tagId |
A display received a tag. |
fleet.player.untagged |
playerId, tagId |
A tag was removed from the display. |
fleet.player.status-changed |
playerId, from, to |
The status of a display has changed (from → to). This is how online and offline show up. |
fleet.player.deleted |
playerId, deletedById |
A display was removed, and its seat is free. |
fleet.player.decommissioned |
playerId, decommissionedById |
A display left with its device: the device has left the organization or was blocked, or the organization was deleted. |
fleet.player.screenshot-recorded |
screenshotId, playerId, screenIndex, capturedAt, trigger, repeated |
A display has reported a screenshot. repeated means it matched the previous one, and only that one’s “last seen” time has advanced. |
fleet.command.issued |
commandId, playerId, kind |
A command to a display was issued. |
fleet.command.status-changed |
commandId, deviceId, kind, status |
The state of a command has changed (machine traffic). |
fleet.command.completed |
commandId, playerId, durationMs |
A command was executed (machine traffic). |
fleet.command.failed |
commandId, playerId, error |
A command failed. |
fleet.command.timeout |
commandId, playerId, kind |
A command received no response. |
fleet.player-tag.created |
tagId, tenantId, name |
A tag for displays was created. |
fleet.player-tag.deleted |
playerTagId, deletedById |
A tag for displays was deleted. |
fleet.display-group.created |
displayGroupId, name, memberPlayerIds |
A video wall was created, and memberPlayerIds lists its displays. |
fleet.display-group.updated |
displayGroupId, memberPlayerIds, previousMemberPlayerIds |
The displays of a video wall were changed. |
fleet.display-group.deleted |
displayGroupId, memberPlayerIds, deletedById |
A video wall was deleted. |
fleet.location.created |
locationId, tenantId, name |
A location was created. |
fleet.location.updated |
locationId, tenantId, name, changedFields |
Details of a location were changed, and changedFields names which. The assigned displays stay where they are. |
fleet.location.opening-hours-changed |
locationId, tenantId |
The opening hours of a location were changed: weekly plan, special days, state, or time zone. |
fleet.location.deleted |
locationId, tenantId, deletedById |
A location was deleted. It was empty, and no display was assigned to it any more. |
fleet.player.ota-installed |
deviceId, version, slotInstalled, installDurationMs |
A device installed a system update. |
fleet.player.ota-completed |
deviceId, version, markGoodAt, bootDurationMs |
A device runs stably after the update. |
fleet.player.ota-rolled-back |
deviceId, versionAttempted, reason |
A device rolled back to the previous state. |
App runtime
Data fetches and recurring jobs of installed apps. fetch.completed is the trigger at which playback picks up new app data.
| Event type | Core payload | When it is raised |
|---|---|---|
app-runtime.fetch.completed |
tenantId, appId, fetchKey, payloadHash |
A data fetch of an app is complete. |
app-runtime.fetch.failed |
tenantId, appId, fetchKey, error |
A data fetch of an app failed. |
app-runtime.cache.invalidated |
tenantId, appId, fetchKey |
Cached app data was discarded. |
app-runtime.job.scheduled |
scheduleId, appId, jobKey, cron |
A recurring app job was scheduled. |
app-runtime.job.executed |
scheduleId, appId, jobKey, durationMs |
An app job was executed. |
app-runtime.job.failed |
scheduleId, appId, jobKey, error |
An app job failed. |
Playback
The computed playback state per display and the reports of the playback software. Only what goes wrong is logged here. The other events are machine traffic whose volume grows with the number of displays.
| Event type | Core payload | When it is raised |
|---|---|---|
playback.snapshot.recomputed |
playerId, manifestHash, bundleHashes, recomputeReason |
The playback state of a display was recomputed. |
playback.snapshot.bundle-changed |
playerId, bundleKind, newHash, oldHash |
A component of the playback state has changed. |
playback.snapshot.stale-detected |
playerId, validUntil, ageSeconds |
The playback state of a display is outdated. |
playback.snapshot.partial-failure |
playerId, degradedWidgets |
Parts of the playback state could not be generated, and degradedWidgets lists them. |
playback.snapshot.playlist-item-skipped |
playerId, skippedItems |
Entries of a playlist were skipped. |
playback.snapshot.recompute-failed |
playerId, recomputeReason, error |
The recomputation of the playback state failed. |
playback.renderer.diagnostics-ingested |
playerId, errorCount, severityCounts |
A display has delivered diagnostic data. |
Analytics
Aggregated measurements, key figures, reports, proofs, and the links for advertisers. analytics.proof.issued reaches your endpoint for every proof of your direct business: for closings and addenda from the nightly run as well as for an interim statement that your organization requests. Proofs of the ad network belong to no organization and reach no endpoint.
| Event type | Core payload | When it is raised |
|---|---|---|
analytics.metric.aggregated |
metric, timeBucket, bucketStart, entryCount |
Measurements were aggregated into a time window. |
analytics.engagement-snapshot.recomputed |
tenantId, computedAt |
The key figures of the organization were recomputed. |
analytics.report.created |
reportId, tenantId, ownerUserId |
A report was created. |
analytics.report.updated |
reportId, changedFields |
A report was changed. |
analytics.report.deleted |
reportId, tenantId |
A report was deleted. |
analytics.report.scheduled-run-triggered |
reportId, nextRunAt |
A scheduled report run was triggered. |
analytics.report.generated |
generatedReportId, format, rowCount, trigger, window, expiresAt |
A report was generated: by hand, on a schedule, or as a one-time output (trigger). window gives the fixed days, and expiresAt the end of the period in which it can be fetched. |
analytics.report.generation-failed |
reportId, error |
The generation of a report failed. |
analytics.retention.archived |
metric, bucketStart, entryCount |
Old measurements were archived. |
analytics.proof.issued |
proofDocumentId, number, kind, campaignId, period, signed |
A closing, addendum, or interim statement of a booking is available as a proof with a sequential number. signed says whether it is signed, and GET /v1/analytics/proofs/{proofId} names its files. |
analytics.share-link.created |
shareLinkId, advertiserId, label, expiresAt, createdById |
Your organization has issued an advertiser a link to the campaign report and proofs. The event never carries the key. createdById is null if the delivery of a large proof created the link. |
analytics.share-link.revoked |
shareLinkId, advertiserId, label, revokedAt, revokedById |
A link for an advertiser was revoked and no longer opens anything. |
Advertising
Advertisers, ad campaigns with their bookings, creatives and their approval, the ad space of the displays, the audience of the locations, participation in the ad network, and the credit note for the ad revenue of a month. The events are slim, so you read the current state under /v1/advertising/…. The events on advertisers, ad campaigns, bookings, and creatives say in ownerKind and tenantId who owns the row. Only the rows of your organization are delivered (ownerKind: tenant). Advertisers, ad campaigns, bookings, and creatives of the ad network carry no organization and reach no endpoint.
| Event type | Core payload | When it is raised |
|---|---|---|
advertising.advertiser.created |
advertiserId, ownerKind, tenantId |
An advertiser was created. |
advertising.advertiser.updated |
advertiserId, ownerKind, tenantId |
The name, brands, industry, contacts, or note of an advertiser were changed. |
advertising.advertiser.archived |
advertiserId, ownerKind, tenantId |
An advertiser was archived. It gets no new ad campaigns, bookings, or creatives, and its ad campaigns and proofs stay readable. Whatever is booked keeps running. |
advertising.campaign.created |
campaignId, advertiserId, status |
An ad campaign was created, and status is draft or booked. |
advertising.campaign.updated |
campaignId, advertiserId, status |
The name, period, goal, price, or note of an ad campaign were changed. A change of state has its own event. |
advertising.campaign.status-changed |
campaignId, advertiserId, status |
An ad campaign was booked, paused, resumed, or ended. status is the new state: booked, paused, or cancelled. |
advertising.booking-line.created |
bookingLineId, campaignId |
A booking was created. |
advertising.booking-line.updated |
bookingLineId, campaignId |
The period, dayparts, displays, frequency, commitment, creatives, or state of a booking were changed. Hours that have begun keep their target. |
advertising.booking-line.deleted |
bookingLineId, campaignId |
A booking was deleted. That is possible only as long as it cannot have delivered anything yet. |
advertising.creative.created |
creativeId, advertiserId, approvalStatus |
A creative was created, also as the replacement of a creative with a new file. approvalStatus is pending at first. |
advertising.creative.updated |
creativeId, advertiserId, approvalStatus |
The name, mandatory text, or state of a creative were changed, also on archiving. A new mandatory text on an approved creative resets the approval to pending. |
advertising.creative.approval-decided |
creativeId, advertiserId, approvalStatus |
The approval of a creative was decided: approved or rejected. Only an approved creative reaches a display. |
advertising.inventory.updated |
playerId, tenantId |
The ad space of a display was changed: placement, diagonal, orientation, placement factor, or the enablement for the ad network. |
advertising.audience-profile.updated |
locationId, tenantId |
The audience of a location was maintained. The contacts of its plays are calculated with these figures from now on. |
advertising.network-participation.changed |
tenantId, enabled |
Your organization has switched participation in the ad network on or off or changed its terms. enabled is the new state. |
advertising.revenue-statement.approved |
statementId, month |
Szenera has checked and approved the statement of your ad revenue for a month. The credit note is issued next. |
advertising.revenue-statement.issued |
statementId, month, documentNumber, creditCents, grossCents |
Szenera has issued you the credit note for the ad revenue of a month, with a number of the form WG-2026-0001 and the amounts net (creditCents) and gross (grossCents). The statement of the month no longer changes after that. |
advertising.revenue-statement.settled |
statementId, month, documentNumber, kind, invoiceNumber, paidOn |
The credit note is settled: offset means it was offset against your invoice invoiceNumber, and paid means it was paid out on paidOn. The other field is null in each case. |
What never arrives
The catalog under GET /v1/webhooks/event-types lists 241 of the 338 event types of the platform, in 16 areas, exactly the types of this page and of the page Event types: organization, accounts, billing. The other 97 cannot be subscribed to: the events of delivery itself and everything that is raised without a link to an organization. Creating or changing an endpoint rejects such types with 422 WebhookEndpoint.EventUnknown, and there is no area-wide entry such as ops.* for these areas. These are:
- The events of delivery itself. The twelve types under
notifications.*(in-app messages, email sending, and webhook management:notifications.webhook.endpoint.created,.endpoint.disabled,.webhook.delivered,.failed,.dead) never trigger a webhook, because otherwise every delivery would trigger the next one. You see the disabling of an endpoint in the portal as the status Inactive, not through a webhook. - Events of platform operations. The 16 types under
ops.*(maintenance windows, incidents, system health, device software) are raised without a link to an organization. - The app catalog. The eight types under
app-catalog.*(versions, bundles, and status of the apps in the catalog): A version is published once for the platform, not per organization. What follows from it for you is reported by themarketplace.app.*events. - Devices before they belong to an organization, and the plumbing of the connection.
fleet.pairing.code-issuedandfleet.pairing.code-rotated(pairing codes are raised before the assignment),identity.device.unblocked(the operator lifts a block on a device that no longer belongs to any organization),device.ota.availableanddevice.software.available(the operator triggers an update), and the four types underrealtime.*(connections and check-ins, constant traffic). - Accounts and keys of the operator. The eight types under
identity.operator-user.*and the three underidentity.operator-api-key.*, managed in the operator interface. - The parameters of the ad network.
advertising.network-parameters.changed: The operator sets them for the whole network, and they belong to no organization. Subscribing to a whole area such asadvertising.*does not include them. - The platform layer. 27 types under
auth.*,permissions.*,outbox.*,audit.*,jobs.*, andapps.*(key rotation, queues, change log, app startup), andfeeds.source.updated(the feed catalog belongs to the platform). The types of the change log belong here as well:audit.export.requested,audit.export.completed, andaudit.pseudonymization.completedcannot be subscribed to.
Even a type from the catalog reaches your endpoint only if the operation behind it is raised in the context of your organization. Operations by the platform operator (marked as such in the tables) and the rows of the ad network carry no organization. They do not arrive, with no failed attempt and no entry in the delivery log.
What to start with
Four event types let you test most integrations, because you can trigger them yourself in the portal: composition.scene.published (publish a scene), scheduling.playlist.updated (change a playlist), media-library.asset.ready (upload a file), and fleet.player.status-changed (disconnect a display from the network).