Skip to content

spec(media-buy): get_media_buys MUST return all account-owned buys#2993

Merged
bokelley merged 1 commit into
mainfrom
bokelley/issues-2963-2964-2965
Apr 24, 2026
Merged

spec(media-buy): get_media_buys MUST return all account-owned buys#2993
bokelley merged 1 commit into
mainfrom
bokelley/issues-2963-2964-2965

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Summary

Tightens the scope of get_media_buys, get_media_buy_delivery, and update_media_buy so account-scoped tasks are bounded by account ownership, not by the surface through which a buy was created. Sales agents MUST NOT partition their inventory into "AdCP-created" and "non-AdCP" subsets for these tasks, and MUST NOT refuse reporting or updates on the basis that a buy was booked directly in the ad server, via legacy APIs, or via manual trafficking.

Closes #2963.

Why

The spec was previously silent on this. Nothing forbid "AdCP only returns what AdCP created" — an interpretation compatible with the letter of the spec but fatal in practice:

  • Adoption: an agency with 10,000 GAM campaigns adding an AdCP agent needs all 10,000 addressable, not just the ones rebuilt through AdCP.
  • Attestation: brownfield Tier-2 conformance (Tier-2 conformance: Production Verified via continuous delivery observability #2965) requires the compliance engine to get_media_buys → discover a live campaign → update_media_buy with a verification reporting_webhook. Partitioning by creation surface collapses Path B.
  • Honesty: AdCP as a protocol onto the seller's ad operations is the premise of the whole spec — not a shadow ledger beside it.

Changes

  • docs/media-buy/task-reference/get_media_buys.mdx — new Scope of Results section: sales agents MUST return every account-owned buy regardless of creation surface; MUST NOT mark a buy read-only on that basis. Business constraints expressed via valid_actions, not by hiding buys.
  • docs/media-buy/task-reference/update_media_buy.mdx — new Scope section: operates on any media_buy_id returned by get_media_buys; creation surface is not a supported axis of authorization.
  • docs/media-buy/task-reference/get_media_buy_delivery.mdx — new Scope section: delivery reporting covers any buy returned by get_media_buys; sellers return zero/partial metrics rather than MEDIA_BUY_NOT_FOUND for account-owned buys.
  • docs/media-buy/specification.mdx — new Account Ownership vs. Creation Surface core concept, cross-referenced from the get_media_buys, update_media_buy, and get_media_buy_delivery requirements lists. Updates the media_buy_id definition to call out that it identifies any ad-server order the account owns.

Test plan

  • Docs build cleanly (verified by pre-commit docs validation)
  • Cross-references to #account-ownership-vs-creation-surface resolve on the specification page
  • Review by ad-tech-protocol-expert for normative language and MUST/SHOULD placement
  • Confirm no schema changes needed — this is normative tightening on existing fields, not new shape

Follow-ups

Part of a 3-issue series on brownfield conformance:

🤖 Generated with Claude Code

Tightens the scope of get_media_buys, get_media_buy_delivery, and
update_media_buy to be bounded by account ownership, not by the
surface through which a buy was created. Sales agents MUST NOT
partition their inventory into "AdCP-created" and "non-AdCP" subsets
for account-scoped tasks, and MUST NOT refuse reporting or updates on
the basis that a buy was booked outside AdCP (direct ad-server entry,
legacy APIs, manual trafficking).

Rationale: enterprise adoption needs existing ad-server state to be
addressable without rebuilding through AdCP; brownfield Tier-2
conformance (#2965) depends on being able to discover live campaigns
and attach a verification reporting_webhook; and "protocol onto the
ad server" is the premise of the spec. Business constraints on
specific operations remain expressible via valid_actions.

Closes #2963

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Schema Link Check Results

Commit: 15f6296 - spec(media-buy): get_media_buys MUST return all account-owned buys

⚠️ Warnings (schema not yet released)

These schemas exist in source but haven't been released yet. The links will be broken until the next version is published:

  • https://adcontextprotocol.org/schemas/v3/collection/create-collection-list-request.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/collection/create-collection-list-response.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/collection/delete-collection-list-request.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/collection/get-collection-list-request.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/collection/get-collection-list-response.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/collection/list-collection-lists-request.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/collection/update-collection-list-request.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/core/creative-consumption.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/core/vendor-pricing-option.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published
  • https://adcontextprotocol.org/schemas/v3/enums/specialism.json
    • Schema exists in latest (source) but not yet released in v3
    • Action: This link will work after next 3.x release is published

To fix: Either:

  1. Wait for the next release and merge this PR after the release is published
  2. Use latest instead of a version alias if you need the link to work immediately (note: latest is the development version and may change)
  3. Coordinate with maintainers to cut a new release before merging

@bokelley bokelley merged commit cf6da6e into main Apr 24, 2026
16 checks passed
@bokelley bokelley deleted the bokelley/issues-2963-2964-2965 branch April 24, 2026 10:01
bokelley added a commit that referenced this pull request Apr 24, 2026
… partitioning belongs (#3016)

Post-#2993 follow-up surfaced by expert review of the Tier-2 conformance
PR. The merged #2993 text says sellers MUST return every account-owned
buy and MUST NOT mark non-AdCP buys read-only — but also that an action
MAY be omitted from valid_actions for "business reasons." Those two
clauses together let a seller technically comply by returning non-AdCP
buys with systematically empty valid_actions, which is indistinguishable
from hiding the buy.

Two clarifications:

1. Creation surface is not a business reason. MUST NOT omit an action
   from valid_actions solely because the buy was created outside AdCP.
   A systematically empty valid_actions on non-AdCP buys is non-conformant.

2. Partitioning belongs at the account boundary. When a seller has a
   legitimate reason to hide a set of buys (child-seller models,
   NDA-scoped PMP deals, privacy partitions), the correct mechanism is
   a separate account the caller is not authorized on — not within-
   account filtering. Within-account filtering reintroduces the
   shadow-ledger problem #2963 forbade.

Updates specification.mdx (new subsection under Account Ownership vs.
Creation Surface), get_media_buys.mdx, update_media_buy.mdx.

No schema changes.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

get_media_buys MUST return all account-owned buys regardless of creation surface

1 participant