Skip to main content
Available at AdCP 3.2. Every Apostra storefront advertises AdCP 3.2 beside 3.1 (and 3.0, except adapter-backed sales storefronts). Pin adcp_version: "3.2" to send targeting_overlay.demographics and read targeting_resolution.demographics. A request that pins 3.0 or 3.1 is served at that release, which has no demographic-targeting field. See AdCP versioning and negotiation.

Overview

AdCP 3.2 promotes demographic targeting from a platform extension to a first-class capability. Platforms that support it declare demographic_targeting directly on their products. Buyers express a demographic intent in targeting_overlay.demographics when creating a media buy, and the platform confirms the exact execution in targeting_resolution.demographics on the response. Demographic targeting is distinct from the exact-age-targeting brief used during product discovery. The discovery brief filters which products match; the targeting_overlay.demographics request writes a targeting constraint into the resulting media buy. At AdCP 3.2, demographic overlays are accepted on create_media_buy for every platform in the support table below. On update_media_buy, behavior differs by platform: Legacy AdCP 3.0 / 3.1 update calls that send targeting_overlay.demographics are refused with a 400 UNSUPPORTED_TARGETING_DIMENSION on every platform.

Supported platforms

The following platforms advertise demographic targeting capability via AdCP 3.2: A product that does not carry demographic_targeting does not support this path — submit a targeting overlay with demographics against such a product and the request is rejected.

How to use

1. Discover products with demographic targeting

Request products as usual. The product response will include a demographic_targeting object when the platform supports it, describing the supported age bounds and bucket structure. Meta (age only) and Spotify (age and gender) already accept demographic changes on update_media_buy. Once activated, TikTok will too; Google, Snap, and Pinterest will reject demographic updates and require a delete+recreate to change the demographic constraint. Spotify also accepts targeting_overlay.demographics.gender: send values: ["female"] or ["male"] to restrict to Women or Men, on both create_media_buy and update_media_buy. Reaching Spotify’s “All” (no restriction) differs by call: on create_media_buy, omitting gender entirely means All, since there is no prior restriction to preserve. On update_media_buy, omitting gender leaves whatever gender restriction the ad set already has unchanged — it does not clear it — so clearing an existing restriction back to All on update requires explicitly sending values: ["female", "male"] with include_unknown: true. non_binary is not supported on Spotify (alone or combined with another value); include_unknown: true is rejected once values restricts to a single gender; and values: ["female", "male"] is rejected unless paired with include_unknown: true — Spotify’s “All” reaches non-binary and unknown-gender listeners too, so naming both known genders without include_unknown: true would ask Spotify to exclude listeners it cannot exclude. No other platform in this guide accepts demographics.gender yet.

2. Express a demographic intent

Pass targeting_overlay.demographics in your create_media_buy request with an age constraint:
The platform validates that the requested range maps exactly to its native bucket structure. A range that cuts through a bucket, or a closed maximum that the platform represents as open-ended (such as 65+ on Google or TikTok), is rejected rather than silently broadened.

3. Confirm the resolution

The media-buy response includes targeting_resolution.demographics describing how the intent was executed, and returns the effective targeting_overlay.demographics applied to the package:
Read targeting_resolution.demographics.execution to verify the platform execution path, and compare requested, applied, and equivalent before treating the buy as active.

Unknown-age users

Some platforms can deliver to users whose age is unknown. Support varies:
  • Meta and Google: Support include_unknown: true. Users with unknown age are included only when you set include_unknown: true; set include_unknown: false to exclude them.
  • Snap, Spotify, TikTok, Pinterest: Cannot include users with unknown age when an age constraint is active. Pass include_unknown: false for these platforms.
An explicit include_unknown: true sent to a platform that cannot honor it is rejected. The platform reports the unsupported combination in the error rather than silently excluding unknown-age users.

Relationship to exact-age targeting in product discovery

Exact age targeting during discovery, documented in Exact Age Targeting, controls which products are returned — it is a filter, not a commitment. Storefronts on the Storefront-built or Agent-supplied path read it from targeting_overlay.demographics.age on an AdCP 3.2 get_products request; built-in platform adapters still read one exact range from the brief. The targeting_overlay.demographics field in create_media_buy is the commitment: it writes the constraint into the media buy and is confirmed by targeting_resolution.demographics. Both paths use the same platform support table and the same exact-match rule — no silent broadening on either surface. Demographic updates through update_media_buy are accepted on TikTok and Spotify (recompiled against the product’s declared capability); Google, Snap, and Pinterest reject demographic updates and require a delete+recreate to change the demographic constraint. Meta accepts an age change only.

AdCP 3.2 reference

Demographic targeting as a first-class capability (not an EXT extension) is defined in the AdCP 3.2 specification. Earlier protocol versions carry age targeting through platform-specific extension fields and do not populate demographic_targeting, targeting_overlay.demographics, or targeting_resolution.demographics.