The tag
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.
The snippet
<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 reasonmacro_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
HMAC-SHA256(secret, imp|cid|ts), hex encoded, in data-sig. Unsigned or forged beacons are rejected before they reach the database.
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
ts is 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.
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.