Optionalcontext?: Omit<Omit<{}, "bank">, "authentication"> & { authentication?: unknown }Optionalgovernance_context?: stringOptionalnotification_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)
Optionalpartial_data?: booleanIndicates if any media buys in this webhook have missing/delayed data (only present in webhook deliveries)
Optionalunavailable_count?: numberNumber of media buys with reporting_delayed or failed status (only present in webhook deliveries when partial_data is true)
Optionalsequence_number?: numberSequential notification number (only present in webhook deliveries, starts at 1)
Optionalnext_expected_at?: stringISO 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_revision_binding?: {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_revision?: {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.
Exact media-buy denominator, including unsupported and unknown buys. An empty array is an explicitly evaluated zero-buy scope.
Exact package denominator for the evaluated media buys.
Stable reasons that some requested scope is not covered by the exact selected offering. These are capability facts, not delivery failures.
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?: {Location of the exact immutable canonicalization contract. Consumers verify canonicalization_sha256 before applying it.
Optionalreporting_rows?: (Omit<Omit<{}, "bank">, "authentication"> & { authentication?: unknown })[]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.
Optionalpagination?: { has_more: boolean; cursor?: string; total_count?: number }Whether more results are available beyond this page
Optionalcursor?: stringOpaque cursor to pass in the next request to fetch the next page. Only present when has_more is true.
Optionaltotal_count?: numberTotal number of items matching the query across all pages. Optional because not all backends can efficiently compute this.
Optionalcurrency?: stringDeprecated 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_window?: {Optionalpost_click?: {Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.
Number of time units. Must be 1 when unit is 'campaign'.
Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.
Optionalpost_view?: {Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.
Number of time units. Must be 1 when unit is 'campaign'.
Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.
Optionalmodel?: AttributionModelOptionalaggregated_totals?: {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.
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?: (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.
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.
Optionalerrors?: {Task-specific errors and warnings (e.g., missing delivery data, reporting platform issues)
Optionalsandbox?: booleanWhen true, this response contains simulated data from sandbox mode.
Optionalext?: Omit<Omit<{ [key: string]: unknown }, "bank">, "authentication"> & {Optionalsummary: 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.