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: 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
From an agent (MCP)
“Is the spring launch ready to go live?” resolves the campaign, then opens its receipt:content summarizes the same facts the Page shows, for example:
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.
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.