Skip to content

Public API

Key authentication, five endpoints for campaigns and videos, pagination, response fields, errors and the request limit.

Updated Oct 17, 2026

The public API only reads your brand's data. The base address is https://api.tiklify.com/v1/api. Send your API key in the Authorization: Bearer tklfy_… or x-api-key: tklfy_… header. We accept 60 requests per minute and at most 20 per second per API key, across all endpoints; a key gets its own counter from the second request after a successful authentication, and until then the address counter applies. If more than 10 invalid API keys arrive from one address within a minute, that address gets a 429 with code API_KEY_RATE_LIMITED and a Retry-After header for 60 seconds; keys that authenticated successfully within roughly the last 10 minutes still get through.

curl "https://api.tiklify.com/v1/api/campaigns?status=live&limit=20" \
  -H "Authorization: Bearer $TIKLIFY_API_KEY"

Endpoints

  • GET /me — your brand (brand with id, name, currency) and the key's scopes.
  • GET /campaigns — the list of campaigns. Filters status and q (searches the title).
  • GET /campaigns/:id — one campaign, with description added.
  • GET /campaigns/:id/submissions — the campaign's videos. Filter state.
  • GET /submissions/:id — one video.

Pagination

Lists accept limit (default 50; above 100 counts as 100) and cursor, and return items and nextCursor. Pass nextCursor as cursor for the next page; on the last page it is null.

Response fields

A campaign has one entry in targets per platform:

{
  "id": "31999db1-6be4-4cce-81cc-aee51f5e8efb",
  "title": "Autumn collection",
  "description": "Show how you wear our autumn collection.",
  "category": "fashion",
  "status": "live",
  "visibility": "public",
  "contentType": "ugc",
  "payoutModel": "goal",
  "launchMode": "open",
  "currency": "CZK",
  "budgetAmount": "30000.00",
  "startsAt": "2026-10-01T08:00:00.000Z",
  "endsAt": "2026-10-31T22:59:59.000Z",
  "createdAt": "2026-09-28T12:00:00.000Z",
  "targets": [
    {
      "id": "67c4fe02-65e3-4621-a742-994e863d04c7",
      "platform": "tiktok",
      "contentKind": "video",
      "status": "live",
      "rewardAmount": "1500.00",
      "requiredViews": 10000,
      "maxVideos": 20,
      "pricePerUnit": null,
      "viewUnit": null,
      "requiredMention": null
    }
  ],
  "requiredHashtag": null,
  "linkTracking": { "enabled": false, "destinationUrl": null }
}

A video:

{
  "id": "cf2b7a29-fa3c-42e9-9414-9b3db1dd07b1",
  "campaignId": "31999db1-6be4-4cce-81cc-aee51f5e8efb",
  "targetId": "67c4fe02-65e3-4621-a742-994e863d04c7",
  "platform": "tiktok",
  "state": "monitoring",
  "videoUrl": "https://www.tiktok.com/@creator/video/7426512345678901234",
  "title": null,
  "submittedAt": "2026-10-14T16:05:00.000Z",
  "approvedAt": null,
  "rejectedAt": null,
  "views": null,
  "rewardAmount": "1500.00",
  "currency": "CZK",
  "creator": { "nickname": "anna.creates" }
}

Possible values:

status (campaign and target)   draft | scheduled | live | paused | stopped | ended | cancelled | archived
state (video)                  submitted | validated | monitoring | threshold_reached | fraud_review |
                               pending_approval | approved | rejected | paid_out | disputed | expired |
                               queued_for_slot
visibility                     public | exclusive | invite_only
contentType                    ugc | klip
payoutModel                    goal | perviews
launchMode                     open | masslaunch
platform                       tiktok | instagram | youtube
contentKind                    video (tiktok) | reel (instagram) | short (youtube)
currency                       EUR | CZK | PLN
amounts                        strings with two decimals ("1500.00"); pricePerUnit with four
times                          ISO 8601, UTC
views                          the current view count from the platform; null until the platform
                               reports it, and again once the stored platform data expires
rewardAmount (video)           Goal: the video's fixed reward; Per-views: null until approval,
                               then the amount for the video's views

null does not mean zero. A creator appears only by nickname.

Errors

400  :id is not a UUID
400  invalid status, state or q (1–200 characters), cursor is not a UUID, or limit is not
     a whole number from 1; the body has message "Validation failed" and an errors list
     with field and message
400  cursor is not an item of this list: code INVALID_CURSOR
401  key missing or malformed: code API_KEY_REQUIRED
401  key invalid or revoked: code API_KEY_INVALID
403  key without the "Read" permission: code API_KEY_SCOPE
404  the campaign or video does not exist or belongs to another brand
429  you exceeded the request limit

Every error body contains statusCode and message.

Still stuck? Write to us at hello@tiklify.com.

Public API — Tiklify Help