@adcp/sdk API Reference - v14.3.0
    Preparing search index...

    Interface AcceptProposalRequest

    Accept one committed immutable proposal. Depending on proposal_kind, acceptance creates a MediaBuy, applies an amendment, or applies a negotiated cancellation. The proposal already contains the commercial terms, so callers do not repeat packages, dates, targeting, or creatives.

    interface AcceptProposalRequest {
        adcp_version?: string;
        adcp_major_version?: number;
        idempotency_key: string;
        name?: string;
        account: CanonicalAccountReference;
        proposal_id: string;
        proposal_terms_digest: string;
        total_budget?: { amount: number; currency: string };
        daily_budget_cap?: number;
        budget_cap_timezone?: string;
        io_acceptance?: {
            io_id: string;
            accepted_at: string;
            signatory: string;
            signature_id?: string;
        };
        purchase_order_ref?: string;
        governance_context?: string;
        push_notification_config?: PushNotificationConfig;
        reporting_webhook?: ReportingWebhook;
        opportunity?: {
            opportunity_id: string;
            phase?: "exploratory"
            | "planning"
            | "active_sourcing";
            intent?: "planning" | "test" | "speculative" | "live_rfp";
            planning_horizon?: DateRange;
            response_deadline?: string;
            status?: "closed" | "open";
            close_reason?:
                | "other"
                | "budget_changed"
                | "selected_alternative"
                | "accepted_with_seller"
                | "purchased_elsewhere"
                | "not_pursued"
                | "timing_changed";
            close_detail?: string;
        } & { status?: "closed" };
        context?: ContextObject;
        ext?: ExtensionObject;
    }
    Index
    adcp_version?: string

    Release-precision AdCP version (VERSION.RELEASE, e.g. "3.0", "3.1", "3.1-beta"). On a request: the buyer's release pin — the seller validates against its supported_versions and returns VERSION_UNSUPPORTED on cross-major mismatch, or downshifts to the highest supported release within the same major. On a response: the release the seller actually served — clients SHOULD validate the response against that release's schema, not against their pin. Patches are not negotiated; surface them as build_version on capabilities for operational visibility. When omitted, falls back to adcp_major_version (deprecated) or server default. Buyers SHOULD emit both adcp_version and adcp_major_version through 3.x to remain compatible with sellers that only read the legacy field. NORMALIZATION: SDKs that read full-semver values from bundle metadata (e.g. ComplianceIndex.published_version = "3.1.0-beta.1") MUST normalize to release-precision ("3.1-beta.1") before emitting on the wire — meta-field values are NOT valid wire values.

    adcp_major_version?: number

    DEPRECATED in favor of adcp_version (release-precision string). Servers MUST continue to honor this field through 3.x. Removed in 4.0. Original semantics: the AdCP major version the buyer's payloads conform to. Sellers validate against their supported major_versions and return VERSION_UNSUPPORTED if unsupported. When omitted, the seller assumes its highest supported version.

    idempotency_key: string

    16

    255

    ^[A-Za-z0-9_.:-]{16,255}$

    name?: string

    Human-readable MediaBuy name supplied by the buyer for trafficking UI display and operational communication. When supplied, this value wins over proposal.name; the seller MUST persist it and echo it unchanged on the commitment success response and subsequent get_media_buys reads. It is operational metadata outside accepted_proposal and is not covered by proposal_terms_digest or terms_digest. When an acceptance creates a MediaBuy and name is absent, the seller MAY seed the MediaBuy name from proposal.name only when proposal.name already satisfies the MediaBuy name constraints (non-whitespace and no longer than 255 characters); the seller MUST NOT silently truncate or otherwise rewrite it. A seeded value counts as a name created through AdCP and MUST be reported on commitment and read surfaces. This display label is not an identifier or financial reference.

    1

    255

    \S

    account: CanonicalAccountReference
    proposal_id: string

    1

    proposal_terms_digest: string

    terms_digest from the committed proposal. The seller MUST atomically verify both ID and digest before acceptance.

    ^sha256:[A-Za-z0-9_-]{43}$

    total_budget?: { amount: number; currency: string }

    Execution amount when the committed proposal defines scalable percentages or constraints rather than a fixed total.

    Type Declaration

    • amount: number

      0

    • currency: string

      ^[A-Z]{3}$

    daily_budget_cap?: number

    Optional hard aggregate daily spend ceiling applied when the committed proposal is accepted. It constrains execution without changing the proposal's negotiated pricing.

    0

    budget_cap_timezone?: string

    Optional shared IANA cap-day timezone override. Requires buyer_timezone_override support. When omitted, budget_capping.timezone_basis selects Account.timezone or fixed_timezone.

    1

    io_acceptance?: {
        io_id: string;
        accepted_at: string;
        signatory: string;
        signature_id?: string;
    }

    Type Declaration

    • io_id: string

      1

    • accepted_at: string

      date-time

    • signatory: string

      1

      250

    • Optionalsignature_id?: string

      1

    purchase_order_ref?: string

    1

    255

    governance_context?: string

    1

    4096

    push_notification_config?: PushNotificationConfig
    reporting_webhook?: ReportingWebhook
    opportunity?: {
        opportunity_id: string;
        phase?: "exploratory" | "planning" | "active_sourcing";
        intent?: "planning" | "test" | "speculative" | "live_rfp";
        planning_horizon?: DateRange;
        response_deadline?: string;
        status?: "closed" | "open";
        close_reason?:
            | "other"
            | "budget_changed"
            | "selected_alternative"
            | "accepted_with_seller"
            | "purchased_elsewhere"
            | "not_pursued"
            | "timing_changed";
        close_detail?: string;
    } & { status?: "closed" }

    Optional planning-cycle closure. Success infers closed with accepted_with_seller when status is omitted. If the proposal carries opportunity_id, a supplied ID MUST match; the accepted proposal preserves that association.

    Type Declaration

    • opportunity_id: string

      Opaque buyer-assigned identifier for this planning cycle, scoped to the seller and account.

    • Optionalphase?: "exploratory" | "planning" | "active_sourcing"

      Current stage of buyer planning.

    • Optionalintent?: "planning" | "test" | "speculative" | "live_rfp"

      How seriously the buyer is evaluating supply in this cycle.

    • Optionalplanning_horizon?: DateRange
    • Optionalresponse_deadline?: string

      Deadline by which the buyer needs a seller response.

    • Optionalstatus?: "closed" | "open"

      Whether the planning cycle remains open. On calls after initial creation, omission means no status update and MUST NOT reopen or close the opportunity implicitly, except that successful create_media_buy proposal execution explicitly infers accepted closure.

    • Optionalclose_reason?:
          | "other"
          | "budget_changed"
          | "selected_alternative"
          | "accepted_with_seller"
          | "purchased_elsewhere"
          | "not_pursued"
          | "timing_changed"

      Why the opportunity closed. Required when status is closed.

    • Optionalclose_detail?: string

      Optional non-sensitive context about closure. MUST NOT identify a competitor or disclose confidential clearing terms.

    • Optionalstatus?: "closed"
    context?: ContextObject