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

# Open Review & go live

> Open the go-live receipt for one draft campaign — its plan, staged media buys, and the readiness blockers still standing between the draft and launch

`open_campaign_receipt` launches **Review & go live** for one draft campaign:
the plan (total budget, flight dates, number of staged media buys), the budget
split across those buys, why each buy is not live yet, and a readiness
checklist of what still blocks launch — a creative that is not yet approved
by its seller, or no media buys staged at all. It is the moment a buyer reviews
before going live.

The receipt is the draft drill-in of the
[Campaigns Page](/v2/buyer/campaigns/tasks/open-campaigns-page): the same
facts V3 `get({kind: "campaign"})` returns as a canonical envelope: `object`
with requested `mediaBuys` and `creatives` as top-level siblings. The
Campaigns widget normalizes that envelope into its legacy `CampaignWorkspace`
drill-in view in `mode: "review"`. The tool binds
`ui://agentic-api/campaigns/mcp-app.html` and seeds it with the campaign. It is
buyer-only and read-only: **going live remains a separate, explicitly
confirmed `save_campaign` step**. Nothing on this Page launches a campaign.

## Arguments

| Argument     | Required | Meaning                                                                                            |
| ------------ | -------- | -------------------------------------------------------------------------------------------------- |
| `campaignId` | yes      | The draft campaign to review. Find it with `search(kind: "campaign", filter: {phase: ["draft"]})`. |

## From an agent (MCP)

"Is the spring launch ready to go live?" resolves the campaign, then opens its
receipt:

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

The result's `content` summarizes the same facts the Page shows, for example:

```text theme={null}
Opened Review & go live for draft campaign "Spring launch". Budget 50,000 USD.
Flight 2026-10-01 to 2026-10-31. 2 staged media buys (1 draft, 1 pending
approval) totalling 50,000 USD. Budget split: CTV package 30,000 USD (60%);
Display package 20,000 USD (40%) — Awaiting seller approval. 1 readiness
blocker: Creative "Hero" is awaiting seller review. Going live stays a
separate, explicitly confirmed save_campaign step.
```

`structuredContent.receipt` carries the projection: `campaignId`,
`advertiserId`, `name`, `handling`, `budget`, `flight`, `mediaBuys[]` (id,
name, seller, phase, `budget`, `budgetShare`, flight, and `attentionNote`
when the seller said why the buy is not live), `stagedBudgets[]` (the sum of
the buy budgets, one entry per currency — budgets are never summed across
currencies or converted), `blockers[]` (`code` and `message`), and
`readyToGoLive`, which is true only when no blocker is recorded. The buys are
the same `CampaignMediaBuySummary` rows the Page's budget-split bar draws, so a
host without MCP Apps reads exactly what the Page shows. `budgetShare` is each
buy's percentage of the staged total in its own currency; it is present only
when every buy shares one currency and something is allocated, and is
otherwise omitted rather than rendered as a false share or 0%.
`structuredContent.params` seeds the Page with the campaign and
`mode: "review"`, which opens the drill-in directly; a later launch without
that mode returns the Page to its list.

Blockers are derived from the campaign's own media buys and creatives:
`CREATIVE_NOT_READY` for every creative whose rolled-up seller review is not
`ready` (a creative with no review yet counts as not ready), and
`NO_MEDIA_BUYS` when nothing is staged. See
[Review vs. record mode](/v2/buyer/campaigns/tasks/get-campaign-workspace#review-vs-record-mode).

## Headless equivalent

`get({kind: "campaign", id, include: ["mediaBuys"]})` returns the canonical
V3 envelope `{ kind: "campaign", object, mediaBuys }`; request `creatives` to
receive that relation as another top-level sibling. It does not return a
`CampaignWorkspace`: that is the widget's normalized legacy drill-in view. Use
the V3 envelope when the host does not render MCP Apps or the agent needs the
facts in text.

## Errors

| Code               | Meaning                                                                                      |
| ------------------ | -------------------------------------------------------------------------------------------- |
| `WRONG_ACCOUNT`    | The active account is not a buyer account                                                    |
| `VALIDATION_ERROR` | `campaignId` is missing or an unknown argument was supplied                                  |
| `NOT_FOUND`        | The campaign cannot be resolved for this account                                             |
| `INVALID_STATE`    | The campaign is no longer a draft; the suggestion names `open_campaigns_page` for its record |
