---
title: "Reject campaign submission"
method: POST
path: "/v1/creator-campaigns/{campaignId}/submissions/{submissionId}/reject"
tags: ["Creator Campaigns"]
---

# Reject campaign submission

`POST /v1/creator-campaigns/{campaignId}/submissions/{submissionId}/reject`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/creator-campaigns/{campaignId}/submissions/{submissionId}/reject`
- Auth: HTTP bearer

Rejects a submission (also one already approved) and fires `campaign_submission.rejected`. Its
tracking window is cancelled and its unsettled earnings return to the campaign budget.
Rejecting a rejected submission returns it unchanged; an expired or withdrawn one answers 409.

## Path parameters

- `campaignId` string, required
- `submissionId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `reason` string, required

## Response `200`

Submission rejected

- object
  - `submission` CampaignSubmission, required
    - `id` string, required
    - `campaignId` string, required
    - `participantId` string, required
    - `creatorId` string, required
    - `accountId` string, required: The creator account the post was published from.
    - `platform` 'tiktok' | 'instagram' | 'youtube' | 'threads' | 'pinterest' | 'facebook' | 'twitter', required
    - `platformPostId` string, required
    - `platformPostUrl` string, nullable, required
    - `externalPostId` string, nullable, required: The tracked external post (see /v1/external-posts).
    - `trackingWindowId` string, nullable, required
    - `mediaHash` string, nullable, required
    - `submittedAt` string, date-time, required
    - `postPublishedAt` string, date-time, nullable, required
    - `status` 'received' | 'tracking' | 'pending_review' | 'approved' | 'rejected' | 'expired' | 'withdrawn', required
    - `rejectReason` string, nullable, required
    - `reviewRound` integer, required: How many times the post was reopened after a reject. 0 until the first reopen.
    - `reviewedBy` string, nullable, required: User id of the reviewer.
    - `reviewedAt` string, date-time, nullable, required
    - `viewsAtSubmission` integer, nullable, required: Views when the post was submitted. They count toward earnings like every later view.
    - `viewsLatest` integer, nullable, required: Latest view count read for the post, frozen at the tracking window end.
    - `viewsEligible` integer, nullable, required: Views that count toward earnings: every view the platform reports for the post, including those before submission, read at the tracking window end at the latest: once the window completes or is cancelled, the last read at or before its end is final and this value stops moving.
    - `engagementsLatest` integer, nullable, required: The campaign engagement types summed at the latest read (all four on a views campaign), frozen at the tracking window end like `viewsEligible`. An `engagements` campaign earns on this count.
    - `viewsPaid` integer, nullable, required: Views from ads the creator ran: YouTube views from the advertising traffic source, X impressions beyond the organic ones. Null on other platforms and before the first read. On an organic-only campaign `viewsEligible` is the latest views minus these.
    - `paidViewsReadAt` string, date-time, nullable, required: When `viewsPaid` was last read. YouTube refreshes every 6 hours and reports ad views up to 2 days late; X about once a day while the post is under 30 days old.
    - `lastAccruedViews` integer, required
    - `accruedCents` integer, required
    - `approvedCents` integer, required
    - `authenticityScore` integer, nullable, required
    - `authenticityConfidence` number, nullable, required
    - `flags` CampaignSubmissionFlag[], required
      - `code` 'duplicate_media' | 'duplicate_post' | 'view_spike' | 'linked_accounts' | 'cross_operator' | 'unreachable' | 'post_deleted' | 'account_restricted' | 'low_authenticity' | 'x_read_cap' | 'paid_views' | 'organic_unverified', required
      - `detail` string, required
      - `raisedAt` string, date-time, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `creator` object, required
      - `id` string, required
      - `displayName` string, required
    - `authenticity` object, nullable, required: 0 to 100, where 100 means the view pattern looks organic. Null until the post is scored.
      - `score` integer, required
      - `confidence` number, nullable, required
      - `reasons` unknown[], required
        - unknown
    - `earnedCents` integer, required: approvedCents once approved, otherwise accruedCents.
    - `releasedCents` integer, required: Approved cents whose hold is over, so payable or already paid out. 0 unless approved.
    - `paidOutCents` integer, required: What rejecting this post could not take back now: releasedCents beyond the creator's payable balance. It stays paid; the dashboard warns before such a reject.
    - `window` object, nullable, required: The tracking window that samples the post.
      - `id` string, required
      - `endsAt` string, date-time, required
      - `status` string, required
    - `post` object, required: The post itself, as the review drawer shows it. Thumbnail and caption are null until the post has been synced.
      - `thumbnailUrl` string, nullable, required
      - `caption` string, nullable, required
      - `accountHandle` string, nullable, required: The @handle of the connected account that published the post, without the @.
      - `publishedAt` string, date-time, required: When the post went live; the submission time if that is not known.

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: Refused. Code `feature_not_available`: creator campaigns run on usage-based billing and the workspace that owns the campaign is not on it yet ("Creator campaigns require usage-based billing..."; contact support to switch), or the campaign reached `caps.maxParticipants` (invites and joins only). Code `insufficient_permissions`: a restricted API key without the `creator_campaigns` resource group.
- `404`: The campaign, participant or submission does not exist, belongs to another team, or sits in a profile this key cannot reach (code `resource_not_found`).
- `409`: The campaign, participant or submission is not in a state that allows this action (code `invalid_resource_state`); the message names the current state. Also returned while the same `Idempotency-Key` is still processing.
- `422`: Idempotency-Key reused with a different request

## Changes

- **2026-10-30** `c319eb5d95b6`: 2 warning, 2 info
  - added the new `organic_unverified` enum value to the `submission/flags/items/code` response property for the response status `200`
  - added the new `paid_views` enum value to the `submission/flags/items/code` response property for the response status `200`
  - added the required property `submission/paidViewsReadAt` to the response with the `200` status
  - added the required property `submission/viewsPaid` to the response with the `200` status
- **2026-10-30** `172499a6a5e9`: 1 info
  - added the required property `submission/engagementsLatest` to the response with the `200` status
- **2026-10-29** `dbfaa35515ac`: 5 warning
  - added the new `facebook` enum value to the `submission/platform` response property for the response status `200`
  - added the new `pinterest` enum value to the `submission/platform` response property for the response status `200`
  - added the new `threads` enum value to the `submission/platform` response property for the response status `200`
  - added the new `twitter` enum value to the `submission/platform` response property for the response status `200`
  - …1 more
- **2026-10-28** `8f2c44dd7550`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/creator-campaigns/:campaignId/submissions/:submissionId/reject/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) - [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/c319eb5d95b6?raw)
