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

# Get campaign submission

`GET /v1/creator-campaigns/{campaignId}/submissions/{submissionId}`

## Request

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

Returns one submission with its per-sync samples (views, likes, comments, shares, saves).

## Path parameters

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

## Response `200`

Submission

- object
  - `submission` CampaignSubmissionDetail, 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.
    - `samples` object[], required: Counters per sync, newest first, up to 500.
      - `syncedAt` string, date-time, required
      - `views` integer, required
      - `likes` integer, required
      - `comments` integer, required
      - `shares` integer, required
      - `saves` integer, required

## 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`).

## Changes

- **2026-10-30** `c319eb5d95b6`: 2 warning, 2 info
  - added the new `organic_unverified` enum value to the `submission/allOf[#/components/schemas/CampaignSubmission]/flags/items/code` response property for the response status `200`
  - added the new `paid_views` enum value to the `submission/allOf[#/components/schemas/CampaignSubmission]/flags/items/code` response property for the response status `200`
  - added the required property `submission/allOf[#/components/schemas/CampaignSubmission]/paidViewsReadAt` to the response with the `200` status
  - added the required property `submission/allOf[#/components/schemas/CampaignSubmission]/viewsPaid` to the response with the `200` status
- **2026-10-30** `172499a6a5e9`: 1 info
  - added the required property `submission/allOf[#/components/schemas/CampaignSubmission]/engagementsLatest` to the response with the `200` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/creator-campaigns/:campaignId/submissions/:submissionId/get.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)
