Skip to main content
Targeting in Semicola lives in three places:

Targeting intent on save_campaign

Pass targeting to save_campaign with one or more of geo, language, device, dayparts and demographics. Each dimension is a list of requirements:
The intent comes back as targeting on the campaign workspace. A save_campaign update that passes targeting replaces the whole stored intent: each call is the full desired state, not a patch.
Targeting intent is stored and returned but isn’t enforced at delivery. What sellers receive is the package targeting overlay below.

Campaign constraints

save_campaign also accepts the simpler constraint form:
countries and geoMetros flow into every package’s overlay when a media buy is sent: include lists intersect with the package’s own, exclude lists add together. If the two include lists contradict each other, the campaign’s list wins rather than widening to “anywhere”. ageRange and audience go into the brief text sellers read during discovery; channels becomes a channel filter on product discovery.

Package targeting overlays

Change a package’s targeting on a draft or live buy with update_media_buy (PATCH /api/v2/buyer/media-buys/{id}):
The typed overlay fields are geo_countries, geo_regions, geo_metros, audience_include, device_type, language and the _exclude variants. Every other AdCP overlay field passes through and is validated against the AdCP schema on save.
  • Per-key merge. Keys you name replace the package’s current values; an empty list clears that key. Keys you omit stay as they are. Omitting targetingOverlay leaves targeting alone.
  • Seller support is checked first. If the seller declared which targeting it supports and your overlay uses a dimension outside that list, the update is refused with CAPABILITY_NOT_SUPPORTED before anything is sent: “Sales agent does not support the requested targeting: … Remove these targeting fields or use a sales agent that declares support.” Product discovery returns each product’s declared list as supported_targeting.
  • Some sellers must approve. The result may carry an update proposal.

Nielsen DMAs

DMA targeting uses geo_metros with system: "nielsen_dma" and three-digit codes such as "803".
Nielsen DMA market names aren’t available yet (they’re licensed data). Codes are accepted and saved as unverified, and the result’s warnings say so. Names can’t be matched until the dictionary lands, so send codes.
The dictionary tools are there for when names arrive; today they return an empty list with a note: nielsen_dma is the only system. When names are available, a name that could mean more than one DMA is refused with the matching codes to choose from.

Age ranges in briefs

Write one exact, closed age range in the brief (“adults ages 25–54”). Semicola’s hosted storefronts copy the numbers from the brief. If none of the proposed products can deliver that exact range, the proposal carries a limitations entry for targeting.age with the closest supported range, and says the age targeting was not applied. It never widens or approximates the range silently. Per-platform exact-age rules for the ad platforms (Meta, Google Ads, TikTok and others) aren’t available: those sellers are sandbox storefronts with no live connection yet.