Browse the help center

Capping matrix

The complete capping enum — 15 types, 5 subjects, 7 period types — which of them a user can actually reach, and the permission that gates each one.

Reference network manager Account → Advertisers → campaign → Frequency Capping

The value lists behind frequency capping, in full, plus which of their values a user can actually reach. For the walkthrough — how a cap counts, when its window rolls over, what Flat does — see Set up frequency capping.

Capping types: what exists and what the product offers

The capping type list has 15 values. A value is one kind of cap fixed to one entity level, so the same kind appears up to four times. Of the 15, 12 are reachable in the product and 3 are not — the three Request values, whose permissions are granted to no role. That is the 1 + 4 + 4 + 3 the combo feeds return.

ValueKindLevelPrefixReachable?
ADVERTISER_FREQUENCYFrequencyAdvertiseraf✔
CAMPAIGN_FREQUENCYFrequencyCampaignc✔
CAMPAIGN_CLICKSClickCampaigncc✔
CAMPAIGN_ACTIONSActionCampaignca✔
CAMPAIGN_NO_CLICKNo-ClickCampaigncnc✔
CAMPAIGN_REQUESTRequestCampaigncr— no role can hold the permission
BANNER_FREQUENCYFrequencyBannerb✔
BANNER_CLICKSClickBannerbc✔
BANNER_ACTIONSActionBannerba✔
BANNER_NO_CLICKNo-ClickBannerbnc✔
BANNER_REQUESTRequestBannerbr— no role can hold the permission
PLACEMENT_FREQUENCYFrequencyPlacementpfc✔
PLACEMENT_CLICKSClickPlacementpcc✔
PLACEMENT_ACTIONSActionPlacementpac✔
PLACEMENT_REQUESTRequestPlacementpr— no role can hold the permission

The prefix is not decoration: it is the name of the browser cookie the counter lives in, and the first half of the composite row id ({id}:{TYPE}) the delete call takes.

What each level serves into the Capping type list

This is what the four combo endpoints actually return, after permission filtering, on a network whose roles have never been hand-edited.

KindAdvertiserCampaignBannerPlacement
Frequency✔✔✔✔
Action—✔✔✔
Click—✔✔✔
No-Click—✔✔— (no such value exists)
Request—(exists, never granted)(exists, never granted)(exists, never granted)

So the lists come out at 1 type for an advertiser, 4 for a campaign, 4 for a banner, 3 for a placement — and in that order: Frequency, Action, Click, No-Click. The advertiser level is deliberately minimal: one impression cap that everything beneath it shares.

Corner case — Request capping is unreachable, not merely ungranted. Its two permissions (Request Capping and Inventory Request Capping) exist as permission definitions, but the migration that created them inserted only the two identities. It never created the role entries or the grants that a permission needs to be holdable, and neither the seed nor any later script grants them, so no role holds either one. Until Epom inserts those rows by hand, no role can see Request capping in any list.

Which permission gates which type

Each kind of cap has its own permission on the role: Frequency Capping, Click Capping, Action Capping and Request Capping. No-Click has none of its own and follows Frequency Capping.

Placement caps use the Inventory twins instead (Inventory Frequency Capping and so on), for both the Capping type list and the save, so a publisher role needs only the inventory permissions.

The card itself also needs Manage Capping & Limitations (demand) or Manage Inventory Capping (supply), enabled or read-only.

Two names for the same row

A cap is labelled one way in the Add dialog and another in the grid’s Type column.

Capping type listGrid Type column
Frequency CappingBy impressions
Action CappingBy conversions
Click CappingBy clicks
Request CappingBy requests
No-Click CappingNo-Click Capping — the one kind with no short label

Note: No-Click Capping stays in English in every interface language, in both the dialog and the grid.

Subjects

Five values, from GET /capping-subject-types.do — note the root path, not /account. The subject is set per cap row, not once for the entity, and it is fixed in the order below.

SubjectIdLabelCounter lives inAvailable when
USER_COOKIE1User (cookie-based)a cookie on the ad-serving domainnothing — this is the default for a new row
USER_SERVER_SIDE4User (server-side storage)the network’s server-side capping store, keyed by the resolved visitor idserver-side capping storage enabled
USER_MIXED5User (cookie-based + server-side storage)the cookie where a cookie is possible, the store where it is notserver-side capping storage enabled
IP2IPthe store, keyed by the client IPserver-side storage and IP capping are enabled for the network, and your role allows IP capping
LES_IP3L.E.S. IPthe store, keyed by the last external source IP — the address seen before proxiesserver-side storage and L.E.S. IP capping are enabled, and your role allows L.E.S. IP capping

The server-side counter is keyed by the visitor id the ad server resolves for the request. In the default (mixed) identity mode that is, in this order: an explicit user id parameter, the Epom UUID cookie, the device advertising ID (ifa) — which is what separates the viewers behind an SSAI stitcher on apps and connected TV — and last a fingerprint of IP, user-agent and language. A placeholder or all-zero advertising ID counts as no ID.

The endpoint filters only on the two permissions; the network switches are checked by the card. The Subject column and its selector appear only when server-side storage is on and at least one of the two IP subjects is both granted to you and enabled on the network. When the column is hidden, existing rows keep and still enforce whatever subject they were saved with.

A request is treated as unable to keep a capping cookie when any of these holds:

  • the ad tag reported private browsing (im=1);
  • the browser is Safari, Mobile Safari, Firefox, Firefox Mobile, Firefox Minimo, Brave or DuckDuckGo;
  • the operating system is iOS, iPadOS or Apple TV;
  • neither the browser nor the OS could be identified at all.

For a USER_MIXED row that flips the counter to server-side storage for that request. For a plain USER_COOKIE row there is no fallback, so the cap simply under-counts that traffic.

The tag’s cookie-policy value overrides all of this: 1 turns off cookies and server-side capping, 2 turns off cookies but keeps server-side capping, 3 drops only the user-ID cookie. A network’s GDPR no-consent restriction maps onto the same values. See Frequency cap not working.

Corner case — No-Click capping is cookie-only. The two No-Click values have no server-side counterpart at all: the mapper that writes counters to the store has no entry for them and skips them silently. A No-Click row with subject User (server-side storage) is never counted and never fires, and a mixed one stops working for exactly the visitors who cannot keep cookies. Leave No-Click on the plain cookie subject.

Period types

Seven values, from GET /time-period-types.do, in this order.

Period typeIdLabel
SECOND6Second(s)
MINUTE0Minute(s)
HOUR1Hour(s)
DAY2Day(s)
WEEK3Week(s)
MONTH4Month(s)
YEAR5Year(s)

The window is Period × Period type, measured from the first counted event for that visitor and that cap. Month and year are calendar lengths, not fixed 30- and 365-day blocks: the ad server computes the window length by adding the period to a calendar date. It does that once, when the cap is loaded into the serving cache, so a one-month window loaded during February is 28 days long for as long as that cache entry lives.

Field ranges and defaults

FieldAdd-dialog defaultAdd-dialog input allowsServer enforces
Capping typefirst type in the list—must match the entity’s level, or the save is refused as Capping type is incompatible with entity
SubjectPlease select… — saved as User (cookie-based)the permitted subjectsthe Capping IP Subject permission for IP
Amount00 – 8 388 6070 – 8 388 607
Period11 – 2551 – 255
Period typeDay(s)the seven abovethe seven above
Flatoffon / off—

The two ranges disagree on purpose in neither direction — the form is simply looser than the validator. A period of 0 or of 300 is accepted by the input and refused on save. An Amount of 0 does not restrict anything: the ad server skips any cap whose amount is 0.

The entity’s own default period type is HOUR; the Add dialog overrides it to Day(s) before you see it, so an HOUR row can only arrive through the API.

REST API surface

LevelCreateListPer-kind set / update / remove
AdvertiserPOST /rest-api/advertiser/capping/{advertiserId}.doGET on the same path—
CampaignPOST /rest-api/campaign/capping/{campaignId}.doGET on the same path, plus GET /rest-api/campaign/capping/bulk.dofrequency, click, action, no-click
BannerPOST /rest-api/banner/capping/{bannerId}.doGET on the same pathfrequency, click, action, no-click
PlacementPOST /rest-api/placement/capping/{placementId}.doGET on the same path—

Any cap row, at any level, can also be changed or removed by its composite id ({id}:{TYPE}) through POST /rest-api/capping/{cappingId}.do and POST /rest-api/capping/delete.do.

Corner case: the spec lists all 15 values in the type enum of all four create endpoints, including the ones that belong to a different level. The description narrows it correctly, and the server rejects a mismatch cleanly — so do not read that list as the values a given endpoint accepts.

Related pages

Please disable Adblock
Are you using adblock? Disable it and reload the page to proceed to the destination page.

A registration has already been submitted from this page. Please try again in 10 minutes.