Traced Agentic Ad Lab

Agentic Advertising Standards: The Version You Can Put in a Contract

Two agentic standards cover advertising. AdCP publishes a wire pin, a version oracle and a support window you can cite in an agreement; AAMP publishes tags that carry no date and no signature.

19 min read 9 chapters

Every claim below opens a file at a named commit. The shas are in the citations.

Six acronyms turn up in agentic buying conversations. Two cover advertising, AdCP and AAMP; the other four settle transactions a layer below it, and they are ACP, UCP, AP2 and x402. Only one of the two advertising standards publishes something you can put in a schedule. AdCP’s rule fits in a line: send adcp_version: "3.1" on the wire, never a patch component, and hold the counterparty to a support window AdCP has written down.

AAMP publishes no rule. Its shared wire contract carries six git tags, two of them lightweight, and every one up to v0.5.0 reports version 0.1.0 to whatever installs it. Outside its bidstream framework there is nothing normative in it to conform to, so “we support AAMP” today means “we match somebody’s Python”. There is nothing to point a contract at.

Back AdCP for anything on the campaign path, and treat everything below as the version evidence for that call. When a vendor quotes you 3.0 GA off the docs site, the schema registry is serving 3.1.14 and the wire contract only cares about "3.1" — that is a correction, not a re-scoping. On the AAMP side, write the vendor’s name into the integration plan instead of the standard’s, because the vendor is what you are integrating with. And keep the other four acronyms out of that budget line entirely.

The clause AdCP has already agreed to

AdCP, the Ad Context Protocol, publishes a versions page with a column headed “Wire pin”. 3.1 is Active, pin "3.1". 3.0 is Maintained, pin "3.0", defined there as “Supported previous minor for existing production integrations. Receives compatibility and security patches.” Underneath the table sits the instruction most readers never reach: “Wire values are release-precision only… Do not send patch components like "3.0.19" or full semver pre-release values like "3.1.0-rc.15".”

docs/reference/versioning.mdx then publishes a release cadence, which is the part a CFO defending a budget needs and the part nobody quotes. Each line below can be lifted into an agreement as it stands.

Clause lineThe published commitment behind it
adcp_version: "3.1" travels on the wire; patches are not negotiated“Wire values are release-precision only”
Anything built against 3.0 keeps working through the 3.x cycle“implementations built against 3.0 will continue to function against any 3.x release”; versions.mdx adds that “3.1 remains additive over 3.0”
At least 12 months of security patches after the next major shipsSupport for previous major after successor GA: minimum 12 months, backported for the full window
At least 6 months of notice before a field is removedDeprecation notice before removal: minimum 6 months. Experimental surfaces run a separate 6-week window
No breaking release before 2027Next major (4.0) targeted early 2027; majors a minimum of 18 months apart

That table did not appear on its own. bokelley opened issue 2312 on 18 April 2026 asking for a published cadence so implementers could plan. AAMP has nothing of this shape at any version, in any repository.

Who is promising the window?

AgenticAdvertising.org is the half of this that needs an introduction. CHARTER.md describes a Delaware trade association with 501(c)(6) status still pending, four voting classes with equal board representation (brands, agencies, publishers, technology providers), and a first AGM dated 6 May 2026. CONTRIBUTORS.md names an interim board of four, two of them from Scope3, and says outright that “Scope3 seeded AAO with foundational IP, funding, and the initial property-catalog knowledge graph”. That is a single-vendor protocol with a trade association forming around it, disclosed by the vendor, and I would rather price a published imbalance than guess at an unpublished one. AdCP vs AAMP prices the concentration.

Mediaocean, The Washington Post, Magnite, PubMatic and Yahoo appear on the external contributor list, which is participation rather than adoption; who actually runs an endpoint in production is a separate question with a separate answer, and the deployments ledger is where it gets kept.

AdCP standardises a buyer agent buying media from a sales agent, and the two operations you meet first are get_products, which asks a seller what inventory it has (natural-language brief or structured filters, your choice), and create_media_buy, which turns whatever comes back into a campaign.

Where AdCP’s effort went shows in the operation counts across its ten areas. Twenty-two of its 64 operations are governance, twice the size of the media buy area they sit next to: AdCP’s authors think the hard part of an agentic buy is proving what the agent was allowed to do.

AAMP comes from IAB Tech Lab, which wrote OpenRTB, AdCOM, OpenDirect and the Global Privacy Platform. That provenance normally settles a standards question on its own, which is what makes the current state of AAMP surprising: it is a name over eight separate GitHub repositories, each tagging on its own schedule, sharing no common type system and no common release.

Those eight repositories are the AAMP evidence base for everything below, and it is worth saying what they are before any claim rests on them. Each was cloned and read at the commit named in the artifact table near the end of this page, then re-checked on 16 August 2026: git describe, tag objects and file reads against the clones, then raw.githubusercontent.com and the GitHub API for tags, releases and repository names. That set is what “the corpus” means here, and it is public GitHub only. A member-facing IAB Tech Lab deliverable circulated through the Tech Lab’s own portal would not appear in it, so read every negative claim below as “not in those eight repositories on that date” rather than “does not exist”.

Four of these six acronyms settle transactions

The four named at the top of this page sit one layer down, where the money moves rather than the media.

ProtocolStewardCategoryWhat it standardises
AdCPAgenticAdvertising.orgAdvertisingMedia buying, creative, signals, brand governance, real-time matching
AAMPIAB Tech LabAdvertisingAgent discovery and trust, buyer/seller negotiation, bidstream mutation, embedding exchange
ACP (Agentic Commerce Protocol)OpenAI and StripeCommerceCheckout, payment delegation without becoming merchant of record
UCP (Universal Commerce Protocol)Google, with Shopify, Walmart, Target and othersCommerceCheckout, payments, fulfilment primitives
AP2 (Agent Payments Protocol)originated at GooglePaymentsMandates authorising an agent to pay on a user’s behalf
x402originated at CoinbasePaymentsSettlement over HTTP, built on the 402 status code

The ACP and UCP rows are AdCP’s own glossary describing its neighbours; the AP2 and x402 rows come from Crossmint’s protocol comparison and the Applied Technology Index 2026 analysis, because neither has a primary specification behind it here.

The two layers meet at one documented handoff: in Sponsored Intelligence the host initiates ACP checkout when the termination reason is handoff_transaction, and the FAQ compresses the boundary to “AdCP owns the path up to the handoff; the commerce protocol owns the transaction.” No AdCP operation settles anything.

The payment references in the AAMP corpus are inherited rather than agentic: the OpenRTB handled-payment flag hp in the wire contract’s SupplyChain, Deal and DealBookingResponse schemas, and a “Payment ID chain (TAG Payment ID Protocol)” field on agentic-direct’s OpenDirect surface. Across the eight repositories at the commits cited here, no AAMP operation settles.

One collision in that table is real rather than sloppy. AdCP’s glossary uses “UCP” for Google’s Universal Commerce Protocol; the AAMP repository agentic-audiences was formerly LiveRamp’s User Context Protocol and has not finished changing its name. Its surviving JSON Schema still carries an $id pointing at raw.githubusercontent.com/LiveRamp/user-context-protocol, and its catalog-info.yaml still declares the project slug LiveRamp/user-context-protocol. A document saying “UCP” may therefore mean a commerce protocol or an advertising data plane, and nothing on the page will tell you which unless you ask who wrote it.

Thirteen patch releases in fifty-four days

The discipline on AdCP’s side does not mean its numbers sit still. Eleven patch tags landed on the 3.1 line in the fifty days between v3.1.0 on 18 June 2026 and v3.1.11 on 7 August, and the line did not stop there: 3.1.12 and 3.1.13 followed by 11 August. Thirteen patches in fifty-four days, roughly one every four days, and 3.1.13 is the release the pinned registry file quoted below carries. 3.1.14 followed on 15 August, four days after the window closes, which is the point rather than an exception to it. Sign a document naming one of them and it is stale before the ink dries. Every release from 3.1.4 onward is filed in CHANGELOG.md under “Patch Changes”. That patch classification is the project’s own, applied to its own changes.

Once, it slipped. Release 3.1.3 added get_products.filters.publisher_domain, a stable schema field, inside a patch. Five days later 3.1.4 shipped as “the corrective successor to withdrawn 3.1.3”, removing “the patch-ineligible get_products.filters.publisher_domain field”, and the changelog notes that “Exact 3.1.3 artifacts remain available as an immutable withdrawn release record”. Somebody caught it, which is the system working. It also means the stable surface was loose enough for a patch to widen it 25 days after 3.1.0 shipped, and nothing has changed that. Release-by-release detail sits on the maturity assessment.

The rule that fired is worth reading, because it makes the contrast with AAMP a policy contrast rather than a maturity one: “The latest published tag must always reflect the same required-field set as source HEAD. A PR that changes any required array, changes a discriminator const, or tightens a validation constraint must be accompanied by a new tag cut before the change becomes the active implementation target for external consumers.”

Which patch is live has one address rather than one answer, and dist/schemas/latest.json is the address:

{
  "latest": "3.1.13",
  "latest_stable": "3.1.13",
  "channel": "stable",
  "path": "/schemas/3.1.13/",
  "index": "/schemas/3.1.13/index.json"
}

That file is five lines and none of them is ambiguous. It is also a moving target by design: read the same file at a commit from 6 August and it says 3.1.10; fetch it at https://adcontextprotocol.org/schemas/latest.json and it says whatever shipped this week, which on 16 August 2026 was 3.1.14. The URL is the durable artifact. The number inside it never was.

Four other surfaces in that same repository answer the same question differently: docs/reference/versions.mdx says 3.1.12, package.json and static/schemas/source/index.json both say 3.1.1, and docs/building/concepts/industry-landscape.mdx prints “Current version | 3.0 (GA, April 2026)”. static/schemas/source/index.json carries 1.0.0 as its own version and 3.1.1 in a separate adcp_version field. The spread does not break a client, and AdCP’s own rules say why. Negotiation runs at release precision, and versioning.mdx puts the build string outside the contract entirely, calling adcp.build_version “optional advisory metadata for incident triage — not part of the wire contract”. The two branch artifacts are the ones that catch people out, because they are also the first files a reader opens. What the two stacks do not standardise keeps the full inventory of surfaces inside the repository that disagree with each other.

Every circulating AdCP number has an address

None of that reaches the trade press. Four AdCP numbers circulate in published sources, and two of them have an address on AdCP’s own documentation host.

docs/building/concepts/industry-landscape.mdx prints “Current version | 3.0 (GA, April 2026)” and is served publicly, where a search engine is most likely to hand it to a buyer. It still said so when I fetched it on 16 August 2026. pkras filed issue 5032 on 26 May 2026 asking for the equivalent banner to be replaced with 3.1; the issue is closed and the surface did not move.

The 3.1.2 in circulation has a cleaner explanation than a writer’s error. Request docs.adcontextprotocol.org/docs/reference/versions and it redirects to /dist/docs/3.1.2/reference/versions: the published documentation site is a build of the 3.1.2 docs. Take a version off that site and you get 3.1.2 from the path and 3.1.0 from the table, neither of them what the schema registry is serving. Measured 16 August 2026.

The other two, “3.0 RC” and a bare 3.1, circulate through protocol directories: advertisingprotocols.com has been quoted for the first, adgentek.ai runs a full “AdCP 3.1 vs IAB AAMP 2.3” comparison for the second. Neither string is on either landing page as served on 16 August 2026, so treat both as sources a reader cannot check.

“AAMP 2.3” is a genuine IAB Tech Lab release announcement dated 30 July 2026, so nobody invented it. What it lacks is a public artifact: none of the eight repositories described above carries a 2.3 at the AAMP level on 16 August 2026, and the closest string in any tag list is buyer-agent v2.3.0. If 2.3 exists as a member deliverable off GitHub, nothing in those repositories points at it, which is the same problem for anyone drafting against it. A release number tracks a programme of work while the tags track engineering, nobody has declared either authoritative, and so every trade article has a defensible source for a different number.

When a version gets quoted at you, ask which file it came out of. A clause in a signed agreement naming “AdCP 3.0 GA” pins a line the schema registry moved off months ago, and nobody finds out until the first deprecation.

On the AAMP side, a tag is not a pin

An external implementer, jaanijuk, filed issue 2 against iab-agentic-primitives on 31 July 2026: “Release integrity: tagged builds report stale version metadata (0.1.0); recent tags are lightweight”. Every line of it reproduces at the pinned clone. pyproject.toml reads version = "0.1.0" at all five tags while main reads 0.5.0, and src/iab_agentic_primitives/__init__.py hardcodes __version__ = "0.1.0" on main too. His summary is the line to quote at a vendor: “Two version strings maintained separately, only one of them bumped.”

The second half of that issue decides what your clause says. Tags v0.1.0 through v0.3.0 are annotated objects; v0.4.0 and v0.5.0 are lightweight, pointing straight at a commit with no tagger, no date and no signature, and lightweight tags are the kind that can be re-pointed without leaving a trace. Both reference agents pin exactly iab-agentic-primitives.git@v0.5.0 from a git URL in pyproject.toml. The pin every AAMP implementation rests on is a mutable label on a library that tells its installer it is version 0.1.0.

He adds, in the same issue, that he reported tag drift against seller-agent in July, a pinned tag resolving to three different commits inside five days, and that the team moved to immutable point releases in response. Nothing corroborates it in the issues and releases of those eight repositories as read on 16 August, and a re-pointed lightweight tag leaves nothing behind to find either way, so take it as reported rather than measured. The instruction does not depend on the report: a lightweight tag is re-pointable whether or not anyone has re-pointed one, so on the AAMP side the clause names a 40-character commit sha rather than a tag.

Which sha needs care. The commit cited throughout this page, 2fc7029fb9eca801bc94586aec398906aa6af6c0, is one commit past the tag — git describe returns v0.5.0-1-g2fc7029 — while both reference agents pin @v0.5.0 itself. Name 2fc7029 and your counterparty is on a wire contract neither reference agent installs; name the commit v0.5.0 dereferences to and you match them exactly. Either way the pin is on a library whose own README says it is not yet released and whose package still reports 0.1.0, so what it buys is a byte-identical counterparty and nothing else: no support window, no compatibility promise, and a re-cut every time the library moves. It moved after the clone this page reads: v0.5.1 on 10 August 2026, a sixth tag and the repository’s only published release, which neither reference agent has taken.

Four of the eight repositories under the label have never been tagged: the hub, agentic-direct, agentic-audiences and registry-agent-example. The four that have agree on nothing: the spread runs from v0.5.0 to v2.4.1, and no two sit on the same version line. The hub README concedes it in one line: “Each repository uses independent semantic versioning.” Waiting does not help, because there is no artifact to defer to.

The wire contract library does ship one thing worth stating precisely. A conformance runner replays 46 golden vectors under spec/fixtures/ through seven check families and emits the STANDARDS_GAP_REPORT.md both agent repositories consume in CI: 12 standards tracked, 4 self-conformant, 0 partial, 8 unverified. That is a harness testing the library against its own checked-in artifacts, not a suite a counterparty’s endpoint can be failed against.

Its headline gap is the one a publisher would care about most. Field-level fidelity against IAB OpenDirect 2.1 is “the most consequential unverified claim”, and the remediation step is to obtain the published OpenDirect 2.1 field specification. IAB Tech Lab’s contract library cannot yet verify that it wraps IAB’s own standard correctly.

Nine artifacts, and what a contract can name in each

ArtifactNewest tag observedVersion it declares about itselfWhat a contract can name
AdCPv3.1.11, cut 7 August 2026latest.json says 3.1.13 stablethe wire value "3.1" plus the published support window. 64 operations, 761 JSON Schema files
ARTFv1.0, lightweight, over a commit dated 14 July 2026“Version 1.0, Released November 12, 2025”a specification, CC BY 3.0; the Go implementation is AGPL-3.0
seller-agentv2.4.1OpenAPI info.version 1.0.0a commit sha. OpenAPI 3.1.0, 74 paths, 91 schemas
buyer-agentv2.3.0OpenAPI info.version 1.0.0a commit sha. OpenAPI 3.1.0, 13 paths, 8 schemas
iab-agentic-primitivesv0.5.0, lightweight0.1.0 from both surfacesa commit sha only. 48 JSON Schemas; README says not yet released
agentic-audiencesnone“Draft v0.1”, inside a specs/v1.0/ directorya commit sha. One JSON Schema, four zero-byte files under specs/
agentic-directnonenonea commit sha. MCP and A2A wrapper over OpenDirect 2.1
registry-agent-examplenonenonea commit sha. A single 22-line agent.ts
AAMP (the hub)nonenonenothing. It is a README listing six of the others

Eight of those nine rows are AAMP: two runnable reference agents, which you stand up as services rather than import as SDKs, the shared library that says it is not yet released, a wrapper, two specifications, a 22-line example and a README. Tags are as observed at the commits cited here, and read again through the GitHub releases API on 16 August 2026 three of those rows had already moved: AdCP published 3.1.14 on 15 August, iab-agentic-primitives published v0.5.1 on 10 August and buyer-agent published v2.4.1 the same day.

Column three is where an integrator loses an afternoon. Both AAMP repositories that ship an OpenAPI document, seller-agent and buyer-agent, stamp info.version 1.0.0 in it while tagging v2.4.1 and v2.3.0 above it. The third API surface, agentic-direct’s OpenDirect wrapper, has no tag at all for its document to contradict. Generate a client from the OpenAPI file, pin the git tag, and you carry two different version numbers for the same component, both read correctly. The per-repository matrix is at AAMP Explorer.

One name in that table does not mean what buyers assume it means. ARTF, the Agentic Real Time Framework, imports OpenRTB 2.6 into its protobuf and mutates live bid objects inside the auction through eight named Intent operations. Nothing in it negotiates and nothing in it needs a language model. The r/programmatic thread that exists only to ask the difference got there first: “ARTF: Protocol framework to allow custom algorithm companies to standardize how container services are built on ad tech. Has nothing to do with AI agents. Don’t ask me why it got the word agent in its name.” AdCP’s FAQ files AAMP’s work streams “alongside OpenRTB at the impression layer” and compresses the whole split into one line: “AAMP is agentic bidding; AdCP is agentic buying.” It is also the one AAMP artifact with a finished specification and a release date, which produces an awkward result: the most complete thing published under the agentic banner is the piece furthest from anything a buyer would call an agent.

It is also the one that goes to your general counsel before it goes to an engineer. One README carries both halves eight lines apart: “The Go reference implementation in this repository is Copyright (c) 2025 Index Exchange Inc. and is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0)”, then “The IAB Tech Lab ARTF Specification is licensed under a Creative Commons Attribution 3.0 License.” Vendor that Go code into a hosted exchange and section 13 puts every counterparty hitting your endpoint in scope for the source. If your exchange is proprietary the choice is binary: reimplement from the CC BY 3.0 specification, or open the service. Finding that out after the integration is written is the expensive version.

The reimplementation half is narrower than it sounds. The CC BY specification types Mutation.intent as a bare string and its worked payloads carry four camelCase literals: activateSegments, activateDeals, adjustDeals, expireDeals. The AGPL-licensed proto in the same repository types that field as a closed enum of eight SCREAMING_SNAKE values, of which two correspond by name to anything in the CC BY document. The vocabulary an implementer has to emit lives in the half you cannot copy. AdCP vs AAMP carries the procurement exposure.

The row that matters most is iab-agentic-primitives, unreleased by its own statement and absent from a hub README that lists six component repositories. The wire contract, the piece every other repository would have to agree on, is the piece you cannot reach from the index. The repository-by-repository read is at AAMP: what IAB Tech Lab has published.

The tell that would resolve this into one stack

Anthony Katsur, who runs IAB Tech Lab, says standards proliferation is a real cost to the industry. He is right, and the bill lands on the buyer rather than on either standards body: two object models with no shared type between them, and one of the two has no conformance suite to fail. Half the repositories under his own umbrella have never been tagged, which is the cost arriving inside the body that named it.

Which leaves the question he does not answer. If proliferation costs what he says it costs, and he runs the body saying so, does this resolve into one stack before the money you spend this quarter has depreciated? I do not expect a merger inside eighteen months. The tell that would change my mind is AdCP-shaped work — a versioned schema registry with a release pointer in front of it — appearing under an IAB Tech Lab tag, and nothing in the eight repositories is moving that way.

Neither stack invented its transport

The two stacks already share plumbing, which is the thing most often mistaken for a merger. AdCP’s glossary defines the protocol as “domain-specific tasks and schemas that work over MCP and A2A as transports”, with Trusted Match outside both on a direct HTTP/2 API per docs/trusted-match/router-architecture.mdx. AAMP runs over MCP, A2A JSON-RPC 2.0 and REST, with gRPC for ARTF, and its three planes have three separate lineages: a control plane assembled from OpenDirect 2.1’s Account, Order, Line, Product, Creative, Assignment and ChangeRequest, a serve-time plane from OpenRTB 2.6 and AdCOM with sellers.json behind it, and a data plane inherited whole from LiveRamp.

AdCP wrote a new object model and published schemas for it, where AAMP wrapped existing IAB standards in agent interfaces. Which of those two bets ages better is not answerable from a file, and I would not trust anyone claiming it this early. What is answerable is which one you can build against this quarter, and my money is on the stack that can be frozen and re-tested. Fund AdCP for anything on the campaign path, name the vendor rather than the standard for anything on the AAMP side, and get the licence question in front of legal before an engineer opens ARTF’s repository.

Read next: AdCP vs AAMP costs the two against each other, and what IAB Tech Lab has published reads AAMP repository by repository.