# Agentic Ad Lab — full text corpus > Protocol-neutral reference for agentic advertising: AdCP, AAMP, and how machines buy media. Generated 2026-08-13. 11 documents. --- # AdCP vs AAMP: Which Standard to Implement Source: https://agenticadlab.com/protocols/adcp-vs-aamp/ AdCP and AAMP are the two agentic advertising protocol stacks. AdCP is one specification of 64 operations pinned at 3.1.13; AAMP is an IAB Tech Lab umbrella over eight independently versioned repositories that share no data type. Implement AdCP first. Back AdCP. If you have one integration budget for the next two quarters, spend it there and keep AAMP as a watch item with a named owner and no engineers attached. AdCP publishes one number for the whole specification in a file you can fetch: dist/schemas/latest.json reads 3.1.13 stable, and that release carries 64 operations across 10 areas. Freeze the directory, run a conformance suite against it, re-run the same suite next quarter against a byte-identical artifact. AAMP is eight repositories versioning independently, and the one holding the buyer-to-seller wire contract, iab-agentic-primitives, calls itself a pre-release whose "APIs, schemas, and package layout may still change between releases until a 1.0 IAB Tech Lab standardization". A supply contract needs a conformance clause, and that sentence will not carry one. The umbrella version does not close the gap. IAB Tech Lab announced AAMP 2.3 on 30 July 2026 and the number matches no tag, no release and no version field in any of the eight repositories; the hub had zero tags on the day of the announcement and has zero tags now. A counterparty that publishes only an AAMP agent card flips the call, because you implement what they serve. So does serve-time work. ARTF lets a third-party agent patch the bid object while the auction clock is running, inside somebody else's OpenRTB auction under tmax, and AdCP has nothing at that layer to compete with it. That work goes to your general counsel before it reaches an engineer: the Go implementation is AGPL-3.0 under Index Exchange copyright. Your first move, by side If you sell inventory, publish two static documents this week. adagents.json and brand.json at /.well-known/ make you discoverable to a buying agent before you implement a single operation, and no protocol decision blocks them. The AAMP equivalent is an agent card plus a registry entry to resolve it, which costs more and reaches fewer buyers today. If you buy, run one HTTP request per counterparty domain before the protocol argument starts. Does the domain serve /.well-known/adagents.json, or hand you an agent card and a registry to resolve against? The responses decide your order of work, and the discovery file guide covers what comes back. If nothing resolves across your top twenty partners, you are early: put a date in the calendar and spend the budget elsewhere. The two stacks, job by job AAMP has no single surface to cite, so its column names repositories: naming operations would imply a coherence that is not there. | Job to be done | AdCP 3.1.13 | AAMP (per repository) | What it costs you | | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | Agent discovery | getadcpcapabilities, plus adagents.json at /.well-known/adagents.json and brand.json at /.well-known/brand.json, all hosted on the domain itself. | GET /.well-known/agent.json (Agent Card) and POST /registry/agents/discover in iab-agentic-primitives, resolved through a registry. | Two static files on your own origin, against a registry entry somebody else has to grant. | | Trust | Authorisation and grading are separate mechanisms. What authorises a transaction is the publisher's adagents.json declaration plus RFC 9421 request signing, normative in 3.1, with AAO Verified as an out-of-band conformance mark. The graded value is derived by the consumer, never issued: five states, inline, mutualassertion, onesidedbrand, onesidedhouse, standalone, computed from brand.json parenthouse against the publisher's brandrefs[], and left to deployer policy. | Five states, issued: Agent.truststatus enum unknown, registered, approved, preferred, blocked. Its own description: "Registry-verified trust status. Caps the effective AccessTier; never self-asserted by the agent." | AdCP's grade is advisory. AAMP's caps the price you are shown. | | Inventory discovery | getproducts, with a required buyingmode of brief, wholesale or refine; listcreativeformats. | GET /products, GET /products/{productid}, POST /products/avails in iab-agentic-primitives; media kit and package endpoints on seller-agent. | The one job both stacks do, and the only one a vendor demo will show you. | | Negotiation | No priced multi-round negotiation. The nearest surface is getproducts with buyingmode: "refine", where each entry carries a natural-language ask and a proposal-scoped action of include, omit or finalize. | First class and numeric. POST /api/v1/negotiations/messages carries action (accept, counter, finaloffer, reject), buyerprice and roundnumber; the response returns concessionpct and cumulativeconcessionpct. | A concession budget on the AAMP side, spent in rounds. On AdCP, a seller you have to trust to re-price honestly. | | Transaction | createmediabuy with a required idempotencykey, account, brand, starttime and endtime, returning mediabuyid. updatemediabuy applies PATCH semantics. | Two steps. POST /api/v1/quotes mints a quoteid; POST /api/v1/deals books it and mints a dealid; POST /api/v1/change-requests handles modification after booking. idempotencykey is required on both quote and booking. | Two round trips on AAMP where AdCP takes one, and a second idempotency surface to test. | | Creative | buildcreative, previewcreative, synccreatives, listcreatives, listtransformers, getcreativedelivery, listcreativeformats, validateinput. | No creative operation. Creative, Assignment and CreativeApproval exist as objects in iab-agentic-primitives; agentic-direct exposes createcreative and createassignment MCP tools whose handlers call generateMockResponse. seller-agent's API has no creative endpoint anywhere in it. | AAMP has none, so creative review stays a manual process sitting next to the agent. | | Signals and audiences | getsignals, activatesignal, and syncaudiences for hashed first-party CRM records. | agentic-audiences, a draft embedding exchange using application/vnd.ucp.embedding+json; v=1, plus POST /agentic-audience/match on seller-agent. The schema that would connect the format to either agent, specs/v1.0/schema/agentinterface.schema.json, is zero bytes. | Any delivery date quoted for audience activation over AAMP is a date for somebody to write the empty file first. | | Serve-time decisioning | Trusted Match Protocol, AdCP's serve-time layer: contextmatch and identitymatch, two structurally separated operations carried over direct HTTP instead of MCP or A2A. Returns eligible packages, no auction. | ARTF v1.0 (the Agentic Real Time Framework, in the agentic-rtb-framework repository): RTBExtensionPoint.GetMutations(RTBRequest) returns RTBResponse, a list of JSON-Patch-shaped mutations keyed on an Intent enum with eight defined intents plus an unspecified zero, applied inside the OpenRTB auction under tmax. | A general counsel review before an engineer opens the ARTF repository. | | Governance and consent | 22 of the 64 registry entries, including checkgovernance, syncplans, reportplanoutcome, getplanauditlogs, property and collection CRUD, calibratecontent and validatecontentdelivery. No consent tag on the wire. | No governance operation. ConsentContext carries eight fields (applicableregimes, diligencestatus, gdprapplies, gppsectionids, gppstring, tcfstring, usprivacy, verifiedat) and is optional everywhere it appears. Plus DecisionRecord and seller-agent's /approvals human-review endpoints. | AdCP gives you an audit trail and no consent tag; AAMP gives you a consent object that is optional everywhere it appears. | | Measurement and reporting | No measurement operation group. Delivery and outcome data move through getmediabuydelivery, provideperformancefeedback, synceventsources, logevent and reportusage, alongside four core objects: measurement-terms, measurement-readiness, measurement-window, outcome-measurement. | No measurement object in the wire contract. Reporting is per implementation: /gam/report, /api/v1/deals/{dealid}/performance and /api/v1/orders/report on the seller agent, /reports/{jobid} and /meta/report on the buyer agent. | A per-vendor reporting integration either way. | AdCP has no priced negotiation. AAMP has no creative operation, no governance operation and no measurement object in its wire contract, which is three blanks against one. Two groups made different bets about which part of a media transaction is the hard part. How a machine buys media traces one purchase at the wire level; AAMP Explorer breaks the right-hand column out repo by repo. The object models do not compose The transports compose. The object models do not: an AdCP mediabuy and an AAMP Deal are unrelated types with unrelated lifecycles, so an agent that already speaks MCP is adding a vocabulary, while a buyer who wants both stacks is buying two integrations and two conformance suites. Negotiation is where that costs money. AdCP negotiates in sentences: a buyer who wants a cheaper plan sends refine with ask: "reduce total by 10%" and lets the seller re-price. AAMP negotiates in numbers, bounded by an access tier the seller assigns to your API key rather than one you claim. The caps are percentages of the seller's own opening price: public gets three rounds, 3% per round and 8% cumulative; advertiser six rounds, 6% and 20% (AAMP Explorer reproduces the table). AdCP's model is more expressive and much harder to test, and on price I want the numbers. NegotiationMessage makes idempotencykey required and the seller agent's handler never reads it, so a retried request counts as a fresh round. On the public tier that is one of your three rounds and 3 of your 8 cumulative points gone to a timeout nobody logged. AAMP's registry issues its five trust states and they cap the prices a buyer is shown. AdCP's five are computed by the consumer from two self-published documents, advisory by design, and they touch no price at any point. The trust status entry has both enums side by side. AdCP's own FAQ files the rivalry away in one line: "Put simply: AAMP is agentic bidding; AdCP is agentic buying." ARTF fits that sentence. The rest of AAMP does not, because its wire contract exposes /products, /api/v1/quotes, /api/v1/deals, /api/v1/change-requests and /api/v1/negotiations/messages over OpenDirect 2.1, which is quote, negotiate, book and amend, the campaign layer AdCP occupies. The same table, stamped "As of April 2026", calls AAMP's public schemas "Being defined"; there are 48.