Trillboards
Menu
Who was there
Play-level audience
One row per ad play, with the audience the camera read while it ran: faces, head pose, gaze, facing angle, dwell, emotion, ambient sound and light, each with the number of camera readings behind it. Every logged play ships, so the file is also a complete play log.
The question it answers
Who was in front of the screen while my ad was playing?
182,303
plays with a camera reading
165,787
plays with a face on camera
4,610
screens
Measured over the 28 days to October 11, 2026.
The dataset
- Grain
- One row per ad play.
- Cadence
- One row per play, one file per day.
- History
- From June 24, 2026.
- Format
- Parquet or JSONL.
- Delivered to
- Your S3 bucket, your GCS bucket, or a time-limited download link, with a manifest and a schema.
- Method
- How each measure is produced and how to add rows up: the measurement methodology.
What buyers do with it
- Attention and audience per creative, flight, screen and hour.
- Send your own play logs (screen, start, end) and get the audience of each play back as a file.
- Ground truth for attention and outcome models.
The table
Read from the export registry each time this site is built.
play_audience
Daily, from June 24, 2026- Grain
- One row per play_date, screen_id, play_source and play_key.
- Delivery
- One file per day, as Parquet or JSONL.
- Basis
- Measured.
- Definition
- Version 1.
| Column | Type | What it holds |
|---|---|---|
play_date | date | UTC day of the play (of its kept report's completion). |
screen_id | string | Trillboards screen id (24-character hex); joins dim_screen.screen_id. |
play_source | string | Where the play is logged: completed_impressions, or partner_measurement_plays for a play a partner served. |
play_key | string | With play_date, screen_id and play_source it is the play: billing's partner-aware key (completed_impressions.play_key) per UTC day, or partner_id:play_id for a partner play. |
ad_id | string | Ad id of the kept report. Null: No ad id, or the pod placeholder. |
creative_id | string | Creative id of the kept report. Null: No creative id, or the IMA house/fallback creative. |
impression_id | string | Impression id of the kept report. Null: The report carried none. |
request_id | string | Our ad request id (joins vast_requests). Null: The report carried none. |
content_sha256 | string | SHA-256 of the media file's bytes that played. Null: The report carried none. |
ingestion_path | string | The kept report's path (vast_event, proof_of_play, partner_sdk, owned_direct; partner_measurement for a partner play). |
source_provider | string | Demand source of the play. |
play_started_at | timestamp | play_completed_at minus the play's length (its longest positive reported duration, else 30 s), UTC. |
play_completed_at | timestamp | When the kept report says the play completed, UTC. |
duration_imputed | integer | 1 when no report carried a positive duration, so the play's interval is the 30 s default. |
windows_n | integer | Audience windows attributed to the play: every window overlapping it widened by 5 s each side, any sensing mode and grade. Unit: windows. |
overlap_windows_n | integer | Of those, the windows inside the logged play itself. Unit: windows. |
overlap_ms_sum | integer | Milliseconds of window inside the logged play, summed. Unit: ms. |
camera_windows_n | integer | Overlapping windows that are camera-graded: the base of every camera measure. Unit: windows. |
camera_overlap_ms | integer | Overlap of those windows: the weight of face_count_mean and head_pose_index_mean. Unit: ms. |
face_windows_n | integer | Camera windows whose face reading is above 0. Unit: windows. |
scene_frames_n | integer | Attributed windows carrying a vision-model scene description. Unit: windows. |
evidence_grade_windows | map | Attributed windows by evidence grade ('' = none recorded); sums to windows_n. Unit: windows. |
face_count_max | double | Largest per-window face reading over the camera windows. Unit: faces. Null: No camera window. |
face_count_mean | double | Overlap-weighted mean face reading over the camera windows. Unit: faces_per_window. Null: No camera window. |
head_pose_index_mean | double | Overlap-weighted mean head-pose index (0.4 yaw + 0.3 pitch + 0.3 eye-open) over every camera window; gaze is gaze_pct_on_screen. Unit: index. Null: No camera window. |
head_pose_windows_n | integer | Camera windows whose head-pose index is above 0 (its coverage, not its denominator). Unit: windows. |
gaze_windows_n | integer | Camera windows carrying a gaze reading. Unit: windows. |
gaze_overlap_ms | integer | Overlap of those windows: gaze_pct_on_screen's weight. Unit: ms. |
gaze_pct_on_screen | double | Overlap-weighted mean on-screen gaze share 0-1. Unit: share. Null: No gaze window. |
head_yaw_windows_n | integer | Camera windows whose facing angle came from the head-yaw instrument and is above 0. Unit: windows. |
head_yaw_overlap_ms | integer | Overlap of those windows. Unit: ms. |
head_yaw_heads_up_share | double | Overlap-weighted share of those windows facing the screen within 30 degrees. Never pooled with the shoulder instrument. Unit: share. Null: No such window. |
shoulder_windows_n | integer | Camera windows whose facing angle came from the shoulder (MoveNet) instrument and is above 0. Unit: windows. |
shoulder_overlap_ms | integer | Overlap of those windows. Unit: ms. |
shoulder_heads_up_share | double | Overlap-weighted share of those windows within 30 degrees. Unit: share. Null: No such window. |
dwell_windows_n | integer | Camera windows with a capped dwell (a start time to cap at). Unit: windows. |
dwell_overlap_ms | integer | Overlap of those windows. Unit: ms. |
dwell_capped_ms_mean | double | Overlap-weighted mean dwell, each window capped at its own length. Unit: ms. Null: No such window. |
receptivity_windows_n | integer | Camera windows carrying an ad-receptivity score. Unit: windows. |
receptivity_overlap_ms | integer | Overlap of those windows. Unit: ms. |
receptivity_mean | double | Overlap-weighted mean ad-receptivity score 0-1. Unit: index. Null: None carried one. |
emotional_engagement_windows_n | integer | Camera windows carrying an emotional engagement score. Unit: windows. |
emotional_engagement_overlap_ms | integer | Overlap of those windows. Unit: ms. |
emotional_engagement_mean | double | Overlap-weighted mean emotional engagement score 0-1. Unit: index. Null: None carried one. |
emotion_windows_n | integer | Camera windows with a real dominant-emotion reading. Unit: windows. |
dominant_emotion_overlap_ms | map | Overlap milliseconds per dominant-emotion value: the play's emotion distribution. Unit: ms. |
dominant_emotion | string | The emotion with the most overlap, ties to the alphabetically first. Null: No emotion reading. |
audio_windows_n | integer | Overlapping windows carrying an audio level. Unit: windows. |
audio_db_max | double | Loudest audio level over those windows. Unit: dB. Null: No audio reading. |
lux_windows_n | integer | Overlapping windows with an ambient light reading. Unit: windows. |
lux_overlap_ms | integer | Overlap of those windows. Unit: ms. |
ambient_lux_mean | double | Overlap-weighted mean ambient light. Unit: lux. Null: No light reading. |
face_rows_n | integer | Per-face observation rows whose span overlaps the logged play. Unit: face_rows. |
face_tracks_n | integer | Distinct face tracks over those rows (the edge's pre-merge track id where it sent one); distinct counts do not add across plays. Unit: face_tracks. Null: No face row. |
gaze_face_rows_n | integer | Face rows carrying gaze seconds. Unit: face_rows. |
gaze_seconds | double | Gaze seconds of those rows inside the logged play. Unit: seconds. Null: No such row. |
builder_version | string | Digest of the builder SQL that built the row (pa-<12 hex>). |
Request a sample
Tell us the markets and the weeks you want. The sample is cut from production by the same export that makes the full delivery.
Request a sampleAll datasets · Next: Mobility flows, daily