VCR & Impression Tracking: VAST Quartile Beacons
How playback is reported to LtvAdx, how VCR is calculated, and how to read delivery data through the API.
Event pipeline
The player calls the tracking URLs in the VAST response. Each event is checked (signature, duplicate, invalid-traffic tag), stored, and added to the daily reporting summary within about 5 minutes. An impression is billed once per ad request — a repeated impression beacon for the same request is ignored.
Beacon URL format
Every tracking URL is the same endpoint with a different event:
GET https://ads.ltvadx.com/track/{requestId}?hh=…&crid=…&liid=…&chid=…&sig=…&event=impression
&event=start
&event=firstQuartile
&event=midpoint
&event=thirdQuartile
&event=complete
&event=skip | click | pause | resume | mute | unmute | fullscreen
&event=error&code=[ERRORCODE]
# Response: 200 with a 1×1 transparent GIFDo not rebuild or edit the URLs
sig signs the request id, line item, creative and channel. A URL that has been changed is still recorded but never billed.
Event reference
| event= | Fired by the player when | Counts towards |
|---|---|---|
| impression | The ad starts to render | Impressions, billing, frequency caps |
| start | Playback begins | Starts (VCR denominator) |
| firstQuartile / midpoint / thirdQuartile | 25% / 50% / 75% played | Quartile funnel |
| complete | 100% played | Completes (VCR numerator) |
| skip | Viewer skipped (skippable creatives only) | Skips |
| click | Click-through used | Clicks |
| pause, resume, mute, unmute, fullscreen | Viewer action | Engagement counters |
| error | The player could not play the ad (with code) | Errors |
| creativeView, closeLinear | Creative shown / closed | Their own counters — not impressions |
VCR calculation
VCR = completes ÷ starts Reported as a 0–1 ratio on /api/v1/reports/delivery rows, and as a percentage on /api/v1/reports/vcr.
Impression vs start
The impression is the player's Impression URL — fired when the ad begins to render, not when the VAST is fetched. A gap between impressions and starts means players that rendered but never began playback (buffering, errors, abandonment).
VAST error codes
| Code | Meaning (IAB) | Usual cause |
|---|---|---|
| 100 | XML parsing error | Malformed VAST |
| 101 | VAST schema validation error | Version mismatch |
| 200 | Trafficking error | Unexpected ad type or size |
| 300 | General wrapper error | Wrapper chain problem |
| 301 | Wrapper URI timeout | Third-party VAST URL unreachable |
| 400 | General linear error | Media file not playable |
| 401 | File not found | Creative asset returns 404 |
| 402 | Timeout | Media file too slow to load |
| 405 | Problem displaying media file | Codec or format unsupported by the player |
| 900 | Undefined error | Unknown player error |
Invalid traffic (IVT)
Beacons are tagged as invalid traffic when the user agent is a known bot or tool, the IP is in a cloud-hosting range, the same event is repeated within 10 minutes, or one IP or household sends an implausible number of beacons in a minute. A quartile or complete without a start is tagged at ingestion.
Tagging only, today
IVT tags are recorded but nothing is filtered: tagged impressions are still billed and still counted in delivery reports. Separate IVT reporting and billing exclusion are planned, not live.
Reporting API
Authenticate with an API key from Dashboard → Settings → API Keys. Results are scoped to your account.
# Delivery rows: one per line item × channel × UTC day
GET https://api.ltvadx.com/api/v1/reports/delivery
?from=2026-09-01
&to=2026-09-30
&channelId=YOUR_CHANNEL_ID # optional; also lineItemId, campaignId
Authorization: Bearer ltv_live_…
# Response: a JSON array of daily summary rows — counters (impressions, starts,
# firstQuartiles, midpoints, thirdQuartiles, completes, skips, clicks, errors),
# rates as 0–1 ratios (vcr, skipRate, ctr …) and money in USD micros
# (divide by 1,000,000).
# VCR aggregate (rates as percentages)
GET https://api.ltvadx.com/api/v1/reports/vcr?campaignId=…&from=…&to=…