Clip events#
Clip webhooks send notifications about Clip creation, supported metadata updates, availability changes, and deletion. Confirm Clip webhook availability for your account with the Storyteller team before enabling an integration.
Notification triggers#
| Configured trigger | When it is used |
|---|---|
| Created | A Clip is created or duplicated. A duplicate has its own Storyteller id. |
| Updated | A base title, static thumbnail, category association, or availability setting changes through a supported CMS operation. |
| Published | A Clip becomes audience-available, through a manual change or its scheduled start. |
| Unpublished | A Clip becomes unavailable, through a manual change or its scheduled end. |
| Deleted | A Clip is deleted. |
Created, Updated, Published, and Unpublished send "eventType": "clip.changed".
Deleted sends "eventType": "clip.deleted". The configured triggers can share
one endpoint. They control when to notify; the body describes current state.
Updated includes changes to internalTitle or displayTitle in the base
language, changing or resetting a static thumbnail, and adding or removing a
category association. Category removal caused by content targeting also qualifies.
An operation that leaves these values unchanged does not trigger an update.
An availability change sends Published or Unpublished if it crosses the availability boundary. If it changes the status or availability window without crossing that boundary, it sends Updated.
Changes only to translations or the Clip's external ID are not update triggers. Editing a category definition does not send an update for every associated Clip.
Payload#
Created, Updated, Published, and Unpublished use the same shape. All four can describe a draft, scheduled, published, or archived Clip, depending on its state when the request is prepared. Example values are illustrative:
{
"id": "11111111-1111-1111-1111-111111111111",
"eventType": "clip.changed",
"externalId": "match-highlights-42",
"internalTitle": "Match 42 — final whistle",
"displayTitle": "The winning moment",
"thumbnailUrl": "https://media.example.com/clip-thumbnail.jpg",
"categories": [
{
"title": "Highlights",
"externalId": "highlights",
"publishAt": null,
"removeAt": null
}
],
"status": "Published",
"availableFrom": "2026-09-15T12:00:00+00:00",
"availableUntil": "2026-09-16T12:00:00+00:00"
}
| Field | Type | Meaning |
|---|---|---|
id |
UUID string | The Storyteller Clip identifier. Keep this as the mapping to your own record. |
eventType |
string | clip.changed for this metadata payload; clip.deleted for deletion. |
externalId |
string or null | The Clip's external identifier, when set. |
internalTitle |
string | The base-language title used to identify the Clip in the CMS. |
displayTitle |
string | The base-language title intended for display to the audience. |
thumbnailUrl |
string or null | The selected static thumbnail URL. It can be null before a usable thumbnail exists. |
categories |
array | Current category associations. An empty array means no associations. |
categories[].title |
string | The category name. |
categories[].externalId |
string or null | The category's external identifier, when set. |
categories[].publishAt |
null | Always null in the current payload. Clip category associations have no schedule. |
categories[].removeAt |
null | Always null in the current payload. Clip category associations have no schedule. |
status |
string | Effective availability: Draft, Scheduled, Published, or Archived. |
availableFrom |
date-time or null | The start of the Clip's availability window. Null means no scheduled start restriction. |
availableUntil |
date-time or null | The end of the Clip's availability window. Null means no scheduled end restriction. |
Date-time values use ISO 8601. The payload contains compact metadata, without video playback URLs, full media details, or translations. The title fields are separate values; neither is filled from the other.
Availability#
The Clip's effective status combines its editorial status with its availability
window:
| Status | Meaning |
|---|---|
Draft |
The Clip is a draft and is not audience-available. |
Scheduled |
The Clip is published editorially, but its availability window has not started. |
Published |
The Clip is published editorially and is within its availability window. |
Archived |
The Clip is archived editorially, or its availability window has ended. |
The start is inclusive and the end is exclusive: a published Clip is available
at availableFrom and unavailable at availableUntil. A draft or archived Clip
remains unavailable even if its timestamps would otherwise allow access.
Scheduled notifications are asynchronous. The receiver may see a later state
by the time the request arrives. Use status to interpret the supplied snapshot,
and follow the synchronization guidance
when current state matters.
Deletion payload#
{
"id": "11111111-1111-1111-1111-111111111111",
"eventType": "clip.deleted"
}
The deletion body contains id and "eventType": "clip.deleted". Keep the mapping
to your own record even if you also use externalId. Repeated deletes should
succeed when the record has already been removed.
Delivery behavior#
Clip requests can include an agreed API key in X-Api-Key. Each request has a
30-second timeout. Failed delivery gets up to three retries with delays of 30,
120, and 600 seconds after successive failures. See
Receiving notifications for response handling,
authentication, and retry limits.