NEWVectors or files. Pick a path.Start →
    Video Understanding
    9 min read
    Updated 2026-10-13

    Why CTV bid requests lack content categories, and how to fill them

    Most CTV bid requests arrive with little or no content metadata because the publisher never classified the stream in IAB terms, privacy law limits show-level sharing, and some publishers hold their best show data back for direct deals. The fix is to classify each asset once at ingest from its frames, speech and on-screen text, store IAB Content Taxonomy 3.1 IDs keyed by content ID, and fill OpenRTB content.cat, cattax, genres and gtax by lookup when the request goes out.

    CTV
    OpenRTB
    IAB Taxonomy
    Contextual Advertising
    Ad Tech
    Video

    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.

  1. Gracenote (vendor study). Across more than 6.8 billion publisher-supplied bid requests, inventory carried an
  2. average of 0.73 biddable categories such as genre, rating or program type, and in a separate week of 21.4 billion SSP bid requests only 32% included a genre (Gracenote).
  3. Peer39 (vendor study). Only about one-third of CTV bid requests include any genre data
  4. (Peer39). In one title-level check, 58% of roughly 327,000 bid requests for *Man of Steel* passed the single genre tag "Fantasy", and none carried the film's full set of Action, Adventure, Science Fiction and Fantasy (Peer39).

    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.

    FieldTypeWhat it carries
    catstring arrayIAB content category IDs describing the content, in the taxonomy named by cattax
    cattaxintegerWhich taxonomy cat uses. Default is 1, and if it is missing, Content Taxonomy 1.0 is assumed
    genrestringFree-text genre, which the genre guidance replaces with genres
    genresstring arrayGenre IDs from the taxonomy named by gtax, normally the CTV genre subset of Content Taxonomy 3.1
    gtaxintegerWhich taxonomy genres uses. Default is 9, Content Taxonomy 3.1
    prodqintegerProduction quality: 1 professionally produced, 2 prosumer, 3 user generated
    livestreaminteger0 for on-demand, 1 for scheduled or linear
    lenintegerLength of the content in seconds
    series, season, episodestring, string, integerWhich show, which season, which episode
    network, channelobjectThe network that owns the content and the channel it plays on, each with id, name and domain
    The taxonomy codes come from AdCOM's List: Category Taxonomies, where 7 is Content Taxonomy 3.0, 9 is Content Taxonomy 3.1, and 500 and up are vendor-specific taxonomies. One detail causes silent mismatches: 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):

  5. genres describes the genre of the whole program. Pass the fewest genres that describe it, most apt first.
  6. Buyers mostly use allow and block lists, and a long list makes the program harder to judge.
  7. cat with cattax describes finer details inside the content that are not its genre.
  8. Vendor classifications go in gtax as a 500+ code, and only work if the DSP can read that vendor's list.
  9. Using the CTV genre subset of 3.1 gives the widest DSP support.

    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" }
        }
      }
    }
    In Content Taxonomy 3.1, 651 is Reality TV and 216 is Cooking (both on the CTV genre list), 640 is Television, 215 is Barbecues and Grilling, and 214 is World Cuisines. A buyer targeting food and cooking can match on 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:

  10. Fraud and spoofed inventory are handled by invalid traffic detection and supply chain checks such as
  11. ads.txt, app-ads.txt and sellers.json. A correct category on a spoofed request is still a spoofed request.
  12. Measurement and attribution come from your measurement partner, panel or clean room.
  13. Audience data is a separate signal. Contextual categories work with none, and they combine with audience
  14. segments where a buyer has consented data.

    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.

    Sources



  15. Gracenote: Content IDs are the key to unlocking value in programmatic CTV advertising (vendor study)
  16. Peer39: Fake CTV, what buyers can't see (vendor study)
  17. Peer39: One movie, six descriptions (vendor study)
  18. Advertising Week: Optimizing CTV with unified taxonomies and signal controls
  19. OpenRTB 2.6 specification, Object: Content
  20. OpenRTB implementation guidance, section 7.13: Using genres and gtax
  21. AdCOM 1.0, List: Category Taxonomies
  22. IAB Tech Lab programmatic CTV genre guidance (PR Newswire, December 2024)
  23. IAB Tech Lab: Content Taxonomy
  24. IAB Content Taxonomy 3.1 TSV
  25. IAB CTV Genre Mapping TSV
  26. @mixpeek/openrtb reference package
  27. Mixpeek IAB contextual classifier demo
  28. Managed Mixpeek

    Put multimodal search to work

    Connect a bucket and Mixpeek runs the whole multimodal search pipeline for you: extraction, indexing, and search over your own objects. No models to wire up, nothing to host.

    Start with Managed
    MVS · bring your own

    Already have vectors?

    Keep your embeddings on your own cloud and run dense, sparse, and BM25 search directly on object storage. From $25/mo.

    Start with MVS

    Run this on your own data

    Point Mixpeek at the storage you already have and search your video, images, audio, and documents the way this guide describes. Build starts at $25/mo for up to 1M vectors.

    Search your own archiveRead Docs