Build 2 layers, not 1 score. A universal floor every advertiser shares, and suitability weights each advertiser sets themselves.
- Build 2 layers: a safety floor that is the same for everyone, and a suitability layer each advertiser configures.
- Do not set suitability weights yourself; an alcohol brand and a children's brand want opposite things.
- GARM shut down in August 2024 after an antitrust suit from X, but its Brand Safety Floor and suitability framework remain the standard, with no steward.
- Keyword blocklists perform badly: ads were found beside racist and sexual content while running through major brand safety controls.
- A single score is fine for budget decisions, unlike employment screening, but return its components so creators can fix something.
Brand safety scoring gets built as 1 model producing 1 number, and then every advertiser argues with the number. The argument is usually right, because the thing being measured is not 1 thing.
There is content almost no advertiser will sit beside, and there is content that is completely fine for 1 brand and wrong for another. Those are different problems and they need different layers.
Here is how to split them, how to let advertisers set their own weights without you deciding on their behalf, and why that separation matters more in 2026 than it did a few years ago.
Why is a score acceptable here?
Worth addressing directly, because we have argued against composite scores elsewhere. In the screening risk taxonomy a blended risk score is a liability, and here a score is reasonable. The difference is what the decision does.
| Employment screening | Brand safety | |
|---|---|---|
| Decision about | A person's livelihood | Where a budget goes |
| Subject can dispute | Legally entitled to | Commercially, not legally |
| Standard | Job-relatedness, set by law | Advertiser preference |
| Right output | Findings with evidence | A ranked, explainable score |
So a score is fine, and it still needs to be decomposable. A creator excluded from a campaign should be able to find out which category triggered it, both because it is fair and because the brand will ask.
What happened to the industry standard?
It lost its owner and kept running. GARM, the Global Alliance for Responsible Media, discontinued its activities in August 2024 after X filed an antitrust lawsuit alleging coordinated ad boycotts, and Rumble sued as well.
The useful part is that the framework survived the organisation. GARM's Brand Safety Floor and its suitability framework stayed in place across publishers and platforms, and they remain the shared vocabulary the industry works in.
2 practical consequences for anyone building now.
- The taxonomy has no maintainer. No one is updating the categories or arbitrating edge cases, so version your implementation, date it, and expect to make your own judgement calls on new content types.
- Coordination is the thing that drew the lawsuit, not safety screening itself. A vendor that sets thresholds centrally and applies them across many advertisers is doing something closer to what was alleged than a vendor giving each advertiser their own controls.
That second point is a design argument, not legal advice, and it happens to produce a better product anyway.
What goes in the floor layer?
Content essentially no advertiser wants adjacency to. This layer is binary, universal across your customers, and short.
- Illegal content and content depicting or facilitating serious crime
- Explicit sexual content
- Graphic violence and gore
- Terrorism and violent extremism
- Content exploiting or endangering children
- Direct, targeted harassment of a named person
Keep it short deliberately. Everything you add to the floor is something you have decided on behalf of every customer, so the bar for inclusion should be that you cannot imagine an advertiser objecting to the exclusion.
What you can assess depends on which content you can reach per platform. The field list is public. See the coverage list
What goes in the suitability layer?
Everything contested, with weights the advertiser sets. The same category gets a different weight from different brands, and both are correct.
| Category | Spirits brand | Children's brand | Fintech |
|---|---|---|---|
| Alcohol references | Welcome | Exclude | Neutral |
| Strong language | Low concern | Exclude | Medium |
| Gambling | Medium | Exclude | High |
| Political commentary | Medium | Medium | High |
| Competitor mentions | High | High | High |
| Debt and credit talk | Neutral | Neutral | High |
No single set of weights serves that table, which is the whole argument for making them configurable. Ship sensible defaults per vertical so a new customer is not starting from an empty form, and make every default editable. The shortlisting side of this sits in influencer discovery.
How should the scoring work?
# 2 passes. The floor is a gate, suitability is a score.
def assess(creator, advertiser_policy):
findings = classify(creator.content) # per item, per category
# PASS 1: the floor. Binary, same for every advertiser.
floor_hits = [f for f in findings if f.category in FLOOR]
if floor_hits:
return {"decision": "excluded",
"reason": [f.category for f in floor_hits],
"evidence": [f.permalink for f in floor_hits]}
# PASS 2: suitability. Advertiser weights, not yours.
components = {}
for cat, weight in advertiser_policy.weights.items():
rate = share_of_items_in(findings, cat) # NOT a raw count
components[cat] = rate * weight
return {"decision": "scored",
"score": 100 - sum(components.values()),
"components": components, # always return these
"items_reviewed": len(findings), # the denominator
"policy_version": advertiser_policy.version}
# 3 details that matter:
# - rate, not count. A creator with 2,000 posts will out-hit one
# with 50 on raw counts while being cleaner per post.
# - items_reviewed travels with the score. A 98 from 11 items is
# not the same as a 98 from 900.
# - policy_version is stored, so last quarter's score can be
# explained when the weights have since changed.
The rate versus count point causes more complaints than anything else in these systems. Scoring on raw counts systematically penalises prolific creators, who are often the ones a brand most wants, and the fix is 1 line.
Why do keyword lists fail?
Because they match words rather than meaning, and the errors run in both directions.
They miss plenty. Reporting in 2024 found ads appearing beside explicitly racist and sexual content while running through brand safety controls from the largest verification vendors, so the presence of a tool is not evidence of protection, any more than a fake follower percentage is evidence of fraud.
They also over-block. A news publisher covering a tragedy gets excluded by a list containing the words in the story, which is why blocklists have a long record of defunding exactly the journalism advertisers say they support.
3 things that work better than a longer list.
- Classify at the item level with context, then aggregate, rather than matching strings across a profile.
- Read what the content actually contains. Most posts on the platforms that matter are video, so a caption-only pipeline is reading the label rather than the tin, the same gap we flagged in building a screening product. Coverage mechanics are in social screening API coverage.
- Separate the creator from the comments. A creator is not responsible for what strangers post under their videos, and attributing it to them will exclude people for being popular.
What should you measure?
- Items reviewed per creator, and the share that were video with audio analysed. This is the honest measure of how much your score is based on.
- Inter-reviewer agreement per category. If 2 humans disagree about a category, the category is badly defined and the classifier cannot fix that.
- Appeal and overturn rate by category. The categories that get overturned most are the ones to rewrite.
- Score distribution by creator size. If small creators score systematically better, you are probably counting rather than rating.
- Language parity. Flag rates that differ across languages when the content does not are a classifier problem, not a creator problem.
Summary
Split the system in 2. A short universal floor you gate on, and a suitability layer whose weights belong to the advertiser rather than to you. That split handles the fact that the same content is right for 1 brand and wrong for another, and it keeps you out of the business of setting a shared industry standard.
Score on rates rather than counts, carry the components and the number of items reviewed alongside the score, and store the policy version so an old decision can still be explained. Then measure coverage and agreement, because a confident score built on 11 posts is not a confident score.
Want the content and identity layer underneath your scoring engine? Get a demo
What is the difference between brand safety and brand suitability?
Safety is content almost no advertiser will appear beside, like gore. Suitability is per advertiser: alcohol references suit a spirits brand, not a children's brand. Gate safety, weight suitability.
Is the GARM framework still used?
Yes. GARM discontinued activities in August 2024 after an antitrust lawsuit from X, but its Brand Safety Floor and suitability framework remain in use, with nobody maintaining them.
Should a brand safety score be a single number?
A single number is acceptable here because the decision is where a budget goes, not someone's livelihood. It should still be decomposable, so a creator can learn which category triggered an exclusion.
Why do keyword blocklists perform badly?
They match words, not meaning, so they miss harmful content using other words and over-block legitimate content like news coverage. Classify items in context and analyse video, not just captions.
Should creators be scored on their comment sections?
Not as their own conduct. Creators do not control strangers' comments, and conflating the two excludes people for being popular. If a brand asks, score comments separately as adjacency risk.



