---
title: "Read a creator invite or participant page"
method: GET
path: "/public/creator-campaigns/{token}"
tags: ["Creator Portal"]
---

# Read a creator invite or participant page

`GET /public/creator-campaigns/{token}`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/public/creator-campaigns/{token}`
- Auth: none required

What a creator sees behind a campaign link, with no API key. Never cached.

`token` is one of:

- An open invite token (from `POST /v1/creator-campaigns/{campaignId}/invite-link`): answers `kind: invite` with the campaign only.
- A participant token (from an invite or a join): answers `kind: participant` with the creator's connected accounts, latest 100 submissions, earnings and payout setup.

Reading a participant page also re-checks the creator's connected accounts.

## Response `200`

The invite or participant page.

- union
  - CreatorPortalInvite
    - `kind` 'invite', required
    - `campaign` CreatorPortalCampaign, required: The campaign as a creator sees it: terms, never the budget.
      - `id` string, required: The campaign id, as in a link-recovery URL.
      - `name` string, required
      - `brandName` string, required
      - `logoUrl` string, nullable, required
      - `theme` object, nullable, required: Same keys as the `welcomeTheme` parameter of `GET /v1/connect/{platform}`.
      - `status` 'draft' | 'active' | 'paused' | 'closed', required
      - `platforms` string[], required
      - `contentRules` string, nullable, required
      - `startsAt` string, date-time, nullable, required
      - `endsAt` string, date-time, nullable, required
      - `currency` string, required
      - `economics` union, required: How the campaign pays, without its budget. Amounts in cents. A pool campaign shows the pool size as `poolCents`.
        - object
          - `type` 'cpm', required
          - `metric` 'views' | 'engagements': What the rate pays on. Missing means views.
          - `engagementTypes` string[]: The engagements that count. Missing means all four.
          - `organicViewsOnly` boolean: Only organic views count; views from ads do not.
          - `ratePer1kCents` integer, required
          - `minViewsToEarn` integer, required
          - `maxPayoutPerClipCents` integer
        - object
          - `type` 'per_post', required
          - `perApprovedPostCents` integer, required
          - `maxPostsPerParticipant` integer
        - object
          - `type` 'pool', required
          - `poolCents` integer, required
          - `minViewsToQualify` integer, required
          - `organicViewsOnly` boolean: Only organic views count; views from ads do not.
      - `maxPostAgeMinutes` integer, nullable, required: A post must be submitted within this many minutes of publishing. Null means any age. Either way, only posts published after the campaign started are accepted.
      - `holdDays` integer, required: Days approved earnings stay owed before they become payable.
      - `trackingDays` integer, required: Days each submitted post is tracked for views.
  - CreatorPortalParticipant
    - `kind` 'participant', required
    - `campaign` CreatorPortalCampaign, required: The campaign as a creator sees it: terms, never the budget.
      - `id` string, required: The campaign id, as in a link-recovery URL.
      - `name` string, required
      - `brandName` string, required
      - `logoUrl` string, nullable, required
      - `theme` object, nullable, required: Same keys as the `welcomeTheme` parameter of `GET /v1/connect/{platform}`.
      - `status` 'draft' | 'active' | 'paused' | 'closed', required
      - `platforms` string[], required
      - `contentRules` string, nullable, required
      - `startsAt` string, date-time, nullable, required
      - `endsAt` string, date-time, nullable, required
      - `currency` string, required
      - `economics` union, required: How the campaign pays, without its budget. Amounts in cents. A pool campaign shows the pool size as `poolCents`.
        - object
          - `type` 'cpm', required
          - `metric` 'views' | 'engagements': What the rate pays on. Missing means views.
          - `engagementTypes` string[]: The engagements that count. Missing means all four.
          - `organicViewsOnly` boolean: Only organic views count; views from ads do not.
          - `ratePer1kCents` integer, required
          - `minViewsToEarn` integer, required
          - `maxPayoutPerClipCents` integer
        - object
          - `type` 'per_post', required
          - `perApprovedPostCents` integer, required
          - `maxPostsPerParticipant` integer
        - object
          - `type` 'pool', required
          - `poolCents` integer, required
          - `minViewsToQualify` integer, required
          - `organicViewsOnly` boolean: Only organic views count; views from ads do not.
      - `maxPostAgeMinutes` integer, nullable, required: A post must be submitted within this many minutes of publishing. Null means any age. Either way, only posts published after the campaign started are accepted.
      - `holdDays` integer, required: Days approved earnings stay owed before they become payable.
      - `trackingDays` integer, required: Days each submitted post is tracked for views.
    - `participant` object, required
      - `displayName` string, required
      - `status` 'invited' | 'active' | 'suspended' | 'removed', required
      - `joinedAt` string, date-time, nullable, required
    - `accounts` object[], required: Verified accounts on the campaign's platforms.
      - `platform` string, required
      - `username` string, required
      - `displayName` string, nullable, required
      - `avatarUrl` string, nullable, required
    - `submissions` CreatorPortalSubmission[], required: The latest 100 submissions.
      - `id` string, required
      - `platform` string, required
      - `postId` string, required
      - `url` string, nullable, required
      - `status` 'received' | 'tracking' | 'pending_review' | 'approved' | 'rejected' | 'expired' | 'withdrawn', required
      - `submittedAt` string, date-time, required
      - `publishedAt` string, date-time, nullable, required
      - `views` integer, required: Latest view count read for the post.
      - `engagements` integer, nullable, required: The campaign engagement types summed at the latest read. Null until the post is read.
      - `viewsFromAds` integer, nullable, required: Views that came from ads the creator ran, on YouTube and X. Null where the platform does not report them or before the first read.
      - `earnedCents` integer, required
      - `rejectReason` string, nullable, required
      - `flags` string[], required: Creator-safe flags only. Every other review flag shows as `under_review`.
      - `trackingEndsAt` string, date-time, nullable, required
    - `earnings` object, required
      - `accruingCents` integer, required: Earned, not approved yet.
      - `owedCents` integer, required: Approved, on hold.
      - `payableCents` integer, required
      - `payingCents` integer, required: A payout in flight.
      - `paidCents` integer, required
      - `nextReleaseAt` string, date-time, nullable, required: When the next held amount becomes payable.
    - `payouts` CreatorPortalPayoutSetup, required
      - `mode` 'none' | 'external' | 'treasury', required: How the campaign pays: treasury means through Zernio, so the creator onboards for payouts.
      - `status` 'not_started' | 'pending' | 'enabled' | 'not_applicable', required
      - `country` string, nullable, required
      - `transfers` object[], required: Treasury payouts sent to the creator.
        - `id` string, required
        - `amountCents` integer, required
        - `createdAt` string, date-time, required

## Other responses

- `404`: The token is malformed, unknown or expired. Every case answers the same, so a link can never be probed.

## Changes

- **2026-10-30** `c319eb5d95b6`: 5 info
  - added the optional property `oneOf[#/components/schemas/CreatorPortalInvite]/campaign/economics/oneOf[subschema #1: CPM]/organicViewsOnly` to the response with the `200` status
  - added the optional property `oneOf[#/components/schemas/CreatorPortalInvite]/campaign/economics/oneOf[subschema #3: Pool]/organicViewsOnly` to the response with the `200` status
  - added the optional property `oneOf[#/components/schemas/CreatorPortalParticipant]/campaign/economics/oneOf[subschema #1: CPM]/organicViewsOnly` to the response with the `200` status
  - added the optional property `oneOf[#/components/schemas/CreatorPortalParticipant]/campaign/economics/oneOf[subschema #3: Pool]/organicViewsOnly` to the response with the `200` status
  - …1 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/public/creator-campaigns/:token/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)
