Approve campaign submission
Approves a tracking or pending_review submission of an active campaign and fires
campaign_submission.approved. The Zernio dashboard offers Approve only on pending_review
(a post that needs a decision) and waits for tracking posts to get there; the API accepts
tracking so an integration can approve early. What the post earned so far moves to owed and is held for the
campaign's holdDays; later earnings post straight to owed. A per-post campaign pays
perApprovedPostCents here. Any other state answers 409. The same post approved in another of your campaigns also answers 409 (invalid_resource_state, "This post is already approved in another campaign of yours."), so one post never earns twice.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Path Parameters
Campaign ID.
Submission ID.
Header Parameters
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.
length <= 255Response Body
application/json
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.approveCampaignSubmission({ path: { campaignId: 'campaign_abc123', submissionId: 'submission_abc123', },});console.log(data);{ "submission": { "id": "string", "campaignId": "string", "participantId": "string", "creatorId": "string", "accountId": "string", "platform": "tiktok", "platformPostId": "string", "platformPostUrl": "string", "externalPostId": "string", "trackingWindowId": "string", "mediaHash": "string", "submittedAt": "2019-08-24T14:15:22Z", "postPublishedAt": "2019-08-24T14:15:22Z", "status": "received", "rejectReason": "string", "reviewRound": 0, "reviewedBy": "string", "reviewedAt": "2019-08-24T14:15:22Z", "viewsAtSubmission": 0, "viewsLatest": 0, "viewsEligible": 0, "lastAccruedViews": 0, "accruedCents": 0, "approvedCents": 0, "authenticityScore": 0, "authenticityConfidence": 0, "flags": [ { "code": "duplicate_media", "detail": "string", "raisedAt": "2019-08-24T14:15:22Z" } ], "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "creator": { "id": "string", "displayName": "string" }, "authenticity": { "score": 0, "confidence": 0, "reasons": [ null ] }, "earnedCents": 0, "releasedCents": 0, "paidOutCents": 0, "window": { "id": "string", "endsAt": "2019-08-24T14:15:22Z", "status": "string" }, "post": { "thumbnailUrl": "string", "caption": "string", "accountHandle": "string", "publishedAt": "2019-08-24T14:15:22Z" } }}Activate creator campaign
Moves a `draft` or `paused` campaign to `active`, where creators can join and submit posts and tracked views accrue earnings. Needs at least one platform and a budget above zero; any other starting state answers 409.
Close creator campaign
Closes an `active` or `paused` campaign for good and fires `creator_campaign.closed`. Open tracking windows are cancelled. A pool campaign is split among participants at this moment by their approved eligible views, so closing a pool campaign answers 409 while any post still awaits review. A campaign also closes by itself once `endsAt` passed and every tracking window had its final read.