@adcp/sdk API Reference - v14.0.0-beta.6
    Preparing search index...

    Interface CanonicalFormatBase

    Shared parameter fields that apply across canonical formats. Each canonical format extends this base with format-specific parameters (dimensions, durations, codecs, slot constraints).

    interface CanonicalFormatBase {
        experimental?: boolean;
        deprecated?: boolean;
        v1_translatable?: boolean;
        since_version?: string;
        migration_target_version?: string;
        composition_model?: "deterministic" | "algorithmic";
        provenance_required?: boolean;
        platform_extensions?: PlatformExtensionReference[];
        synthesis_nondeterministic?: boolean;
        slots?: {}[];
        required_connections?: {
            provider?: string;
            connection_type:
                | "advertiser_account"
                | "publisher_identity"
                | "post_authorization";
            required_for?: string[];
            scope?: "unknown"
            | "account"
            | "identity"
            | "post";
            status?:
                | "unknown"
                | "pending"
                | "expired"
                | "revoked"
                | "not_required"
                | "connected"
                | "missing";
            connection_id?: string;
            resource_ref?: {
                platform_account_id?: string;
                identity_id?: string;
                handle?: string;
                profile_url?: string;
                post_id?: string;
                post_url?: string;
            };
            authorization_url?: string;
            authorization_instructions?: string;
            expires_at?: string;
        }[];
        reference_mutability?: | "immutable_snapshot"
        | "mutable_requires_reapproval"
        | "mutable_auto_recheck";
        production_window_business_days?: number;
    }
    Index

    Properties

    experimental?: boolean

    When true, this canonical or seller narrowing may not work as declared. Adopters SHOULD preflight it with validate_input or in a sandbox and SHOULD NOT route production budget without testing; experimental status never makes the deprecated v1 path preferable. Drivers include unsettled spec shape, an adopter runtime gap, and custom shapes awaiting promotion. This replaces the earlier status plus runtime_status axes. Sellers SHOULD set experimental whenever a canonical or declaration is not production-ready.

    deprecated?: boolean

    When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with migration_target_version to indicate when the canonical is expected to be removed. Distinct from experimental: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.

    v1_translatable?: boolean

    Whether this canonical has any v1 named-format equivalent. true (default) — the canonical is structurally expressible as one or more v1 named formats (IAB display sizes, VAST tags, DAAST tags, etc.); v1→v2 projection via v1-canonical-mapping.json is meaningful. false — the canonical is inherently new in v2 and has no v1 form; v1's list_creative_formats couldn't express it because the underlying concept (algorithmic surface composition, AI-surface mentions, retail-media catalog placements, multi-card carousels) didn't exist as a v1 named-format archetype.

    Lets SDKs distinguish two failure modes that today look identical: (a) the registry hasn't covered this canonical yet (correctable — seller adds explicit canonical field or files a registry entry) vs (b) no v1 path is possible (informational — buyer needs v2-aware consumption, or seller declares canonical_formats_only: true on the product declaration). SDKs encountering v1_translatable: false on a canonical SHOULD NOT emit FORMAT_PROJECTION_FAILED (which signals registry-coverage gap) — instead surface the inherent v1-unreachability as a different diagnostic or skip silently. The 4 inherently-v2 canonicals at 3.1 GA: image_carousel, sponsored_placement, responsive_creative, agent_placement.

    since_version?: string

    AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected — canonicals are introduced at minor-version boundaries.

    migration_target_version?: string

    AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when deprecated: true) be removed. Patch precision is intentionally rejected — canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').

    composition_model?: "deterministic" | "algorithmic"

    Whether the surface composes deterministically (buyer can predict per-slot rendering — sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing — responsive_creative, agent_placement).

    provenance_required?: boolean

    When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.

    platform_extensions?: PlatformExtensionReference[]

    Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled extensions map in get_products responses or fetched directly.

    Collision precedence (normative). When two or more platform_extensions[] entries on the same declaration extend the same target (e.g., both extend tracking) with overlapping field names, array order is authoritative — later entries override earlier ones on a per-field basis (last-in-array-wins). SDKs MUST surface the overlap via the errors[] array on the get_products response with a structured code (FORMAT_DECLARATION_DIVERGENT is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.

    synthesis_nondeterministic?: boolean

    When true, the format's production pipeline is genuinely nondeterministic — the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive validate_input is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, build_creative returns task_failed with a synthesis_failed reason. Distinct from composition_model (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that validate_input can predict output properties from input properties.

    Compatibility with asset_source / item_production_model: synthesis_nondeterministic: true MAY pair with any of seller_pre_rendered_from_brief, seller_human_designed, or agent_synthesized (the QA loop is concept-level, not source-specific — 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with buyer_uploaded (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with publisher_host_recorded (the publisher's host produces a deterministic-from-script output even if the human voice varies). When synthesis_nondeterministic: true is set with an incompatible source, validators SHOULD reject with a structured error.

    slots?: {}[]

    Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an asset_type so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat headline_max_chars on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's max_chars or max_size_kb) live on the slot entry.

    required_connections?: {
        provider?: string;
        connection_type:
            | "advertiser_account"
            | "publisher_identity"
            | "post_authorization";
        required_for?: string[];
        scope?: "unknown"
        | "account"
        | "identity"
        | "post";
        status?:
            | "unknown"
            | "pending"
            | "expired"
            | "revoked"
            | "not_required"
            | "connected"
            | "missing";
        connection_id?: string;
        resource_ref?: {
            platform_account_id?: string;
            identity_id?: string;
            handle?: string;
            profile_url?: string;
            post_id?: string;
            post_url?: string;
        };
        authorization_url?: string;
        authorization_instructions?: string;
        expires_at?: string;
    }[]

    Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.

    Type Declaration

    • Optionalprovider?: string

      Stable provider or platform namespace, preferably lowercase. Examples: social.example, shortvideo.example, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an authorization_url fully routes the human to the correct provider-specific connection flow.

    • connection_type: "advertiser_account" | "publisher_identity" | "post_authorization"

      Kind of downstream connection required. advertiser_account is the platform account used to buy/manage ads. publisher_identity is the creator, page, channel, organization, or profile that owns source posts. post_authorization is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity.

    • Optionalrequired_for?: string[]

      Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as list_creatives, sync_creatives, create_media_buy, get_media_buy_delivery, or get_creative_delivery over broad category labels such as reporting.

    • Optionalscope?: "unknown" | "account" | "identity" | "post"

      Granularity of the downstream grant.

    • Optionalstatus?:
          | "unknown"
          | "pending"
          | "expired"
          | "revoked"
          | "not_required"
          | "connected"
          | "missing"

      Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use unknown; AUTHORIZATION_REQUIRED details SHOULD use missing, expired, or revoked for the connection that blocked the call.

    • Optionalconnection_id?: string

      Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.

    • Optionalresource_ref?: {
          platform_account_id?: string;
          identity_id?: string;
          handle?: string;
          profile_url?: string;
          post_id?: string;
          post_url?: string;
      }

      Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.

      • Optionalplatform_account_id?: string

        Provider-native advertiser or business account id, when safe to disclose.

      • Optionalidentity_id?: string

        Provider-native creator, page, channel, organization, or profile id, when safe to disclose.

      • Optionalhandle?: string

        Provider-native public handle for the owning identity, when available.

      • Optionalprofile_url?: string

        Public URL for the owning identity, when available.

      • Optionalpost_id?: string

        Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.

      • Optionalpost_url?: string

        Public URL for the referenced post, when available.

    • Optionalauthorization_url?: string

      Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.

    • Optionalauthorization_instructions?: string

      Human-readable instructions for completing or restoring this downstream connection.

    • Optionalexpires_at?: string

      Expiration time for the downstream grant, when known.

    reference_mutability?:
        | "immutable_snapshot"
        | "mutable_requires_reapproval"
        | "mutable_auto_recheck"

    Policy for formats whose slots accept a published_post reference. immutable_snapshot: seller snapshots the referenced post at approval and later source changes do not change the served creative. mutable_requires_reapproval: the source post may change and material changes require review before continued serving. mutable_auto_recheck: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no published_post slot.

    production_window_business_days?: number

    Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).