Architecture: Setup Time, Not Real-Time
Property lists are designed for setup-time operations, not real-time bid decisions:- Static lists: Curated sets of approved properties
- Dynamic lists: Properties matching criteria (country, channel, score thresholds)
- Hybrid lists: Base set modified by filters
Tasks Overview
Property List Structure
A property list contains:Domain identifier format
Fordomain and subdomain identifiers, value MUST be a lowercase ASCII
hostname with at least two labels. Internationalized names MUST use lowercase
IDNA A-label (punycode) form. Each label has 1–63 letters, digits, or hyphens,
starts and ends with a letter or digit, and labels are separated by dots. The
hostname is at most 253 characters, excluding an optional wildcard prefix.
Schemes, paths, query strings, fragments, ports, whitespace, underscores, and
trailing dots are invalid. These constraints are enforced by
core/identifier.json.
The optional
*. is permitted only once, at the start of a domain value.
It is a matching selector, not part of the hostname. The format check does not
perform DNS resolution or establish ownership. Reserved test hostnames such as
publisher.example are valid protocol identifiers; the public registry applies
additional contribution restrictions.
A receiver MUST reject a create, update, or other request containing an invalid
identifier with INVALID_REQUEST, identifying the offending field. It MUST NOT
silently skip or reinterpret the value. A sender MAY offer explicit URL-to-hostname
conversion before submission, but MUST validate the resulting identifier. This
applies to inclusion lists, exclusion lists, and filters.exclude_identifiers.
If an invalid identifier arrives in a fetched list, the receiver MUST reject that
snapshot and report the failure to its caller; it MUST NOT apply a partial list.
Brand
Instead of manually specifying all filters, provide a brand reference and let the governance agent apply appropriate rules based on who you are:- A consent agent applies COPPA requirements based on the brand’s target audience
- A brand safety agent infers content categories from the brand’s industry
- A sustainability agent applies requirements from the brand’s profile
brand.json file.
Webhooks
Configure webhooks viaupdate_property_list to receive notifications when the resolved list changes.
Important: Webhooks provide notification only. They tell you that the list has changed, but do not stream the updated properties. After receiving a webhook, you must call get_property_list to retrieve the updated property set.
Webhook Flow
Webhook Payload
Signature, Signature-Input, and Content-Digest HTTP headers before processing, following the webhook profile. The required body-level signature: "rfc9421" is a deprecated compatibility marker retained through 3.x; receivers MUST ignore it for authentication. Recipients MUST also dedupe by idempotency_key so retried deliveries of the same change event are ignored.
Webhook Use Cases
- Buyer agent aggregation: Receive updates from multiple specialized agents, intersect results
- Seller cache invalidation: Know when to re-fetch the compliant property list
- Alerting: Notify when significant changes occur to compliance status
Filters
Filters are applied when the list is resolved (viaget_property_list):
Feature Requirements
Feature requirements reference features discovered viaget_adcp_capabilities. Each agent exposes different features (mfa_score, carbon_score, coppa_certified, etc.).
For quantitative features (scores, ranges):
Handling Missing Coverage
When a property doesn’t have data for a required feature, you can control the behavior withif_not_covered:
When
if_not_covered: "include" is used, the response includes a coverage_gaps field showing which properties were included despite missing data:
Required Filters
Every property list must include at least:- One country in
countries_all(ISO 3166-1 alpha-2 code, case-insensitive) - One channel in
channels_any(display, video, audio, etc.)
Filter Logic
The filter field names make the logic explicit:countries_all: Property must have feature data for ALL listed countries.channels_any: Property must support ANY of the listed channels.feature_requirements: Property must pass ALL requirements (AND).
Base Properties
base_properties is an array of property sources to evaluate. Each entry is a discriminated union with selection_type as the discriminator:
selection_type:
If
base_properties is omitted, the agent queries its entire property database for properties matching the filters.
See the base-property-source schema for the full specification.
create_property_list
Create a new property list.Request
Response
Dynamic List (Filters Only)
Create a list that dynamically queries the governance agent’s database (no base_properties - uses agent’s full coverage):update_property_list
Modify an existing property list.Request - Update Filters
Request - Replace Base Properties
Request - Add Exclusions
Response
get_property_list
Retrieve a property list with optional resolution of filters.Resolving a property list reference
A receiver given aPropertyListReference MUST invoke get_property_list on
the managing agent at agent_url, with list_id from the reference and
resolve: true (or its default). The issuer MUST expose this task over MCP at
agent_url, and receivers MUST support MCP resolution. Another AdCP task
transport advertised by the managing agent, such as A2A, MAY be used by agreement
using that transport’s normal task envelope. Implementations MAY also offer
custom HTTP download routes, but those are extensions: serving only
GET {agent_url}/lists/{list_id} does not satisfy this contract, and receivers
MUST NOT infer that path from a reference.
When auth_token is present, the receiver MUST send it as
Authorization: Bearer <auth_token> on the task transport, including session
initialization and every paginated fetch. The managing agent MUST accept this
credential in place of its normal authentication. A recipient does not need an
existing account or a second credential. The token MUST authorize read-only
get_property_list access to that list_id and its continuation pages; it MUST
NOT authorize other lists, list enumeration, or mutations. The issuer MUST make
the reference unambiguous without requiring an account argument that the
reference does not carry. An omitted token requires a public list or independent
authorization already available to the receiver.
The sender delivers auth_token inside the PropertyListReference passed to
the intended receiver, including when that reference is a seller task argument.
When authenticating get_property_list requests, receivers MUST send the token
only in the Authorization header to the managing agent; it MUST NOT appear in
those task arguments, URL paths, query strings, or logs. Receivers MUST NOT
forward the credential to another origin on redirect. An expired, revoked, or
invalid token is an authorization failure, not an empty list. The receiver MUST
report resolution failure to its caller and MUST NOT silently remove the
associated targeting constraint.
The receiver MUST follow pagination.cursor while pagination.has_more is
true, passing the same list_id, resolve, and credential on each request.
It MUST validate every page and assemble the complete list before replacing
its cached snapshot. An incomplete fetch or invalid page MUST NOT become an
active partial inclusion or exclusion list. Refresh the complete snapshot
after cache_valid_until or a change notification.
Request - Get Resolved Properties
Response
The response returns a compact list of identifiers only (not full property objects) for efficiency. Only identifiers that pass the feature requirements are included - no scores or metadata.The
auth_token is only returned when the list is created via create_property_list. Store it securely - you’ll need it to share access with sellers.Request - Get Metadata Only
Response (Metadata Only)
list_property_lists
List property lists owned by a given account, or all property lists accessible to the authenticated agent whenaccount is omitted.
Request
Response
delete_property_list
Delete a property list.Request
Response
Integration with Other Tasks
Using Lists in score_properties
Reference a property list instead of passing properties inline:Using Lists in Media Buys
Pass property lists to media buy creation:Error Codes
Caching and Refresh
Theget_property_list response includes caching guidance. When it supplies resolved_at, sellers copy that timestamp into product list_applications receipts; otherwise the seller timestamps completion of its full snapshot fetch, including all pages:
Typical flow for orchestrators/sellers:
Usage Notes
- Setup time only: Governance agents are not in the real-time bid path; resolve lists during campaign setup
- Local caching: Orchestrators/sellers must cache resolved properties locally for bid-time decisions
- Refresh on schedule: Re-fetch lists based on
cache_valid_until(typically every 1-24 hours) - Dynamic vs Static: Use filters-only lists when you want the agent to maintain the property set; use base_properties when you need explicit control
- Pagination: Large lists may require multiple requests with cursor-based pagination
- No score leakage: Raw scores are kept internal to governance agents; responses contain pass/fail lists, not scores