Kick · event: chat.message.sent ·
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: 01K3Y9QH7R4W2N8VDBZS5XEJTM kick-event-subscription-id: 01K3Y9QH8T6X3P9WECAT7YFKUN kick-event-message-timestamp: 2026-08-30T06:15:01Z kick-event-type: chat.message.sent kick-event-version: 1 kick-event-signature: jugfy8nSKOJde34yUCXRmygZPO1KWDHFqFc1wKQIsbYQclQiNPXuW5G+of2roj+o6HDt7MALi8NYFmfe2xqNSbQoL+eMx7/F7REpHnbRh/M4tcNicWBN8OzPWmf8nL7jlTSDe0Uh692kPDFdGc8L4kmBdHzO/dgFb3yJNtoVBOvMx869ieQdyhg7UGiE1uYdVEbZetvyb8PpgtqBosQ/8xwcjGwCruDbJkpkBcL0eWP/u1TekHboyc2pvjYrimxU3/VkiH6p4j6ehCAkaWSJsenTegCSURHgE1xDhh7TdW3jgJQA6e1gNrMeMmIQ0WatQ2m0pvCMqHp/ZZkRxBQcjg==
{
"message_id": "01K3Y9QH7R4W2N8VDBZS5XEJTM",
"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
},
"sender": {
"is_anonymous": false,
"user_id": 987654321,
"username": "sender_name",
"is_verified": false,
"profile_picture": "https://example.com/sender_avatar.jpg",
"channel_slug": "sender_channel",
"identity": {
"username_color": "#FF5733",
"badges": [
{
"text": "Moderator",
"type": "moderator"
},
{
"text": "Subscriber",
"type": "subscriber",
"count": 3
}
]
}
},
"content": "Hello [emote:37226:KEKW]",
"emotes": [
{
"emote_id": "37226",
"positions": [
{
"s": 6,
"e": 23
}
]
}
],
"created_at": "2026-08-30T06:15:00Z"
}
messageId + "." + timestamp + "." + rawBody with RSA PKCS#1 v1.5 /
SHA-256 and base64-encodes the result into Kick-Event-Signature
(verified against the Go sample in
docs.kick.com/events/webhook-security,
which calls rsa.VerifyPKCS1v15). Reaching for an Ed25519 or HMAC
verifier is the classic dead end here.GET api.kick.com/public/v1/public-key. That means anyone can verify but
nobody can forge — and there's nothing secret to store or leak.-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAroMjlHpp7jM1bk99s082 z762jO5Fzwjs9MVw2y2W5liatVlIKby4RjYOHxoNX6JXhYZ5/aNa9nNXXD14DrMg 3Ba2DTntvXgpEQUap9relCd1Dn+eLzXvnjFZGehICGwQL3vpVmh6Dxx6w/lAL1KT 5CL4oPhq0tb+shF40EiXOwCWwWTpZ/ts0adrgtD0TK58PQOdtcxzRatBXx/m9n9/ RfEgH8pb1eUgyMQI7KiYRfAaX7rjhjrV5abFV1g8O9OyNthFPSt9/qaZOMQRglYP UhrNHN+1HkE5eAzf+DftXTOl0kAQObGiq6i9leTDunt0TRfY+J5bRHMXVJEe+LEu 3QIDAQAB -----END PUBLIC KEY-----Paste the body, the id + timestamp headers, the signature, and this key into the signature debugger (Kick scheme) — or set scheme "Kick" with this key on a capture bin and replay the delivery to see the live ✓ badge. Real events verify the same way with Kick's real key.
Kick-Event-Message-Id is a ULID and doubles as the idempotency key;
the timestamp is RFC3339 (not unix seconds — passing epoch seconds into your
verifier breaks the signed string).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: 01K3Y9QH7R4W2N8VDBZS5XEJTM' \
-H 'kick-event-subscription-id: 01K3Y9QH8T6X3P9WECAT7YFKUN' \
-H 'kick-event-message-timestamp: 2026-08-30T06:15:01Z' \
-H 'kick-event-type: chat.message.sent' \
-H 'kick-event-version: 1' \
-H 'kick-event-signature: jugfy8nSKOJde34yUCXRmygZPO1KWDHFqFc1wKQIsbYQclQiNPXuW5G+of2roj+o6HDt7MALi8NYFmfe2xqNSbQoL+eMx7/F7REpHnbRh/M4tcNicWBN8OzPWmf8nL7jlTSDe0Uh692kPDFdGc8L4kmBdHzO/dgFb3yJNtoVBOvMx869ieQdyhg7UGiE1uYdVEbZetvyb8PpgtqBosQ/8xwcjGwCruDbJkpkBcL0eWP/u1TekHboyc2pvjYrimxU3/VkiH6p4j6ehCAkaWSJsenTegCSURHgE1xDhh7TdW3jgJQA6e1gNrMeMmIQ0WatQ2m0pvCMqHp/ZZkRxBQcjg==' \
-d '{
"message_id": "01K3Y9QH7R4W2N8VDBZS5XEJTM",
"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
},
"sender": {
"is_anonymous": false,
"user_id": 987654321,
"username": "sender_name",
"is_verified": false,
"profile_picture": "https://example.com/sender_avatar.jpg",
"channel_slug": "sender_channel",
"identity": {
"username_color": "#FF5733",
"badges": [
{
"text": "Moderator",
"type": "moderator"
},
{
"text": "Subscriber",
"type": "subscriber",
"count": 3
}
]
}
},
"content": "Hello [emote:37226:KEKW]",
"emotes": [
{
"emote_id": "37226",
"positions": [
{
"s": 6,
"e": 23
}
]
}
],
"created_at": "2026-08-30T06:15:00Z"
}'