Skip to content

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-Type with 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 the marketplace.app.* events.
  • Devices before they belong to an organization, and the plumbing of the connection. fleet.pairing.code-issued and fleet.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.available and device.software.available (the operator triggers an update), and the four types under realtime.* (connections and check-ins, constant traffic).
  • Accounts and keys of the operator. The eight types under identity.operator-user.* and the three under identity.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 as advertising.* does not include them.
  • The platform layer. 27 types under auth.*, permissions.*, outbox.*, audit.*, jobs.*, and apps.* (key rotation, queues, change log, app startup), and feeds.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, and audit.pseudonymization.completed cannot 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).