---
title: "Get Creator Hub campaign performance table"
method: GET
path: "/creator-hub/overview/campaign-performance"
tags: ["Creator Hub Analytics"]
---

# Get Creator Hub campaign performance table

`GET /creator-hub/overview/campaign-performance`

## Request

- Base URL: `https://viral.app/api/v1`
- URL: `https://viral.app/api/v1/creator-hub/overview/campaign-performance`
- Auth: API key in header `x-api-key`

Returns paginated per-campaign comparison rows for the selected scope: assigned and posting creators, posted videos against the period-prorated target, campaign views (views gained while a creator is assigned) and their share across every campaign in scope, paid + projected payouts with effective CPM and spend per video in the display currency, plus engagement and virality metrics.

## Query parameters

- `page` number: Page number (1-based index)
- `perPage` number: Number of items per page (1-100)
- `sortCol` 'campaignName' | 'activeCreators' | 'totalPosts' | 'totalVideosEligible' | 'totalViews' | 'viewShare' | 'payoutTotal' | 'effectiveCpm' | 'spendPerVideo' | 'engagementRate' | 'viralityRate'
- `sortDir` 'asc' | 'desc'
- `scope` 'dateRange' | 'allTime'
- `dateRange` object, required: Date range filter for analytics queries
  - `from` string, required: Start date in ISO format (YYYY-MM-DD)
  - `to` string, required: End date in ISO format (YYYY-MM-DD)
- `campaignIds` string[]
- `creatorIds` string[]
- `publicationMode` 'allEligible' | 'onlyPublished'

## Response `200`

OK

- object
  - `data` object[], required
    - `id` string, required: Campaign ID with orgcamp_ prefix
    - `campaign` object, required
      - `id` string, required: Campaign ID with orgcamp_ prefix
      - `name` string, required
      - `description` string, nullable, required
      - `currency` 'USD' | 'EUR' | 'CHF' | 'GBP' | 'CNY' | 'JPY' | 'KRW' | 'THB' | 'IDR' | 'VND' | 'RUB', required
      - `interval` 'day' | 'week' | 'month', required
      - `intervalCount` integer, required
      - `billingAnchor` 'fixed' | 'rolling', required
      - `status` 'upcoming' | 'active' | 'closing' | 'ended', required: Campaign lifecycle status derived from validity window. upcoming: validFrom in the future; active: started with no end date; closing: started and has an end date in the present/future; ended: end date is in the past.
      - `validFrom` string, required
      - `validUntil` string, nullable, required
    - `assignedCreators` number, required: Creators with an assignment overlapping the period
    - `activeCreators` number, required: Assigned creators who posted at least one eligible video in the period
    - `totalPosts` number, required: Eligible videos posted inside the period
    - `totalVideosEligible` number, required: Distinct eligible videos in the period
    - `totalViews` number, required: Campaign views gained across the period (videos posted while a creator was assigned, no video-age window)
    - `viewShare` number, required: This campaign's share (0-1) of campaign views across every campaign in scope
    - `payoutTotal` number, required: Paid + projected payouts (major units) in the display currency
    - `paidPayoutTotal` number, required: Paid payouts (major units) in the display currency
    - `effectiveCpm` number, required: (payoutTotal / totalViews) * 1000 in the display currency; 0 without views
    - `spendPerVideo` number, required: payoutTotal / totalPosts in the display currency; 0 without posted videos
    - `totalLikes` number, required
    - `totalComments` number, required
    - `totalShares` number, required
    - `totalBookmarks` number, required
    - `engagementRate` number, required: (likes + comments + shares + bookmarks) / latest-snapshot views
    - `viralityRate` number, required: Capped P90/P50 view ratio across the campaign's eligible videos (0-1)
  - `resolvedRange` object, required: Date range filter for analytics queries
    - `from` string, required: Start date in ISO format (YYYY-MM-DD)
    - `to` string, required: End date in ISO format (YYYY-MM-DD)
  - `currency` string, required: Display currency for monetary row values (single-campaign scope: the campaign currency; otherwise the organization default currency, with campaign currencies converted at nearest-date FX rates)
  - `eligibilityRefreshedAt` string, nullable, required
  - `totals` object, required
    - `rowCount` number, required
    - `totalPosts` number, required
    - `totalVideosEligible` number, required
    - `totalViews` number, required
    - `payoutTotal` number, required
    - `paidPayoutTotal` number, required
  - `pageCount` number, required: Total number of pages
  - `totalRows` number, required: Total number of rows

## Other responses

- `400`: 400
- `401`: 401
- `402`: 402
- `404`: 404
- `408`: 408
- `429`: 429
- `500`: 500

---

[API](https://skmtc.dev/viral/apis/viral-app-api.md) · [All operations](https://skmtc.dev/viral/apis/viral-app-api/llms.txt) · [OpenAPI document](https://skmtc.dev/viral/apis/viral-app-api/revisions/31e97fa79ef1?raw)
