A2B: Testing your first agent call
Free module — No account required. ~20 minutes with Addie. Prerequisite: A2.
Learning objectives
- Call the stateless MCP transport exposed by the AdCP test agent
- Call
get_productswith a natural-language brief and read the product response - Place a media buy with
create_media_buyand handle all three response shapes - Attach creatives with
sync_creativesand check buy status viaget_media_buys - Diagnose and resolve auth failures, schema mismatches, and async polling delays
Reading list
AdCP quickstart
End-to-end buyer workflow from setup to delivery.
Media buy lifecycle
Media buy status states — pending_creatives, pending_start, active, paused, completed — and what each means for the buyer.
Create media buy task
Full field reference, required fields, and all three response shapes.
Sync creatives task
How to attach assets to a buy, dry-run validation, and assignment patterns.
Error handling
Error codes, retry behavior, and how to read the
errors[] array.MCP integration guide
MCP transport and tool call formats.
Test agent
All curl examples below target the AdCP training agent:<your-api-key> in every example.
What you’ll do with Addie
Walk through four calls in sequence. Addie demonstrates each call, shows the raw response, then guides you through reproducing it yourself.- Discover —
get_productswith a brief; read proposals - Buy —
create_media_buy; handle all three response shapes - Attach creatives —
sync_creatives; validate with dry-run first - Poll status —
get_media_buysuntilvalid_actionsshows the buy is serving
tools/call, with no initialize exchange or mcp-session-id header. Durable sandbox state is keyed by the authenticated caller and the account reference in each task, not by an MCP transport session. Use the same account object throughout the workflow.
Step-by-step curl reference
Use these as a quick reference while working through the module with Addie, or to reproduce any step independently.Step 1 — Discover products
Callget_products with buying_mode: "brief" and a plain-English description of your campaign goals. The agent returns curated products[] and ready-to-execute proposals[].
content[0].text as JSON. Look for proposals[0].proposal_id — you’ll pass it to create_media_buy.
Step 2 — Place a media buy
Pass theproposal_id from Step 1 and a total_budget. The idempotency_key lets you safely retry if the network drops — use a fresh UUID v4 per request.
Step 3 — Attach creatives
A buy inpending_creatives state can’t serve until you call sync_creatives. Use dry_run: true first to validate your creative shapes without writing anything.
"dry_run": true to apply. The response includes creatives[].status — approved, pending_review, or rejected.
Step 4 — Check status
Pollget_media_buys with the media_buy_id from Step 2 to see lifecycle state and valid_actions.
media_buys[0].status field is one of pending_creatives, pending_start, active, paused, completed, rejected, or canceled. The valid_actions array tells you what the buyer can do next.
Async polling
Whencreate_media_buy returns status: "submitted" and a task_id, the buy is queued. Poll until the task completes:
get_task_status is an AdCP application-layer polling alias exposed by the training agent’s /sales/mcp tenant. The legacy root /mcp alias does not expose it. Other sellers may instead expose the AdCP tasks/get surface; inspect their advertised tools rather than assuming the alias exists. Do not confuse either AdCP polling surface with transport-native MCP/A2A tasks/* methods, which use their own task wire shapes.status is completed, the result field contains the full create_media_buy response with media_buy_id. See the Task lifecycle doc for all AdCP task status values.
Common errors
Assessment
Passing threshold: 70%.
Start this module
Start A2B with Addie
Open Addie and say “I’d like to start certification module A2B.”