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

    Interface LegacyGetMediaBuyDeliveryResponse

    Response payload for get_media_buy_delivery task

    interface LegacyGetMediaBuyDeliveryResponse {
        context_id?: string;
        context?: ContextObject;
        task_id?: string;
        status: TaskStatus;
        message?: string;
        timestamp?: string;
        replayed?: boolean;
        adcp_error?: Error;
        push_notification_config?: PushNotificationConfig;
        governance_context?: string;
        payload?: {};
        adcp_version?: string;
        adcp_major_version?: number;
        notification_type?:
            | "scheduled"
            | "final"
            | "delayed"
            | "adjusted"
            | "window_update";
        partial_data?: boolean;
        unavailable_count?: number;
        sequence_number?: number;
        next_expected_at?: string;
        reporting_period: { start: string; end: string; timezone?: string };
        reporting_revision_binding?: {
            reporting_revision_id: string;
            row_count: number;
            control_totals: ReportingControlTotal[];
            content_sha256: string;
        };
        reporting_revision?: {
            reporting_revision_id: string;
            revision_content_sha256: string;
            report_definition_id: string;
            report_definition_uri: string;
            report_definition_sha256: string;
            reporting_profile: string;
            schema_version: string;
            schema_uri: string;
            schema_sha256: string;
            schema_dialect: "https://json-schema.org/draft/2020-12/schema";
            schema_ref_policy: "local_fragment_only";
            account_id: string;
            media_buy_ids: string[];
            coverage: ReportingCoverage;
            period: { start: string; end: string; source_timezone: string };
            finality: ReportingFinality;
            finality_basis?: "source_final" | "contractual_cutoff" | "stabilized";
            finality_policy_id?: string;
            finalized_at?: string;
            observed_at: string;
            data_through: string | null;
            data_through_precision: "unknown" | "exact" | "lower_bound";
            supersedes_reporting_revision_id?: string;
            row_count: number;
            control_totals: ReportingControlTotal[];
            canonical_content_digest?: ReportingCanonicalContentDigest;
            created_at: string;
        };
        reporting_rows?: {}[];
        pagination?: PaginationResponse;
        currency?: string;
        attribution_window?: AttributionWindow;
        aggregated_totals?: {
            impressions: number;
            spend: number;
            clicks?: number;
            completed_views?: number;
            views?: number;
            conversions?: number;
            conversion_value?: number;
            commissionable_value?: number;
            roas?: number;
            new_to_brand_rate?: number;
            cost_per_acquisition?: number;
            completion_rate?: number
            | null;
            reach?: number;
            reach_aggregation?: ReachAggregation;
            reach_unit?: ReachUnit;
            frequency?: number;
            media_buy_count: number;
            metric_aggregates?: DeliveryMetricAggregate[];
        };
        media_buy_deliveries: {
            media_buy_id: string;
            currency?: string;
            status: | "active"
            | "rejected"
            | "failed"
            | "pending"
            | "completed"
            | "pending_creatives"
            | "pending_start"
            | "paused"
            | "canceled"
            | "reporting_delayed";
            expected_availability?: string;
            is_adjusted?: boolean;
            is_final?: boolean;
            finalized_at?: string;
            pricing_model?: PricingModel;
            pacing_index?: number;
            totals: DeliveryMetrics & { effective_rate?: number };
            by_package: (
                DeliveryMetrics & {
                    package_id: string;
                    pacing_index?: number;
                    pricing_model?: PricingModel;
                    rate?: number;
                    currency?: string;
                    delivery_status?: DeliveryStatus;
                    paused?: boolean;
                    is_final?: boolean;
                    finalized_at?: string;
                    measurement_window?: string;
                    supersedes_window?: string;
                    missing_metrics?: MissingMetric[];
                    metric_values?: PackageDeliveryMetricValue[];
                    by_catalog_item?: GetMediaBuyDeliveryCatalogItemMetrics[];
                    by_catalog_item_truncated?: boolean;
                    by_catalog_item_sorted_by?: SortMetric;
                    by_catalog_item_sort_direction?: SortDirection;
                    by_creative?: CreativeDeliveryMetrics[];
                    by_format?: (DeliveryMetrics & { format_kind: CanonicalFormatKind })[];
                    by_format_truncated?: boolean;
                    by_format_sorted_by?: SortMetric;
                    by_format_sort_direction?: SortDirection;
                    by_creative_truncated?: boolean;
                    by_creative_sorted_by?: SortMetric;
                    by_creative_sort_direction?: SortDirection;
                    by_keyword?: GetMediaBuyDeliveryKeywordMetrics[];
                    by_keyword_truncated?: boolean;
                    by_keyword_sorted_by?: SortMetric;
                    by_keyword_sort_direction?: SortDirection;
                    by_geo?: GetMediaBuyDeliveryGeoMetrics[];
                    by_geo_truncated?: boolean;
                    by_geo_sorted_by?: SortMetric;
                    by_geo_sort_direction?: SortDirection;
                    by_device_type?: GetMediaBuyDeliveryDeviceTypeMetrics[];
                    by_device_type_truncated?: boolean;
                    by_device_type_sorted_by?: SortMetric;
                    by_device_type_sort_direction?: SortDirection;
                    by_device_type_pagination?: PaginationResponse;
                    by_device_platform?: GetMediaBuyDeliveryDevicePlatformMetrics[];
                    by_device_platform_truncated?: boolean;
                    by_device_platform_sorted_by?: SortMetric;
                    by_device_platform_sort_direction?: SortDirection;
                    by_device_platform_pagination?: PaginationResponse;
                    by_audience?: GetMediaBuyDeliveryAudienceMetrics[];
                    by_audience_truncated?: boolean;
                    by_audience_sorted_by?: SortMetric;
                    by_audience_sort_direction?: SortDirection;
                    by_audience_pagination?: PaginationResponse;
                    by_demographic?: (
                        DeliveryMetrics & {
                            demographic: string;
                            demographic_system: DemographicSystem;
                            age?: { min?: ...; max?: ...; include_unknown: ... };
                        }
                    )[];
                    by_demographic_truncated?: boolean;
                    by_demographic_sorted_by?: SortMetric;
                    by_demographic_sort_direction?: SortDirection;
                    by_demographic_suppressed?: boolean;
                    by_placement?: GetMediaBuyDeliveryPlacementMetrics[];
                    by_placement_truncated?: boolean;
                    by_placement_sorted_by?: SortMetric;
                    by_placement_sort_direction?: SortDirection;
                    by_placement_pagination?: PaginationResponse;
                    by_property?: PropertyDeliveryMetrics[];
                    by_property_truncated?: boolean;
                    by_property_suppressed?: boolean;
                    by_property_sorted_by?: SortMetric;
                    by_property_sort_direction?: SortDirection;
                    by_collection?: CollectionDeliveryMetrics[];
                    by_collection_truncated?: boolean;
                    by_collection_sorted_by?: SortMetric;
                    by_collection_sort_direction?: SortDirection;
                    by_installment?: InstallmentDeliveryMetrics[];
                    by_installment_truncated?: boolean;
                    by_installment_sorted_by?: SortMetric;
                    by_installment_sort_direction?: SortDirection;
                    by_collection_property?: CollectionPropertyDeliveryMetrics[];
                    by_collection_property_truncated?: boolean;
                    by_collection_property_suppressed?: boolean;
                    by_collection_property_sorted_by?: SortMetric;
                    by_collection_property_sort_direction?: SortDirection;
                    by_installment_property?: InstallmentPropertyDeliveryMetrics[];
                    by_installment_property_truncated?: boolean;
                    by_installment_property_suppressed?: boolean;
                    by_installment_property_sorted_by?: SortMetric;
                    by_installment_property_sort_direction?: SortDirection;
                    by_placement_property?: PlacementPropertyDeliveryMetrics[];
                    by_placement_property_truncated?: boolean;
                    by_placement_property_suppressed?: boolean;
                    by_placement_property_sorted_by?: SortMetric;
                    by_placement_property_sort_direction?: SortDirection;
                    by_spot?: (
                        DeliveryMetrics & {
                            spot_id: string;
                            creative_id?: string;
                            aired_at: string;
                            network?: string;
                            station?: string;
                            daypart?: string;
                        }
                    )[];
                    by_spot_truncated?: boolean;
                    daily_breakdown?: {
                        date: string;
                        impressions: number;
                        spend: number;
                        conversions?: number;
                        conversion_value?: number;
                        commissionable_value?: number;
                        roas?: number;
                        new_to_brand_rate?: number;
                    }[];
                }
            )[];
            windows?: {
                window_start: string;
                window_end: string;
                totals: DeliveryMetrics;
                by_package?: (
                    DeliveryMetrics & { package_id: string; currency?: string }
                )[];
                is_final?: boolean;
                measurement_window?: string;
            }[];
            daily_breakdown?: {
                date: string;
                impressions: number;
                spend: number;
                conversions?: number;
                conversion_value?: number;
                commissionable_value?: number;
                roas?: number;
                new_to_brand_rate?: number;
            }[];
        }[];
        errors?: Error[];
        sandbox?: boolean;
        ext?: ExtensionObject;
    }
    Index
    context_id?: string

    Transport-managed conversation identifier. On A2A, this maps to the native Message/Task contextId used to associate messages with a conversation; it is not carried inside the AdCP DataPart. On MCP, a request-body context_id, where admitted by the selected request schema, is a compatibility-only field: servers MUST ignore it, callers MUST NOT rely on it for continuity, and it MUST NOT select session state, identity, account, authorization, task continuation, or idempotency scope. MCP continuity, if provided, comes from the transport session. Distinct from context (per-request opaque echo, see below) and from task_id (AdCP operation tracking).

    context?: ContextObject
    task_id?: string

    Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.

    status: TaskStatus
    message?: string

    Human-readable summary of the task result. Provides natural language explanation of what happened, suitable for display to end users or for AI agent comprehension. Generated by the protocol layer based on the task response.

    timestamp?: string

    ISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.

    replayed?: boolean

    Set to true when this response was returned from the idempotency cache rather than from a fresh execution. Set to false (or omitted) when the request was executed fresh. Buyers use this to distinguish cached replays from new executions — matters for billing reconciliation, audit logs, state-machine routing (cached state-tracking fields are historical snapshots, not current state — re-read via the resource's read endpoint), and any downstream system that assumes exactly-once event semantics. replayed appears only when the request actually resolved through the idempotency cache. Pure reads may ignore an optional idempotency_key; when a seller voluntarily caches keyed reads, those responses use the same replay indicator and full cache contract.

    adcp_error?: Error
    push_notification_config?: PushNotificationConfig
    governance_context?: string

    Opaque authorization context issued only by an approved check_governance decision. Buyers attach it to governed requests across protocol roles (media buys, rights acquisitions, signal activations, creative services); receiving services persist it and forward it on subsequent execution and lifecycle checks. The context is the authoritative plan binding at service boundaries, so a service MUST NOT require a separate plan_id.

    Governance agents MUST emit a compact JWS per the AdCP JWS profile. Verifiers validate standard authorization claims such as signature, issuer, audience, expiry, and replay protection, but intermediaries MUST NOT interpret embedded governance state for business logic. A conditions or denied verdict never carries an authorization context.

    This is the primary correlation key for audit and reporting across the governance lifecycle.

    payload?: {}

    Conceptual grouping for the task-specific response data defined by individual task response schemas (e.g., get-products-response.json, create-media-buy-response.json). payload is a documentary construct — it is NOT a required wire field, and its on-the-wire shape depends on transport (see Transport serialization below). Task response schemas declare body fields without wrapping them in a payload object; the wire representation places those body fields per transport convention. On MCP the body fields appear as siblings of envelope fields at the root of the tool response; on A2A they appear inside task.artifacts[0].parts[].DataPart; on REST they appear at the root of the JSON body.

    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.

    notification_type?:
        | "scheduled"
        | "final"
        | "delayed"
        | "adjusted"
        | "window_update"

    Type of webhook notification (only present in webhook deliveries): scheduled = regular periodic update, final = campaign completed, delayed = data not yet available, adjusted = resending period with corrected data (same window), window_update = resending period with a wider measurement window (e.g., C3 superseding live, C7 superseding C3)

    partial_data?: boolean

    Indicates if any media buys in this webhook have missing/delayed data (only present in webhook deliveries)

    unavailable_count?: number

    Number of media buys with reporting_delayed or failed status (only present in webhook deliveries when partial_data is true)

    0

    int

    sequence_number?: number

    Sequential notification number (only present in webhook deliveries, starts at 1)

    1

    int

    next_expected_at?: string

    ISO 8601 timestamp for next expected notification (only present in webhook deliveries when notification_type is not 'final')

    date-time

    reporting_period: { start: string; end: string; timezone?: string }

    Half-open period for the report: start is inclusive and end is exclusive. Both are instants. For a date-bounded request they are the instants at which start_date and end_date begin in the reporting timezone (the in-scope products' reporting_capabilities.timezone, echoed in timezone). They fall on UTC midnight only when that timezone is UTC. An exact reporting_revision_id read returns the revision's period instead, whose source_timezone names its calendar.

    Type Declaration

    • start: string

      Inclusive RFC 3339 start instant. For a date-bounded request, the start of start_date in the reporting timezone, written with that zone's UTC offset or as the equivalent UTC instant (e.g., 2026-04-15T00:00:00-04:00 or 2026-04-15T04:00:00Z for America/New_York; 2026-04-15T00:00:00Z for UTC).

      date-time

    • end: string

      Exclusive RFC 3339 end instant. For a date-bounded request, the start of end_date in the reporting timezone (e.g., 2026-04-16T00:00:00-04:00 for a report covering 2026-04-15 in America/New_York).

      date-time

    • Optionaltimezone?: string

      Reporting timezone applied to this report, as 'UTC' or an IANA timezone identifier. It equals the in-scope products' reporting_capabilities.timezone. start_date, end_date, the reporting_period boundaries, daily_breakdown[].date, and daily, weekly, or monthly windows[] all use it, so a stored report stays interpretable if the product's capability later changes. Sellers SHOULD return it on reads without reporting_revision_id whenever every in-scope media buy shares one reporting timezone. Exact reporting_revision_id reads return the revision period, which carries source_timezone instead.

      1

    reporting_revision_binding?: {
        reporting_revision_id: string;
        row_count: number;
        control_totals: ReportingControlTotal[];
        content_sha256: string;
    }

    Present only for a reporting_revision_id selector. Binds the complete ordered reporting_rows sequence obtained by concatenating every cursor page to one immutable Reliable Reporting revision; consumers verify content_sha256 over RFC 8785 JCS of {reporting_revision_id,row_count,control_totals,reporting_rows} before using it as revision evidence.

    Type Declaration

    • reporting_revision_id: string

      1

      255

    • row_count: number

      0

      int

    • control_totals: ReportingControlTotal[]
    • content_sha256: string

      SHA-256 of RFC 8785 JCS of {reporting_revision_id,row_count,control_totals,reporting_rows}, where reporting_rows is the complete ordered sequence concatenated across every cursor page; identical to reporting_revision.revision_content_sha256.

      ^[A-Fa-f0-9]{64}$

    reporting_revision?: {
        reporting_revision_id: string;
        revision_content_sha256: string;
        report_definition_id: string;
        report_definition_uri: string;
        report_definition_sha256: string;
        reporting_profile: string;
        schema_version: string;
        schema_uri: string;
        schema_sha256: string;
        schema_dialect: "https://json-schema.org/draft/2020-12/schema";
        schema_ref_policy: "local_fragment_only";
        account_id: string;
        media_buy_ids: string[];
        coverage: ReportingCoverage;
        period: { start: string; end: string; source_timezone: string };
        finality: ReportingFinality;
        finality_basis?: "source_final" | "contractual_cutoff" | "stabilized";
        finality_policy_id?: string;
        finalized_at?: string;
        observed_at: string;
        data_through: string | null;
        data_through_precision: "unknown" | "exact" | "lower_bound";
        supersedes_reporting_revision_id?: string;
        row_count: number;
        control_totals: ReportingControlTotal[];
        canonical_content_digest?: ReportingCanonicalContentDigest;
        created_at: string;
    }

    Type Declaration

    • reporting_revision_id: string

      Portable AdCP identity for this immutable report publication. Distinct from package delivery_revision_id and provider-native versions.

    • revision_content_sha256: string

      SHA-256 of the immutable RFC 8785 JCS binding object containing reporting_revision_id, row_count, control_totals, and reporting_rows. Reliable Reporting 1.0 Core revisions include it and exact reads return the identical value.

    • report_definition_id: string

      Identity or canonical fingerprint of immutable metric, grain, attribution, breakdown, action-definition, profile, and calendar/timezone semantics.

    • report_definition_uri: string
    • report_definition_sha256: string
    • reporting_profile: string
    • schema_version: string
    • schema_uri: string

      Machine-readable schema on the authenticated seller/provider or AdCP-registry origin.

    • schema_sha256: string

      Digest of the exact schema bytes used to validate this immutable revision.

    • schema_dialect: "https://json-schema.org/draft/2020-12/schema"

      Closed SDK-bundled dialect; the metaschema is never network-fetched.

    • schema_ref_policy: "local_fragment_only"

      The fetched schema is self-contained and every $ref is a local # fragment.

    • account_id: string
    • media_buy_ids: string[]

      Exact frozen media-buy denominator inherited from the obligation, including buys with zero rows. An empty array proves a zero-buy period rather than an unknown denominator.

    • coverage: ReportingCoverage
    • period: { start: string; end: string; source_timezone: string }

      Half-open reporting interval with its source calendar boundary.

    • finality: ReportingFinality
    • Optionalfinality_basis?: "source_final" | "contractual_cutoff" | "stabilized"

      Why an official revision is considered final: an authoritative source signal, a versioned contractual cutoff, or a versioned stabilization rule.

    • Optionalfinality_policy_id?: string

      Immutable policy/version reference that defines the selected finality basis. It MUST be bound by report_definition_id.

    • Optionalfinalized_at?: string

      When the producer applied the declared finality basis to this official revision.

    • observed_at: string

      When the seller obtained or committed this source observation.

    • data_through: string | null

      Latest event time conservatively included, or null when precision is unknown.

    • data_through_precision: "unknown" | "exact" | "lower_bound"
    • Optionalsupersedes_reporting_revision_id?: string

      Immediately superseded snapshot revision of the same logical slice. An official revision is terminal and MUST NOT be named here; later corrections use reporting-adjustment records.

    • row_count: number

      Logical row count, including zero for a successfully evaluated empty report.

    • control_totals: ReportingControlTotal[]

      Profile-defined totals computed from the canonical logical revision. Names MUST be unique.

    • Optionalcanonical_content_digest?: ReportingCanonicalContentDigest
    • created_at: string
    reporting_rows?: {}[]

    One page of authoritative logical rows for an exact reporting_revision_id read. Validate every row against the revision's digest-pinned schema; concatenate pages in cursor order before verifying the binding digest.

    pagination?: PaginationResponse
    currency?: string

    Deprecated in AdCP 3.2 and removed in AdCP 4.0. Optional legacy response-wide ISO 4217 currency code. It may be used only when every monetary value in the response has that denomination. A delivery response can contain media buys with different currencies, so buyers MUST NOT interpret this field as an aggregation currency or evidence of currency conversion. Prefer media_buy_deliveries[].currency when present and package-level currency otherwise.

    ^[A-Z]{3}$

    attribution_window?: AttributionWindow
    aggregated_totals?: {
        impressions: number;
        spend: number;
        clicks?: number;
        completed_views?: number;
        views?: number;
        conversions?: number;
        conversion_value?: number;
        commissionable_value?: number;
        roas?: number;
        new_to_brand_rate?: number;
        cost_per_acquisition?: number;
        completion_rate?: number | null;
        reach?: number;
        reach_aggregation?: ReachAggregation;
        reach_unit?: ReachUnit;
        frequency?: number;
        media_buy_count: number;
        metric_aggregates?: DeliveryMetricAggregate[];
    }

    Type Declaration

    • impressions: number

      Total impressions delivered across all media buys

      0

    • spend: number

      Total amount spent across all media buys

      0

    • Optionalclicks?: number

      Total clicks across all media buys (if applicable)

      0

    • Optionalcompleted_views?: number

      Total audio/video completions across all media buys (if applicable)

      0

    • Optionalviews?: number

      Total views across all media buys (if applicable)

      0

    • Optionalconversions?: number

      Total conversions across all media buys (if applicable)

      0

    • Optionalconversion_value?: number

      Total conversion value across all media buys (if applicable)

      0

    • Optionalcommissionable_value?: number

      Total settled conversion value eligible for revenue-share commission across all media buys (if applicable)

      0

    • Optionalroas?: number

      Aggregate return on ad spend across all media buys (total conversion_value / total spend)

      0

    • Optionalnew_to_brand_rate?: number

      Fraction of total conversions across all media buys from first-time brand buyers (weighted by conversion volume, not a simple average of per-buy rates)

      0

      1

    • Optionalcost_per_acquisition?: number

      Aggregate cost per conversion across all media buys (total spend / total conversions)

      0

    • Optionalcompletion_rate?: number | null

      Aggregate completion rate across all media buys (weighted by impressions, not a simple average of per-buy rates). Null indicates the metric is not applicable to the aggregated buys (e.g. all non-video inventory).

      0

      1

    • Optionalreach?: number

      Reach across all media buys. Only present when all media buys share the same reach_unit. Omitted when reach units are heterogeneous — use per-buy reach values instead. The optional reach_aggregation field declares whether this value is deduplicated across buys or is a sum of constituent reach values.

      0

    • Optionalreach_aggregation?: ReachAggregation

      How reach was combined across the media buys in this aggregate. When omitted, legacy reach semantics are unknown and consumers MUST NOT use reach as the denominator for frequency.

    • Optionalreach_unit?: ReachUnit

      Unit of measurement for reach. Only present when all aggregated media buys use the same reach_unit.

    • Optionalfrequency?: number

      Average frequency per reach unit across all media buys (impressions / reach). In new payloads, only present when reach is present and reach_aggregation is deduplicated. MUST be omitted when reach_aggregation is sum_of_constituent_reach. Legacy payloads that omit reach_aggregation remain schema-valid, but consumers MUST NOT treat their reach as a safe frequency denominator.

      0

    • media_buy_count: number

      Number of media buys included in the response

      0

      int

    • Optionalmetric_aggregates?: DeliveryMetricAggregate[]

      Cross-buy delivery aggregates partitioned by qualifier. Row-symmetric with package.committed_metrics and by_package[].missing_metrics — same atomic unit (scope, metric_id, qualifier) — so reconciliation collapses to a row-level join on the tuple. Granularity rule: one row per (metric_id, full-qualifier-set), reported at the finest available granularity; buyers re-aggregate up if they want a coarser view. Used only for metrics with non-empty qualifier sets — unqualified metrics (impressions, spend, media_buy_count, etc.) remain at the top of aggregated_totals. Mutual exclusion MUST: for any metric_id appearing in metric_aggregates, the corresponding top-level scalar in aggregated_totals MUST be omitted (not zeroed) — avoids duplicate sources of truth. The qualifier vocabulary on this delivery surface is closed today (additionalProperties: false, same content as committed_metrics.qualifier) but is expected to diverge from contract qualifier in future minors as transparency disclosures buyers don't commit to ship delivery-only (e.g., tracker_firing pending #3832 resolution). Each row carries a value plus inlined per-metric component fields (e.g., measurable_impressions and viewable_impressions for viewable_rate; spend and conversions for cost_per_acquisition). Per-buy totals keeps its flat shape — each buy is single-qualifier by definition; only the aggregate spans qualifiers. Qualifier-set drift across reports: when a campaign gains a new qualifier mid-flight (e.g., adds tracker_firing partitioning in week 2), prior periods' rows remain valid at their original granularity; buyers SHOULD NOT retroactively repartition.

    Deprecated in AdCP 3.2 and removed in AdCP 4.0. Legacy combined metrics across all returned media buys. When this field is present, the deprecated response-wide currency is required and denominates its spend. Cross-buy totals are unsafe when currencies, metric qualifiers, measurement windows, finality, or deduplication semantics differ. Sellers SHOULD omit this field; buyers SHOULD aggregate media_buy_deliveries[] only when the relevant row semantics are compatible.

    media_buy_deliveries: {
        media_buy_id: string;
        currency?: string;
        status:
            | "active"
            | "rejected"
            | "failed"
            | "pending"
            | "completed"
            | "pending_creatives"
            | "pending_start"
            | "paused"
            | "canceled"
            | "reporting_delayed";
        expected_availability?: string;
        is_adjusted?: boolean;
        is_final?: boolean;
        finalized_at?: string;
        pricing_model?: PricingModel;
        pacing_index?: number;
        totals: DeliveryMetrics & { effective_rate?: number };
        by_package: (
            DeliveryMetrics & {
                package_id: string;
                pacing_index?: number;
                pricing_model?: PricingModel;
                rate?: number;
                currency?: string;
                delivery_status?: DeliveryStatus;
                paused?: boolean;
                is_final?: boolean;
                finalized_at?: string;
                measurement_window?: string;
                supersedes_window?: string;
                missing_metrics?: MissingMetric[];
                metric_values?: PackageDeliveryMetricValue[];
                by_catalog_item?: GetMediaBuyDeliveryCatalogItemMetrics[];
                by_catalog_item_truncated?: boolean;
                by_catalog_item_sorted_by?: SortMetric;
                by_catalog_item_sort_direction?: SortDirection;
                by_creative?: CreativeDeliveryMetrics[];
                by_format?: (DeliveryMetrics & { format_kind: CanonicalFormatKind })[];
                by_format_truncated?: boolean;
                by_format_sorted_by?: SortMetric;
                by_format_sort_direction?: SortDirection;
                by_creative_truncated?: boolean;
                by_creative_sorted_by?: SortMetric;
                by_creative_sort_direction?: SortDirection;
                by_keyword?: GetMediaBuyDeliveryKeywordMetrics[];
                by_keyword_truncated?: boolean;
                by_keyword_sorted_by?: SortMetric;
                by_keyword_sort_direction?: SortDirection;
                by_geo?: GetMediaBuyDeliveryGeoMetrics[];
                by_geo_truncated?: boolean;
                by_geo_sorted_by?: SortMetric;
                by_geo_sort_direction?: SortDirection;
                by_device_type?: GetMediaBuyDeliveryDeviceTypeMetrics[];
                by_device_type_truncated?: boolean;
                by_device_type_sorted_by?: SortMetric;
                by_device_type_sort_direction?: SortDirection;
                by_device_type_pagination?: PaginationResponse;
                by_device_platform?: GetMediaBuyDeliveryDevicePlatformMetrics[];
                by_device_platform_truncated?: boolean;
                by_device_platform_sorted_by?: SortMetric;
                by_device_platform_sort_direction?: SortDirection;
                by_device_platform_pagination?: PaginationResponse;
                by_audience?: GetMediaBuyDeliveryAudienceMetrics[];
                by_audience_truncated?: boolean;
                by_audience_sorted_by?: SortMetric;
                by_audience_sort_direction?: SortDirection;
                by_audience_pagination?: PaginationResponse;
                by_demographic?: (
                    DeliveryMetrics & {
                        demographic: string;
                        demographic_system: DemographicSystem;
                        age?: { min?: ...; max?: ...; include_unknown: ... };
                    }
                )[];
                by_demographic_truncated?: boolean;
                by_demographic_sorted_by?: SortMetric;
                by_demographic_sort_direction?: SortDirection;
                by_demographic_suppressed?: boolean;
                by_placement?: GetMediaBuyDeliveryPlacementMetrics[];
                by_placement_truncated?: boolean;
                by_placement_sorted_by?: SortMetric;
                by_placement_sort_direction?: SortDirection;
                by_placement_pagination?: PaginationResponse;
                by_property?: PropertyDeliveryMetrics[];
                by_property_truncated?: boolean;
                by_property_suppressed?: boolean;
                by_property_sorted_by?: SortMetric;
                by_property_sort_direction?: SortDirection;
                by_collection?: CollectionDeliveryMetrics[];
                by_collection_truncated?: boolean;
                by_collection_sorted_by?: SortMetric;
                by_collection_sort_direction?: SortDirection;
                by_installment?: InstallmentDeliveryMetrics[];
                by_installment_truncated?: boolean;
                by_installment_sorted_by?: SortMetric;
                by_installment_sort_direction?: SortDirection;
                by_collection_property?: CollectionPropertyDeliveryMetrics[];
                by_collection_property_truncated?: boolean;
                by_collection_property_suppressed?: boolean;
                by_collection_property_sorted_by?: SortMetric;
                by_collection_property_sort_direction?: SortDirection;
                by_installment_property?: InstallmentPropertyDeliveryMetrics[];
                by_installment_property_truncated?: boolean;
                by_installment_property_suppressed?: boolean;
                by_installment_property_sorted_by?: SortMetric;
                by_installment_property_sort_direction?: SortDirection;
                by_placement_property?: PlacementPropertyDeliveryMetrics[];
                by_placement_property_truncated?: boolean;
                by_placement_property_suppressed?: boolean;
                by_placement_property_sorted_by?: SortMetric;
                by_placement_property_sort_direction?: SortDirection;
                by_spot?: (
                    DeliveryMetrics & {
                        spot_id: string;
                        creative_id?: string;
                        aired_at: string;
                        network?: string;
                        station?: string;
                        daypart?: string;
                    }
                )[];
                by_spot_truncated?: boolean;
                daily_breakdown?: {
                    date: string;
                    impressions: number;
                    spend: number;
                    conversions?: number;
                    conversion_value?: number;
                    commissionable_value?: number;
                    roas?: number;
                    new_to_brand_rate?: number;
                }[];
            }
        )[];
        windows?: {
            window_start: string;
            window_end: string;
            totals: DeliveryMetrics;
            by_package?: (DeliveryMetrics & { package_id: string; currency?: string })[];
            is_final?: boolean;
            measurement_window?: string;
        }[];
        daily_breakdown?: {
            date: string;
            impressions: number;
            spend: number;
            conversions?: number;
            conversion_value?: number;
            commissionable_value?: number;
            roas?: number;
            new_to_brand_rate?: number;
        }[];
    }[]

    Array of delivery data for media buys. When used in webhook notifications, may contain multiple media buys aggregated by publisher. When used in get_media_buy_delivery API responses, typically contains requested media buys.

    Type Declaration

    • media_buy_id: string

      Seller's media buy identifier

    • Optionalcurrency?: string

      ISO 4217 denomination for monetary values in this media-buy delivery row, including totals, package spend, and currency-denominated package rates. Sellers SHOULD populate this field whenever all monetary values in the row share one currency. For AdCP-authored buys it MUST equal the media-buy currency, and every by_package[].currency MUST equal it. For a legacy or externally created mixed-currency buy, omit this field, daily_breakdown, and all monetary or money-derived values from row and window totals; report those values only at package grain with each package's own currency. AdCP does not perform currency conversion.

      ^[A-Z]{3}$

    • status:
          | "active"
          | "rejected"
          | "failed"
          | "pending"
          | "completed"
          | "pending_creatives"
          | "pending_start"
          | "paused"
          | "canceled"
          | "reporting_delayed"

      Current media buy status. Lifecycle states use the same taxonomy as media-buy-status (pending_creatives, pending_start, active, paused, completed, rejected, canceled). In webhook context, reporting_delayed indicates data temporarily unavailable. pending is accepted as a legacy alias for pending_start.

    • Optionalexpected_availability?: string

      When delayed data is expected to be available (only present when status is reporting_delayed)

      date-time

    • Optionalis_adjusted?: boolean

      Indicates this delivery contains updated data for a previously reported period. Buyer should replace previous period data with these totals.

    • Optionalis_final?: boolean

      Whether this row's delivery data is final for the reporting period. The row does not carry its own measurement_window — that lives on each by_package[*] entry. Reconciliation joins on per-package measurement_window; this row-level flag is a convenience roll-up. Sellers MUST NOT emit is_final: true at the row level unless every entry in by_package has is_final: true for the same measurement_window as the buy's measurement_terms.billing_measurement.measurement_window (or for the row's natural window when no billing_measurement.measurement_window is set). On any disagreement between row-level and package-level finality, package-level is authoritative. When true, the seller considers these numbers closed and is willing to invoice on them subject to measurement_terms.billing_measurement. When false, numbers may still move as measurement matures (broadcast C3 → C7) or processing completes (IVT scrubbing, dedup). When absent, the seller does not distinguish provisional from final at the row level — consult per-package is_final.

    • Optionalfinalized_at?: string

      ISO 8601 timestamp at which this row became final. Present only when is_final: true. Anchors the buyer's reconciliation and (when later defined) dispute-window clocks against the buy's measurement_terms.billing_measurement. Computed as the latest finalized_at across the row's packages for the reconciliation window.

      date-time

    • Optionalpricing_model?: PricingModel
    • Optionalpacing_index?: number

      Aggregate media-buy delivery pace relative to the media-buy pacing plan (1.0 = on track, <1.0 = behind, >1.0 = ahead). This is the authoritative pacing signal for seller-optimized buys; package pacing indexes are subordinate diagnostics.

      0

    • totals: DeliveryMetrics & { effective_rate?: number }
    • by_package: (
          DeliveryMetrics & {
              package_id: string;
              pacing_index?: number;
              pricing_model?: PricingModel;
              rate?: number;
              currency?: string;
              delivery_status?: DeliveryStatus;
              paused?: boolean;
              is_final?: boolean;
              finalized_at?: string;
              measurement_window?: string;
              supersedes_window?: string;
              missing_metrics?: MissingMetric[];
              metric_values?: PackageDeliveryMetricValue[];
              by_catalog_item?: GetMediaBuyDeliveryCatalogItemMetrics[];
              by_catalog_item_truncated?: boolean;
              by_catalog_item_sorted_by?: SortMetric;
              by_catalog_item_sort_direction?: SortDirection;
              by_creative?: CreativeDeliveryMetrics[];
              by_format?: (DeliveryMetrics & { format_kind: CanonicalFormatKind })[];
              by_format_truncated?: boolean;
              by_format_sorted_by?: SortMetric;
              by_format_sort_direction?: SortDirection;
              by_creative_truncated?: boolean;
              by_creative_sorted_by?: SortMetric;
              by_creative_sort_direction?: SortDirection;
              by_keyword?: GetMediaBuyDeliveryKeywordMetrics[];
              by_keyword_truncated?: boolean;
              by_keyword_sorted_by?: SortMetric;
              by_keyword_sort_direction?: SortDirection;
              by_geo?: GetMediaBuyDeliveryGeoMetrics[];
              by_geo_truncated?: boolean;
              by_geo_sorted_by?: SortMetric;
              by_geo_sort_direction?: SortDirection;
              by_device_type?: GetMediaBuyDeliveryDeviceTypeMetrics[];
              by_device_type_truncated?: boolean;
              by_device_type_sorted_by?: SortMetric;
              by_device_type_sort_direction?: SortDirection;
              by_device_type_pagination?: PaginationResponse;
              by_device_platform?: GetMediaBuyDeliveryDevicePlatformMetrics[];
              by_device_platform_truncated?: boolean;
              by_device_platform_sorted_by?: SortMetric;
              by_device_platform_sort_direction?: SortDirection;
              by_device_platform_pagination?: PaginationResponse;
              by_audience?: GetMediaBuyDeliveryAudienceMetrics[];
              by_audience_truncated?: boolean;
              by_audience_sorted_by?: SortMetric;
              by_audience_sort_direction?: SortDirection;
              by_audience_pagination?: PaginationResponse;
              by_demographic?: (
                  DeliveryMetrics & {
                      demographic: string;
                      demographic_system: DemographicSystem;
                      age?: { min?: ...; max?: ...; include_unknown: ... };
                  }
              )[];
              by_demographic_truncated?: boolean;
              by_demographic_sorted_by?: SortMetric;
              by_demographic_sort_direction?: SortDirection;
              by_demographic_suppressed?: boolean;
              by_placement?: GetMediaBuyDeliveryPlacementMetrics[];
              by_placement_truncated?: boolean;
              by_placement_sorted_by?: SortMetric;
              by_placement_sort_direction?: SortDirection;
              by_placement_pagination?: PaginationResponse;
              by_property?: PropertyDeliveryMetrics[];
              by_property_truncated?: boolean;
              by_property_suppressed?: boolean;
              by_property_sorted_by?: SortMetric;
              by_property_sort_direction?: SortDirection;
              by_collection?: CollectionDeliveryMetrics[];
              by_collection_truncated?: boolean;
              by_collection_sorted_by?: SortMetric;
              by_collection_sort_direction?: SortDirection;
              by_installment?: InstallmentDeliveryMetrics[];
              by_installment_truncated?: boolean;
              by_installment_sorted_by?: SortMetric;
              by_installment_sort_direction?: SortDirection;
              by_collection_property?: CollectionPropertyDeliveryMetrics[];
              by_collection_property_truncated?: boolean;
              by_collection_property_suppressed?: boolean;
              by_collection_property_sorted_by?: SortMetric;
              by_collection_property_sort_direction?: SortDirection;
              by_installment_property?: InstallmentPropertyDeliveryMetrics[];
              by_installment_property_truncated?: boolean;
              by_installment_property_suppressed?: boolean;
              by_installment_property_sorted_by?: SortMetric;
              by_installment_property_sort_direction?: SortDirection;
              by_placement_property?: PlacementPropertyDeliveryMetrics[];
              by_placement_property_truncated?: boolean;
              by_placement_property_suppressed?: boolean;
              by_placement_property_sorted_by?: SortMetric;
              by_placement_property_sort_direction?: SortDirection;
              by_spot?: (
                  DeliveryMetrics & {
                      spot_id: string;
                      creative_id?: string;
                      aired_at: string;
                      network?: string;
                      station?: string;
                      daypart?: string;
                  }
              )[];
              by_spot_truncated?: boolean;
              daily_breakdown?: {
                  date: string;
                  impressions: number;
                  spend: number;
                  conversions?: number;
                  conversion_value?: number;
                  commissionable_value?: number;
                  roas?: number;
                  new_to_brand_rate?: number;
              }[];
          }
      )[]

      Metrics broken down by package

    • Optionalwindows?: {
          window_start: string;
          window_end: string;
          totals: DeliveryMetrics;
          by_package?: (DeliveryMetrics & { package_id: string; currency?: string })[];
          is_final?: boolean;
          measurement_window?: string;
      }[]

      Per-window delivery slices over the reporting period at the requested time_granularity. Only present when the request set time_granularity and include_window_breakdown: true. Each slice mirrors what reporting_webhook would have delivered for the same window — buyers who missed webhook fires can reconstruct identical data by reading this array. Slice rows are ordered by window_start ascending; consecutive rows are contiguous (each row's window_end equals the next row's window_start) and partition the requested date range at the chosen granularity. For a legacy or external mixed-currency media buy, monetary and money-derived values MUST be omitted from each window totals object and reported only in currency-qualified windows[].by_package rows. Sellers MUST exclude this field when time_granularity is omitted; when set, sellers MUST honor pulls at any granularity in reporting_capabilities.windowed_pull_granularities (otherwise return UNSUPPORTED_GRANULARITY). See snapshot-and-log Rule 4 for the two-paths-parity contract this surface anchors.

    • Optionaldaily_breakdown?: {
          date: string;
          impressions: number;
          spend: number;
          conversions?: number;
          conversion_value?: number;
          commissionable_value?: number;
          roas?: number;
          new_to_brand_rate?: number;
      }[]

      Day-by-day delivery for a media-buy row with one currency. Sellers MUST omit this aggregate breakdown for a legacy or externally created mixed-currency buy because these rows have no package currency field. Sellers MUST also omit this aggregate breakdown when the media buy's packages span more than one reporting timezone; package-level daily_breakdown remains, each in its own product's reporting timezone.

    errors?: Error[]

    Task-specific errors and warnings (e.g., missing delivery data, reporting platform issues)

    sandbox?: boolean

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