adcp.major_versions, the exact format_ids creative
fields, and, over time, the get_products / create_media_buy /
update_media_buy facades. AdCP 3.2 already carries what replaces them. We
require capabilities, not protocol releases: an agent can deliver a capability
on AdCP 3.2 or 3.3, and what matters is that it supports it well. We read the
capabilities your agent declares and tell you which ones you are missing, and
by when, so you can fix them before 4.0 rather than after it breaks.
Nothing here is enforced before 1 February 2027. Until then, your readiness
does not change your certification, block a buy, or affect how buyers reach
you. From 1 February 2027, a sales agent that lacks a capability with a date
in the “Must from” column loses its certification that day, including an
agent certified earlier.
The schedule
Every capability is a should today. A should with a date becomes a must on that date. A should without a date is advice with no deadline.
If we require another capability, it will appear in this table, with its date,
before it is enforced.
A must means proven, not declared. From 1 February 2027, a capability with
a date that we have not yet proved counts as missing. We prove each one
differently:
- Reliable Reporting and webhook signing: a complete, valid declaration passes.
- Canonical creative formats: we have read your products, and every one
carries canonical
format_options. - Compact lifecycle: you pass our compact-lifecycle certification. Declaring the tools is not enough, and that certification is not available yet.
Where you see it
- Agent page, Overview tab. A sales Agent that lacks a capability with a must date shows a notice that names each missing capability and its date. An Agent that has them all but is not ready for 4.0 shows a shorter notice. Both link to this page. A ready Agent shows nothing.
- Agent page, Test Agent tab. The full verdict: every check, whether it passed, whether it is a should or a must and from when, what we found, and what to change for each check that failed.
- API. Read your Agent with
get(kind: "agent"); the verdict is inadcpReadiness. Each check carriesrequirement(SHOULDorMUST) andmustFrom(aYYYY-MM-DDdate, ornull), anddatedGapslists the dated checks you are missing: those that failed, and, from their date, those we have not yet proved (statusisnull).
adcpReadiness is null).
The verdict
The verdict follows the schedule, not your AdCP release number. An agent on AdCP
3.3 that lacks Reliable Reporting is flagged, and an agent on 3.2 that has every
dated capability is not.
No agent can reach
READY_FOR_4 yet. The compact-lifecycle check passes only
once you pass our compact-lifecycle certification, which is not available yet.
When the AdCP release that carries the rest of 4.0 ships, we will add its
checks to this page.
Each check in adcpReadiness.checks carries the field we read
(sourceFieldPath), what we found (whatWeSaw), and what to change
(howToFix).
The checks
Release versions (supported_versions)
What we read: adcp.supported_versions.
Why it matters: AdCP 4.0 removes adcp.major_versions. Buyers then pin a
release from supported_versions alone, so an agent that does not declare it
cannot be called at the right release.
To pass: list every release you speak, for example ["3.1", "3.2"]. Keep
sending adcp.major_versions as well. AdCP 3.x still requires it, and an agent
that drops it fails the AdCP 3 requirement
today.
Reliable Reporting (reliable_reporting)
What we read: media_buy.reporting_delivery and experimental_features.
Required from: 1 February 2027. This check reads what your agent declares,
whether or not buyers can use Reliable Reporting yet.
Why it matters: Reliable Reporting is how
a buyer learns, from an authoritative record, whether a report is due,
complete, or late. It is the AdCP 3.2 reporting contract that 4.0 builds on.
To pass: declare a complete media_buy.reporting_delivery block with
supported: true and reliable_reporting_version: "1.0", and list
"media_buy.reporting_delivery" in experimental_features.
Request signing (request_signing)
What we read: request_signing.
Why it matters: AdCP 4.0 makes signed requests mandatory on every
operation that commits spend. Apostra already signs the requests it sends you;
Verifying our signed requests
explains how to check them.
To pass: declare request_signing with supported: true,
covers_content_digest: "required", and at least one spend-committing
operation (create_media_buy, update_media_buy, buy_products,
accept_proposal, or control_media_buy) in supported_for or
required_for.
Webhook signing (webhook_signing)
What we read: webhook_signing.
Required from: 1 February 2027.
Why it matters: AdCP 4.0 removes HMAC and Bearer webhook authentication,
including webhook_signing.legacy_hmac_fallback. After that, only webhooks
signed with the AdCP webhook profile can be verified. Reporting webhooks depend
on AdCP 3.3 relaxing their required authentication block
(adcontextprotocol/adcp#8176).
To pass: sign the webhooks you send and declare
webhook_signing.supported: true. If you declare profile, it must be
adcp/webhook-signing/v1. See
Signing the webhooks you send us.
Operator identity (operator_identity)
What we read: identity.brand_json_url.
Why it matters: buyers find your signing keys through your brand.json.
AdCP 4.0 requires you to declare its URL whenever you sign requests or
webhooks; the well-known fallback no longer applies.
To pass: publish a brand.json that lists your agent and its jwks_uri,
and declare its https URL in identity.brand_json_url.
Compact lifecycle (compact_lifecycle)
What we read: media_buy.lifecycle_tools.
Required from: 1 February 2027.
Why it matters: the AdCP 3.2 compact lifecycle (list_products,
request_proposals, accept_proposal or buy_products, control_media_buy)
is the foundation of buying in 4.0. It is not a drop-in replacement for
get_products, so we will certify it separately.
To pass: implement the compact lifecycle, list the tools you serve in
media_buy.lifecycle_tools, and pass Apostra’s compact-lifecycle test against
your sandbox; its latest decisive result decides PASSED or FAILED. Until
Apostra has run that test, a declared lifecycle shows null, and from
1 February 2027 that counts as missing. Apostra does not run the test yet.
Canonical creative formats (canonical_creatives)
What we read: media_buy.features.canonical_creatives, and the AdCP
releases in adcp.supported_versions.
Required from: 1 February 2027.
Why it matters: AdCP 4.0 removes the deprecated exact format_ids fields
(adcontextprotocol/adcp#7629).
A canonical creative format is named by a format_kind and its params, with
no agent URL. Once format_ids is gone, an agent that cannot take canonical
formats cannot be told which creative format a buy uses, and its buys and
creative syncs fail.
To pass: publish canonical format_options (format_kind and params) on
every product, accept format_kind selectors on create_media_buy and
sync_creatives, and declare media_buy.features.canonical_creatives: true. A
product passes if it carries canonical format_options; it may also keep
format_ids for AdCP 3.x buyers until 4.0.
How we check it today: two things must hold. Your declaration: an agent
whose highest declared release is 3.2 or later passes unless it declares
media_buy.features.canonical_creatives: false, and an agent on an earlier
release, or one that declares no precise release, passes only if it declares
true. And your products: every product we
stored must carry canonical format_options. One product with only legacy
format_ids fails the whole check, so a 3.2 agent that publishes only
format_ids fails, and so does a catalogue that mixes the two; the finding says
how many products need changing. If your declaration passes but we have not read
your products yet, the check shows null, and from 1 February 2027 that counts
as missing.
How we read your agent
- We read the capabilities we last stored from your
get_adcp_capabilitiesresponse, and each block must be valid under the AdCP 3.2 schema to pass. A declaration AdCP would reject, such as a Reliable Reporting block missing required fields, showsFAILED. We never call your agent to compute the verdict.capabilitiesRefreshedAtsays when we last read them. See Keep capabilities current. - If your Agent backs more than one inventory source, the verdict is for the least-ready of them.