Blog · CTV
Half a million streaming shows get ranked from app.bundle alone. Your content object is optional to everyone but you.
On August 27, Pixalate published the July 2026 OpenEPG Index update. The ranked universe grew from 12,875 shows at launch to more than 532,000 shows mapped across 13,600+ channels and 6,100+ apps. The index measures U.S. open programmatic ad spend and consumer reach by streaming TV show, split by large-screen CTV and small-screen mobile. Resolution uses standard bidstream bundle IDs with no publisher opt-in. That last clause is the part buyers should read twice.
What the index actually measures
OpenEPG ranks shows by estimated U.S. consumer reach and reports each show's share of open programmatic ad spend. The July release breaks spend and reach by screen class, genre, market tier, and daypart. Large-screen rankings combine Roku, Amazon Fire TV, Samsung, and Apple TV. Small-screen rankings combine Android and iOS. These are open-exchange signals, not a walled-garden report from any single SSP.
Pixalate states explicitly that show resolution runs on bundle IDs from the bidstream. The database behind the index does not wait for a seller to populate content.title, content.series, or content.episode. Public EPG data and open-exchange traffic do the mapping. If your buyer-side filter treats an empty content object as low-quality inventory, you are applying a rule the measurement layer does not need.
RTBlint is independent of Pixalate and not affiliated with IAB Tech Lab. The numbers below come from Pixalate's July 2026 blog post and linked U.S. spend report unless noted.
July spend patterns: same genre label, different screens
News, Reality, and Documentary accounted for 75% of estimated U.S. CTV open programmatic ad spend on streaming TV shows in July. On mobile, News alone took 52% of spend. Reality flipped the split: 8% of mobile streaming TV ad spend versus 30% on CTV. Comedy was 16% mobile and 4% CTV. Drama was 4% mobile and 3% CTV. Sport sat at 2% on both surfaces.
National versus local news diverged by screen as well. National news outlets captured 40% of mobile streaming TV ad spend compared with 12% for local stations. On CTV the gap was wider: 34% national versus 3% local. A single content.genre string, if it arrives at all, cannot carry that national/local split unless the seller also sends consistent market metadata and the buyer's taxonomy matches how the seller encodes it.
News over-monetized on CTV in July: 37% of ad spend against 28% of reach, which Pixalate reads as heavier ad loads and higher CPMs on large screens. Mobile news sat near parity at 52% spend versus 51% reach. HGTV (13%) and Food Network (11%) together accounted for roughly a quarter of CTV ad spend. Scripps News alone accounted for 22% of U.S. mobile streaming TV open programmatic ad spend. The Weather Channel swept the top three mobile slots by reach and held 25% of mobile streaming TV ad spend.
Genre IVT is not uniform
Among leading genres in July, News carried the highest invalid-traffic rate at 6.1%, nearly double Reality at 3.2%. Pixalate notes these IVT figures follow its MRC-accredited methodology and are not legal findings of fraud. Still, a buyer blocking on genre without knowing whether content.genre or content.genres in the request matches the show-level classification downstream is blocking blind.
If verification vendors classify genre from bundle resolution and public EPG while your DSP reads only what the seller typed into content, your pre-bid filter and your post-bid report can disagree on the same impression. That is not a measurement bug. It is two different inputs.
The mechanism in OpenRTB
Show-level context in OpenRTB lives on the Content object: content.title, content.series, content.season, content.episode, content.genre, and since 2.6-202501, content.gtax and content.genres. App inventory nests that object under app.content; site inventory uses site.content. CTV sellers often send a thin object or omit it entirely while still transmitting a valid app.bundle, app.name, and device fields.
Bundle ID is the key third parties use when publishers do not opt into enriched content signaling. The same identifier appears in ads.txt and sellers.json rows, in blocklists, and in fraud reports that flag platform mimicry. Inconsistent app.bundle across exchanges already splits one app into three allowlist entries. OpenEPG adds another consequence: show-level spend rankings and genre IVT rates can be computed from traffic that would fail a buyer rule requiring content.title.
// Minimal CTV app request: valid auction, empty show context
{
"app": {
"bundle": "com.example.fastnews",
"name": "Example FAST"
// no app.content block
},
"device": { "devicetype": 3, "ifa": "…" },
"imp": [{ "video": { "plcmt": 1 } }]
}
// Downstream show resolution (vendor EPG + bidstream)
// → "Morning Rush" on Scripps News, News genre, 6.1% genre IVT bucketNeither shape is malformed by itself. The gap is operational: buyers optimize filters on fields sellers skip; sellers lose demand to filters that measurement vendors bypass.
What to do
- Audit empty
contenton live CTV traffic before you block it. Sample open-exchange requests byapp.bundle. If title and series are missing but bundle and IFA are present, you are in the population show-level indexes already classify. - Split genre analysis by screen class. July's Reality skew (30% CTV spend, 8% mobile) means a genre allowlist tuned on one surface mis-prices the other. Device type and bundle together beat a lone
content.genrestring. - Align on
content.gtaxandcontent.genreswhere you can. OpenRTB 2.6-202501 added taxonomy fields so genre is not free text. See our 2.6-202501 review for the migration notes. - Treat national versus local as a separate signal. The July national/local split (40% versus 12% mobile, 34% versus 3% CTV) will not appear in a generic News genre flag unless someone sends it.
- Validate fixtures against both bundle and content. A test request with a perfect
contentblock and a spoofed bundle is still wrong. A real bundle with an emptycontentobject is common live traffic.
Check the payload
RTBlint checks structural and consistency rules on OpenRTB JSON. It does not resolve EPG or detect IVT. It will flag missing cattax when categories are sent, type mismatches on content.genres, and implausible combinations of app, device, and video fields. Paste a production CTV request and read what the seller actually ships.