Campaigns
Reminder: All queries on this page require the
WORKSPACE-IDheader. 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 acampaignsIdsfilter onitemsso 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:
| Field | Type | Description |
|---|---|---|
id | ID | Unique campaign identifier — use this anywhere a campaign UUID is expected (e.g. items filter). |
name | String | Campaign name as configured in the UI. |
createdAt | DateTime | When 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], notitem_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 thecampaignslist query. - A
campaign/campaignsfield on theItemtype. 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 fromitems(filter: { campaignsIds: ... }). - Filter by campaign name (only
campaignsIdsis supported — discover IDs via thecampaignsquery first). - Mutations to create, update, archive, or add talent to a campaign — those stay in the Archive UI.