The verification tag
The ad tracking script that does the verifying: one file, 2.1KB gzipped, identical for every partner. Everything that differs between partners lives in a server-side macro map, so there is nothing to build on your side and nothing to maintain once it is live.
Setting a partner up for the first time? Start with the integration guide: where the tag goes, the macro for each ad server, and the hourly log that makes the numbers comparable. This page is the reference behind it.
The snippet
Every attribute a tag can carry, which is the signed variant.
data-sig and data-ts belong only to accounts in signed
mode; most accounts send neither. data-pimp is for ad servers that
cannot expose an impression ID.
<script src="https://t.pixtru.com/v.js"
data-imp="${AUCTION_ID}"
data-pimp="${SSP_TXN_ID}"
data-partner="your_partner_id"
data-side="ssp"
data-cid="${CAMPAIGN_ID}"
data-crid="${CREATIVE_ID}"
data-w="300" data-h="250"
data-sig="${TAG_SIGNATURE}"></script> What you must do
1. Expand the macros at serve time
An unexpanded macro is rejected at the edge with reason
macro_unexpanded, and it appears on your partner status screen within
minutes rather than at month end. This is the single most common integration
failure, which is why it is counted per partner rather than discarded.
2. Sign the tag — signed accounts only
Most accounts sign nothing and can skip this: they hold no secret,
and their log is what decides billing. Where an account is in signed mode, the
tag carries HMAC-SHA256(secret, imp|cid|sts), hex encoded, in
data-sig, with the ad server's serve time in data-ts. Then
unsigned or forged beacons are rejected before they reach the database: a
missing serve time as missing_serve_ts, a wrong signature as
bad_hmac. We tell you which mode your account is in; unless we have
sent you a secret, it is the open one.
sig = hmac_sha256(shared_secret, f"{imp_id}|{campaign_id}|{ts_millis}").hexdigest() The signature covers imp|cid|ts and nothing else. We
say so plainly because it matters: every other attribute on the tag is unsigned,
so nothing security-relevant is ever derived from them. The advertiser an
impression belongs to comes from the DSP log, not from data-adv.
3. Keep the timestamp fresh
data-ts is the ad server's serve time, in milliseconds since epoch.
Beacons more than 30 minutes out of step are rejected as stale_ts,
which is what stops a captured beacon being replayed later. On an open account
there is no signed serve time, so the measurement's own clock is the reference.
If you cannot pass an impression ID
Send data-pimp — your own auction ID — and omit data-imp.
We resolve it back through the logs. That is still an exact join, and it is
reported as partner_id rather than quietly merged into your exact
match rate.
What the tag sends
| Beacon | When | Carries |
|---|---|---|
seq=0 | On render | Identity, size, page context. |
seq=1 | When the ad leaves the screen, or after 60s | The evidence: continuous in-view milliseconds, sample count, how geometry was obtained, tab visibility, IVT flags. |
The second beacon carries evidence, not a verdict. We store how long an ad was actually on screen rather than a yes or no, so when a threshold changes it is a re-query over data we already hold instead of a re-tag and a lost month.
Performance
- 2.1KB gzipped, loaded asynchronously — it never blocks rendering.
- The collector answers in roughly 2ms and writes to a local spool first, so a database restart costs nothing.
- No cookies and no cross-site identifiers. The tag measures an ad, it does not follow a person.