Final episode. So far, our agents read Google Ad Manager. Here we speak the media-buy standard: AdCP (Ad Context Protocol). A buy-side
agent sends a create_media_buy request; the OrbiAds agent validates then previews it as a GAM deal, writing nothing.
AdCP is native in OrbiAds (don't hand-roll anything)
The reflex to avoid: building a "homemade JSON brief". OrbiAds already exposes a complete AdCP surface. The tools live under parent tools (parent → action pattern):
| Capability | Call | Type |
|---|---|---|
| Sell-side discovery | products → get_products_adcp | read |
| Validate a create_media_buy | deals(action='adcp_validate') | read |
| Translate to DealSpec (no execute) | deals(action='adcp_preview') | read |
| Execute end-to-end | deals(action='adcp_create') | write |
The AdCP request (create_media_buy)
Here's what a media-buy request from a buy-side agent looks like:
{
"idempotency_key": "demo-mediabuy-0001-acme-q3",
"account": { "account_id": "demo-buyer-seat-001", "sandbox": true },
"brand": { "domain": "acme.com", "industries": ["retail"] },
"start_time": "2026-09-01T00:00:00Z",
"end_time": "2026-09-30T23:59:59Z",
"packages": [
{
"package_id": "pkg-homepage-fr-1",
"budget": 5000.0,
"impressions": 1000000,
"targeting_overlay": { "geo_countries": ["FR"], "language": ["fr"] }
}
],
"ext": {
"orbiads_deal_type": "pg_guaranteed",
"orbiads_buyer_account_id": "demo-authorized-buyer-seat"
}
}The A2A case: a read-only gateway
The adcp_gateway agent receives the request (from a buy-side agent or the user),
then: (1) check_credentials + network check, (2) deals(adcp_validate),
(3) if valid, deals(adcp_preview), (4) a human-readable summary. It never calls adcp_create.
Three frictions to know
- Filtering by name, not by action.
tool_filtercan't isolate an action: exposingdealsalso exposes writes. Guardrails = the prompt (allow only validate/preview) + OrbiAds'confirmation_token. - Real advertiser lookup.
adcp_previewresolves the brand in GAM. No match →ADCP_ADVERTISER_UNRESOLVED: provideext.orbiads_advertiser_company_id. - Model choice. A large nested AdCP JSON can make some lightweight models "code" the call; a stronger model makes it reliable. It's the approach we validate, the model stays a parameter.
Series wrap-up
In four episodes: we connected an agent to GAM (OAuth), deployed it and made it discoverable over A2A, composed a multi-agent business case, and spoke the AdCP standard. The through-line: everything rests on a clean connection and guardrails (read-only, network check, confirmation_token). The rest is composition.
