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

    Interface LegacyCreateMediaBuySuccess

    Success response - media buy created successfully

    interface LegacyCreateMediaBuySuccess {
        proposal_id?: string;
        media_buy_id: string;
        name?: string;
        account?: Account;
        invoice_recipient?: BusinessEntity;
        media_buy_status?: MediaBuyStatus;
        confirmed_at?: string | null;
        creative_deadline?: string;
        revision?: number;
        currency?: string;
        total_budget?: number;
        daily_budget_cap?: number;
        frequency_cap?: {
            suppress?: Duration;
            suppress_minutes?: number;
            max_impressions?: number;
            per?: ReachUnit;
            window?: Duration;
        };
        budget_cap_timezone?: string;
        budget_allocation?: BudgetAllocation;
        pacing?: Pacing;
        bidding?: {
            automatic?: true;
            bid_amount?: number;
            max_bid?: number;
            cost_per?: { amount: number; strength: "cap"
            | "target" };
            roas?: { value: number; strength: "target" | "floor" };
        };
        valid_actions?: MediaBuyValidAction[];
        available_actions?: MediaBuyAvailableAction[];
        packages: {
            package_id: string;
            product_id?: string;
            audience_evidence_selections?: [
                AudienceEvidenceSelection,
                ...AudienceEvidenceSelection[],
            ];
            budget?: number;
            min_spend_target?: number;
            daily_budget_cap?: number;
            pacing?: Pacing;
            pricing_option_id?: string;
            bid_price?: number;
            bidding?: {
                automatic?: true;
                bid_amount?: number;
                max_bid?: number;
                cost_per?: { amount: number; strength: "cap"
                | "target" };
                roas?: { value: number; strength: "target" | "floor" };
            };
            price_breakdown?: PriceBreakdown;
            impressions?: number;
            catalogs?: Catalog[];
            format_ids?: LegacyFormatReferenceStructuredObject[];
            format_option_refs?: [FormatOptionReference, ...FormatOptionReference[]];
            format_kind?: CanonicalFormatKind;
            params?: {};
            targeting_overlay?: TargetingOverlay;
            targeting_resolution?: PackageTargetingResolution;
            measurement_terms?: MeasurementTerms;
            performance_standards?: [PerformanceStandard, ...PerformanceStandard[]];
            committed_metrics?: [CommittedMetric, ...CommittedMetric[]];
            creative_assignments?: CreativeAssignment[];
            formats_to_provide?: [PackageFormatSnapshot, ...PackageFormatSnapshot[]];
            formats_pending?: PackageFormatSnapshot[];
            format_ids_to_provide?: LegacyFormatReferenceStructuredObject[];
            format_ids_pending?: LegacyFormatReferenceStructuredObject[];
            optimization_goals?: [OptimizationGoal, ...OptimizationGoal[]];
            start_time?: string;
            end_time?: string;
            paused?: boolean;
            canceled?: boolean;
            cancellation?: {
                canceled_at: string;
                canceled_by: CanceledBy;
                reason?: string;
                acknowledged_at?: string;
            };
            agency_estimate_number?: string;
            creative_deadline?: string;
            context?: ContextObject;
            ext?: ExtensionObject;
        }[];
        planned_delivery?: {
            media_buy_id?: string;
            proposal_id?: string;
            proposal_terms_digest?: string;
            geo?: { countries?: string[]; regions?: string[] };
            channels?: MediaChannel[];
            start_time?: string;
            end_time?: string;
            frequency_cap?: {
                suppress?: Duration;
                suppress_minutes?: number;
                max_impressions?: number;
                per?: ReachUnit;
                window?: Duration;
            };
            audience_summary?: string;
            audience_targeting?: [AudienceSelector, ...AudienceSelector[]];
            total_budget?: number;
            daily_budget_cap?: number;
            budget_cap_timezone?: string;
            currency?: string;
            budget_allocation?: BudgetAllocation;
            pacing?: Pacing;
            bidding?: {
                automatic?: true;
                bid_amount?: number;
                max_bid?: number;
                cost_per?: { amount: number; strength: "cap" | "target" };
                roas?: { value: number; strength: "target" | "floor" };
            };
            enforced_policies?: string[];
            ext?: ExtensionObject;
        };
        warnings?: {
            code: WarningCode;
            message: string;
            affected_resource: WarningAffectedResource;
            details?: {};
            ext?: ExtensionObject;
        }[];
        sandbox?: boolean;
        context?: ContextObject;
        ext?: ExtensionObject;
    }
    Index
    proposal_id?: string

    The immutable committed proposal executed by this media buy, echoed when proposal_id was supplied in the request.

    1

    media_buy_id: string

    Seller's unique identifier for the created media buy

    name?: string

    Persisted human-readable name for this media buy. When create_media_buy supplied name, the seller MUST echo it unchanged here. This display label is shared for trafficking UI display and operational communication; it is not an identifier or financial reference.

    1

    255

    \S

    account?: Account
    invoice_recipient?: BusinessEntity
    media_buy_status?: MediaBuyStatus
    confirmed_at?: string | null

    ISO 8601 timestamp when this media buy was committed by the seller. Stable after it is set; do not update on later pause/resume/status/reporting transitions. May be null in deferred or manual-approval flows until seller commitment occurs.

    date-time

    creative_deadline?: string

    ISO 8601 timestamp for creative upload deadline

    date-time

    revision?: number

    Initial revision number for this media buy. Use in subsequent update_media_buy requests intended to change state for optimistic concurrency.

    1

    int

    currency?: string

    Single ISO 4217 currency code for total_budget, package budget constraints, and canonical BiddingPolicy monetary fields. Every selected pricing option MUST declare this currency; packages needing another currency belong in another media buy. In proposal mode the seller derives it from total_budget.currency; in explicit-package mode the seller derives or validates one common pricing-option currency. Matches subsequent get_media_buys responses.

    ^[A-Z]{3}$

    total_budget?: number

    Hard aggregate lifetime budget, denominated in currency. The request encodes total_budget as an object {amount, currency}; this response flattens amount and promotes currency to its sibling field. Present for proposal and seller-optimized modes, and when supplied or deterministically derived in fixed explicit-package mode. Matches subsequent get_media_buys responses.

    0

    daily_budget_cap?: number

    Accepted hard aggregate daily spend ceiling, denominated in currency. Sellers MUST echo it whenever the request set an aggregate daily cap.

    0

    frequency_cap?: {
        suppress?: Duration;
        suppress_minutes?: number;
        max_impressions?: number;
        per?: ReachUnit;
        window?: Duration;
    }

    Type Declaration

    • Optionalsuppress?: Duration

      Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.

    • Optionalsuppress_minutes?: number

      Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).

    • Optionalmax_impressions?: number

      Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.

    • Optionalper?: ReachUnit

      Entity granularity for impression counting. Required when max_impressions is set.

    • Optionalwindow?: Duration

      Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.

    budget_cap_timezone?: string

    Accepted IANA timezone shared by every aggregate and package daily cap. Sellers MUST echo it whenever any daily cap is set on the media buy.

    budget_allocation?: BudgetAllocation

    Accepted cross-package allocation configuration. Omitted means fixed allocation for legacy buys.

    pacing?: Pacing
    bidding?: {
        automatic?: true;
        bid_amount?: number;
        max_bid?: number;
        cost_per?: { amount: number; strength: "cap" | "target" };
        roas?: { value: number; strength: "target" | "floor" };
    }

    Accepted media-buy-authored bidding policy with goal binding and monetary denomination preserved. Packages that inherit it omit package.bidding; explicit package policies, including {automatic:true}, remain at package scope.

    Type Declaration

    • Optionalautomatic?: true

      Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.

    • Optionalbid_amount?: number

      Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.

    • Optionalmax_bid?: number

      Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.

    • Optionalcost_per?: { amount: number; strength: "cap" | "target" }

      Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.

      • amount: number

        Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency.

      • strength: "cap" | "target"

        cap optimizes for an average at or below the amount and accepts underdelivery when necessary; target optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.

    • Optionalroas?: { value: number; strength: "target" | "floor" }

      Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.

      • value: number

        Return per unit of ad spend; 4 means 4 units of value per 1 unit spent.

      • strength: "target" | "floor"

        floor prefers underdelivery to knowingly optimizing below the requested return; target optimizes around the requested return. Neither guarantees realized return.

    valid_actions?: MediaBuyValidAction[]

    Flat-vocabulary actions the buyer can perform on this media buy after creation. Saves a round-trip to get_media_buys. Deprecated in favor of available_actions[], which carries mode, optional SLA, and in 3.2 an optional change_term_id. Sellers SHOULD populate both during the 3.x deprecation window; consumers MUST prefer available_actions[] when both are present. Removed in 4.0.

    available_actions?: MediaBuyAvailableAction[]

    Structured per-buy resolution of actions available immediately after creation. Authoritative — see get-media-buys-response.json for full semantics.

    packages: {
        package_id: string;
        product_id?: string;
        audience_evidence_selections?: [
            AudienceEvidenceSelection,
            ...AudienceEvidenceSelection[],
        ];
        budget?: number;
        min_spend_target?: number;
        daily_budget_cap?: number;
        pacing?: Pacing;
        pricing_option_id?: string;
        bid_price?: number;
        bidding?: {
            automatic?: true;
            bid_amount?: number;
            max_bid?: number;
            cost_per?: { amount: number; strength: "cap"
            | "target" };
            roas?: { value: number; strength: "target" | "floor" };
        };
        price_breakdown?: PriceBreakdown;
        impressions?: number;
        catalogs?: Catalog[];
        format_ids?: LegacyFormatReferenceStructuredObject[];
        format_option_refs?: [FormatOptionReference, ...FormatOptionReference[]];
        format_kind?: CanonicalFormatKind;
        params?: {};
        targeting_overlay?: TargetingOverlay;
        targeting_resolution?: PackageTargetingResolution;
        measurement_terms?: MeasurementTerms;
        performance_standards?: [PerformanceStandard, ...PerformanceStandard[]];
        committed_metrics?: [CommittedMetric, ...CommittedMetric[]];
        creative_assignments?: CreativeAssignment[];
        formats_to_provide?: [PackageFormatSnapshot, ...PackageFormatSnapshot[]];
        formats_pending?: PackageFormatSnapshot[];
        format_ids_to_provide?: LegacyFormatReferenceStructuredObject[];
        format_ids_pending?: LegacyFormatReferenceStructuredObject[];
        optimization_goals?: [OptimizationGoal, ...OptimizationGoal[]];
        start_time?: string;
        end_time?: string;
        paused?: boolean;
        canceled?: boolean;
        cancellation?: {
            canceled_at: string;
            canceled_by: CanceledBy;
            reason?: string;
            acknowledged_at?: string;
        };
        agency_estimate_number?: string;
        creative_deadline?: string;
        context?: ContextObject;
        ext?: ExtensionObject;
    }[]

    Array of created packages with complete state information

    Type Declaration

    • package_id: string

      Seller's unique identifier for the package

    • Optionalproduct_id?: string

      ID of the product this package is based on. For packages created from an explicit create_media_buy package request, sellers MUST echo the request package's product_id on every response package object that represents that requested package.

    • Optionalaudience_evidence_selections?: [AudienceEvidenceSelection, ...AudienceEvidenceSelection[]]

      Exact immutable audience-evidence snapshots that affected recommendation, eligibility, or package construction. A confirmed package MUST include a package_construction selection matching every buyer audience_evidence_pin and every snapshot used to satisfy package audience_evidence_requirements; this readback remains mandatory on subsequent package read surfaces. This is decision provenance only; applied targeting remains exclusively in targeting_overlay and targeting_resolution.demographics.

      1

    • Optionalbudget?: number

      Hard lifetime spend cap for this package in the media-buy currency. Every selected pricing option in an AdCP-authored media buy MUST declare that same currency. In seller-optimized allocation mode this is a ceiling, not a current allocation. May be omitted when the package is bounded only by the shared media-buy total.

    • Optionalmin_spend_target?: number

      Soft lifetime spend target accepted for this package under seller-optimized budget allocation. This is an allocation preference, not a billing or delivery guarantee.

    • Optionaldaily_budget_cap?: number

      The hard package spend ceiling per shared media-buy cap day, in the media buy's currency. Sellers MUST echo this whenever a package daily cap is set. It is a subordinate ceiling, not a reserved or current allocation; the media buy's budget_cap_timezone defines its day boundary.

    • Optionalpacing?: Pacing
    • Optionalpricing_option_id?: string

      ID of the selected pricing option from the product's pricing_options array

    • Optionalbid_price?: number

      DEPRECATED legacy bidding representation. 3.2 sellers normalize accepted legacy input and SHOULD echo bidding instead. Removed in the next major.

    • Optionalbidding?: {
          automatic?: true;
          bid_amount?: number;
          max_bid?: number;
          cost_per?: { amount: number; strength: "cap" | "target" };
          roas?: { value: number; strength: "target" | "floor" };
      }

      Package-authored bidding policy, echoed only when the buyer authored a package override. {automatic:true} is an explicit automatic-bidding override. Omission means the package inherits media-buy bidding or, when both scopes are absent, uses provider automatic delivery. Monetary fields are denominated in the media-buy currency. Sellers MUST NOT materialize inherited media-buy policy here.

      • Optionalautomatic?: true

        Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.

      • Optionalbid_amount?: number

        Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.

      • Optionalmax_bid?: number

        Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.

      • Optionalcost_per?: { amount: number; strength: "cap" | "target" }

        Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.

        • amount: number

          Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency.

        • strength: "cap" | "target"

          cap optimizes for an average at or below the amount and accepts underdelivery when necessary; target optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.

      • Optionalroas?: { value: number; strength: "target" | "floor" }

        Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.

        • value: number

          Return per unit of ad spend; 4 means 4 units of value per 1 unit spent.

        • strength: "target" | "floor"

          floor prefers underdelivery to knowingly optimizing below the requested return; target optimizes around the requested return. Neither guarantees realized return.

    • Optionalprice_breakdown?: PriceBreakdown
    • Optionalimpressions?: number

      Impression goal for this package

    • Optionalcatalogs?: Catalog[]

      Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Echoed from the create_media_buy request.

    • Optionalformat_ids?: LegacyFormatReferenceStructuredObject[]

      Deprecated in AdCP 3.2; removed in AdCP 4.0. Legacy named-format IDs supplied for this package on create_media_buy. Sellers SHOULD echo this field whenever the request included it, including dual-emission cases where format_option_refs was the winning selector, so read surfaces preserve the original wire contract. Omitted means the request did not carry legacy format_ids unless the seller cannot reconstruct legacy requests created before this field was persisted.

    • Optionalformat_option_refs?: [FormatOptionReference, ...FormatOptionReference[]]

      Structured 3.1+ format option references supplied for this package on create_media_buy. Sellers SHOULD echo this field whenever the request included it. Publisher-catalog-backed options are identified by { scope: "publisher", publisher_domain, format_option_id }; product-local options are identified by { scope: "product", format_option_id } and resolve only against this package's target product. Omitted means the request did not carry format_option_refs unless the seller cannot reconstruct legacy requests created before this field was persisted.

      1

    • Optionalformat_kind?: CanonicalFormatKind
    • Optionalparams?: {}

      Parameters for the direct canonical selector in format_kind, echoed from the create_media_buy request whenever the request included it. Requires format_kind; omitted only when the request did not carry direct canonical params or when the seller cannot reconstruct legacy requests created before this field was persisted.

    • Optionaltargeting_overlay?: TargetingOverlay
    • Optionaltargeting_resolution?: PackageTargetingResolution
    • Optionalmeasurement_terms?: MeasurementTerms
    • Optionalperformance_standards?: [PerformanceStandard, ...PerformanceStandard[]]

      Agreed performance standards for this package. When any entry specifies a vendor, creatives assigned to this package MUST include corresponding tracker_script or tracker_pixel assets from that vendor.

      1

    • Optionalcommitted_metrics?: [CommittedMetric, ...CommittedMetric[]]

      The binding reporting contract for this package — what the seller has agreed to populate in delivery reports. Each entry carries an explicit committed_at timestamp, so the array also serves as the contract amendment ledger: day-1 commitments share committed_at = create_media_buy.confirmed_at; mid-flight additions carry their own timestamps. When create_media_buy.confirmed_at is null for a provisional buy, sellers MUST omit committed_metrics until commitment. The first response that sets confirmed_at MAY include the initial committed-metrics set, and each such entry's committed_at MUST equal confirmed_at. The missing_metrics field on get_media_buy_delivery reconciles against this list, filtering to entries where committed_at < reporting_period.end (a metric committed mid-flight is only audited from its commitment timestamp forward). Sellers stamp the day-1 set on the create_media_buy response; mid-flight additions are appended via update_media_buy (append-only — sellers MUST reject attempts to modify or remove existing entries with validation_error, suggested code: IMMUTABLE_FIELD). Optional in v1; absence means the seller does not provide an audit-grade contract and missing_metrics falls back to the product's live available_metrics (a known audit gap — buyers SHOULD treat absence as 'no audit-grade contract' rather than 'clean delivery'). Each entry uses an explicit scope discriminator: standard for entries from the closed available-metric.json enum, vendor for vendor-defined metrics anchored on a BrandRef. Standard entries are symmetric with by_package[].metric_values; vendor entries reconcile to by_package[].vendor_metric_values; both use by_package[].missing_metrics for gaps. The atomic key remains (scope, metric_id, qualifier), with vendor identity included for vendor scope. Replaces the parallel-array design that shipped briefly in #3510.

      1

    • Optionalcreative_assignments?: CreativeAssignment[]

      Creative assets assigned to this package, including the committed package-scoped rotation policy. Omitted rotation_mode reads as weighted for backward compatibility; all assignments resolve to one effective mode, and sequential positions are unique within each package-local group.

    • Optionalformats_to_provide?: [PackageFormatSnapshot, ...PackageFormatSnapshot[]]

      Immutable canonical creative contracts established for this package. Each entry is a PackageFormatSnapshot of the selected effective Product format declaration. A package whose selected format carries tracker_execution_contract MUST retain and return this checklist even after creative coverage is complete; the live Product is never substituted for the package snapshot.

      1

    • Optionalformats_pending?: PackageFormatSnapshot[]

      PackageFormatSnapshot entries from formats_to_provide that do not yet have creative coverage through sync_creatives or inline assignment. Every entry MUST equal its formats_to_provide snapshot after RFC 8785 canonicalization and, when product_snapshot_digest is present, carry the identical digest. An empty emitted array means every required format is covered. Absence means readiness was not reported.

    • Optionalformat_ids_to_provide?: LegacyFormatReferenceStructuredObject[]

      DEPRECATED in 3.2. Legacy named-format projection of formats_to_provide retained for older 3.x peers. New sellers emit canonical formats_to_provide declarations.

    • Optionalformat_ids_pending?: LegacyFormatReferenceStructuredObject[]

      DEPRECATED in 3.2. Legacy named-format projection of formats_pending retained for older 3.x peers. New sellers emit canonical formats_pending declarations. An empty emitted array means every projected requirement is covered. Absence means legacy readiness was not reported and MUST NOT be interpreted as full coverage.

    • Optionaloptimization_goals?: [OptimizationGoal, ...OptimizationGoal[]]

      Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.

      1

    • Optionalstart_time?: string

      Flight start date/time for this package in ISO 8601 format. When omitted, the package inherits the media buy's start_time. Sellers SHOULD always include the resolved value in responses, even when inherited.

    • Optionalend_time?: string

      Flight end date/time for this package in ISO 8601 format. When omitted, the package inherits the media buy's end_time. Sellers SHOULD always include the resolved value in responses, even when inherited.

    • Optionalpaused?: boolean

      Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false.

    • Optionalcanceled?: boolean

      Whether this package has been canceled. Canceled packages stop delivery and cannot be reactivated. Defaults to false.

    • Optionalcancellation?: {
          canceled_at: string;
          canceled_by: CanceledBy;
          reason?: string;
          acknowledged_at?: string;
      }

      Cancellation metadata. Present only when canceled is true.

      • canceled_at: string

        ISO 8601 timestamp when this package was canceled.

      • canceled_by: CanceledBy
      • Optionalreason?: string

        Reason the package was canceled.

      • Optionalacknowledged_at?: string

        ISO 8601 timestamp when the seller acknowledged the cancellation. Confirms inventory has been released and billing stopped. Absent until the seller processes the cancellation.

    • Optionalagency_estimate_number?: string

      Agency estimate or authorization number for this package. Echoed from the buyer's request. When present on the package, takes precedence over the media buy-level estimate number.

    • Optionalcreative_deadline?: string

      ISO 8601 timestamp for creative upload or change deadline for this package. After this deadline, creative changes are rejected. When absent, the media buy's creative_deadline applies.

    • Optionalcontext?: ContextObject
    • Optionalext?: ExtensionObject
    planned_delivery?: {
        media_buy_id?: string;
        proposal_id?: string;
        proposal_terms_digest?: string;
        geo?: { countries?: string[]; regions?: string[] };
        channels?: MediaChannel[];
        start_time?: string;
        end_time?: string;
        frequency_cap?: {
            suppress?: Duration;
            suppress_minutes?: number;
            max_impressions?: number;
            per?: ReachUnit;
            window?: Duration;
        };
        audience_summary?: string;
        audience_targeting?: [AudienceSelector, ...AudienceSelector[]];
        total_budget?: number;
        daily_budget_cap?: number;
        budget_cap_timezone?: string;
        currency?: string;
        budget_allocation?: BudgetAllocation;
        pacing?: Pacing;
        bidding?: {
            automatic?: true;
            bid_amount?: number;
            max_bid?: number;
            cost_per?: { amount: number; strength: "cap" | "target" };
            roas?: { value: number; strength: "target" | "floor" };
        };
        enforced_policies?: string[];
        ext?: ExtensionObject;
    }

    Type Declaration

    • Optionalmedia_buy_id?: string

      Seller-assigned media buy identifier. Optional on a purchase-phase prepare/check because the service may not assign the identifier until commit; required on modification and delivery lifecycle checks.

    • Optionalproposal_id?: string

      Proposal snapshot being executed or currently governing the MediaBuy.

    • Optionalproposal_terms_digest?: string

      Digest of the proposal commercial_terms. The governance agent compares it to the digest bound during the intent check.

    • Optionalgeo?: { countries?: string[]; regions?: string[] }

      Geographic targeting the seller will apply.

      • Optionalcountries?: string[]

        ISO 3166-1 alpha-2 country codes where ads will deliver.

      • Optionalregions?: string[]

        ISO 3166-2 subdivision codes where ads will deliver.

    • Optionalchannels?: MediaChannel[]

      Channels the seller will deliver on.

    • Optionalstart_time?: string

      Actual flight start the seller will use.

    • Optionalend_time?: string

      Actual flight end the seller will use.

    • Optionalfrequency_cap?: {
          suppress?: Duration;
          suppress_minutes?: number;
          max_impressions?: number;
          per?: ReachUnit;
          window?: Duration;
      }
      • Optionalsuppress?: Duration

        Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.

      • Optionalsuppress_minutes?: number

        Deprecated — use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).

      • Optionalmax_impressions?: number

        Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.

      • Optionalper?: ReachUnit

        Entity granularity for impression counting. Required when max_impressions is set.

      • Optionalwindow?: Duration

        Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.

    • Optionalaudience_summary?: string

      Human-readable summary of the audience the seller will target.

    • Optionalaudience_targeting?: [AudienceSelector, ...AudienceSelector[]]

      Structured audience targeting the seller will activate. Each entry is either a signal reference or a descriptive criterion. When present, governance agents MUST use this for bias/fairness validation and SHOULD ignore audience_summary for validation purposes. The audience_summary field is a human-readable rendering of this array, not an independent declaration.

      1

    • Optionaltotal_budget?: number

      Total budget the seller will deliver against.

    • Optionaldaily_budget_cap?: number

      Hard aggregate daily spend ceiling the seller will enforce. Governance checks compare it with the authorized execution controls; it does not allocate spend to packages.

    • Optionalbudget_cap_timezone?: string

      IANA timezone defining the calendar-day boundary for every daily cap on the planned media buy.

    • Optionalcurrency?: string

      ISO 4217 currency code for the budget. Governance execution checks require it whenever total_budget is present and require it to match the intent-authorized currency.

    • Optionalbudget_allocation?: BudgetAllocation

      Seller-accepted cross-package allocation authority and goals. Presence with seller_optimized mode means automatic within-buy reallocations are part of the committed delivery, not separate modification actions.

    • Optionalpacing?: Pacing
    • Optionalbidding?: {
          automatic?: true;
          bid_amount?: number;
          max_bid?: number;
          cost_per?: { amount: number; strength: "cap" | "target" };
          roas?: { value: number; strength: "target" | "floor" };
      }

      Seller-interpreted media-buy bidding policy used for governance and delivery transparency. Goal-bound controls follow budget-allocation scope semantics and monetary fields use the planned delivery currency. Package-authored overrides, including explicit automatic overrides, remain on packages rather than being copied into this aggregate field.

      • Optionalautomatic?: true

        Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.

      • Optionalbid_amount?: number

        Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.

      • Optionalmax_bid?: number

        Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.

      • Optionalcost_per?: { amount: number; strength: "cap" | "target" }

        Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.

        • amount: number

          Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency.

        • strength: "cap" | "target"

          cap optimizes for an average at or below the amount and accepts underdelivery when necessary; target optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.

      • Optionalroas?: { value: number; strength: "target" | "floor" }

        Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.

        • value: number

          Return per unit of ad spend; 4 means 4 units of value per 1 unit spent.

        • strength: "target" | "floor"

          floor prefers underdelivery to knowingly optimizing below the requested return; target optimizes around the requested return. Neither guarantees realized return.

    • Optionalenforced_policies?: string[]

      Registry policy IDs the seller will enforce for this delivery.

    • Optionalext?: ExtensionObject
    warnings?: {
        code: WarningCode;
        message: string;
        affected_resource: WarningAffectedResource;
        details?: {};
        ext?: ExtensionObject;
    }[]

    Optional non-blocking observations accompanying this successful creation. The media buy was still created. Buyers SHOULD surface recognized codes operationally rather than treating this as an error; continuing conditions also appear on get_media_buys as current resource state.

    Type Declaration

    • code: WarningCode
    • message: string

      Short human-readable explanation. Treat as untrusted seller text and do not require buyers to parse it for routing.

    • affected_resource: WarningAffectedResource
    • Optionaldetails?: {}

      Optional seller-specific structured diagnostics. AdCP 3.2 defines interoperability through code and affected_resource only; buyers MUST NOT require portable keys inside details. Seller extensions that are not direct diagnostics belong in ext.

    • Optionalext?: ExtensionObject
    sandbox?: boolean

    When true, this response contains simulated data from sandbox mode.

    context?: ContextObject