Reopen campaign submission
Puts a rejected submission back to pending_review so it can be decided again. Its tracking
window resumes, so it works only while that window has not ended; otherwise 409 invalid_resource_state
("This post's tracking window has ended."). A post that earned money which was already paid
out cannot be reopened, and neither can a post of a closed campaign. Reopening a submission that is
already pending_review returns it unchanged; any other status answers 409. No webhook fires.
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.reopenCampaignSubmission({ 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" } }}Remove campaign participant
Removes the participant from the campaign. Their earnings stay in the ledger. Removing an already removed participant returns it unchanged.
Settle campaign participant
Records a payout of the participant's payable balance and fires `campaign_payout.settled`. Omit `amountCents` to settle the whole payable balance; an amount above it answers 400, and nothing payable answers 409. - `none` settlement: records a payout you made elsewhere. - `external` settlement: pay from your own rails when `campaign_payout.payable` fires, then call this with your payout id in `externalReference` (required in this mode). - `treasury` settlement: transfers the amount from your Zernio balance to the creator's connected Stripe account, then records it with the Stripe transfer id as `externalReference`. The transfer fee (4%, $0.50 minimum) is added on top: the creator receives the full amount and your balance is debited `totalCents`. The creator must have finished payout setup from their campaign page (409 otherwise), and a balance that does not cover the amount plus the fee answers 402. While Stripe confirms the transfer the amount sits in the participant's `settling` balance: a reject in that window cannot reverse it. If Stripe refuses the transfer the amount returns to payable; if Stripe does not answer, the amount stays in `settling` and the next settle call for this participant finishes that payout first (even with nothing payable left). A retry asking for a different `amountCents` than the payout in progress answers 409 with the amount in progress, and a settle while another request is still waiting on Stripe for the same payout answers 409 ("This payout is being sent to Stripe right now. Try again in a minute."). A payout Stripe has not confirmed after 24 hours answers 409 ("This payout is being confirmed with Stripe. Try again after the next reconciliation (within 24 hours).") until the daily reconciliation finishes it: settled if Stripe made the transfer, returned to payable if it did not. Set `recordOnly: true` to record a payout you made yourself instead of moving money through the treasury (the webhook then carries `recorded: true`). A treasury payout needs an owner, admin or billing admin, signed in or through a full-access key they created (403 otherwise); recording with `recordOnly` does not. A creator held by an unfinished payout batch answers 409 ("This creator is in a card payout that is not finished yet."). Send an `Idempotency-Key` so a retry never records the payout twice.