Skip to Content
API ReferenceCampaigns

Campaigns

Reminder: All queries on this page require the WORKSPACE-ID header. See Getting Started for setup.

A Campaign in Archive groups together UGC posts tied to a single brand initiative — a launch, a seeding moment, a creator program, an event. You build and manage campaigns from the Archive UI; the API lets you list them and pull the content inside each one.

This is what you see under the Campaigns section in the Archive UI. Learn more: Getting Started with Campaigns .

Read-only, minimal surface by design. The API exposes the campaigns list (id, name, createdAt) plus a campaignsIds filter on items so you can pull the content inside any campaign. Creating, updating, archiving, and adding talent to a campaign stays in the Archive UI.


List all campaigns

query ListCampaigns { campaigns(first: 50) { totalCount nodes { id name createdAt } pageInfo { hasNextPage endCursor } } }

Example response:

{ "data": { "campaigns": { "totalCount": 4, "nodes": [ { "id": "f6fda4e1-e2a5-4fa9-8f71-80ffbababa59", "name": "Q2 Launch Campaign", "createdAt": "2026-04-12T14:08:33Z" }, { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Holiday Seeding", "createdAt": "2026-02-01T10:22:11Z" } ], "pageInfo": { "hasNextPage": false, "endCursor": "..." } } } }

Available fields on Campaign:

FieldTypeDescription
idIDUnique campaign identifier — use this anywhere a campaign UUID is expected (e.g. items filter).
nameStringCampaign name as configured in the UI.
createdAtDateTimeWhen the campaign was created.

Other metadata (description, status, start/end dates, brief, item totals, EMV totals) is not yet exposed. To get per-campaign totals today, query items(filter: { campaignsIds: ... }) { totalCount } and aggregate client-side.

Using with AI:

“How many campaigns are in this workspace?” “List all campaigns sorted by creation date.”


Pull items in a campaign

Use the campaignsIds filter on the items query — supports any number of campaign IDs as a [ID!] array, combined with all the other item filters and sorts.

query CampaignItems($campaignId: ID!) { items( first: 100 filter: { campaignsIds: [$campaignId] } sorting: { sortKey: EARNED_MEDIA_VALUE, sortOrder: DESC } ) { totalCount pageInfo { hasNextPage endCursor } nodes { id provider type takenAt originalUrl socialProfile { accountName followers } currentEngagement { likes comments impressions earnedMediaValue } } } }

Important: the filter argument is campaignsIds (plural-plural — campaigns + Ids), not campaignIds. Using the wrong spelling returns:

InputObject 'ItemFilterInput' doesn't accept argument 'campaignIds' (Did you mean `campaignsIds`?)

You can pass multiple campaign IDs to find items that belong to any of them:

filter: { campaignsIds: ["uuid-1", "uuid-2", "uuid-3"] }

You can also combine the campaign filter with any other filter — for example, top performers in a campaign over the last 30 days:

query TopCampaignPerformersLast30Days { items( first: 10 filter: { campaignsIds: ["f6fda4e1-e2a5-4fa9-8f71-80ffbababa59"] takenAt: { from: "2026-04-26T00:00:00Z", to: "2026-05-26T00:00:00Z" } } sorting: { sortKey: EARNED_MEDIA_VALUE, sortOrder: DESC } ) { nodes { id socialProfile { accountName } currentEngagement { earnedMediaValue impressions } } } }

Using with AI:

“Pull every item in the Q2 Launch Campaign.” “Show me the top 10 EMV posts in this campaign over the last 30 days.” “Total EMV for the Holiday Seeding campaign.”


Going from an item to its campaign(s)

The Item type does not expose any campaign field — there is no campaign, campaigns, or campaignsIds field on Item. Given an item, the API cannot directly tell you which campaign(s) it belongs to. The relationship is queryable only in the campaign → items direction.

Two patterns work today, depending on the question:

“Is this specific item in campaign X?”

One query, combine the campaignsIds filter with the ids filter:

query ItemInCampaign($campaignId: ID!, $itemId: ID!) { items(first: 1, filter: { campaignsIds: [$campaignId], ids: [$itemId] }) { totalCount } }

totalCount: 1 → the item belongs to the campaign. 0 → it doesn’t.

”Which campaign(s) is this item in?”

Reverse-lookup. List every campaign, pull the items inside each, build the mapping client-side:

query AllCampaigns { campaigns(first: 100) { nodes { id name } pageInfo { hasNextPage endCursor } } } query ItemsInCampaign($cid: ID!) { items(first: 200, filter: { campaignsIds: [$cid] }) { nodes { id } pageInfo { hasNextPage endCursor } } }

Then invert the mapping in your code:

item_to_campaigns = {} for campaign in campaigns: for item_id in items_in_campaign(campaign.id): item_to_campaigns.setdefault(item_id, []).append(campaign.id)

Things to know about this pattern:

  • One API call per campaign (50 campaigns → 50 calls), plus pagination if any campaign has more than 200 items.
  • Per-workspace rate limit is 5 requests per second — space the calls, don’t burst them. See Error Handling → Rate limit errors.
  • An item can belong to multiple campaigns — the mapping must be item_id → [campaign_ids], not item_id → campaign_id.
  • The snapshot goes stale the moment a campaign membership changes in the UI. For fresh data, rerun.
  • Best suited to one-shot enrichment or a cached index refreshed on a schedule. Not suitable for real-time transactional lookups.

Using with AI:

“Is item <uuid> part of the Q2 Launch Campaign?” “Build a mapping of every item in this workspace to the campaigns it belongs to.”


What’s not exposed

The campaigns surface is intentionally minimal and read-only. The following are not available via the API and are not planned:

  • A singular campaign(id: ID!) lookup — use the campaigns list query.
  • A campaign / campaigns field on the Item type. Items do not carry their campaign membership back — use the reverse-lookup pattern above.
  • Campaign metadata beyond id / name / createdAt (status, start/end dates, brief, goals).
  • Per-campaign aggregate fields (itemsCount, creatorsCount, totalEarnedMediaValue) — aggregate client-side from items(filter: { campaignsIds: ... }).
  • Filter by campaign name (only campaignsIds is supported — discover IDs via the campaigns query first).
  • Mutations to create, update, archive, or add talent to a campaign — those stay in the Archive UI.
Last updated on