> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apostra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Open Campaigns

> Open the buyer's Campaigns Page — status, flight, and budget per campaign, opening one for its media buys and creatives

`open_campaigns_page` launches **Campaigns** — the buyer's campaign list with
status, flight, and budget on each row. Opening a row shows that campaign's
workspace: its media buys, creatives and their per-seller review status, and
for a draft campaign the [Review & go live](/v2/buyer/campaigns/tasks/open-campaign-receipt)
receipt.

The filter row has Search, Status, **Dimensions**, and Type. **Dimensions** is
one multi-select: its values are named by dimension, for example
`Market › US` or `Launch › Q4`, and selected values appear as chips in the
control. Campaign rows show their current labels as small read-only chips.

The list is for reading and filtering. To change one campaign's labels, open
that campaign and use **Labels** in its detail view. That action is available
only to buyers the server authorizes to manage dimensions. To create a
dimension or apply labels to many objects, ask in chat. Only the first-party
host re-reads the Page when chat returns updated Page state.
Claude and ChatGPT do not re-read the Page after a chat write.

Buyers who can edit a campaign also see **Attach creatives** in its detail
view. Select creatives from that advertiser's Library, then save the selection.
Unticking a selected creative detaches it. Draft creatives and uploads without
assets cannot be attached; the picker explains why. Library membership appears
under **Attached**; creatives placed on media buys appear in their own group.
Tracked campaigns remain read-only.

Read-only buyers, parent accounts, and seller-sponsored buyer views can filter
by existing dimensions. They do not see a label-edit action in the drill-in.

It is a **widget launcher**: the tool returns the shared MCP App directive for
`ui://agentic-api/campaigns/mcp-app.html` plus the focus it was given, and the
Page self-fetches through V3 `search({kind: "campaign"})`,
`get({kind: "campaign"})`, and, when it needs the seeded header label,
`get({kind: "advertiser"})`. The host keeps these named reads bound to this
Page. A permitted buyer can edit one campaign's labels from its drill-in;
dimension creation and bulk labelling stay in chat. A permitted buyer can also
attach Creative Library creatives. Buyers with campaign write access can create
a draft from the Page and edit its details in the drill-in.

## Create and edit a campaign

Select **New campaign** to create an **Untitled campaign** draft and open it
immediately. On an advertiser-scoped Page, the draft uses that advertiser. On
an unscoped Page, choose the advertiser in the searchable selector first.

Edit the campaign name, budget, and flight directly in the campaign. Budget
uses the advertiser's primary currency and flight dates use the advertiser's
reporting time zone. Tracked campaigns are read-only. In chat, ask for a
campaign and the agent creates a draft from what it understands, then opens it.

Creating a draft does not add a brief, goals, creatives, inventory, or media
buys. Add those on the campaign after it is created.

## What the list shows

The Page opens on the working set. **Archived campaigns are not listed by
default** — select **Archived** in the Page's status filter to bring them back.
Archiving is a soft delete
([Delete Campaign](/v2/buyer/campaigns/tasks/delete-campaign)), so nothing is
removed: an archived campaign stays readable by id, stays in reporting, and can
be restored. Hiding it only keeps finished work out of the list you plan from.

This matches the campaign list API, which also defaults to the live working set
and reaches archived campaigns only through an explicit status
(see [Campaign](/v2/object-guides/campaign)).

The status filter also covers active, draft, paused, completed, and canceled
campaigns, plus a **Needs attention** lens for campaigns carrying an attention
signal. A separate filter narrows by who operates the campaign — managed or
tracked.

## Arguments

| Argument | Required | Meaning |
| - | - | - |
| `advertiserId` | no | Positive integer string. Scopes the list to one advertiser; the owner resolves the advertiser's name so the Page can label itself while it loads. Omit for every advertiser. |
| `campaignId` | no | Focuses one campaign. The owner reads it first, so an id this account cannot resolve is refused instead of opening a Page pointed at nothing. When the campaign is linked to an advertiser, the list is scoped to that advertiser as well. |

Resolve names to ids first with `search(kind: "advertiser")` or
`search(kind: "campaign")`; never invent an id.

## From an agent (MCP)

"Show my campaigns" opens the unscoped Page:

```json theme={null}
{
  "name": "open_campaigns_page",
  "arguments": {}
}
```

"How is the spring launch doing?" resolves the campaign, then focuses it:

```json theme={null}
{
  "name": "open_campaigns_page",
  "arguments": { "campaignId": "cmp_987654321" }
}
```

The result's `content` names what was opened — for example
`Opened Campaigns Page focused on "Spring launch" (active, managing); scoped to advertiser "Acme".`
— and `structuredContent.params` carries the seed the Page reads
(`advertiserId`, `advertiserName`, `campaignId`). When the focused campaign is
still a draft, the summary points at `open_campaign_receipt`.

## Text answers

For an answer in words — how many campaigns, which are paused, one campaign's
budget — use `search(kind: "campaign")` and `get(kind: "campaign", id)`
instead. The launcher never enumerates campaigns.

## Hosts without a widget surface

A host that cannot render MCP apps, such as Claude Code or a plain MCP client,
still receives the text result. When the Page has an advertiser, that text
ends with an `Open in the browser:` link that opens the same Campaigns Page in
Apostra chat for the account your API key belongs to, focused on the launched
campaign when there was one. The advertiser is the one the launch names, once
the server confirms you can read it; otherwise the launched campaign's
advertiser; otherwise, on the v2 Buyer MCP, the advertiser your connection
selected with the `x-scope3-seat-id` header. On the v2 Buyer MCP the link
opens the account that owns that advertiser when it is your own account or an
account beneath it; an advertiser owned anywhere else (a sibling account, the
parent, or an organization that delegated it to yours) carries no link,
because that Campaigns Page may not open for you. The same URL is
available as `openInBrowserUrl` in the structured result. A launch with no
advertiser carries no link, because the hosted chat opens the Page for one
advertiser, and a seller account opening its own-supply or sponsored-buyer
campaigns carries no
link either, because the buyer hosted chat does not model those scopes.

## Errors

| Code | Meaning |
| - | - |
| `WRONG_ACCOUNT` | The active account is not a buyer account |
| `VALIDATION_ERROR` | `advertiserId` is not a positive integer string, an unknown argument was supplied, or `campaignId` belongs to a different advertiser than `advertiserId` |
| `NOT_FOUND` | `campaignId` or `advertiserId` cannot be resolved for this account |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.