Data dictionary
One row is one continuous appearance of an ad on screen; if it leaves the viewport and returns, that is a new row. Mobile rows and desktop rows are two tables with their own columns: pick the platform below, and the list shows every column of that platform's rows, grouped by what it tells you. See a whole row →
A null column is left out of the line: treat a missing key as null. The one exception is other_brands, which is [] when there are none.
impression_id identifies one impression. The change feed sends an impression again whenever it changes, and sends {"impression_id", "date", "removed": true} when it is gone, so upsert on the id: The change feed →. In a day export, a rebuilt day can give its rows new ids: replace whole days, not ids. Day export →
New columns are added as we measure more. Read the files by name with schema union and a new column is a new key on the rows that have it.
Identity
Keys for joining and counting. panelist_id and session_id are stable across exports; a rebuilt day can give its rows new impression_id values.
Unique identifier of the impression, unique within an export. A rebuilt day can give its rows new ids: merge by day, not by id.
9f1c2b3a…4b5c6d7ePseudonymous identifier of the panelist who saw the ad. The same across every export and both platforms, so it counts reach and frequency.
p_0001a2b3The sitting the impression happened in: a period of phone use, or a browsing session.
174823910Where the ad was seen
The website the ad was seen on.
Null on mobile when the ad was seen inside an app rather than in a browser.
aftonbladet.seThe app, by the name it shows on the phone; package_name is the same app by its id.
Null when the phone reported no name for the package.
InstagramWhere in the app the ad ran. Facebook: feed, reel, story, marketplace, watch, browser. Instagram: feed, reel, story, explore. YouTube: in_stream, shorts, feed. TikTok: feed. A web page in a browser: browser. Any other placement: other.
Null when the format could not be read with confidence, about one row in ten.
feedWhat kind of creative it was: video or display. On desktop, video is also told apart as in-stream (inside a video player) or out-stream (in the page).
Null on mobile outside Facebook, Instagram, YouTube, TikTok and Chrome, and when it could not be read with confidence.
displayWhen and for how long
All times are UTC. Rows carry no date column: the download holds a day=DD folder per day inside each month's archive, the UTC date the ad first appeared.
When the ad left the screen. On mobile, the device's next screen change after the ad was last captured, in the same app or another, at most 60 seconds later and 10 minutes after first_seen, and earlier when the camera stopped. On desktop, when the ad was last seen.
2026-10-03T09:42:14.778ZHow long the ad was on screen: first_seen to last_seen on mobile.
Mind the units: seconds on mobile, milliseconds on desktop.
3.366Ad size
Width of the ad. Mobile uses density-independent pixels, so sizes compare across screens.
360Shape of the ad by height ÷ width: banner (under 0.22), strip (to 0.40), wide (to 0.70), mpu (to 0.92), square (to 1.15), tall (to 1.40), full (1.40 and above).
tallThe standard display size an ad in a mobile browser matches, within 10 dp on each side.
Null for in-app ads and sizes that match no standard.
300x250Attention
Gaze measured while the ad was on screen, first_seen to last_seen on mobile, with the same definitions on both platforms. How we measure →
true when gaze was measured while the ad was on screen. Filter on it before computing attention rates.
When false, the attention columns are zero or null. That means "not measured", not "not looked at".
trueTotal time the gaze rested on the ad while it was on screen, in milliseconds. Fixation time is measured from the first to the last gaze sample on the ad, so a single fixation reads slightly shorter than the time the eye rested there.
412Whether the ad was looked at. The same definition on mobile and desktop, so the two compare directly.
trueAudience
The panelist's profile on the day of the impression: age, gender, area, country_code, and nothing else. Each can be null when the panelist has not given it.
{ "age": 34, … }The ad
Who advertised and what the ad said. Read from the text and links captured with each ad. A day's brand reading finishes about two days after the day; until then these columns can be missing, and the day's rebuild brings them.
The advertiser, by its public name.
Null when the ad shows no readable advertiser, for example an image ad with no text. The row stays in the export.
OddsetThe exact text the brand was read from, keyed by where it was found: account_name, ad_copy, landing_domain, file_name, view_id.
Null when brand is null.
{"account_name": ["oddset"]}Other brands named in the ad, such as the phone in an operator's ad. Each has a name and its relation to the ad: product, retailer_listing, co_marketing, comparison, sponsorship or unknown.
Empty list [] when there are none, also on a row with no brand. The one column that is never left out for being empty.
[{"name": "iPhone 17", "relation": "product"}]The advertiser's industry on the IAB Ad Product Taxonomy 2.0: the top level, and the full path down to the most specific level that fits.
Null when there is no brand, or the advertiser could not be placed with confidence.
GamblingGambling > Sports BettingThe advertiser's own words in the ad, copied exactly, one piece of text per line.
Null when there is no brand.
Allsvenskan avgörs nu
Spela på OddsetAddress of the ad's image or video file, when the app exposes one.
https://scontent…/oddset_v41.jpgIdentity
Keys for joining and counting. panelist_id and session_id are stable across exports; a rebuilt day can give its rows new impression_id values.
Unique identifier of the impression, unique within an export. A rebuilt day can give its rows new ids: merge by day, not by id.
9f1c2b3a…4b5c6d7ePseudonymous identifier of the panelist who saw the ad. The same across every export and both platforms, so it counts reach and frequency.
p_0001a2b3The sitting the impression happened in: a period of phone use, or a browsing session.
174823910Where the ad was seen
The website the ad was seen on.
Null on mobile when the ad was seen inside an app rather than in a browser.
aftonbladet.seWhat kind of creative it was: video or display. On desktop, video is also told apart as in-stream (inside a video player) or out-stream (in the page).
Null on mobile outside Facebook, Instagram, YouTube, TikTok and Chrome, and when it could not be read with confidence.
displayWhen and for how long
All times are UTC. Rows carry no date column: the download holds a day=DD folder per day inside each month's archive, the UTC date the ad first appeared.
When the ad left the screen. On mobile, the device's next screen change after the ad was last captured, in the same app or another, at most 60 seconds later and 10 minutes after first_seen, and earlier when the camera stopped. On desktop, when the ad was last seen.
2026-10-03T18:05:19.874ZHow long the ad was on screen: first_seen to last_seen on mobile.
Mind the units: seconds on mobile, milliseconds on desktop.
6120When any part of the ad first and last became visible.
2026-10-03T18:05:12.540Z2026-10-03T18:05:18.660ZAd size
Width of the ad. Mobile uses density-independent pixels, so sizes compare across screens.
300Viewability
The IAB in-view standard, measured in the panelist's browser.
At least half the ad was visible for at least one continuous second.
trueAt least half the ad was visible for at least two continuous seconds.
trueWhether the ad meets the IAB standard for its format: one second for display, two for video.
trueAttention
Gaze measured while the ad was on screen, first_seen to last_seen on mobile, with the same definitions on both platforms. How we measure →
true when gaze was measured while the ad was on screen. Filter on it before computing attention rates.
When false, the attention columns are zero or null. That means "not measured", not "not looked at".
trueTotal time the gaze rested on the ad while it was on screen, in milliseconds. Fixation time is measured from the first to the last gaze sample on the ad, so a single fixation reads slightly shorter than the time the eye rested there.
690Whether the ad was looked at. The same definition on mobile and desktop, so the two compare directly.
trueWhen the gaze first landed on the ad, and when it last left.
Null when the ad was not looked at.
2026-10-03T18:05:13.102Z2026-10-03T18:05:16.410ZAudience
The panelist's profile on the day of the impression: age, gender, area, country_code, and nothing else. Each can be null when the panelist has not given it.
{ "age": 34, … }The ad
Who advertised and what the ad said. Read from the text and links captured with each ad. A day's brand reading finishes about two days after the day; until then these columns can be missing, and the day's rebuild brings them.
Content of the ad's HTML: visible text, headings, links, image, video and script addresses. Only included when the export is started with include_html_metadata and your agreement covers it.
{ "headings": […], … }