Zernio
APIFor you
Zernio
APIFor you
API Reference

Creator Campaigns

List campaign ledgerGETList campaign participantsGETList campaign payablesGETList payout batchesGETList campaign submissionsGETList creator campaignsGETCreate campaign adjustmentPOSTCreate campaign invite linkPOSTInvite campaign participantPOSTPay creators with one card paymentPOSTCreate creator campaignPOSTGet campaign participantGETGet campaign reportGETGet campaign submissionGETGet creator campaignGETUpdate creator campaignPATCHActivate creator campaignPOSTApprove campaign submissionPOSTClose creator campaignPOSTPause creator campaignPOSTRaise creator campaign budgetPOSTReinstate campaign participantPOSTReject campaign submissionPOSTRemove campaign participantPOSTReopen campaign submissionPOSTSettle campaign participantPOSTSuspend campaign participantPOST
Dashboard
OverviewPlatformsAPI ReferenceResources
Creator Campaigns

Create creator campaign

Creates a campaign in draft. Creators are paid for verified performance of the posts they submit: Zernio tracks each post through a tracking window, scores its authenticity and records every earning in a ledger. Activate the campaign to start accepting submissions.

Creator campaigns run on usage-based billing; a workspace not on it gets 403 feature_not_available. profileId must be a profile this key can reach, otherwise 404.


POST
/v1/creator-campaigns

Authorization

bearerAuth
AuthorizationBearer <token>

API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.

In: header

Header Parameters

Idempotency-Key?string

Optional client-generated unique key (e.g. a UUID) that makes retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. A request cut off mid-handler (for example by a function timeout) can leave its key in progress, answering 409 until the key expires after 24 hours.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.creatorcampaigns.createCreatorCampaign({  body: {    profileId: 'profile_abc123',    name: 'Example',    brandName: 'Example',    economics: {      type: 'cpm',      ratePer1kCents: 1,      minViewsToEarn: 0,      budgetCents: 0,    },  },});console.log(data);
{  "campaign": {    "id": "string",    "userId": "string",    "profileId": "string",    "kind": "string",    "name": "string",    "brandName": "string",    "status": "draft",    "type": "cpm",    "currency": "string",    "platforms": [      "tiktok"    ],    "contentRules": "string",    "startsAt": "2019-08-24T14:15:22Z",    "endsAt": "2019-08-24T14:15:22Z",    "trackingDays": 0,    "holdDays": 0,    "maxPostAgeMinutes": 0,    "settlement": "none",    "economics": {      "type": "cpm",      "ratePer1kCents": 1,      "minViewsToEarn": 0,      "maxPayoutPerClipCents": 1,      "budgetCents": 0    },    "caps": {      "maxParticipants": 1,      "maxSubmissionsPerParticipantPerDay": 1,      "maxAccountsPerParticipant": 1,      "authenticityThreshold": 0    },    "branding": {      "brandName": "string",      "primaryColor": "string",      "logoUrl": "string",      "theme": {}    },    "budgetExhaustedAt": "2019-08-24T14:15:22Z",    "closedAt": "2019-08-24T14:15:22Z",    "payableScannedAt": "2019-08-24T14:15:22Z",    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "hasOpenInvite": true,    "consumedCents": 0,    "participantCount": 0,    "submissionCounts": {      "received": 0,      "tracking": 0,      "pending_review": 0,      "approved": 0,      "rejected": 0,      "expired": 0,      "withdrawn": 0    }  }}
Was this page helpful?

Pay creators with one card payment

Pays exactly what is owed: every payable creator of a `treasury` campaign who finished payout setup (or only `participantIds`, minus `excludeParticipantIds`) is held in `settling`, and the response carries a Stripe Checkout `url` for the total plus the fee (4% per creator, 50 cent minimum). Once the card payment completes, each creator gets a transfer funded by that charge and the batch ends `paid` or `partially_failed`. A creator whose payouts were disabled before the payment landed is skipped and stays payable. If the Checkout expires unpaid (24 hours), every amount is payable again. Card payouts are limited to $2,000.00 gross per rolling 30 days by default; over it the call answers 402 ("Over your instant payout limit. Top up your balance to pay more this month, or contact support to raise the limit."). Nothing payable answers 400 ("Nothing is payable."). Needs an owner, admin or billing admin, signed in or through a full-access key they created. Send an `Idempotency-Key` so a retry never opens a second batch.

Get campaign participant

Returns one participant with connected accounts, balances by state, flags and submission counts.

profileId*string

Profile the campaign lives in. Creator accounts connect into the same workspace.

name*string
Length1 <= length <= 200
brandName*string
Length1 <= length <= 200
economics*||

How the campaign pays, picked by type. Amounts are USD cents. Every type carries budgetCents, the most the campaign can pay out in total; once earnings reach it the campaign stops accruing and creator_campaign.budget_exhausted fires.

  • cpm: ratePer1kCents per 1,000 eligible views, earned from minViewsToEarn views on, capped per post by maxPayoutPerClipCents.
  • per_post: perApprovedPostCents for each approved post, at most maxPostsPerParticipant per participant.
  • pool: budgetCents is split at close among approved posts by eligible views; a post needs minViewsToQualify views to share.
caps?

Omitted, the campaign starts with authenticityThreshold 40 and no other caps.

platforms?array<>

Platforms creators may post on. At least one is needed to activate.

contentRules?|
Lengthlength <= 10000
startsAt?|
Formatdate-time
endsAt?|
Formatdate-time
trackingDays?integer
Range1 <= value <= 365
Default30
holdDays?integer
Range0 <= value <= 90
Default10
maxPostAgeMinutes?integer
Range1 <= value
Default60
settlement?string
Default"none"

Value in

  • "none"
  • "external"
  • "treasury"
branding?|null