Skip to main content
Tasks: Create, update, get, list, and delete property lists. Property lists are managed resources that combine static property sets with dynamic filters. When resolved, filters are applied to produce the final property set.

Architecture: Setup Time, Not Real-Time

Property lists are designed for setup-time operations, not real-time bid decisions:
This enables:
  • 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

For domain 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:
The agent resolves the brand identity and applies rules based on its domain expertise:
  • 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
The brand reference uses the standard core/brand-ref schema. The governance agent resolves the domain to discover the brand’s identity via its brand.json file.

Webhooks

Configure webhooks via update_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

The webhook payload includes counts but NOT the actual properties. This keeps payloads small and avoids redundant data transfer when recipients may not need the full list immediately. Recipients MUST verify the delivery’s RFC 9421 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

  1. Buyer agent aggregation: Receive updates from multiple specialized agents, intersect results
  2. Seller cache invalidation: Know when to re-fetch the compliant property list
  3. Alerting: Notify when significant changes occur to compliance status

Filters

Filters are applied when the list is resolved (via get_property_list):

Feature Requirements

Feature requirements reference features discovered via get_adcp_capabilities. Each agent exposes different features (mfa_score, carbon_score, coppa_certified, etc.). For quantitative features (scores, ranges):
For binary features (true/false):
For categorical features (enum values):

Handling Missing Coverage

When a property doesn’t have data for a required feature, you can control the behavior with if_not_covered:
When if_not_covered: "include" is used, the response includes a coverage_gaps field showing which properties were included despite missing data:
This transparency helps agencies distinguish between properties that passed a requirement vs. those that couldn’t be evaluated.

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.)
These are required because governance agents need to know which jurisdiction and context to evaluate properties against.

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:
Each entry must include 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 a PropertyListReference 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 when account 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

The get_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

  1. Setup time only: Governance agents are not in the real-time bid path; resolve lists during campaign setup
  2. Local caching: Orchestrators/sellers must cache resolved properties locally for bid-time decisions
  3. Refresh on schedule: Re-fetch lists based on cache_valid_until (typically every 1-24 hours)
  4. 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
  5. Pagination: Large lists may require multiple requests with cursor-based pagination
  6. No score leakage: Raw scores are kept internal to governance agents; responses contain pass/fail lists, not scores