CreativeRepresentationSet revision, then resolve exactly one into an ordinary seller-bound creative manifest.
This is not creative rotation or A/B testing. Every entry represents the same creative content through a different delivery contract. A representation set is scoped to one canonical format kind: every representation must share the same format_kind. Interchangeable packagings for different media types belong in separate sets or separate sync_creatives items—seller selection is choosing between delivery contracts for one format, not between media types.
Selection chooses a
representation_id. It never chooses or creates one of the variant identities.
Representation-set object
The set always means “choose exactly one compatible representation.” Arrays inside a manifest asset slot still mean repeatable cardinality; they do not mean representation alternatives.creative_id identifies the durable creative. revision_id identifies this complete immutable buyer input state, and each representation_id is stable and unique within that revision. Ingestion stores every valid entry without invoking URLs, executing markup, resolving macros, or discarding an unsupported representation.
Revision identity
The complete representation set is the revision preimage. Producers remove exactly the top-level$schema, creative_id, revision_id, revision_content_digest, and name properties, serialize everything else with RFC 8785 JCS, and place the lowercase-hex SHA-256 in revision_content_digest. $schema is transport/schema-location metadata, not creative content. Other unknown fields and representation array order are significant. Producers and resolvers reject duplicate JSON member names, and resolvers recompute the digest before selection.
Changing any representation, its source metadata, the set-level provenance, representation order, or another unknown revision-bearing field requires a new revision_id and digest. Renaming the set does not. Selecting, transcoding, macro-binding, or serving one representation does not mint a new revision.
This extends the ordinary sync_creatives revision contract: the complete set—not the selected manifest—is bound to (creative_id, revision_id). Reusing that identity with a different digest or canonical content fails with CREATIVE_REVISION_CONTENT_MISMATCH. The selected manifest carries the verified digest so a downstream seller can retain the complete-set binding even when it receives only the derived output.
Seller-bound resolution
Resolution follows this order:- Discover the destination’s product format option and seller-wide execution capabilities.
- Filter candidates by canonical
format_kindand the selectedformat_option_ref. - Apply the option’s asset shape and delivery-mechanism constraints.
- For VAST, intersect product and seller version sets.
- Normalize tracker defaults, bind one exact VAST/DAAST execution version, and match every first-class tracker against the destination’s tracker execution contract.
- Evaluate every declared macro against product and seller macro capabilities as a separate check.
- Select exactly one compatible representation.
build_creative representation resolution is intentionally narrower: only the destination sales agent may advertise creative.representation_resolution.supported: true and accept a set. A standalone creative agent does not own the product or seller execution ceilings and cannot claim seller compatibility. Silent guessing is never allowed.
The request carries representation_destination.product_id plus the exact effective product format_option. The destination seller verifies that declaration against its current product, every named placement/publisher narrowing, and its current seller-wide execution ceilings. When placement_refs is omitted, the output must satisfy the common effective contract for every placement where it may deliver. target_capability_id selects the seller’s creative-operation route; it is not a substitute for the inventory contract.
Resolution requires explicit compatibility inputs. In particular, every video_vast source representation has an exact asset vast_version, while the selected product option and seller advertise non-empty plural vast_versions. An absent set is unproven and cannot be treated as accepting every version on this opt-in resolution path.
When a first-class vast_tracker or daast_tracker has no sibling exact-version delivery document, representation_destination carries execution_vast_version or execution_daast_version. The value must belong to the destination acceptance set and is echoed in representation_selection. It joins the selected representation and output digest in the execution-review identity, so changing it requires re-resolution and ordinary re-review. Package assignment must preserve the same exact version.
Equivalence is a buyer assertion, not something the set digest proves. The digest proves that the complete asserted set was not changed; it does not prove that two representations render the same ad or behave identically. A seller MUST apply its ordinary validation and review policy to the exact selected output before approving or serving it. The seller does not need to fetch, execute, or approve every unselected candidate, and it MUST NOT treat acceptance of one candidate as approval of another. Different sellers may select different candidates, but each selected output is separately submitted through sync_creatives and reviewed before it can serve. A later selection likewise requires an explicit buyer sync and ordinary re-review, so an unreviewed hidden candidate can never replace the approved execution.
Pass a representation set to the destination seller’s build_creative route with the product contract and an advertised strategy:
macro_values is the one permitted operation that may change the derived manifest: selection happens first, then declared build-time macro binding runs without changing the retained source set. Preview fields may request a sidecar render of that selected output, but preview inputs or context never authorize mutation of the manifest or its digest. A pure resolution response never carries build_variant_id.
The output is the normal seller-bound manifest. representation_selection carries complete-revision lineage through sync_creatives and readback:
selected_output_digest is SHA-256 over RFC 8785 JCS of a shared manifest projection. From either the returned CreativeManifest or its later CreativeAsset sync wrapper, remove exactly top-level $schema, representation_selection, creative_id, revision_id, name, tags, status, weight, placement_refs, placement_ids, and inputs; include every other field, including unknown delivery fields. The identical projection makes ordinary library wrapping and metadata-only edits digest-neutral while fingerprinting the selected seller-bound output separately from the source revision. A changed selection, macro binding, translation, or transcode may keep the same buyer revision_id, but it changes this output fingerprint.
Sync, review, and readback
Onsync_creatives, the seller enforces two different invariants:
(creative_id, revision_id, revision_content_digest)binds immutable buyer source content—the complete representation set, never only the selected entry.(selected_representation_id, selected_output_digest, execution_vast_version-or-null, execution_daast_version-or-null)binds the current seller-bound execution submitted for review.
revision_id. Changing only the selected execution does not mint a buyer revision, but it is an updated creative and follows the ordinary re-review lifecycle; approval never transfers silently to different execution bytes. list_creatives returns the exact current representation_selection while that selected execution remains current. A downstream seller that receives only the selected manifest can verify its output digest and retain the asserted source-set digest, but cannot claim it independently inspected hidden source representations.
Resolution is an explicit buyer-initiated operation, not a continuously
reevaluated seller policy. After a selected output is accepted by
sync_creatives, later product, placement, VAST, macro, or seller-capability
changes MUST NOT cause the seller to rerun the strategy, replace
representation_selection, or move the creative into re-review on behalf of
the buyer. Those changes apply to future resolution requests and assignment
validation. To replace the current execution, the buyer explicitly calls the
destination seller’s build_creative route with the current destination
contract and then submits the returned manifest through sync_creatives.
build_creative alone does not mutate the creative library; the subsequent
sync is the buyer-visible update that starts ordinary re-review.
If a seller can no longer serve an already accepted execution, it MUST NOT
silently substitute another representation. It uses the ordinary
seller/system-initiated creative lifecycle and media-buy impairment surfaces,
while preserving the exact selection lineage for audit. Buyers reconcile the
status through creative.status_changed, list_creatives, and
get_media_buys, then explicitly resolve and sync a replacement when needed.
An independent seller-initiated re-review may evaluate the same pinned
execution, but it does not authorize representation re-selection.
Representation resolution is a trafficking-time destination choice, not a
viewer- or device-time fallback mechanism. highest_compatible_vast means the
highest exact VAST version accepted by the selected product and seller; it does
not mean the highest version supported by a particular player or device. The
selected representation remains pinned for every execution until the buyer
explicitly resolves and syncs a replacement. Device-specific media selection,
VAST wrapper fallback, and player compatibility remain inside the selected
VAST document and its MediaFile alternatives. Buyers that need distinct
device contracts must target separate product options or submit separate
creatives; a representation set never authorizes runtime switching between its
members.
This version does not combine representation_selection with the sync-only
localization mutation. A selected sync item MUST omit localization, including
null, and the stored creative MUST NOT already have localization that omission
would preserve. To migrate an existing localized creative, first submit a
separate ordinary sync with localization: null and no representation_selection;
only after that removal is accepted may the selected output be synced. Locale
topology and materialized locale assets need their own explicit
pre-binding projection; treating them as library metadata would allow served
bytes to change without changing either review fingerprint.
Resolution failure
When no candidate works, returnCREATIVE_REPRESENTATION_UNRESOLVED. error.details MUST conform to error-details/creative-representation-unresolved.json, with exactly one representation_rejections entry for every candidate. Unsupported representations remain in the immutable set; failure does not delete or rewrite them.
tracker_contract_mismatch and macro_unsupported are deliberately distinct. A seller reports the former with the manifest asset path, normalized selector identity, and destination option reference. Library-only sync_creatives can preserve a selected output and validate its structure, but package assignment must revalidate the trackers against the immutable package snapshot before spend.
VAST representations
One VAST asset declares one exactvast_version; a product option and seller declare accepted sets.
['3.0', '4.0', '4.1', '4.2'] but the selected product accepts only ['3.0', '4.0'], the compatible candidates are VAST 3.0 and 4.0. highest_compatible_vast chooses 4.0 only after that intersection is computed; if multiple compatible candidates declare the same highest exact version, the first in representation array order wins. That strategy is valid only for a video_vast destination; using it for another format returns INVALID_REQUEST and never silently falls back. representation_order always chooses the first compatible entry. Resolution must never relabel the VAST 3.0 asset as 4.0.
Representation namespaces
CreativeRepresentationSet.representations[].representation_id identifies an equivalent trafficking representation within one creative revision. It is distinct from:
revision_id, the complete immutable buyer input state;build_variant_id, a generated or transformed output leaf;locale_variant_id, a buyer-authored localized asset set;- assignment weight or rotation groups; and
- served
variant_id, an agent-assigned immutable execution returned byget_creative_delivery.
representation_selection join instead.