scrub labs
api in private beta · sub-300ms p99

moderation
that doesn't suck.

A moderation layer built for modern apps. One API. Sub-300ms. Slang-aware. Trust & safety shipped in an afternoon., slang-aware. ship trust & safety in an afternoon — not a quarter.

join the waitlistsee how it works
~/ curl
# one call. that's it.
curl -X POST https://api.getscrub.dev/v1/moderate \
  -H "authorization: Bearer sk_live_•••" \
  -d '{"text":"u finna catch these hands fr"}'
# → {"decision":"block","tier":"deep","categories":["hate"]}
0ms
target p50 latency
0.00%
uptime sla
0
categories detected
0h
retrain cadence
sub-300ms p99slang-aware41 categoriesno human reviewers in your hot pathedge deployedtyped responsesbyo policyaudit log includedsoc2 in progressprivate beta
sub-300ms p99slang-aware41 categoriesno human reviewers in your hot pathedge deployedtyped responsesbyo policyaudit log includedsoc2 in progressprivate beta
/01the problem

existing tools fail in three ways. we picked them apart.

01 / blind

slang-blind

legacy classifiers were trained on 2018 reddit. "u finna get cooked" reads as a recipe. ours doesn't.

input → "u finna catch these hands"
legacy → safe ✕
scrub → block ✓
02 / slow

too slow

1.4s round-trips to a llm just to check a chat message. your users typed three more before it answered.

legacy
scrub
03 / pricey

too expensive

$0.012 per message at scale is a tax on growth. we cascade tiers so 95% of traffic costs ~nothing.

legacy $0.012/msg
scrub $0.0004/msg avg
— 30× cheaper at p50.
/02how it works

three tiers. cascade. only escalate when needed.

most messages are easy. spend cycles on the ones that aren't. we route every request through the cheapest tier first and only promote on uncertainty.

1,000,000 messagescost / latency ↘
flash · 95%echo · 4%deep · 1%
T1
Flash
tier 1
~1ms
95%resolves here

deterministic + cached.

regex, allow/deny, repeat-message bloom. catches the obvious 95%.

e.g. ok / spam / hard slurs
T2
Echo
tier 2
~30ms
4%resolves here

embedding + small classifier.

context-aware. handles slang, code-switching, masked text.

e.g. leetspeak, dogwhistles, soft toxicity
T3
Deep
tier 3
~250ms
1%resolves here

policy-tuned llm.

the last 1%. sarcasm, threats, long-form. includes a cited rationale.

e.g. ambiguous threats, jokes-with-edge
always learning

every 12 hours, the model gets a little sharper.

fresh slang corpus, fresh evals, fresh weights — on a 12h cadence. you ship once and the accuracy quietly compounds in the background.

cadence
12h
retrain + redeploy
drift caught
<24h
from the moment new slang shows up
your work
0
no version pinning, no migrations
/03why scrub

four things, done well.

/f

fast

global runtime latency: p50 62ms, p99 sub-300ms across 330+ locations. requests stay close to users, so your chat doesn't wait.

p50 62ms · p95 180ms · p99 281ms
/c

cheap

tiered cascade keeps 95% of traffic at flash-tier prices. you pay for hard cases, not easy ones.

avg $0.0004/msg at 1m+/mo
/a

accurate

94.6% f1 on the toxicity-en-2025 benchmark. retrained monthly on fresh slang corpora.

f1 0.946 · recall 0.93
/s

simple

one endpoint. one key. no webhooks, no sdks-required. typed responses, sane defaults.

POST /v1/moderate
/04live playground

type something. see what we'd do.

real cascade. local flash check first, then gpt-oss-safeguard-20b, then 120bvia vercel ai gateway. stops the moment we're sure.

POST /v1/moderate
28 chars · ⌘+enter to run
200 OK · response
ndjson
flash
~1ms
local wordlist + regex
echo
~30ms
gpt-oss-safeguard-20b
deep
~250ms
gpt-oss-safeguard-120b
awaiting input…
/06waitlist

we're not live yet. but we're close.

drop your email. we'll send one message when keys are ready — no drip campaign, no roadmap newsletters, no noise.

one email when keys are ready. that's it.

we won't spam. we won't sell your email. if we do, block us with our own api.