---
title: "List campaigns with post counts, measured views and the public payout-report link (Pro plan or above)"
method: GET
path: "/api/v1/campaigns"
---

# List campaigns with post counts, measured views and the public payout-report link (Pro plan or above)

`GET /api/v1/campaigns`

## Request

- Base URL: `https://everpop.app`
- URL: `https://everpop.app/api/v1/campaigns`
- Auth: HTTP bearer

## Response `200`

The account's campaigns with their post rollup and public report link.

- CampaignListEnvelope
  - `ok` unknown, required
  - `data` object, required
    - `campaigns` CampaignListItem[], required: Newest first.
      - `id` string, required
      - `userId` string, required
      - `name` string, required
      - `sourceUrl` string, nullable, required
      - `sourceVideoId` string, nullable, required
      - `platformRule` string, required
      - `cpmCents` integer, nullable, required
      - `budgetCents` integer, nullable, required
      - `deadline` string, date-time, nullable, required
      - `notes` string, nullable, required
      - `status` 'ACTIVE' | 'COMPLETED', required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
      - `postCount` integer, required: Published posts attached to the campaign.
      - `verifiedViews` number, required: Measured YouTube Analytics views summed over the attached posts: per post the 7-day window when measured, else 48h (so a lower bound while 48h counts still climb).
      - `measuredCount` integer, required: Attached posts with at least one measured window.
      - `platformCounts` object, required: Attached posts per platform.
      - `estimatedPayoutCents` integer, nullable, required: verifiedViews ÷ 1,000 × cpmCents, rounded; null without a CPM. An estimate — the marketplace's own view count governs payout.
      - `publicUrl` string, uri, nullable, required: The token-protected public payout-report page.
      - `source` object, nullable, required
        - `id` string, required
        - `title` string, required
        - `status` string, required
        - `rightsOk` boolean, required: Whether publishing from this footage is allowed (the user's rights attestation is on file).
      - `brief` object, nullable, required: The structured brief rules enforced on every attach, or null.
      - `briefLines` string[], required: The brief rules as plain sentences.
      - `briefUnreadable` boolean, required: true when stored brief rules could not be read (attaching refuses until they are fixed).

## Other responses

- `401`: The API key did not authenticate. code=key_missing: no Authorization: Bearer epk_... header. code=key_invalid: the key is unknown or revoked. code=key_expired: the key passed its expiry; the user creates a new one in Dashboard → API.
- `402`: reason=plan — campaigns are not included in this account's plan.
- `403`: code=scope (also reason=scope): the API key is read-only and this is a write. code=suspended: the account is suspended. Endpoint-specific refusals document their own reason.
- `429`: Too many requests. code=rate_limited: the per-minute limit; wait Retry-After (60) seconds. code=quota_exhausted (with used, limit, resetsAt, retryable: false): the monthly allowance is used up; Retry-After is the seconds until resetsAt — tell the user rather than wait. code=queue_capacity (retryable: true): the render queue is full; retry after Retry-After (180).

---

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