Skip to main content

Taxonomies and verdicts

Labels in the API come from three sources: IAB Tech Lab taxonomies (content, audience, ad product), the GARM brand-safety categories, and a handful of fixed vocabularies defined by Pyler (genre, music mood, weather, human activity). Brand-safety verdicts are a separate, deterministic decision computed from GARM hits and your policy rules.

Label setWhere it appearsLevel
IAB Contentiab_content_leaf; filter iab_t1 on search and video listVideo
IAB Audience (interest, purchase intent)iab_audience_interest_leaf, iab_audience_purchase_intent_leafVideo
IAB Ad Productiab_ad_product_leafVideo
GARMgarm_categories (scene), garm_level (scene marker), garm_video (video), garm (ad screening)Scene and video
GenregenreVideo
Music mood, weather, human activitymusic_mood, weather, human_activityScene

Label strings are enforced as exact enums in the pipeline. Compare them verbatim, including case, spacing and punctuation.

IAB Content Taxonomy​

The IAB Tech Lab Content Taxonomy is a "common language" for describing content; its typical uses are contextual targeting and brand safety. The pipeline works from the Tier-1 / Tier-2 hierarchy of the taxonomy and returns leaf labels.

How videos get labels. IAB categories are not predicted per scene. The summarizer reads all scene captions, transcripts and entities together and assigns up to five iab_content_leaf labels describing what the video is about. A scene object therefore has no IAB field; look at its parent video.

Filtering. iab_t1 on POST /api/v1/search and GET /api/v1/videos takes Tier-1 content category names (for example Food & Drink) and narrows results to videos in those branches.

IAB Audience Taxonomy​

The Audience Taxonomy gives the industry a common nomenclature for audience segments. Its Tier-1 split is Demographic, Interest (segments based on user interests in particular topics or activities) and Purchase Intent (segments based on indicated intent to purchase particular products or services).

The API infers the two content-derivable branches and omits Demographic, which cannot be inferred from content alone:

FieldReading
iab_audience_interest_leafInterests of the viewers this video suits.
iab_audience_purchase_intent_leafProduct or service categories those viewers are likely in market for.

IAB Ad Product Taxonomy​

The Ad Product Taxonomy standardizes how the product or service being advertised is described, giving publishers control over the kinds of ads delivered through automated channels.

The API uses it in the reverse direction: iab_ad_product_leaf lists the ad product categories that fit next to this content (a cooking video might yield restaurant or food-delivery categories). Ad matching uses these labels. GET /api/v1/ads/{ad_id}/analysis returns the same IAB and GARM fields for a registered ad creative.

GARM brand-safety categories​

The GARM Brand Safety Floor, a framework published by the World Federation of Advertisers' Global Alliance for Responsible Media initiative, lists the categories the industry uses to keep ads away from harmful content. The API applies that framework as implemented by Pyler. Two closely related vocabularies are in use.

Indexing and search (12 categories, three levels)​

Used by scene garm_categories, scene-marker garm_level, video garm_video, and the garm_min_level filter.

Slug
adult
weapons
crime
death_conflict
piracy
hate
profanity
substances
spam_harmful
terrorism
sensitive_social
misinformation

Severity levels are high, medium, low. Scene markers add none for a scene with no flag.

Scene flags vs video assessment. Scene-level garm_categories record anything genuinely depicted in a single clip and are intentionally sensitive: fairy tales, parody, sports highlights and scripted drama over-trigger. The summarizer then reviews each flagged category against the whole video and keeps only the ones that are truly present. garm_video therefore contains only confirmed entries, each as:

{ "category": "substances", "level": "medium",
"reasoning": "Bar scene with repeated on-screen drinking.", "time_ranges": [] }

Filtering. garm_min_level (low | medium | high) on search and the video list is a floor: "only matches at this level or higher".

Ad screening (11 categories)​

POST /api/v1/ad-blocking and POST /api/v1.1/ad-blocking evaluate an ad creative against the GARM Brand Safety Floor. Slugs are stable and safe to switch on.

SlugGARM title
adult_and_explicit_sexual_contentAdult & Explicit Sexual Content
arms_and_ammunitionArms & Ammunition
crime_human_rights_violationsCrime & Harmful Acts, Human Rights Violations
death_injury_or_military_conflictDeath, Injury, or Military Conflict
online_piracyOnline Piracy
hate_speech_and_acts_of_aggressionHate Speech & Acts of Aggression
obscenity_and_profanityObscenity & Profanity
illegal_drugs_alcohol_tobacco_vapingIllegal Drugs / Tobacco / E-cigarettes / Vaping / Alcohol
spam_or_harmful_contentSpam or Harmful Content
terrorismTerrorism
debated_sensitive_social_issueDebated Sensitive Social Issue

Screening results report fired categories without a severity level: each garm[] item is { category, reasoning }.

Pyler vocabularies​

Besides IAB and GARM, a few fields use fixed vocabularies defined by Pyler.

FieldVocabulary
genre (video)28 film-and-TV genre labels; one to three per video, dominant first.
music_mood (scene)calm, energetic, dramatic, playful, melancholic, tense, none.
weather (scene)20 observed weather / sky states, including Indoor and Unknown / Not visible.
human_activity (scene)AVA-80 activity labels, derived from the free-form action slugs.

The verdict model​

Brand-safety screening returns a single deterministic verdict in block_decision.

block_decisionWhen
blockAt least one GARM category fired or at least one policy rule matched.
allowNothing fired and no rule matched.

There is no intermediate "review" state in the API. The model supplies the evidence; the verdict is computed in code from that evidence, so the verdict always agrees with the garm and blocklist.hits it ships with. The evidence itself is model output and can be wrong; treat block as "hold for review", not as a legal or policy determination. See Data handling.

garmobject[]

GARM categories that fired, each { category, reasoning }. Empty when clean. Always evaluated, even with no rules.

blocklistobject

{ rules, hits }. rules is every policy line evaluated (your team's saved blocklist plus the request's ad-hoc rules). hits is [{ rule, matched, evidence }]; items with matched: true are the rules that fired.

explanationstring | null

One-sentence human-readable reasoning prefixed with the triggering categories and rules. For display only; branch on garm and blocklist.hits instead.

screening_failedboolean

true when the screening itself errored. The verdict is then a precautionary block (fail-closed), not a content judgement. Retry, and never surface it to end users as a real block.

warning

A real block and a failed screening both produce block_decision: "block" and an explanation that starts with BLOCKED. Branch on screening_failed, not on the text.

Policy rules​

Policy rules are natural-language lines ("no on-screen consumption of alcohol"). Two sources are merged on every screening:

  • Your team's saved blocklist, managed in the dashboard's Ad Blocking tab.
  • Ad-hoc rules sent with the request, comma- or newline-separated.

Each rule is judged independently and reported in blocklist.hits. Rules are additional policy on top of GARM; GARM categories are always evaluated. The API does not define custom categories beyond these rules.

Where verdicts come from​

EndpointInputNotes
POST /api/v1/ad-blockingMultipart file + optional title, rulesSynchronous, a few seconds. Creatives capped at about 120 s. Result has ad_id: null.
POST /api/v1.1/ad-blockingJSON ad_id (+ rules)Screens a registered creative; 409 if it is not ready.
GET /api/v1.1/ad-blockingad_id filterStored results, newest first. Use it to recover a verdict lost to a client timeout instead of re-submitting.

See the Brand safety guide for an end-to-end recipe.