Discriminator identifying this as a renderer-fired pixel tracker asset. See /schemas/creative/asset-types for the registry.
Optionalmethod?: "img" | "js"How the tracker URL is invoked at serve time:
img — fired as an image pixel (HTTP GET with <img>-like semantics; no JS execution)js — fired as a script include (renderer evaluates the URL's response as JavaScript)Matches IAB OpenRTB Native 1.2 method enum (1=img, 2=js). js MUST only be used by sellers whose renderer supports JavaScript trackers; sellers without JS-tracker support MUST reject method: js declarations at sync_creatives time with CREATIVE_REJECTED carrying the reason.
Optionalmacro_declarations?: [One declaration per token occurrence in url; declaration_id values MUST be unique and locations MUST resolve. When omitted, legacy behavior applies.
Optionalcustom_event_name?: stringREQUIRED when event is custom; otherwise MUST be absent. Adopter-defined event name. When tracker execution is undeclared, an unknown custom event is a forward-compatible probe and the seller silently no-ops instead of rejecting the creative. An effective tracker_execution_contract overrides that legacy fallback: with complete:true an unlisted custom selector is unsupported and rejects compatibility with tracker_contract_mismatch; a listed custom selector is an affirmative accept-and-initiate commitment.
Optionalprovenance?: Provenance
A single renderer-fired HTTP tracker URL — image pixel or JavaScript include — bound to a measurement event (impression, viewability, click, custom). Generic web-pixel tracker primitive applicable to any web-rendered canonical format (image, html5, image_carousel, responsive_creative, sponsored_placement, native_*, plus the non-VAST/DAAST events of video_hosted and audio_hosted). The buyer's measurement vendor declares the tracker URL; the seller's renderer fires it at serve time without buyer-side involvement.
The discriminated-union shape and event/method enums are formalized in IAB OpenRTB Native 1.2 (
imptrackers[]/jstracker/eventtrackers[]/link.clicktrackers[]); the same shape applies cleanly to image banners, html5, carousels, and any other format whose renderer fires HTTP pixels for measurement. The namepixel_trackermirrors the industry's existing 'tracker pixel' terminology (already used inurl_type: "tracker_pixel") and applies equally tomethod: imgandmethod: js(a JS include is still a measurement-pixel hop in vendor parlance).Scope boundary (normative).
pixel_trackercovers RENDERER-FIRED trackers — measurement events that the ad's serving template invokes when the user sees, views, or clicks the creative. Conversion pixels that fire on the advertiser's site after the click (Meta Pixel, GA4 server-side, custom postbacks) MUST be modeled viasync_event_sources/event_log— they are campaign-scoped, not creative-asset-scoped. Seedocs/creative/canonical-formats.mdx#what-format_kind-is-not-for.Format-specific tracker primitives. Formats whose wire shape embeds tracker URLs in a format-specific structure use dedicated asset types instead:
video_vast/audio_vast→vast_tracker(VAST<TrackingEvents>: start, quartiles, complete, pause, mute)audio_daast→daast_tracker(DAAST<TrackingEvents>parity)display_tag→ opaque (third-party server fires its own trackers)All other web-rendered canonicals use
pixel_tracker.Maps to IAB OpenRTB Native 1.2 / Dynamic Native Ads API tracker objects:
imptrackers[]→ onepixel_trackerper entry withevent: impression,method: imgjstracker→ onepixel_trackerwithevent: impression,method: jseventtrackers[]→ onepixel_trackerper entry,eventmapped from the IAB event enumlink.clicktrackers[]→ onepixel_trackerper entry withevent: click,method: img(click destinations live onlanding_page_urlslot)Bidirectional v1↔v2 mapping (normative for SDK auto-negotiation). A 3.1 buyer SDK talking to a 3.0.x seller MUST downgrade
pixel_trackerto the v1{asset_type: url, url_type: tracker_pixel}shape. The URL still emits on the wire; what's lost depends on the original event/method. A 3.1 SDK reading a v1 manifest MUST upgrade{asset_type: url, url_type: tracker_pixel}topixel_trackerby inferring event/method from the v1asset_id. Both directions are lossy-with-advisory; SDKs MUST emit the appropriate error code so consumers can see what was inferred or dropped.v2 → v1 downgrade table:
{event: impression, method: img, url}{url_type: tracker_pixel, asset_id: impression_tracker, url}{event: viewable_mrc_50, method: img, url}{url_type: tracker_pixel, asset_id: viewability_tracker, url}PIXEL_TRACKER_LOSSY_DOWNGRADE{event: viewable_mrc_100, method: img, url}PIXEL_TRACKER_LOSSY_DOWNGRADE{event: viewable_video_50, method: img, url}PIXEL_TRACKER_LOSSY_DOWNGRADE{event: audible_video_complete, method: img, url}PIXEL_TRACKER_LOSSY_DOWNGRADE{event: click, method: img, url}{url_type: tracker_pixel, asset_id: click_tracker, url}{event: custom, custom_event_name: X, ...}{url_type: tracker_pixel, asset_id: impression_tracker, url}(defaults to impression timing)PIXEL_TRACKER_LOSSY_DOWNGRADE{method: js, any event, url}url_type: tracker_pixelPIXEL_TRACKER_LOSSY_DOWNGRADEv1 → v2 upgrade table (inferred — SDK has no explicit event/method):
impression_tracker{event: impression, method: img}viewability_tracker{event: viewable_mrc_50, method: img}click_tracker{event: click, method: img}<other asset_id>{event: custom, custom_event_name: <original asset_id>, method: img}All v1→v2 upgrades surface
PIXEL_TRACKER_UPGRADE_INFERREDso consumers can see that event/method were inferred rather than explicitly declared.