Story events#
Story webhooks send notifications about Story creation, supported updates, publication changes, and deletion. Select the triggers you need, as described in Change Notification Webhooks. They can share a destination URL.
Notification triggers#
| Configured trigger | When it is used | Delivery condition |
|---|---|---|
| Created | A Story is created. | Can describe an unpublished Story. |
| Updated | A supported Story change occurs, such as a title, thumbnail, or category-association change. | Sent only if the Story's stored status is Published when the request is prepared. |
| Published | The CMS publishes the Story. | Sent only if the Story's stored status is still Published when the request is prepared. |
| Unpublished | The CMS unpublishes the Story, or the existing removal check identifies it as expired. | Can describe an unpublished Story. |
| Deleted | A Story is deleted. | Uses the deletion payload below. |
Created, Updated, Published, and Unpublished send "eventType": "story.changed".
Deleted sends "eventType": "story.deleted". The configured trigger controls
when Storyteller sends a request; it is not a separate field in the body.
Updated is a notification to refresh the Story. It is not a complete log of every edit, and it does not identify which fields changed. Some changes, such as an external ID edit or a thumbnail-affecting page change, can trigger an update without that field or the page content appearing in the payload.
Draft and other unpublished Story edits do not produce an Updated request. Created and Unpublished requests are not subject to that publication filter.
Payload#
Created, Updated, Published, and Unpublished use the same shape. Example values are illustrative:
{
"id": "22222222-2222-2222-2222-222222222222",
"eventType": "story.changed",
"title": "Match highlights",
"thumbnailUrl": "https://media.example.com/story-thumbnail.jpg",
"categories": [
{
"title": "Highlights",
"externalId": "highlights",
"publishAt": "2026-09-15T12:00:00+00:00",
"removeAt": null
}
],
"deeplink": "https://share.example.com/go/22222222-2222-2222-2222-222222222222/33333333-3333-3333-3333-333333333333",
"wscStoryId": null,
"status": "Published"
}
| Field | Type | Meaning |
|---|---|---|
id |
UUID string | The Storyteller Story identifier. Keep this as the mapping to your own record. |
eventType |
string | story.changed for this metadata payload; story.deleted for deletion. |
title |
string | The Story's CMS title. |
thumbnailUrl |
string or null | The Story's thumbnail URL, when available. |
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 |
date-time or null | The scheduled start of this Story's association with the category. |
categories[].removeAt |
date-time or null | The scheduled end of this Story's association with the category. |
deeplink |
string or null | A link using the account's configured share domain, with the first page when available. |
wscStoryId |
UUID string or null | The related WSC Story identifier, when present. |
status |
string | The Story's stored publication status. Values are Draft, Published, Scheduled, Past, and Archived. |
Date-time values use ISO 8601. Category dates describe the association with that category; they are not the Story's overall publication window. The payload does not include the Story's external ID, pages, translations, or overall publication and removal timestamps.
Story status is the stored CMS state. It is not the effective availability
calculation used by Clip webhooks. An Unpublished
notification from the removal check can still carry "status": "Published".
If your integration needs to establish audience availability, confirm the
appropriate Storyteller API access and scheduling rules with the Storyteller team.
Deletion payload#
Story deletion retains the existing Story payload shape:
{
"id": "22222222-2222-2222-2222-222222222222",
"eventType": "story.deleted",
"title": null,
"thumbnailUrl": null,
"categories": null,
"deeplink": null,
"wscStoryId": null,
"status": "Draft"
}
When eventType is story.deleted, use id to identify the record to remove.
The null fields and default
"status": "Draft" do not describe a surviving draft Story. Remove the mapped
record from your system, and treat repeated deletion requests safely.
Delivery behavior#
Story webhook delivery has no automatic retries. Use one destination URL for each configured Story trigger. Several triggers can use the same URL. If you need to distribute notifications to several services, your receiver can forward them.
Authentication for existing Story integrations varies by account. Confirm the
actual request headers with the Storyteller team. Do not assume the Clip
X-Api-Key behavior applies to every Story integration.
See Receiving notifications for shared receiver guidance and delivery limits.