Kick · event: livestream.status.updated ·
content type: application/json
This is a representative sample — fake IDs, real structure. To see a payload with your data, point the provider at a capture URL (button below).
One click creates a free capture bin with this exact payload already in it — pretty-printed, headers inspectable, replayable to your own endpoint:
Then paste the bin's URL into Kick's webhook settings to capture a real delivery. No signup.
content-type: application/json kick-event-message-id: 01K3YB2M9S5X4Q1WFDCU8ZGKVP kick-event-subscription-id: 01K3YB2MAT7Y5R2XGEDV9AHLWQ kick-event-message-timestamp: 2026-08-30T08:30:02Z kick-event-type: livestream.status.updated kick-event-version: 1 kick-event-signature: er2oyVuM5FXvdWcrpy9j2kkbPK6SWvUQxUt0SjwxCCsEZriRswUZTr/pYKmTcS7M/LWQDo4qMK7ehau2N2CcZM0fDf5DIABHSohuCJcdikszuTrQ3DLtoRWiqGBuWnLFRg0FA8Hsr/nCnEtNQe3lMPwrT3y/1ziN0pwu8DOgq7yTkHHtgGejj8Ukf5e5g3vs+xQLkrm/OeqGvyrEGxjLY0O7ogSZu20qMG2ibe0w/yBpCWMx/rCJXWF5EOrWAIxIj9jRKwt58cne4fahhDfuaLGOhRn6okxNbWgJgCzJluqIZGja7qCekv9Qd7VFLhH0OvDM9f4GDcj2oZJu3W6xqw==
{
"broadcaster": {
"is_anonymous": false,
"user_id": 123456789,
"username": "broadcaster_name",
"is_verified": true,
"profile_picture": "https://example.com/broadcaster_avatar.jpg",
"channel_slug": "broadcaster_channel",
"identity": null
},
"is_live": false,
"title": "Stream Title",
"started_at": "2026-08-30T04:00:00+11:00",
"ended_at": "2026-08-30T08:30:00+11:00"
}
messageId + "." + timestamp + "." + rawBody — not Ed25519, not
HMAC. Paste into the signature debugger
(Kick scheme) or set the Kick scheme on a capture bin.livestream.status.updated
fires for both stream start and stream end. Start: is_live: true,
ended_at: null. End (shown here): is_live: false with both
timestamps set. There is no separate stream.online/offline
pair like Twitch — branch on is_live.+11:00 here, not Z-normalized) — naive string comparison or a
parser that assumes UTC will mis-order events. The header timestamp, by contrast,
is what goes into the signature — feed it to your verifier byte-for-byte.livestream.metadata.updated (a separate subscription with a
metadata envelope). Subscribing only to status updates and expecting
title changes is a common miss.Reproduce this delivery against any endpoint (your handler, a bin, staging):
$ curl -X POST https://your-endpoint.example/hook \
-H 'content-type: application/json' \
-H 'kick-event-message-id: 01K3YB2M9S5X4Q1WFDCU8ZGKVP' \
-H 'kick-event-subscription-id: 01K3YB2MAT7Y5R2XGEDV9AHLWQ' \
-H 'kick-event-message-timestamp: 2026-08-30T08:30:02Z' \
-H 'kick-event-type: livestream.status.updated' \
-H 'kick-event-version: 1' \
-H 'kick-event-signature: er2oyVuM5FXvdWcrpy9j2kkbPK6SWvUQxUt0SjwxCCsEZriRswUZTr/pYKmTcS7M/LWQDo4qMK7ehau2N2CcZM0fDf5DIABHSohuCJcdikszuTrQ3DLtoRWiqGBuWnLFRg0FA8Hsr/nCnEtNQe3lMPwrT3y/1ziN0pwu8DOgq7yTkHHtgGejj8Ukf5e5g3vs+xQLkrm/OeqGvyrEGxjLY0O7ogSZu20qMG2ibe0w/yBpCWMx/rCJXWF5EOrWAIxIj9jRKwt58cne4fahhDfuaLGOhRn6okxNbWgJgCzJluqIZGja7qCekv9Qd7VFLhH0OvDM9f4GDcj2oZJu3W6xqw==' \
-d '{
"broadcaster": {
"is_anonymous": false,
"user_id": 123456789,
"username": "broadcaster_name",
"is_verified": true,
"profile_picture": "https://example.com/broadcaster_avatar.jpg",
"channel_slug": "broadcaster_channel",
"identity": null
},
"is_live": false,
"title": "Stream Title",
"started_at": "2026-08-30T04:00:00+11:00",
"ended_at": "2026-08-30T08:30:00+11:00"
}'