DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

IAB Content Taxonomy 1.0 vs 2.2 vs 3.1: cattax Picks Which Table cat Uses

Starting 15 October 2026, Google Ad Manager again fills site.cat, site.pagecat, app.cat, and app.pagecat on Authorized Buyers, Open Bidding, and SDK bid requests outside the EEA, UK, and Switzerland. Contextual targeting gets a field it has not reliably had on the Google path since 2020. The catch is not whether categories appear. It is whether the buyer knows which IAB Content Taxonomy those integers belong to. OpenRTB carries the codes in cat (and pagecat, bcat, and friends). It carries the version selector in cattax. Treat them as one contract or your deal filters and brand-safety blocks aim at the wrong vertical.

Content Taxonomy 1.0: what OpenRTB assumes when cattax is missing

OpenRTB 2.6 sets BidRequest.cattax default to 1, AdCOM’s Content Category Taxonomy 1.0. That default made sense when most publishers still spoke the original flat list. It is a poor default in 2026.

Taxonomy 1.0 is a single-tier list. IAB1 might mean Arts & Entertainment in that table. In later taxonomies the same string pattern can sit under a different parent, or the id may not exist at all. If you omit cattax on a request whose CMS mapped categories with a 2.2 or 3.1 tool, a strict buyer still parses JSON successfully and interprets every code under the 1.0 table. Loss reason 209 (category blocked) then reads like a buyer grudge, not a version mismatch.

Google’s October rollout populates category arrays on the Ad Exchange path; buyers need the matching cattax on the same object. Our write-up on the Ad Manager pagecat change and the Prebid ortb2 gap walks through why two bidders on one page can see different category signals depending on path.

Content Taxonomy 2.2: tiered ids buyers still treat like 1.0

Content Taxonomy 2.2 expanded coverage and introduced tiered ids (IAB6-7 style paths). AdCOM maps it to cattax: 6. Pipelines built during the 2.x era often emit those codes everywhere: Prebid ortb2.site.content.cat, seller JSON fixtures, curated PMP filters.

The failure mode is subtle. "cat": ["IAB8"] with cattax: 6 is food & drink in 2.2. The same payload with cattax omitted (therefore default 1) is a different 1.0 category. Both payloads pass a schema check that only validates array shape and string type. Only a taxonomy-aware validator ties the integer to the declared table.

2.x is also what many block lists and bcat entries were authored against. When an upstream partner re-labels inventory with 3.1 ids but leaves cattax: 6, blocked-category logic silently misfires.

Content Taxonomy 3.0 and 3.1: same ids, new genre plane

3.0 and 3.1 grow the tree again (704 categories in 3.1, including genre additions such as Thriller). AdCOM uses cattax: 7 for 3.0 and cattax: 9 for 3.1. Every 3.0 id remains valid in 3.1, but new genre codes only make sense when the receiver knows 3.1.

OpenRTB 2.6-202501 added a second axis for CTV and long-form video: content.gtax (genre taxonomy id) and content.genres (genre codes in that taxonomy). cat / cattax still describe content category for contextual and brand-safety use. gtax / genres describe genre for programming metadata. Sending thriller genre codes without gtax, or labeling 3.1 genre ids under cattax: 7, produces the same class of bug: valid JSON, wrong semantics. The OpenRTB 2.6-202501 gtax and genres rule documents what that snapshot added on content.

cattax on the wire: one selector, many objects

cattax is not only on the bid request root. OpenRTB 2.6 lets site, app, content, publisher, producer, and bid objects carry their own taxonomy selector so nested cat arrays do not inherit a guess. In practice most integrations set BidRequest.cattax once and copy the same value down, or they set nothing and rely on default 1.

AdCOM publishes the authoritative enum list (1.0, 2.0, 2.1, 2.2, 3.0, 3.1, plus vendor-specific values). That list is the Rosetta stone between cat integers and human-readable verticals. The AdCOM guide on rtblint.org is the right place to reconcile cat with cattax when you upgrade OpenRTB snapshots.

VAST uses a parallel idea: Category values plus an authority URL naming which taxonomy registry applies. A mismatch there breaks creative-side category reporting even when the bid request looked fine. See content taxonomy authority on VAST tags. When you need to confirm category elements on the creative itself, use the VAST tag tester for live URL fetch and preview, and the VAST inspector to walk wrapper chains before you trust a category block list on the bid.

How you catch it

An LLM generating OpenRTB can emit cat and cattax that look plausible and still describe inventory the exchange cannot match to a deal or block list. The RPC or HTTP POST can return 200 either way.

rtblint (cargo install rtblint, npm install rtblint-core, MCP rtblint-mcp) checks the bid request object against dated OpenRTB snapshots, including cattax placement and the 202501 gtax / genres pair. It is independent of IAB Tech Lab and AAO; it is the deterministic check on the wire shape your agent claimed.

Run fixtures against the snapshot your exchange actually runs, for example OpenRTB 2.6-202606, before you scale traffic after a taxonomy migration or a publisher-side category rollout.

Where to go next

When you remap CMS tags to IAB 3.1, update cattax to 9, re-audit bcat, and replay a week of bid requests through rtblint. The categories Google started sending are only as good as the version label riding next to them.

Top comments (0)