Skip to main content
A frequency cap limits how often the same person is shown your ads. Semicola has two kinds, and they are different fields:
Buyer-side caps are one exposure budget per person across every seller running an advertiser or campaign. Enforcing that needs a request-time moment on each seller’s inventory (real-time targeting), and no seller in Semicola is connected that way. So on every seller today a buyer-side cap is never enforced there, not delayed and not partially applied. Every write that sets one answers with a frequencyCapsNote saying so. For a cap a seller actually applies, use the package’s frequency_cap below.

Set a cap on a package

Use update_media_buy (or PATCH /api/v2/buyer/media-buys/{id}) on a draft or live buy:
The cap follows the AdCP 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 frequencyCaps replaces 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 (ADVERTISER or CAMPAIGN), targetId, max_impressions, window, createdAt, updatedAt and archivedAt.
Creative-level caps aren’t available.