Webhook events
When each of the ten events arrives, which fields the body carries and how to handle repeated deliveries.
Updated Oct 16, 2026
The webhook form shows event names. Each event reaches your endpoint as a JSON POST, with its code in eventType and in the Tiklify-Event header.
When each one arrives
- "Campaign status changed"
campaign.status_changed— the campaign changed status on one platform: published, scheduled, paused, resumed, stopped, ended or cancelled. - "Campaign ended"
campaign.ended— the whole campaign ended. - "New video"
submission.created— we accepted a creator's video. - "Video reached its goal"
submission.goal_reached— a video in a Goal campaign reached the required views. - "Video awaiting approval"
submission.pending_approval— a video awaits your decision, including videos released from the waiting list or after a check. - "Video approved"
submission.approved— approved by you, automatically or after a dispute. - "Video rejected"
submission.rejected— you or our check rejected the video. - "Video expired"
submission.expired— the campaign or earning period ended before the video earned a reward. - "Appeal filed"
submission.dispute_opened— a dispute started on the video, for example a creator's appeal. - "Appeal decided"
submission.dispute_resolved— the dispute was decided.
The "Test" button sends a test event.
Fields
Body fields are listed below. The Tiklify-Event-Id header carries the same value as eventId. Creators' personal data is never included.
every event schemaVersion (now 2), eventId, eventType, occurredAt (ISO 8601, UTC), campaignId
campaign.status_changed target (id, platform, contentKind), from, to
campaign.ended reason: ended | cancelled | mixed (some platforms ended, others were cancelled)
submission.created submission
submission.goal_reached submission, views
submission.pending_approval submission, approveUntil (time of the automatic approval, or null
when a person has to decide)
submission.approved submission, rewardAmount (string: the fixed reward in Goal, the amount
for the video's views in Per-views), currency, automatic (true | false)
submission.rejected submission, appealUntil (appeal deadline, or null)
submission.expired submission
submission.dispute_opened submission, disputeId
submission.dispute_resolved submission, disputeId, outcome: creator | brand
test test: true, ranAt (no campaignId)
submission id, targetId (the campaign on one platform), platform, videoUrl (address, or null)
from, to draft | scheduled | live | paused | stopped | ended | cancelled | archived
platform tiktok | instagram | youtube
contentKind video (tiktok) | reel (instagram) | short (youtube)
currency EUR | CZK | PLN
Example body
{
"schemaVersion": 2,
"eventId": "3ed902c6-ce55-42d9-84f6-39c5de0e7435",
"eventType": "submission.approved",
"occurredAt": "2026-10-16T09:30:00.000Z",
"campaignId": "31999db1-6be4-4cce-81cc-aee51f5e8efb",
"submission": {
"id": "cf2b7a29-fa3c-42e9-9414-9b3db1dd07b1",
"targetId": "67c4fe02-65e3-4621-a742-994e863d04c7",
"platform": "tiktok",
"videoUrl": "https://www.tiktok.com/@creator/video/7426512345678901234"
},
"rewardAmount": "1500.00",
"currency": "CZK",
"automatic": false
}
Retries and duplicates
Without a 2xx answer within 10 seconds we retry: up to 5 attempts in total, with growing intervals from 30 seconds. So an event can arrive twice, or after a newer one: store eventId, acknowledge known events with a 2xx code and order by occurredAt.
Still stuck? Write to us at hello@tiklify.com.
Related
- API keys and webhooksWhere to create an API key and a webhook, which events a webhook sends and why it switches itself off after failures.
- Verifying the webhook signatureHow to use the Tiklify-Signature header to check that a request came from Tiklify and was not changed on the way. With Node.js and PHP examples.
- Public APIKey authentication, five endpoints for campaigns and videos, pagination, response fields, errors and the request limit.