Mutation
updateCampaign
Change a campaign: rename it, move its end date, add or remove creators on its roster, and, on a CONTENT_CAPTURE or BRAND_MONITORING campaign, add or remove its posts.
Arguments
Object, input and enum types open in place — use + to reveal their fields. A type that is already open above the row stops at a ↻ circular marker, and anything nested past the depth limit links out to its own page instead.
- input UpdateCampaignInput! required
- Mutation input.
- creators CampaignCreatorsPatchInput
- Creators to add to or remove from the campaign's roster.
- add [CampaignCreatorInput!] default []
- Creators to add. Asynchronous: each is queued for import and joins the roster once resolved (for CREATOR_MONITORING, Archive then pulls their posts back to dateStart and tracks new ones until dateEnd; on BRAND_MONITORING, capture is replayed for an added creator, so their in-window posts from brand-listening sources can be captured, including ones taken out earlier with posts.remove). On VETTING_WORKFLOW, Archive pulls and reviews their posts in the window. One already on the roster is a no-op.
- handle String! required
- The profile's username. Whitespace and a leading '@' are stripped and case is ignored.
- provider Provider! required
- The profile's platform. Which platforms a roster takes is the campaign type's rule: INSTAGRAM and TIKTOK for CREATOR_MONITORING and VETTING_WORKFLOW; INSTAGRAM, TIKTOK and YOUTUBE for CONTENT_CAPTURE and BRAND_MONITORING. No campaign type takes INTERNAL. Any other platform is refused on this entry.
- Instagram platform integration, including posts, reels, stories, and profile data.
- INTERNAL
- Internal Archive-managed source used for synthetic or system-generated content.
- TIKTOK
- TikTok platform integration, including videos and creator profile data.
- YOUTUBE
- YouTube platform integration, including Shorts, videos, thumbnails, and profile data.
- addCreatorIds [ID!] default []
- Creators already in the workspace to add, by creator id (from creators or creator). Synchronous: each joins the roster during the call, after any removals. A refused id is reported at its own path, e.g. ["input","creators","addCreatorIds","2"]. Refused: an unknown id, an id from another workspace, a full roster, a creator the campaign type does not admit. One already on the roster is a no-op.
- remove [CampaignCreatorInput!] default []
- Creators to take off the roster, now. Their captured posts stay in the campaign; on a CONTENT_CAPTURE or BRAND_MONITORING campaign, take them out with posts.remove. A creator is on the roster once, so any one of their profiles removes them. Also cancels an add of the same profile still waiting to import. One not on the roster is a no-op.
- handle String! required
- The profile's username. Whitespace and a leading '@' are stripped and case is ignored.
- provider Provider! required
- The profile's platform. Which platforms a roster takes is the campaign type's rule: INSTAGRAM and TIKTOK for CREATOR_MONITORING and VETTING_WORKFLOW; INSTAGRAM, TIKTOK and YOUTUBE for CONTENT_CAPTURE and BRAND_MONITORING. No campaign type takes INTERNAL. Any other platform is refused on this entry.
- Instagram platform integration, including posts, reels, stories, and profile data.
- INTERNAL
- Internal Archive-managed source used for synthetic or system-generated content.
- TIKTOK
- TikTok platform integration, including videos and creator profile data.
- YOUTUBE
- YouTube platform integration, including Shorts, videos, thumbnails, and profile data.
- dateEnd DateTime
- New end of the campaign's window (UTC), not before its dateStart. For CREATOR_MONITORING, moving it later also extends tracking for creators already on the roster. For VETTING_WORKFLOW, it may not be more than 24 hours from now. Refused on an open-ended BRAND_MONITORING campaign (one without a dateEnd). Uses the supplied instant at whole-second precision; choose your timezone and day boundaries, then convert to UTC before sending it. Must be between 2000-01-01T00:00:00Z and 2100-01-01T00:00:00Z.
- id ID! required
- UUID of the campaign to update. It must be of a type the API provisions (campaignType not null).
- name String
- New campaign name, under the same rules as CreateCampaignInput.name: a blank or invalid name is a userError on input.name. Omit it, or send the current name back unchanged, to keep the name as stored.
- posts CampaignPostsPatchInput
- Posts to add to or remove from a CONTENT_CAPTURE or BRAND_MONITORING campaign; refused on CREATOR_MONITORING.
- add [ID!] default []
- Item ids to add, as items and itemIdsByUrl return them. Synchronous: each post is in the campaign when the call returns, and its creator joins the campaign's roster. An id already in the campaign is a no-op. An id that is not an item of this workspace, or that would exceed the campaign's post or creator limit, is refused at its index.
- remove [ID!] default []
- Item ids to take out of the campaign, now. The creator stays on the campaign's roster, and a removed post can be added back later; on BRAND_MONITORING, capture can also bring it back on a later replay. An id not in the campaign is a no-op.
- settings CampaignSettingsPatchInput
- Changes to the type-specific options. Only the fields you send change; the rest keep their stored values. Changed rules trigger asynchronous re-evaluation of existing in-window posts; already captured posts are not removed.
- creatorMonitoring CreatorMonitoringSettingsPatchInput
- Tag rule changes for a CREATOR_MONITORING campaign.
- pullLogic CampaignPullLogic
- Whether a post needs any of the tagNames or all of them.
- HAS_ALL
- Capture a post only when it carries every one of the tag names.
- HAS_ANY
- Capture a post that carries any of the tag names.
- tagNames [String!]
- The new tag list, under the createCampaign tagNames rules. An empty list removes tag filtering; content conditions set in the app still apply.
Returns
- campaign Campaign
- The campaign after the call. Null only when the campaign-level change was refused.
- campaignType CampaignType
- What kind of campaign this is; null for a campaign whose type the API does not expose.
- BRAND_MONITORING
- Brand Monitoring: Archive captures native content (Instagram Reels, TikTok, YouTube) between dateStart (required) and dateEnd (optional; omitted means open-ended). One created through the API captures workspace-wide (the app's default "any creator" mode), so its roster does not narrow what is captured. One built in the app may instead be scoped to its roster, in which case adding creators decides what is captured. updateCampaign changes its name, end date, roster and posts; its tag, content and source narrowing are kept as stored. updateCampaign(posts:) adds specific posts on top of automatic capture, and capture never removes posts. Adding a post puts its creator on the roster, which can capture more of that creator's in-window posts from brand-listening sources. A post taken out with posts.remove can be captured again by a later replay (a creator added, a date edit) when it is in-window and from a brand-listening source. Read the posts with items(filter: { campaignsIds: [<campaign id>] }). An open-ended campaign cannot be given a dateEnd through updateCampaign. No options: send no
settings. - CONTENT_CAPTURE
- Content Capture: one created through the API has no capture triggers, so Archive adds no posts on its own and it holds exactly the posts you add with updateCampaign(posts:). One built in the app keeps the capture triggers the app gave it, so Archive can still add posts to it; it is updatable the same way. Read the posts with items(filter: { campaignsIds: [<campaign id>] }); that list is search-indexed and catches up shortly after a change, so diff against it on a later run, not right after patching. dateStart and dateEnd are optional. No options: send no
settings. - CREATOR_MONITORING
- Creator Monitoring: Archive captures the posts every creator on the roster publishes between dateStart and dateEnd (both required). Options:
settings.creatorMonitoring. - VETTING_WORKFLOW
- Vetting Workflow: AI brand safety review of the posts each rostered creator published. The window is dateStart to dateEnd, both required. dateEnd may not be more than 24 hours from now. A creator's posts are pulled once, when they are added. Roster: INSTAGRAM and TIKTOK profiles. Options:
settings.vettingWorkflow. Available only in a workspace whose Archive app lists Vetting Workflow campaigns; elsewhere they are neither listed nor created. - createdAt DateTime!
- When the campaign was created (UTC).
- creatorsCount Int!
- Creators currently on the roster. Creators added by handle through updateCampaign join it once their background import resolves them; creators added by id join it during the call.
- dateEnd DateTime
- End of the campaign's window (UTC); null when it has none.
- dateStart DateTime
- Start of the campaign's window (UTC); null when it has none.
- excludeCreatorsInOtherVettingCampaigns Boolean
- Whether a VETTING_WORKFLOW campaign skips creators already on another one of the workspace. Null for a campaign of another type, or one created before the option existed.
- externalId String
- The key the campaign was created with through createCampaign; null for a campaign created in the Archive app.
- id ID!
- Unique identifier for the campaign in Archive's system.
- maxMediaItemsPerCreator Int
- Most posts per creator a VETTING_WORKFLOW campaign pulls and reviews (1000000 means no limit). Null for a campaign of another type.
- name String!
- Campaign name as shown in Archive.
- pullLogic CampaignPullLogic
- Whether a CREATOR_MONITORING campaign captures posts carrying any or all of its tagNames. Null for a campaign of another type.
- HAS_ALL
- Capture a post only when it carries every one of the tag names.
- HAS_ANY
- Capture a post that carries any of the tag names.
- tagNames [String!]
- Hashtags and mentions a CREATOR_MONITORING campaign narrows capture to, as stored (lowercased, deduplicated); empty captures every post the roster publishes in the window. Null for a campaign of another type.
- userErrors [UserError!]!
- List of user-facing validation errors; a refused roster or post entry is reported at its index path. Empty when everything applied.
- field [String!]
- Path to the input field that caused the error.
- message String!
- The error message.