purpose is include (only buy on these) or exclude (never buy on
these).
How lists are enforced
Enforcement happens when products are selected: at discovery and when a campaign goes live.- Exclude lists are enforced by Semicola. Products whose publisher website domain (or a
subdomain of it) is on a list leave discovery, and a campaign that still has such a product
staged won’t go live; the error names each product and the list. App and CTV properties without
a website domain aren’t matched. A list with
filters.channels_anyapplies only to products on those channels. - Include lists go to sellers that declare property-list support in their capabilities, as
targeting_overlay.property_liston every package of a media buy (and asproperty_liston discovery once the seller is known to support it). Sellers that don’t declare support never receive it. Creating an include list, replacing its identifiers, or attaching it to a campaign re-sends it to the advertiser’s live media buys (cascadeSummary); a failed buy is logged and doesn’t undo the change.
GET /lists/{listId} on the API origin, with the bearer
token carried in the reference. The answer is the ADCP GetPropertyListResponse (paginated with
max_results and cursor; cache it for 24 hours).
Identifiers and resolution
Passdomains (shorthand for type: "domain"), typed identifiers, or both: 1 to 100,000 per
request, canonicalized and deduplicated. Website domains always resolve. App and CTV identifiers
resolve when they appear on products this account has been offered; the rest come back in
unresolvedIdentifiers and won’t target. Only resolved identifiers are stored, so the
unresolved list appears on the create or update response and not on later reads. Always check
resolutionSummary.
PUT replaces the whole identifier set (there is no incremental add or remove). DELETE
archives the list.
Check before you commit
POST /api/v2/buyer/property-lists/check sorts candidates into ok, modify (canonicalized,
for example www. removed), remove (duplicates) and assess (manual review). Every app and
CTV identifier lands in assess. Semicola isn’t connected to the AgenticAdvertising.org property
registry yet, so domains can’t be registry-confirmed or registry-blocked: clean domains land in
assess too. Checks that include a domain return a reportId, readable for 7 days.
Audiences
POST /api/v2/buyer/advertisers/{advertiserId}/audiences/sync adds members (an externalId plus
an email, a phone with its + country code, their SHA-256 hashes, or universal ids), removes
members by externalId, or deletes an audience. Raw email and phone are normalized and hashed
before anything is stored. The call returns 202 with a taskId for GET /tasks/{taskId}.
uploadedCount is the stored member count; matchedCount stays empty because matching happens at
the seller.
A campaign’s audienceConfig (targetAudienceIds, suppressAudienceIds) adds audiences; with
deleteMissing: true it replaces the set. They reach sellers that declare audience targeting as
audience_include and audience_exclude.