Set a cap on a package
Useupdate_media_buy (or PATCH /api/v2/buyer/media-buys/{id}) on a draft or live buy:
FrequencyCap shape. Set at least one of:
When both
suppress and max_impressions are set, an impression is delivered only if both allow it.
The overlay is validated against the AdCP schema when you save. Like any overlay key, sending
frequency_cap replaces the package’s current cap, and an update that leaves it out keeps it.
The seller must support it
A cap only works if the seller enforces caps. If the seller declared which targeting it supports and frequency capping isn’t on the list, the update is refused before anything is sent: “Sales agent does not support the requested targeting: frequency_cap. Remove these targeting fields or use a sales agent that declares support.” A seller that declared no targeting support at all receives the cap, and whether it’s honored is up to that seller. Ad platforms (Meta, TikTok and the others) run their own ad servers, and their storefronts in Semicola are sandbox with no live connection yet, so a cap set there doesn’t reach the platform.Buyer-side caps
Buyer-side caps are embedded in the advertiser and campaign; there’s no separate cap resource.
The shape deliberately leaves out the seller-side fields (
per, suppress): a buyer-side cap is only
about how many impressions one person gets.
- Replace, don’t merge. Sending
frequencyCapsreplaces every stored cap on that advertiser or campaign;[]clears them; omitting the field leaves them as they are. - The old set is kept. The replaced caps stay in the change record in the advertiser’s or campaign’s activity history.
- Reads return each cap with
id,targetLevel(ADVERTISERorCAMPAIGN),targetId,max_impressions,window,createdAt,updatedAtandarchivedAt.