Optionalcontext_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).
OptionalcontextOptionaltask_Unique identifier for tracking asynchronous operations. Present when a task requires extended processing time. Used to query task status and retrieve results when complete.
OptionalmessageHuman-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.
OptionaltimestampISO 8601 timestamp when the response was generated. Useful for debugging, logging, cache validation, and tracking async operation progress.
OptionalreplayedSet 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.
Optionaladcp_Optionalpush_Optionalgovernance_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.
OptionalpayloadConceptual 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.
Optionaladcp_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.
Optionaladcp_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.
Optionalnotification_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)
Optionalpartial_Indicates if any media buys in this webhook have missing/delayed data (only present in webhook deliveries)
Optionalunavailable_Number of media buys with reporting_delayed or failed status (only present in webhook deliveries when partial_data is true)
Optionalsequence_Sequential notification number (only present in webhook deliveries, starts at 1)
Optionalnext_ISO 8601 timestamp for next expected notification (only present in webhook deliveries when notification_type is not 'final')
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.
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).
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).
Optionaltimezone?: stringReporting 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.
Optionalreporting_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.
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.
Optionalreporting_Portable AdCP identity for this immutable report publication. Distinct from package delivery_revision_id and provider-native versions.
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.
Identity or canonical fingerprint of immutable metric, grain, attribution, breakdown, action-definition, profile, and calendar/timezone semantics.
Machine-readable schema on the authenticated seller/provider or AdCP-registry origin.
Digest of the exact schema bytes used to validate this immutable revision.
Closed SDK-bundled dialect; the metaschema is never network-fetched.
The fetched schema is self-contained and every $ref is a local # fragment.
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.
Half-open reporting interval with its source calendar boundary.
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?: stringImmutable policy/version reference that defines the selected finality basis. It MUST be bound by report_definition_id.
Optionalfinalized_at?: stringWhen the producer applied the declared finality basis to this official revision.
When the seller obtained or committed this source observation.
Latest event time conservatively included, or null when precision is unknown.
Optionalsupersedes_reporting_revision_id?: stringImmediately 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.
Logical row count, including zero for a successfully evaluated empty report.
Profile-defined totals computed from the canonical logical revision. Names MUST be unique.
Optionalcanonical_content_digest?: ReportingCanonicalContentDigestOptionalreporting_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.
OptionalpaginationOptionalcurrencyDeprecated 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.
Optionalattribution_Optionalaggregated_Total impressions delivered across all media buys
Total amount spent across all media buys
Optionalclicks?: numberTotal clicks across all media buys (if applicable)
Optionalcompleted_views?: numberTotal audio/video completions across all media buys (if applicable)
Optionalviews?: numberTotal views across all media buys (if applicable)
Optionalconversions?: numberTotal conversions across all media buys (if applicable)
Optionalconversion_value?: numberTotal conversion value across all media buys (if applicable)
Optionalcommissionable_value?: numberTotal settled conversion value eligible for revenue-share commission across all media buys (if applicable)
Optionalroas?: numberAggregate return on ad spend across all media buys (total conversion_value / total spend)
Optionalnew_to_brand_rate?: numberFraction of total conversions across all media buys from first-time brand buyers (weighted by conversion volume, not a simple average of per-buy rates)
Optionalcost_per_acquisition?: numberAggregate cost per conversion across all media buys (total spend / total conversions)
Optionalcompletion_rate?: number | nullAggregate 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).
Optionalreach?: numberReach 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.
Optionalreach_aggregation?: ReachAggregationHow 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?: ReachUnitUnit of measurement for reach. Only present when all aggregated media buys use the same reach_unit.
Optionalfrequency?: numberAverage 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.
Number of media buys included in the response
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.
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.
Seller's media buy identifier
Optionalcurrency?: stringISO 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.
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?: stringWhen delayed data is expected to be available (only present when status is reporting_delayed)
Optionalis_adjusted?: booleanIndicates this delivery contains updated data for a previously reported period. Buyer should replace previous period data with these totals.
Optionalis_final?: booleanWhether 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?: stringISO 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.
Optionalpricing_model?: PricingModelOptionalpacing_index?: numberAggregate 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.
Metrics broken down by package
Optionalwindows?: {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?: {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.
OptionalerrorsTask-specific errors and warnings (e.g., missing delivery data, reporting platform issues)
OptionalsandboxWhen true, this response contains simulated data from sandbox mode.
Optionalext
Response payload for get_media_buy_delivery task