Skip to content

RFC: declare macro dialect, substitution owner, and encoding for creative tags #6764

Description

@bokelley

Problem

AdCP can transport macro-bearing creative URLs, but cannot currently establish
whether they will work at the destination:

  • url-asset.json accepts AdCP universal macros in URI templates.
  • vast-asset.json also accepts VAST [MACRO] and ad-server ${MACRO} tokens.
  • The 3.2 video contract explicitly treats unresolved macros as opaque and says
    macro correctness and substitution verification are out of scope.
  • Real third-party tags mix vendor dialects from CM360, GAM, DV360, The Trade
    Desk, Amazon, Microsoft/Xandr, Adobe, Adform, Yahoo, Innovid/Flashtalking,
    verification vendors, and IAB VAST.

The same semantic has different spellings across platforms; the same-looking
token can have different scope; click URLs require different encoding depths;
and some values are owned by the buyer, seller, publisher player, or source ad
server. Preserving tokens is necessary but not sufficient: neither party can
determine preflight compatibility or explain which token remains unresolved.

Related: #6207 defines product tracking capabilities and substituted universal
macros for tracker assets. This issue covers creative delivery assets and
vendor/VAST dialects, not only tracker assets.

References:

Proposed direction

Add a macro contract usable by URL-delivered display tags, inline tag markup,
VAST URLs, and tracker assets. It should separate the literal source token from
its canonical meaning and resolver:

{
  "token": "%%TTD_CLK_ESC2%%",
  "dialect": "the_trade_desk",
  "semantic": "click_redirect",
  "resolved_by": "seller",
  "encoding": { "kind": "url", "depth": 2 },
  "required": true
}

Candidate fields/semantics:

  • token: exact byte-preserved expression from the source.
  • dialect: IAB/AdCP or vendor namespace; no semantic inference from spelling
    alone.
  • semantic: reference to the universal macro vocabulary when verified, or
    unresolved/vendor-defined when not.
  • resolved_by: buyer, seller, publisher/player, source ad server, or already
    resolved.
  • encoding/value-shape constraints, including nested URL-encoding depth.
  • required vs. optional and safe behavior when the value is unavailable.

Seller/product format options should advertise which macro dialects and
canonical semantics they can resolve. Creative validation should return a
structured result per token: resolved, preserved for a downstream resolver,
unsupported, or ambiguous.

Safety and interoperability rules

  • Never replace a token from spelling alone when dialect/context is unknown.
  • Never invent consent strings, vendor IDs, device IDs, or impression IDs.
  • Preserve the original creative bytes and token list through pre-binding
    storage and variant selection.
  • Click-macro encoding depth is part of the contract, not a string-replacement
    implementation detail.
  • IAB's live VAST macro registry should be referenced/versioned rather than
    copied into an AdCP enum that will drift.
  • Vendor-specific mappings require a cited vendor source and remain extensions
    until promoted into a governed shared semantic.

Acceptance criteria

  • Creative assets can declare exact source tokens, dialect, semantic,
    resolver, and encoding requirements.
  • Seller/product capabilities declare resolvable macro semantics/dialects.
  • Validation returns per-token compatibility and actionable failures.
  • Unknown or ambiguous tokens survive unchanged and never receive guessed
    replacements.
  • Worked examples cover cache busting, click redirect with nested encoding,
    GDPR/TCF, GPP, player/VAST macros, and an unresolved vendor token.
  • The contract composes with RFC: Measurement capability declaration (tracking_capabilities, attribution methodologies, TMP exposure data) #6207 rather than defining a competing tracker
    capability model.
  • Compliance tests cover preservation, substitution ownership, and encoding
    depth.

Compatibility

Additive. Existing opaque-token behavior remains the fallback when no macro
contract is supplied; absence means undeclared, not supported.

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.creativeneeds-wg-reviewBlocked on a working-group decision — surface in WG meeting agendasrfcProtocol change — auto-adds to roadmap boardschemaJSON Schema source-of-truth: definitions, codegen artifacts, validation, hygienespec / protocol

    Type

    No type

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions