Stop bad ads before they render. Know exactly what it cost you.
PubTrust is ad-quality and malvertising protection for publishers. One script tag watches every slot, judges the creative before the browser paints it, and replaces it with your own fallback. Then it tells you which rule fired, what the blocked impression was worth, and how many milliseconds the whole decision took.
New sites begin in Monitor mode. PubTrust will not block a single ad on your inventory until you have read your own data and turned it on.
gambling · layer 1 (pre-render)- Creative text matched
- "casino utan spelpaus"weight 1.4
- Advertiser (declared)
- casino-example.comdeclared ≠ observed
- Slot
- div-gpt-ad-sidebar-1 · 300×250
- Bidder
- appnexus · CPM 4.82 SEK
- Estimated impact
- −0.00482 SEKAllow this advertiser
- Decision time
- published in your dashboard
This is the whole product. A rule you can read, an advertiser you can allowlist in one click, and a number for what the block cost.
Three things no one else in this category will put in writing
Publishers do not, in our experience of this market, complain that their vendor misses malware. They complain that they cannot see what blocking cost them, cannot find out why an advertiser was stopped, and cannot get a straight answer about what the tag does to their page. Those are the three things we commit to publicly.
Every block carries a price.
When a block comes from header-bidding demand we know the winning bid's CPM at the moment we stop it. So every blocked impression in your dashboard carries an estimated revenue impact, and every policy carries a running total. You should never have to guess what protection is costing you, and you should be able to argue with us using your own numbers.
We publish our latency.
Decision time is measured in the tag, reported with every beacon and displayed in your dashboard — per site, per layer, at the median and the 95th percentile. It is not a figure we assert in a datasheet; it is a figure you watch move. We could not find a published latency number from any vendor in this category. Now there is one.
Every verdict is explainable.
No black-box score. Every violation names the pack, the rule, the matched value, the weight it carried, the layer that caught it and the language the rule came from — then offers a one-click allowlist. If you disagree with a block you can undo it in the same second you found it.
Why does PubTrust block before the ad renders?
Because of how the impression is counted. Google Ad Manager counts an impression on begin-to-render. If a malicious or policy-violating creative is stopped before it renders, no impression was counted, nothing was earned, and therefore nothing was lost. If it is stopped after it renders, the publisher has been paid — but the creative's code has already executed in the reader's browser, which is the part that actually does harm. Pre-render blocking is not simply the safer option; it is the economically correct one. PubTrust's first detection layer reads bid metadata and the winning bid's creative markup before the browser paints anything.
The bid tells us more than the page can.
With Prebid.js, the winning bid's creative markup — bid.adm — is a plain string in page JavaScript before render. We scan it: text, links, image sources, script hosts. This works regardless of whether the creative later lands in a friendly iframe or a SafeFrame, which means it covers the header-bidding demand path that carries most programmatic revenue. We ship a Prebid Real-Time Data module, pubtrustRtdProvider, for exactly this.
Where we control the render, nothing executes at all.
Creative markup is parked as inert text inside nested <template><xmp> — two parsing contexts in which no script runs, no image loads and no request fires. We reach a verdict, then either write it into the slot or discard it. For a malware creative that is the whole difference: a hidden iframe still runs its payload.
Holding a creative holds revenue, so the hold is capped.
The inert-park wait has a hard 5,000 ms ceiling, after which the creative renders unjudged. Every one of those is counted and shown to you. Your fail-open rate is a figure in your dashboard, next to your decision latency — not a silent degradation you find out about later.
What does PubTrust actually catch?
Two different kinds of problem, caught by different machinery. The first is policy: ads for categories you do not want on your inventory — gambling, adult, crypto-investment scams, rogue pharmacies, weapons retail, political advertising you must disclose, and the deceptive low-quality creative that damages a premium site. The second is behaviour: ads that misbehave at runtime regardless of what they advertise — forced redirects, pop-unders, autoplay audio, document.write hijacks, CPU-hogging creatives. Policy is enforced by 16 Protection Packs in 14 languages. Behaviour is enforced by Runtime Integrity, which is on by default on every site and needs no keywords at all.
Policy — 16 Protection Packs
Core: Gambling · Adult · Crypto & Forex Scam · Malware & Scam
Regulated: Alcohol · Tobacco & Vape · Pharma · CBD & Cannabis · Weapons · Political
Deceptive: Weight Loss · Clickbait & Chumbox · Fake Endorsement · AI-Slop Creative · Shock & Gore · Fake UI
Behaviour — Runtime Integrity, always on
Forced navigation and auto-redirect · pop-under and pop-up abuse · document.write hijack · autoplay with sound · heavy creative and long-task attribution · optional iframe sandboxing that makes top-level navigation structurally impossible.
Is the rule set actually multilingual, or is it an English list in translation?
Authored natively, language by language. PubTrust ships 12,034 rules across 16 packs and 14 languages — en, de, fr, es, it, pt, nl, sv, da, no, fi, pl, cs, tr — and each language file is written against the vocabulary that market's advertisers actually use, with its own regulatory context and its own false-friend hazards documented in the file. A translated English list would be worse than useless here: Swedish spel, Danish spil, Norwegian spill, Finnish peli, Polish gra, Czech hra and Turkish oyun all mean "game" in every ordinary sense — football, video games, a play — and weighting any of them as a gambling term would block a sports desk's own coverage. Every Nordic gambling rule in our corpus is therefore a compound, never a bare stem.
The strongest signal in German gambling advertising is not the word "casino". It is Glücksspiel kann süchtig machen — the mandated warning, which appears in the advertising and essentially nowhere else.
What happens on the first day?
Nothing is blocked. Every new site starts in Monitor mode: PubTrust watches, judges and reports, but does not stop anything. You look at a week of your own violations, on your own inventory, with the estimated revenue impact of each one already calculated — and then you decide, policy by policy, what to enforce. This is the default because the expensive failure in this product is not a miss, it is a false positive against a legitimate advertiser. You should not have to take our calibration on faith.
Can an AI agent operate PubTrust?
It can read everything and draft policy; it cannot switch enforcement on. PubTrust ships an MCP server at app.pubtrust.cc/mcp with OAuth 2.1. An agent can query metrics and trends, drill into violations, inspect sites and packs, generate reports, and author policies — adding keywords, domains and URL patterns, or proposing terms back into a pack. What it cannot do is flip a policy from Monitor to Block, or touch billing. Those create a pending approval that a human clicks in the dashboard. Every agent action is audit-logged with the agent's identity kept distinct from the person's.
What PubTrust cannot do
Cross-origin creatives are opaque to JavaScript, and no vendor can change that. When a creative renders inside a SafeFrame or any cross-origin iframe, its document is unreadable from the page — contentDocument returns null — and it cannot be screenshotted from the page either, by four independent mechanisms in the browser. Any vendor describing client-side capture of cross-origin creative content is describing something browsers do not permit. What we read instead is the bid markup where header bidding supplies it, the iframe src and name attributes, and the sandbox flags and geometry — and a gambling creative’s markup almost always names a gambling host. Where a rendered image of a creative is genuinely needed, we capture it server-side, in a headless browser, where we are the browser and the boundary does not apply. Redirect chains are followed the same way.
Second limit, stated plainly
We do not support CJK or right-to-left languages at launch. Chinese, Japanese, Korean, Arabic and Hebrew are not in the 14. The behavioural layer is language-independent and protects those markets; the keyword packs do not yet.
Built by ClearTrust
PubTrust is a ClearTrust product. ClearTrust builds governed, auditable infrastructure for teams that have to explain their systems to somebody — a regulator, a board, a client, a reader. The same commitments run through all of it: append-only audit trails, explicit data retention, no silent impersonation, and no claim we cannot evidence.
Start in Monitor. Decide with your own numbers.
Install one tag. Watch a week of real violations on your real inventory, each priced. Then turn on exactly the policies you want and nothing else.
Monitor mode is the default. Nothing is blocked until you have looked at your own data and decided to block it.