Optionalcontext_Session/conversation identifier for tracking related operations across multiple task invocations. Managed by the protocol layer to maintain conversational context. Distinct from context (per-request opaque echo, see below).
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. From 3.1 onward, replayed MAY appear on responses to any request that resolved via the idempotency cache, including read tools — universal idempotency_key (see security.mdx §Idempotency) means the cache holds read responses too.
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.
OptionalsignalsArray of matching signals
Optionalrestricted_attributes?: RestrictedAttribute[]Restricted attribute categories this listing touches. Required with demographic_predicate and must include age. For referenced provider/source signals, any projected values must match the authoritative definition.
Optionaldemographic_predicate?: DemographicPredicateOptionalpolicy_categories?: string[]Policy categories this signal is sensitive for.
Optionaltaxonomy?: {Optional taxonomy metadata describing what this signal means in an external audience, content, retail-media, or provider-owned taxonomy.
Optionalsegmentation_criteria?: stringOptionalcriteria_url?: stringOptionaldata_sources?: (Optionalmethodology?: "declared" | "inferred" | "modeled" | "observed" | "derived"Optionalaudience_expansion?: booleanOptionaldevice_expansion?: booleanOptionalrefresh_cadence?: Optionallookback_window?: Optionalonboarder?: {Optionalcountries?: string[]Optionalconsent_basis?: ConsentBasis[]Data provider's declared GDPR Article 6 lawful basis or consent basis for the underlying signal definition, projected into this get_signals response row when requested. Sellers and federating agents that pass through another provider's signal MUST NOT substitute their own processing basis for the provider-declared basis.
Optionalart9_basis?: Data provider's declared GDPR Article 9 basis for the underlying signal definition when special-category data is involved and Article 9 applies, projected into this get_signals response row when requested. Sellers and federating agents that pass through another provider's signal MUST NOT substitute their own Article 9 basis for the provider-declared basis.
Optionalmodeling?: {Provider assertion that the seed source carries a signed attestation. Consumers MUST NOT treat this boolean alone as cryptographic proof.
Optionaldisclosure?: {The provider's claim that a modeling or AI-use disclosure is required for this signal in at least one applicable jurisdiction. This is a declared compliance signal, not a protocol-level legal determination.
Optionaljurisdictions?: [Jurisdictions where a modeling or AI-use disclosure applies.
Optionalnotes?: stringOptional provider notes on how the disclosure should be interpreted. Informational only; buyers should not branch programmatically on this text.
Optionaldata_subject_rights?: {Per-signal data-subject-rights routing. This is a contact/routing reference, not a machine-callable AdCP API.
Optionallast_updated?: stringWhen this listing record was last updated. This indicates freshness of the listing record, not an attestation that the underlying data or model was refreshed at that time.
Optionaldts_compliant_version?: stringOptionalsignal_ref?: SignalRefOptionalsignal_id?: SignalIDHuman-readable signal name
Detailed signal description
Optionalmethodology_url?: stringOptional link to published methodology, media-kit, or data documentation. For data_provider and signal_source refs, this SHOULD match or supplement the referenced definition.
Optionalvalue_type?: SignalValueTypeOptionalcategories?: string[]Valid values for categorical signals. Present when value_type is 'categorical'. Buyers must use one of these values in SignalTargeting.values.
Optionalrange?: { min: number; max: number }Valid range for numeric signals. Present when value_type is 'numeric'.
Minimum value (inclusive)
Maximum value (inclusive)
Opaque resolved-segment handle issued by this signal source. Pass this string verbatim to activate_signal.signal_agent_segment_id, and echo it in package signal targeting when the selected product option exposes the same handle. Treat the value as provider-scoped and opaque: providers MAY namespace it so two providers can expose similarly named signals without relying on a shared taxonomy. Do not pass the signal_id object as this handle, and do not reconstruct a segment handle from categorical values when get_signals returned a resolved segment.
Optionaldata_provider?: stringHuman-readable source name for the signal, when applicable. For data_provider-scoped signals this is the data provider name; for signal_source-scoped signals it may identify the signal source or proprietary origin.
Optionalcoverage_percentage?: numberDEPRECATED for detailed planning. Optional legacy scalar percentage of audience coverage retained only as a fallback for clients that do not consume coverage_forecast. When coverage_forecast is present, coverage_forecast is authoritative for signal-level discovery and coverage_percentage is fallback-only. If coverage_forecast includes an absent bucket over the same denominator, coverage_percentage SHOULD align with 100 * (1 - absent coverage_rate.mid).
Optionalcoverage_forecast?: {Coverage or availability points. Each point reuses the standard ForecastPoint shape, MUST include a signal dimension, and MUST include metrics.coverage_rate. Use metrics.impressions for count denominators and metrics.coverage_rate for the fraction of the declared scope represented by the point.
How to interpret the points array. Signal coverage forecasts always use 'availability' because the points describe available inventory or population coverage, not spend curves or temporal pacing.
Explicit denominator for the coverage forecast. This identifies the inventory, product, account, or custom universe that coverage_rate values are relative to. Additional seller-specific qualifiers are allowed for scopes such as line item type, ad server, inventory class, country, or flight window.
Denominator family for the coverage forecast.
Human-readable denominator label, such as 'network price-priority inventory'.
Optionalproduct_id?: stringProduct denominator when kind is 'product'.
Optionalcountries?: [string, ...string[]]Countries included in the denominator, as ISO 3166-1 alpha-2 codes.
Optionalline_item_types?: [string, ...string[]]Seller or ad-server line item types included in the denominator.
Optionaldate_range?: DateRange'exclusive' means the returned signal-value buckets do not overlap with each other. 'overlapping' means one impression or user can appear in multiple returned buckets, so coverage_rate values may sum above 1.0. This field describes overlap among returned buckets; bucket_completeness declares whether the returned buckets cover the full denominator.
'complete' means the returned buckets cover the declared denominator. For complete + exclusive forecasts, count metrics and coverage_rate values can be treated as a full partition, subject to metric additivity rules. 'partial' means omitted denominator share represents undisclosed, other, or unsupported buckets; buyers MUST NOT infer totals by summing returned points.
Optionalgenerated_at?: stringWhen this coverage forecast was computed.
Optionalvalid_until?: stringWhen this coverage forecast expires.
Optionalext?: ExtensionObjectArray of deployment targets
Optionalpricing_options?: VendorPricingOption[]Pricing options available for this signal when it has an incremental price. The buyer selects one and passes its pricing_option_id in report_usage or package-level signal_targeting_groups for billing verification. Omit when pricing is unavailable to the caller, bundled into the destination product, or has no incremental cost.
OptionalerrorsTask-specific errors and warnings (e.g., signal discovery or pricing issues)
OptionalincompleteDeclares what the agent could not finish within the caller's time_budget or due to internal limits. Each entry identifies a scope that is missing or partial. Absent when the response is fully complete.
'signals': not all matching signals were returned. 'pricing': signals returned but pricing is absent or unconfirmed. 'wholesale_feed': in wholesale mode, full feed enumeration could not complete in the time budget.
Human-readable explanation of what is missing and why.
Optionalestimated_wait?: DurationHow much additional time would resolve this scope. Allows the caller to decide whether to retry with a larger time_budget.
Optionalwholesale_Opaque token representing the version of the wholesale signals feed state used to compose this response. Agents that implement conditional-fetch (if_wholesale_feed_version) MUST return this on every wholesale-mode response so callers can cache and probe later. Callers MUST treat the value as opaque — no format, no ordering, no inspection. The token is scope-keyed: it describes a version for the cache_scope declared on this response, NOT a global agent version. A caller caches (cache_scope, wholesale_feed_version) pairs and presents the matching token on the next request. Scoping dimensions: (agent, discovery_mode, filters, destinations, countries) for cache_scope: 'public'; that tuple plus account_id for cache_scope: 'account'. pagination.cursor is NOT part of the scoping tuple. See specs/wholesale-feed-webhooks.md for the full cache layering model.
Optionalpricing_Opaque token representing the version of the pricing layer. When the agent supports independent pricing versioning, pricing_version changes when prices move but wholesale_feed_version changes only when structure/metadata moves. Same cache_scope keying as wholesale_feed_version. Agents not separating these MAY omit pricing_version and use wholesale_feed_version for both.
Optionalcache_Declares whether the wholesale_feed_version and pricing_version on this response describe a universal layer or an account-specific overlay. REQUIRED on every 3.1+ response (the 3.1 schema enforces this — the safety property of the two-layer cache model depends on it). 'public': this response describes the agent's published rate card; the caller MAY dedupe under (agent, discovery_mode, filters, destinations, countries) without scoping by account. 'account': this response includes account-specific overrides; the caller MUST cache the version under that tuple plus account_id. When the request did NOT include account, the agent MUST return cache_scope: 'public'. When the request included account, the agent MUST return either 'public' (this account prices off the public rate card — caller dedupes) or 'account' (account-specific overrides exist — caller caches under the account key). Agents MAY return 'public' on an account-scoped request that previously had overrides — callers SHOULD interpret this as a downgrade. Without schema-required cache_scope, an agent silently omitting the field on an account-scoped response would cause callers to mis-key the cache and serve account-overlay payloads to other accounts — the canonical safety invariant of the entire cache layering model. Backward-compatibility note for 3.1 validators: SDKs validating strictly against the 3.1 schema MUST select the validator based on the server-declared adcp_version. For responses with adcp_version starting 3.0, the 3.1 cache_scope-required constraint MUST be relaxed — pre-3.1 agents correctly emit no cache_scope and remain conformant to their declared version. This is a tightening within 3.1, not a 3.0 break.
OptionalunchangedPresent and true ONLY on wholesale-mode responses when the request carried if_wholesale_feed_version (and/or if_pricing_version) matching the agent's current version for the caller's cache_scope, in which case signals[] MUST be omitted; wholesale_feed_version (echoed), cache_scope (echoed), and pricing_version (echoed when used) MUST still be present. Callers receiving unchanged: true MUST NOT mutate their local wholesale signals mirror. One shape per state: agents MUST NOT emit unchanged: false — the absence of the field IS the signal that the response carries signals. Cross-scope isolation: the comparator that decides unchanged MUST be keyed on (cache_scope, wholesale_feed_version), not on the token value alone. An agent MUST NOT emit unchanged: true when it resolves the request to a different cache_scope than the one whose token the caller echoed in if_wholesale_feed_version (and/or if_pricing_version): because the token is scope-keyed, a value minted for cache_scope: 'public' cannot match the agent's current token for cache_scope: 'account' (or vice-versa), so such a request MUST return the full feed for the resolved scope with that scope's own token.
OptionalpaginationOptionalsandboxWhen true, this response contains simulated data from sandbox mode.
Optionalext
Response payload for get_signals task