How do I fill content categories in an OpenRTB bid request for CTV?
Classify each piece of content once, before it airs, and look the result up when the bid request is built. A publisher, SSAI service or SSP data team runs every episode, movie or FAST channel segment through a classifier that reads its frames, speech and on-screen text, stores the IAB Content Taxonomy 3.1 IDs against the content ID, and writes them into
content.cat with cattax: 9 and content.genres with gtax: 9 at request time. No viewer
data is involved, and the lookup adds no model call to the auction.Most CTV requests go out without this today, which is why buyers say contextual targeting on CTV does not work.
How much content data do CTV bid requests actually carry?
Very little, according to the two vendors that have published counts. Both sell a fix for the problem, so read their numbers as directional.
The second figure shows the other half of the problem. When a genre does arrive, it is often one free-text word chosen by whoever set up the feed.
Why do CTV bid requests have no genre or content category?
Three reasons show up again and again.
The fields are optional and the old genre field is free text. OpenRTB defines a rich
content object, but
nothing in a request requires it to be filled. IAB Tech Lab's own implementation guidance says the genre
attribute is free text, so "sellers often pass their own internal naming conventions or long comma separated
arrays", which buyers cannot use for targeting, reporting or forecasting
(OpenRTB implementation guidance, section 7.13).Privacy law limits what can be shared. The Video Privacy Protection Act (VPPA) restricts sharing show-level viewing data, which makes some publishers cautious about passing titles and episodes in the bid stream (Advertising Week).
Publishers keep their best data for direct deals. The same Advertising Week piece notes that some publishers retain content object data for direct IOs, so the open-exchange version of a request carries less than the deal version.
A CTV stream also has no page to scrape. Web classifiers read the article text, and a video stream's content lives in its pictures and sound, so someone has to classify the media itself before any category can be sent.
Which OpenRTB 2.6 content fields matter for CTV?
These are the fields in the OpenRTB 2.6
Content object (under site.content or app.content) that carry
contextual signal for CTV, as defined in the
OpenRTB 2.6 specification.| Field | Type | What it carries |
cat | string array | IAB content category IDs describing the content, in the taxonomy named by cattax |
cattax | integer | Which taxonomy cat uses. Default is 1, and if it is missing, Content Taxonomy 1.0 is assumed |
genre | string | Free-text genre, which the genre guidance replaces with genres |
genres | string array | Genre IDs from the taxonomy named by gtax, normally the CTV genre subset of Content Taxonomy 3.1 |
gtax | integer | Which taxonomy genres uses. Default is 9, Content Taxonomy 3.1 |
prodq | integer | Production quality: 1 professionally produced, 2 prosumer, 3 user generated |
livestream | integer | 0 for on-demand, 1 for scheduled or linear |
len | integer | Length of the content in seconds |
series, season, episode | string, string, integer | Which show, which season, which episode |
network, channel | object | The network that owns the content and the channel it plays on, each with id, name and domain |
cattax defaults to 1 while gtax defaults to 9. If you send 3.1 IDs in
cat and leave out cattax, the receiver reads them as Taxonomy 1.0 codes. Always send cattax explicitly.What does the IAB Tech Lab CTV genre guidance say?
In December 2024 IAB Tech Lab released programmatic CTV genre guidance that added the
genres and gtax
attributes, a minor genre update published as Content Taxonomy 3.1, and a subset of 3.1 for CTV genres. Its stated
reason is that "free-text genre fields make it harder and more expensive for DSPs to interpret bidstream data
accurately" (PR Newswire).
The 3.1 update added the Thriller genre
(IAB Tech Lab).The implementation guidance splits the work between two fields (OpenRTB implementation guidance, section 7.13):
genres describes the genre of the whole program. Pass the fewest genres that describe it, most apt first.cat with cattax describes finer details inside the content that are not its genre.gtax as a 500+ code, and only work if the DSP can read that vendor's list.The CTV genre list itself is a short TSV in the IAB Taxonomies repository (CTV Genre Mapping). Each CTV genre points to a Content Taxonomy 3.1 ID, for example Reality to 651, Cooking to 216, Drama to 647 and Thriller to 700.
How does classify-at-ingest work for CTV?
The pattern moves classification out of the auction and into the content pipeline, where there is time to look at the whole asset.
1. Ingest. When an episode, movie or FAST segment lands in the library (usually in object storage), split it into scenes and extract what each scene contains: sampled frames, a speech transcript and on-screen text. 2. Classify once. Map the asset, and optionally each scene, to Content Taxonomy 3.1 IDs. Pick program-level
genres from the CTV genre subset and finer cat IDs from the full taxonomy. Keep a confidence score per
label and drop low-confidence ones.
3. Store by content ID. Write the IDs to a key-value store keyed by the same content ID the ad server or SSAI
service sees at playback.
4. Look up at request time. When the SSAI service or SSP builds the bid request, it reads the stored IDs and
fills cat, cattax, genres and gtax. A key-value read fits easily inside the auction's time budget.Who runs it depends on who holds the content. SSAI and FAST channel operators have the files and the content IDs, so they can classify directly. SSP data teams can classify the catalogs their publishers share with them. Scene-level contextual targeting is the same pattern at a finer grain: store IDs per scene with start and end times, and pick the scene that matches the ad break's position.
Because the labels come from the media, the request needs no viewer data, and the publisher decides which IDs to expose in the open exchange and which to keep for deals.
What does a filled content object look like?
Here is
app.content for a hypothetical FAST channel episode of a backyard grilling competition, using IDs from
the official
Content Taxonomy 3.1 TSV
and the CTV genre subset.{
"app": {
"bundle": "com.example.fastchannel",
"content": {
"id": "bco-s03e07",
"title": "Smoke Ring Showdown",
"series": "Backyard Cook-Off",
"season": "Season 3",
"episode": 7,
"len": 2580,
"livestream": 0,
"prodq": 1,
"gtax": 9,
"genres": ["651", "216"],
"cattax": 9,
"cat": ["640", "215", "214"],
"network": { "id": "net-01", "name": "Example Network", "domain": "example.com" },
"channel": { "id": "ch-12", "name": "Example Cooking Channel", "domain": "example.com" }
}
}
}genres
or on cat, and a grill brand can match on 215 directly.What does content classification leave to other tools?
Content categories describe what is on screen. Other problems in CTV need their own tools:
How does Mixpeek fit?
Mixpeek is one way to run the classification step. It reads video from your own bucket, splits it into scenes, extracts frames, speech transcripts and on-screen text, and classifies each document against a taxonomy with a confidence score per label. It ships the full IAB Content Taxonomy 3.1, generated from IAB Tech Lab's published TSV with a test that checks every ID, name, parent and tier. See taxonomies in the docs and how to classify content against a taxonomy. You store the resulting IDs by content ID and look them up at bid time, as described above.
For the request side, the open-source @mixpeek/openrtb reference package shows how to write categories into
site.content or app.content. It currently
emits IAB Content Taxonomy 3.0 with cattax: 7, and it is a reference implementation with no official IAB status. If your
buyers expect 3.1, send cattax: 9 with 3.1 IDs. The open-source IAB mapper converts
older 2.x categories to 3.x. You can try classification on your own text and media in the free
IAB contextual classifier demo.An open IAB 3.1 benchmark for multimodal classification is not yet published, so test any classifier, Mixpeek's included, on a sample of your own catalog before you put its labels in the bid stream.
Frequently Asked Questions
What cattax value should I use for IAB Content Taxonomy 3.1?
Use 9. In AdCOM's List: Category Taxonomies, 9 is Content Taxonomy 3.1 and 7 is 3.0. Send it explicitly, because a missing
cattax means Taxonomy 1.0.What is the difference between genres and cat in OpenRTB?
genres holds the genre of the whole program as IDs from the taxonomy in gtax, normally the CTV genre subset
of Content Taxonomy 3.1. cat holds other content categories, including finer details inside the program, in the
taxonomy named by cattax
(OpenRTB implementation guidance).How do we target CTV contextually without viewer data?
Classify the content itself and send the result as IAB category and genre IDs in the bid request. The labels describe the program and its scenes, and the request carries no information about the viewer.
Why are the IAB categories in the bid stream often wrong?
Many feeds still use the free-text
genre field filled with each seller's own naming, and many pass one tag for a
title that fits several. Peer39, a vendor that sells program-level data, found 58% of requests for one film carried
only "Fantasy"
(Peer39).
Labels derived from the video and checked against the official 3.1 list fix both problems.Can I classify CTV content at bid time instead of at ingest?
Classifying a video takes far longer than an auction allows, and the same episode is requested many times. Classify once when the asset is ingested, store the IDs by content ID, and read them at request time.