---
title: "Release 155"
description: "Pay publishers and charge advertisers per viewable impression with vCPM, and read Viewable impressions, Viewable CTR and vCPM in reports; pin any action as a row of the Limits card and set the share of a cap at which delivery stops; leave notes a user reads on a Notes tab; DSP partners and header bidding in any currency, priced at the day's reference rate; a custom parameter registry with list values and \"has all of\"; any of / all of on multi-valued targeting; a cap on one conversion action; a Traffic Quality status that says what to do; sealed click IDs you can decode over the API; and the General report's conversions no longer counting playback and viewability events."
type: "reference"
audience: [network-manager, admin, publisher, advertiser]
keywords: [release 155, whats new, vcpm, viewable impressions, viewable ctr, viewability pricing, pinned actions, limit stop share, stop at 98, notes tab, user notes, unread notes, multi-currency, dsp partner currency, exchange rate, ecb rate, header bidding currency, bid floor currency, custom parameter registry, list parameter, has all of, is one of, value list, any of, all of, match mode, cookie value targeting, retargeting, per-action capping, conversion action cap, traffic quality status, invalid traffic share, ip screening, sealed click id, actiondata v2, tracking decode, decode click id, server-to-server ip, screen width targeting, width range, banner template grouping, placement type grouping, label filter advanced report, country names language, conversions dropped, system events, advanced widget empty, vast quartiles split, comma in filter, session expired, daisy chaining, daisy chaining countries, apply priorities, frequency cap 127 days, notes for the user, internal notes, limits card, targeting heading, more values, ubvc cookie, ubv cookie, ip list info null, help search]
---

Fetch the complete documentation index at: https://epom.com/ad-server/docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# Release 155

Release 155 is the **viewability release**. A campaign or a placement can be priced on **vCPM** — the advertiser
pays, and the publisher earns, only for impressions that were actually seen — and the General report and the
dashboards show **Viewable impressions, Viewable CTR and vCPM** beside the columns you have. Any action, the
viewable impression included, can be pinned as a row of the Limits card, and the network sets the share of a cap
at which delivery stops.

Alongside it: an operator can leave **Notes** a user reads on their own tab; a DSP partner or a header-bidding
bid can be in **any currency**, priced at the day's reference rate; custom parameters that carry a list of values
are registered once and targeted item by item, with a new **has all of**; every multi-valued targeting list can be
**any of or all of**; an action cap can name **one conversion action**; the Traffic Quality page leads with one
invalid-traffic share and a status that says what to do; click IDs are sealed against tampering and can be
decoded over the API; and the General report's conversions no longer count video playback and viewability events, which
changes the figures on networks that have them.

> **Things to act on.**
>
> **Conversions fall on networks with video or viewability.** The General report counted every action-log row as
> a conversion, including the playback and viewability events a video or vCPM impression fires — up to twenty per
> impression. Those system events now count as zero in Conversions, I2C, CCR and Conv. fraud, as the Advanced
> report already did. An action you pick by name is counted whatever it is, grouping by action keeps each row's
> own count, and no money changes. Days before release 149 keep counting them. See
> [Metrics](https://epom.com/ad-server/docs/reference/metrics.md).
>
> **vCPM is available to every role that may price on CPM; everything else new is off until you grant it.**
> The viewable report columns, the Notes tab and the pinned rows of the Limits card are each behind a permission
> that no role has on upgrade — grant them in **Admin → Users & access → User roles & permissions**. Limit stop
> shares are 100 and nothing is pinned, so no cap stops earlier than it did until you set one. See
> [Users and roles](https://epom.com/ad-server/docs/guides/admin/users-and-roles.md) and [Limits](https://epom.com/ad-server/docs/guides/delivery/limits.md).
>
> **A DSP partner that bids in another currency needs its currency set.** Until now a bid's currency was ignored
> and the amount read as dollars — a partner answering 300 in yen won as a $300 CPM. Now a bid in the partner's
> currency is converted at the day's rate, a bid in another currency with a known rate is converted too, and a bid
> in a currency with no usable rate is refused rather than booked as dollars. Set **Currency** on the partner's
> card. See [DSP partners](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md).
>
> **Traffic Quality statuses move.** The invalid share is now counted exactly, impression by impression, and the
> routine-bot and data-centre categories that had silently never matched now do: on a test network about 5 % of
> impressions moved from suspicious to routine bots, and days too small to judge no longer set the network's
> median. Every AI feature — the Traffic Quality notes among them — now counts against the requesting user's
> monthly AI limit. See [Invalid traffic and risk scoring](https://epom.com/ad-server/docs/concepts/invalid-traffic-and-risk-scoring.md).
>
> **Three things leave the console.** A user's, site's or advertiser's own ad-serving domain, the site's
> invocation-code domain and domain categories are gone, with the Ad-Serving domains and Domain categories admin
> pages: ad tags have been built on the placement's domain for several releases and nothing read those fields. A
> placement that stored another host serves from the default domain; tags already pasted keep working. See
> [Networks and domains](https://epom.com/ad-server/docs/guides/admin/networks-and-domains.md).
>
> **Screen width targeting is read in CSS pixels now.** A request without a size from the tag used to be sized
> in physical pixels from the device data, so an iPhone read 1 170 px wide and fell into laptop-width rules. Such
> a phone now counts as a typical current phone, tablets and TVs without a size stay unsized, and the Screen size
> report rows change to match. See [Targeting dimensions](https://epom.com/ad-server/docs/reference/targeting-dimensions.md).

## Pay and earn per viewable impression

A campaign, a banner, a site or a placement can be priced on **vCPM** beside CPM, CPC, CPA and the flat fees. The
side on vCPM books the price per thousand on every measured viewable impression and nothing on impressions,
clicks or conversions, so a vCPM publisher can run a CPM advertiser — still charged per impression — and the other
way round, and a vCPM price on a site or a campaign covers the placements and banners below it. Country prices, the
CSV upload, the minimum margin, price-adjustment rules and the REST API all take it (`pricingType=VCPM`), and a
vCPM creative always carries the viewability beacon. A viewable that books money has to prove itself: the beacon
carries a token signed when the ad was rendered, and an altered, replayed or day-old one is refused — viewable
counts on networks that do not price on vCPM are untouched.

What vCPM does not cover: tags without the beacon (iframe and direct `/ads` tags, the XML ad API, native, header
bidding, always-redirect creatives), video players with neither OM SDK nor VAST 4 `ViewableImpression`, and
OpenRTB DSP demand on either side — those book nothing. The new **vCPM Pricing Type** permission is granted on
upgrade to every role that already has CPM Pricing Type, so the same people see it; switch it off per role if you
do not want it offered. See [Pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md) and
[Viewability and Open Measurement](https://epom.com/ad-server/docs/concepts/viewability-and-open-measurement.md).

**Viewable impressions, Viewable CTR and vCPM in the General report and on the dashboards.** Three new columns in
the basic, publisher and advertiser families, in every grouping, on the dashboards and in the tree's hover card.
Viewable CTR and vCPM are computed only on the traffic that has viewable impressions on the same day, creative,
placement and country, so a creative nothing measures does not drag them down. They sit behind the new
**Analytics Report Column Viewable Impressions** permission, off on every role: a role with it and Impressions
reads both sets; a role with it and without Impressions reads Viewable CTR and vCPM in place of CTR and eCPM and
keeps Requests and the real Fill rate. A role without it sees exactly what it saw before. The columns are not
offered where the action log cannot answer — reports by action or attribution type, custom-parameter splits, the
Advanced report. See [Metrics](https://epom.com/ad-server/docs/reference/metrics.md) and [Run a report](https://epom.com/ad-server/docs/guides/analytics/run-report.md).

## Pin any action to the Limits card, and choose where delivery stops

Two new cards under **Admin → Ad serving → System preferences**. **Pinned actions**: pin any action the per-action
limits offer — *Ad Viewable Impression*, Skip, Complete, or one of your own conversion actions — and it becomes a
Daily / Total row of the Limits card on advertisers, campaigns, banners, sites and placements, after the fixed
rows. The row reads and saves the per-action limit on that action, so nothing about counting or serving changes.
**Limits**: one whole percent per limit type — budget, requests, opportunities, impressions, clicks, conversions,
per-action limits on actions you did not pin — plus a percent per pin. Below 100, every limit of that type stops
delivery at that share of its cap, rounded up: a 1 000 viewable cap pinned at 98 stops at 980, a cap of 1 stays 1.
The limits cards say so with an amber note, *Delivery stops at 98 % of this limit (network setting)*.

Nothing is pinned and every share is 100 on upgrade. The pinned rows are shown to roles with the new **Pinned
Action Limits** (advertisers, campaigns, banners) or **Inventory Pinned Action Limits** (sites, placements)
permission — both off until granted — and a role with only that permission edits the pinned rows and nothing
else; a cap is cleared by setting it to 0. See [Limits](https://epom.com/ad-server/docs/guides/delivery/limits.md).

## Notes a user reads on their own Notes tab

An operator who may edit a user gets a **Notes for the user** panel on the user's edit page: notes with an optional
title and up to 5 000 characters of text, each with its own Add / Save, Edit and Delete, who wrote and last changed
it, and whether — and when — the user read it. The user reads them on a new **Notes** tab between Analytics and
Preferences, newest first, in their language and time zone, without the author's name. A new note, or one whose
title or text changes, is unread: the tab carries the count, an unread note has a dot and a bolder title, a check
beside the date marks it read, and **Mark all as read** sits above the list. Opening the tab marks nothing. An
operator switched into the user sees what is unread but cannot mark it.

The tab is shown to roles with the new **Notes Tab Visible** permission, off on upgrade, and only once the user
has at least one note. The old internal
*Comments* field on the user is now called **Internal notes** — only operators see it, as before. See
[Users and roles](https://epom.com/ad-server/docs/guides/admin/users-and-roles.md) and
[Account users](https://epom.com/ad-server/docs/guides/collaboration/account-users.md).

## DSP partners and header bidding in any currency

A DSP partner's card gets a **Currency** section: the currency it is quoted and bids in, the rate it is priced at
today, and an optional contractual rate. The ad server fetches the day's reference rates itself — the European
Central Bank's for the currencies it publishes, Frankfurter's for the rest — and holds one rate per day, so every
server prices the same way; a rate older than four days raises a warning, and one older than a week is not used.
A bid's currency is finally read: dollars are dollars, the partner's currency is converted at its rate, another
currency with a known rate is converted too, and a currency with no usable rate is refused. Win and loss notices
settle in the bid's currency, and a loser in another currency gets the clearing price in its own.

Header bidding follows: a publisher's bid floor in another currency is converted instead of compared as dollars —
a 150-yen floor no longer shuts out every bid — and a fill is booked at its converted value. The creative-level
*DSP Custom Currency* parameters are gone, and a campaign's exchange rate takes ten decimals so rates for rupiah or
yen can be typed. See [DSP partners](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md),
[Header bidding settings](https://epom.com/ad-server/docs/guides/inventory/header-bidding-settings.md) and
[Programmatic DSP demand](https://epom.com/ad-server/docs/use-cases/programmatic-dsp-demand.md).

## Custom parameters are registered, and a list is targeted item by item

A tag that packs several values into one parameter — `cp.genre=rock,pop`, a stitcher's
`contentGenre=Comedy,Drama` — could only be targeted with an expression; *genre is one of pop* compared the whole
string and never matched. **Admin → Targeting presets → Custom parameters** now holds your parameters: the name,
a label and a description, whether it *arrives as a list* and with which separator, an optional value list (closed,
or open to other values), whether to record it in analytics, a live split preview and a *Used by* list of the rules
that read it. A *One of* rule on a list parameter then matches item by item, and the new **has all of** requires
every listed item. The targeting editor picks the parameter and its values from the registry, explains separators
and escaping behind a ⓘ next to each field, previews a match and warns about a value that can never match.
Unregistered parameters and every other rule behave as before.

Analytics recording is now per parameter, with a network policy for unregistered ones; a closed list records an
unlisted value as *Other (not in list)*, and the Advanced report's filter on a list parameter finds a request holding
the value among others. **Nothing changes on upgrade**: the policy starts as *Legacy*, under which the old
Analytics-configuration include / exclude list keeps deciding, and the page offers **Move it here** when you are
ready. The registry is behind a new admin permission, **Custom Parameters**, granted to everyone who holds
Analytics Configuration. See [Custom parameters](https://epom.com/ad-server/docs/guides/admin/custom-parameters.md) and
[Custom Parameter targeting](https://epom.com/ad-server/docs/guides/targeting/custom-parameter-targeting.md).

## Any of, or all of, on every multi-valued targeting list

A retargeting rule such as *visited pricing and booked a demo and started sign-up* — one cookie per step — could
not be written: several rules of one type always meant any of them. Each Include and each Exclude list of Cookie
Value, Custom Parameter, DMP and API JSON Field targeting now has an **or / and** switch in its header. Values of
one key a visitor holds once (one cookie name, one parameter) stay alternatives inside their group, every other
rule is its own group, and the switch joins the groups: `tier=gold, tier=silver, region=eu` under *and* means
*(gold or silver) and eu*. Every existing list stays on *or*. The classic interface shows the mode read-only, reading
the list out in its heading: a long list shows its first three values and *+N more*, and the whole expression
appears when you hover the heading. See
[Add targeting](https://epom.com/ad-server/docs/guides/targeting/add-targeting.md) and
[Retargeting and audiences](https://epom.com/ad-server/docs/use-cases/retargeting-and-audiences.md).

## A cap on one conversion action

An Action Capping row can name the **conversion action** it counts, or keep *Any action*: *stop after one Purchase*
no longer caps a visitor on every Lead too. Each such row has its own counter, and Flat is not available with a
named action. Underneath, a bigger fix: a conversion reported server-to-server never reaches the visitor's cookie,
and a private window keeps the conversion and the next ad request apart, so cookie-based conversion caps simply
missed them. On a network with server-side capping storage, every action cap on a cookie-based subject now also
counts each conversion server-side, so a cap on server-to-server conversions holds; without server-side storage
nothing changes. See [Frequency capping](https://epom.com/ad-server/docs/guides/delivery/frequency-capping.md).

## Traffic Quality: one share, a status, and what to do

Every Traffic Quality surface — the page, the PDF, the API, the AI notes — leads with the same verdict: the exact
share of a placement-day's impressions that carry a strong invalid-traffic signal or repeat a view already
received, what was paid for them, how many were refused before counting (never billed), and a status: **Act**,
decided on the day; **OK** or **Watch**, judged on the placement's previous seven days so one noisy day does not
flip it; *Not enough data* for a thin day without a week behind it. The invalid share is split into routine bots,
suspicious and counted twice, the page opens at the verdict with Act and Watch rows first, each row shows a share
meter against the format's lines, and the details say why and what to try first. The AI explains the verdict in
your language and never re-scores it. Days scored before this release read their old level as a status. The
status is evidence for a conversation with the publisher, not enforcement — ad serving reads none of it. See
[Invalid traffic and risk scoring](https://epom.com/ad-server/docs/concepts/invalid-traffic-and-risk-scoring.md) and
[Moderation and quality](https://epom.com/ad-server/docs/guides/admin/moderation-and-quality.md).

## Click IDs that cannot be tampered with, and a decoder for your own links

Today's click ID is plain base64 anyone can read and edit. The ad server now mints a sealed, compact version —
about half the length — that refuses an altered, truncated or foreign token the way it refuses any malformed click
id. Sealed click IDs start once the whole platform runs release 155: ops switches them on in one step after the
rollout. Click IDs minted before keep working; the landing-page helper takes the sealed ones only from a snippet
copied after the switch, so re-copy it then. With sealed IDs comes a
decoder: `POST /rest-api/tracking-decode.do` and the assistant's `tracking_decode` take click IDs, tracking URLs,
postback URLs or a whole VAST and answer what each one carries and which of your entities it refers to — only
for entities you may view, with the visitor's IP, device ids and consent string always hidden. It needs the
Action Tracking: Server-to-Server permission. The decoder and the assistant's tool also
take a click ID copied from the visitor's `ubvc` (click) or `ubv` (view) cookie, where a sealed ID is spelled with
`.` and `~`, or the cookie's whole value, read entry by entry. See
[Postback troubleshooting](https://epom.com/ad-server/docs/guides/conversions/postback-troubleshooting.md).

An action can also ask the ad server to judge its server-to-server conversions by the **click's visitor IP**
instead of the advertiser's server address, so geo, the duplicate-conversion window and IP capping see the real
visitor — a per-action checkbox for roles with the server-to-server permission, off by default. It works as soon as
sealed click IDs start, on any action whose box is ticked while **User IP in click IDs** is *Included* under
Validation settings. See [Conversion actions](https://epom.com/ad-server/docs/guides/conversions/conversion-actions.md).

## Analytics

**Group and filter the Advanced report by banner template**, and group both reports **by placement type**, on the
console, over the API and in the assistant; the placement-type names come in your language. A template that
covers more creatives than the report can read at once is refused with a message that says how to narrow it, not
with a truncated result.

**Label filters narrow the Advanced report** as they do the General one — they used to be dropped there silently.
A role without the labels permission is refused the filter the way it is refused the grouping, with the permission
named, and a saved report loads without a filter the role may not use. The *Filter all labels* checkbox is now a
**Match Any / Match All** choice inside each label filter. A report never runs with no columns: an empty saved
column set selects every column, and a tab whose report has no metric says so instead of drawing an empty table.

**Query details lists every filter the report ran with** — template, label, placement type, custom parameter,
risk level, country — and the hours of the day next to the dates; a KPI tile shows metrics only.

**Country and world-region names come in your console language**: *Deutschland* for a German console, *ドイツ*
for a Japanese one, in pickers, targeting chips, grids, reports and exports. Pickers still find a place typed in
English, and the API keeps answering in English.

**Fixed:** a comma inside a filter value — a label named *Coastal, Outdoor* — is one value again; a backslash in
a filter value, a risk name or a word where an id is expected answer a 400 that names the accepted values instead
of a 500; Advanced dashboard widgets, which had been empty since release 117, show data; splitting columns by
VAST quartiles returns the quartile columns; turning a split off gives back the action filter and the columns it
took; a label-grouped report no longer fans a placement into every label it carries, and its totals count each
log once; an Advanced report run right after a restart no longer caches an empty result; the hour window of the
Advanced report and the raw logs, and the trend lines on every chart, which could dip below zero beside a spike,
stay inside their data. See [Run a report](https://epom.com/ad-server/docs/guides/analytics/run-report.md) and
[Dashboards](https://epom.com/ad-server/docs/guides/analytics/dashboards.md).

## Screen width targeting

The Resolution rule is now a **Screen width** rule: quick-pick bands Phone, Tablet, Laptop and Desktop, or a
custom From / To width, with a height range behind *More: limit height*. A request with no known size never
matches an Include and always passes an Exclude. Existing rules match as before. See
[Targeting dimensions](https://epom.com/ad-server/docs/reference/targeting-dimensions.md) and
[Add targeting](https://epom.com/ad-server/docs/guides/targeting/add-targeting.md).

## Also in this release

- **Statistics land in the hour they happened.** During a stalled flush, five hours of traffic could be written
  into one hour; each record is now tagged with its hour as it is logged, so during a stall figures arrive late
  but never in the wrong hour, and held hours keep counting against limits. See
  [Analytics pipelines explained](https://epom.com/ad-server/docs/concepts/analytics-pipelines-explained.md).
- **A confirmed day is never silently lowered.** When late figures reach a day marked Confirmed or Finalized, the
  figures are still written and the advertiser's Status cell shows **Changed after confirmation** with the date;
  re-confirming the day clears it. See [Finances and billing](https://epom.com/ad-server/docs/guides/admin/finances-and-billing.md).
- **Cookie values with "+" or "%" are read as written.** Since release 150 a value such as `a+b` was read as `a b`
  and `%41` as `A`, so a Cookie Value rule on it never matched and `$$COOKIE()$$` printed the changed value. **Such
  rules now match** — an Include rule on one serves more, an Exclude rule serves less. See
  [Retargeting and audiences](https://epom.com/ad-server/docs/use-cases/retargeting-and-audiences.md).
- **Frequency caps longer than 127 days** no longer make the viewer's other cap updates fail — about half of
  one network's cap writes had been lost to one two-year cap.
- **Per-action conversion limits are judged on the right counters:** a daily cap was compared against lifetime
  conversions and could stop a campaign for the day as soon as the root tracked it, a lifetime cap could run an hour
  past, and deleting one action's limit reset every counter on the entity. Campaigns stopped that way start
  delivering. See [Action limits](https://epom.com/ad-server/docs/guides/delivery/action-limits.md).
- **A limit counts in the figures of the side that owns it**, so a limit on an advertiser follows what the
  advertiser is reported, and one on a placement what the publisher is reported; without a scaling rule nothing
  changes.
- **Daisy chaining:** a placement whose stored chain count was out of range can be saved again, and a creative
  linked from its own side — over the API, by the assistant, or by undo — now joins the placement's chain instead
  of silently never serving there. With *Apply priorities* on, each tier's country picker in the new interface shows
  its saved countries again — it had come up empty since release 154. See
  [Daisy chaining and passback](https://epom.com/ad-server/docs/guides/delivery/daisy-chaining-passback.md).
- **Listing a creative's placements over the API no longer deletes its links** to placements that had been
  deleted.
- **A user whose session expired is sent to log in again** instead of seeing *Missing or invalid CSRF token*, and
  returns to the page afterwards; unsaved edits prompt *Leave site?* first.
- **Account pages stay inside a phone screen** and keep the tab bar at the bottom.
- **The DSP partner grid selects one partner at a time**; Edit, Delete and Force sync each act on one.
- **DSP analytics sync** writes nothing for a day cut short by a restart and refuses a negative bucket instead of
  silently erasing the amount. See [DSP partners](https://epom.com/ad-server/docs/guides/admin/dsp-partners.md).
- **`$$REMOTE_COUNTRY$$` and `$$COUNTRY$$` are documented as the two-letter code they return**, with Britain as
  `UK`. See [Macros](https://epom.com/ad-server/docs/reference/macros.md).
- **The IP list's Info column no longer reads *null*** for an address with no known location, in the grid or in the
  CSV export — such a row is now empty. The *Ban & white-listed IPs*, *Click fraud banned IPs* and *Invalid traffic
  banned IPs* tabs and the troubleshooting-log filter hints (*comma separated values*) are spelled right. See
  [Validation settings](https://epom.com/ad-server/docs/guides/admin/validation-settings.md).
- **The Actions Log no longer stores a DSP partner's analytics-sync credentials, CSRF tokens or URL secrets**,
  older rows come back masked, and an undo built from a masked value is refused rather than writing `***` back.
- **Text your customers read names no third-party services.** Fraud scoring reads *IP screening*, the location
  database *the IP data provider*, device detection *the device data provider*, and the creative scanner *the
  creative-scan provider* — on the console, in the API descriptions and throughout this help centre.
- **The new interface fetches shared lists once** and cancels requests for a page you have left, and the
  advertiser, campaign and creative edit pages load 20–50 % fewer statements.

## For API and assistant users

- **Pricing:** `pricingType=VCPM` on every pricing endpoint and in the assistant's pricing tools. See
  [Pricing over the API](https://epom.com/ad-server/docs/guides/delivery/pricing-over-the-api.md).
- **Notes:** `GET /rest-api/user-preference/notes`, `POST …/notes/{noteId}/read`, `POST …/notes/read-all` and
  `GET …/notes/unread-count` for your own notes; `GET` / `POST /rest-api/system-users/{userId}/notes` and `POST` /
  `DELETE …/notes/{noteId}` for operators. `user-preference/get` carries `notes` with `readAt`; the assistant's
  profile reports `may.notesTab`.
- **Targeting match mode:** `POST /rest-api/{entity}/{id}/targeting/match-mode` with `type`, `rule` and
  `matchMode` ANY | ALL on all six levels; `cookie-value/create` takes an optional `matchMode`. Screen width:
  `screen-resolution/create` adds `minWidth` / `maxWidth` / `minHeight` / `maxHeight`, and
  `screen-resolution/save-ranges` saves up to 20 ranges in one call. See
  [Targeting API](https://epom.com/ad-server/docs/api/targeting-api.md).
- **Custom parameters:** a new *Custom Parameters* tag — `GET` / `POST /rest-api/custom-parameters`,
  `GET` / `POST …/{id}`, `POST …/{id}/delete`, `POST /rest-api/custom-parameter-policy` and `…/adopt-legacy`;
  the assistant reaches them through its REST tool.
- **Capping:** `actionId` on the `/rest-api/{banner,campaign,placement}/capping` and
  `/rest-api/capping/{cappingId}` paths, answered with `actionName`; the assistant's `campaign_overview`,
  `placement_overview` and `fill_check` carry `actionId` and `actionHidden`. See
  [Capping API](https://epom.com/ad-server/docs/api/capping-api.md).
- **Traffic Quality:** `/rest-api/traffic-quality/scores.do` and the `traffic_quality` / `traffic_quality_analyze`
  tools add `status`, `invalidPct`, `invalidRangePct`, the GIVT / SIVT / repeat shares, `invalidGross`,
  `confidence`, `topReasons`, `actions` and a `statuses` filter; the 0–100 score and `level` stay as deprecated
  fields.
- **Tracking decode:** `POST /rest-api/tracking-decode.do` and the new `tracking_decode` tool, behind the Action
  Tracking: Server-to-Server permission; both also take a `ubvc` / `ubv` cookie value, one item per entry. Actions
  take `applyClickIpToServerToServer`.
- **Help search:** the assistant's and the MCP connector's `help_search` finds answers under a fourth-level heading,
  labelled with the heading they sit under, and answers deep inside a long *Caveats* section, returning the
  paragraph that answers — marked with a leading … — instead of the section's first 1 500 characters. See
  [MCP](https://epom.com/ad-server/docs/api/mcp.md).
- **Analytics:** `eqStr[TEMPLATE_ID]` and *Banner Template* / *Placement Type* grouping in the Advanced report;
  `eqStr[PLACEMENT_LABEL]` / `eqStr[BANNER_LABEL]` honoured there; a free-text `eqStr` value (labels, device
  vendor and model, custom-parameter values) is bound whole, commas included — repeat the key to send several.
  A word where an id is expected answers 400 with the accepted values; `eqStr[RISK_LEVEL]` and
  `eqStr[RISK_CATEGORY]` take names. See [Analytics API](https://epom.com/ad-server/docs/api/analytics-api.md).
- **Removed:** `GET /rest-api/adsHosts.do`, `GET /rest-api/invocationCodeHosts.do`,
  `POST /rest-api/sites/{siteId}/changeAdServingDomain.do` and `…/changeInvocationCodeDomain.do`; `adsHost` and
  `invocationCodeHost` on site, advertiser, zone, placement and user updates are reported under `ignoredFields`.
  The creative-level *DSP Custom Currency* network parameters are gone. See [MCP](https://epom.com/ad-server/docs/api/mcp.md) for the
  tool list.