A property list is a named, advertiser-scoped collection of domains used to
shape where a brand’s media runs. Lists carry a purpose of either include
(only buy on these properties) or exclude (never buy on these properties).
Once created, lists are linked to the brand’s targeting profile and flow into
every product discovery and media buy as part of the ADCP target_overlay.Property lists are a buyer-curated concept. They are owned by your
advertiser, validated against the AAO property registry, and pushed to sales
agents as a PropertyListReference that the agent resolves on demand.
Include lists
Restrict targeting to a hand-picked allow-list (e.g., a curated PMP of
premium publishers).
Exclude lists
Block specific domains across all of an advertiser’s campaigns (e.g., a
brand-safety blocklist).
Each list stores a set of domains that are normalized, deduped, and resolved
through two systems:
AAO registry — the cross-publisher Ad Context registry used to confirm a
domain is a real, identified property.
Local property catalog — Scope3’s mapping of domains to targetable
Property records used by sales agents.
Submitted domains land in one of three buckets, surfaced in every create/update
response as a resolutionSummary:
Bucket
Meaning
Targets?
resolvedCount
Mapped to a local Property record
Yes
registeredCount
Known to AAO but no local property yet
Not yet — will become targetable as catalog catches up
unresolvedCount
Not found anywhere
No — silently skipped
A single list can hold up to 100,000 domains per request. The service
chunks large inputs server-side against the AAO registry (which itself caps at
10,000 domains per call) and returns a single resource with the full
resolution summary.
All buyer endpoints below are mounted under https://api.agentic.scope3.com/api/buyer.
The GET /lists/:listId resolution endpoint is mounted at the app root
(no /api/buyer or /api/storefront prefix) per ADCP convention.
resolutionSummary is only returned on create and update. GET and
list responses contain only the resolved domains because the stored list
drops unresolved entries.
When you PUT an include list, every active media buy whose advertiser
references the list is notified via ADCP update_media_buy so the sales agent
can refresh its cached property set. The update response surfaces this with a
cascadeSummary:
The cascade is best-effort and applies to include lists only — the ADCP
target_overlay.property_list reference carries include semantics. Cascade
failures do not roll back the list update; the database is the source of
truth and per-media-buy errors are logged for retry.
Per-media-buy fan-out is bounded (concurrency 5) so a large advertiser cannot
thunder a single sales agent.
Sales agents resolve a PropertyListReference by calling
GET https://api.agentic.scope3.com/lists/:listId with an HMAC bearer token
that Scope3 mints when it embeds the reference in a request. This endpoint is
mounted at the app root (no /api/buyer or /api/storefront prefix) per ADCP convention. The
endpoint returns ADCP GetPropertyListResponse shape (not the standard
{ data, error, meta } envelope):
Always inspect resolutionSummary. Any non-zero unresolvedCount
indicates domains that will not target — surface them to the user before
going live.
Prefer one large list over many small ones. A 100k-domain list is
cheaper than 100 lists of 1k domains because each list creates its own
SmartPropertyList link.
Use filters.channels_any to scope a list. Without it, the list applies
across all of the brand’s targeting profiles. With it, you can keep
display/OLV separate from CTV.
Treat updates as full replacements.PUT replaces the entire domain
set; there is no incremental add/remove. Re-send the union you want stored.
Validate before bulk import. Run POST /api/buyer/property-lists/check
on the raw input first, especially when assembling a list from spreadsheets
or third-party feeds.
Avoid touching include lists during high-traffic windows. Cascading
notifies every active media buy on the advertiser; schedule large updates
for off-peak times when possible.