Skip to content

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.

Webhook events — Tiklify Help