
Moderation with your policy, not ours
A kids’ app, a gaming community and a marketplace draw the line in different places. Our open moderation pack, on par with dedicated moderation models, gives a calibrated score for each of 17 categories, with thresholds you set, and runs your own rules in the same call.
A published paper →
How it works, every result and its limits, in the open.
Public benchmarks, reproducible →
Measured on public labelled data; rerun it with your own key.
Open, readable pack →
Every question, calibration and threshold in one JSON file.
Your content stays yours
Not stored by default, never used to train models.
About $0.16 per 1,000 posts
1M posts for about $162. On spinf-12b, our optimized Gemma 4 12B, only input is billed, at $0.09 per million tokens: the content once per call, each question's own tokens, and one empty floor per question. The scores are free.
Combine use cases in the same call
The pack is open: a readable JSON file you can download, with every question and threshold. Run it with your own rules and any other classification (topic, intent, prompt injection) on the same post, in one call: the post is read and billed once, and each extra question adds only its own tokens.
Assumes 100-token posts, the full moderation prompt-pack (22 categories and a safe / unsafe decision) and two policy questions of your own in the same call. The first 50M tokens are free. Gemma is a trademark of Google LLC.
Results you can trust
Tested on 14,504 real, labelled posts and messages from public test sets, none of which were used to build the pack. Everything is public: rerun the test yourself with your own API key.
spinf/moderation: calibrated content moderation from plain-language questions
How the pack works, every category and test set, the safe / unsafe results, cost, what did not work, and the limits.
Ranks harmful above harmless: show the pack two posts, one that belongs to the category and one that does not. This is how often it gives the first one the higher score (50% would be a coin flip). Out of the box, each category flags only 0.5% of everyday content, and you can make it stricter or looser. Click a category to see its public test sets.
Data, method, the safe / unsafe results and every number on this page: see the paper.
Test sets, questions and code on GitHub: reproduce it with your own keyThe questions matter: iterate on yours
As with any language model, the wording of the questions and a few labelled examples change the results a lot. With spinf that is cheap to get right: try a few wordings and example sets on a few hundred of your own items for cents, and keep the best. How to write questions
See it on a real post
One call: every moderation category, the decision, and a rule of your own.
Guaranteed 300% returns in 7 days! DM me your wallet seed phrase and I'll set up the trading bot for you for free. Only 5 spots left.
The pack’s decision, with its default settings
Does the post promise guaranteed investment returns?
0.92
Fraud and scamsflagged
0.98
Hacking and malwareflagged
0.96
Spam and advertisingreported only
0.88
General (overall harmfulness)flagged
0.68
Other crime
0.48
Private personal information
0.42
Illegal drugs
0.36
Weapons
0.32
Child sexual exploitation and grooming
0.32
Extremism and terrorism
0.29
Gore and graphic violence
0.29
Sexual content
0.28
Self-harm and suicide
0.26
Gambling (topic)reported only
0.13
Harassment and bullying
0.13
Profanity
0.10
Violence and threats
0.06
Hate against protected groups
0.04
Medication (topic)reported only
0.01
Tobacco and vaping (topic)reported only
0.01
Alcohol (topic)reported only
0.00
Gibberishreported only
0.00
import os
import requests
resp = requests.post(
"https://api.spinf.com/v1/score",
headers={"Authorization": f"Bearer {os.environ['SPINF_API_KEY']}"},
json={
"model": "spinf-12b",
"inputs": [
{
"id": "post-1",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Guaranteed 300% returns in 7 days! DM me your wallet seed phrase and I'll set up the trading bot for you for free. Only 5 spots left."
}
]
}
]
}
],
"scoring": {
"packs": [
{
"id": "spinf/moderation",
"context": "forum",
"decision": {
"mode": "micro_layer"
}
}
],
"queries": [
{
"id": "guaranteed_returns",
"template": "\n\nQuestion: Does the post promise guaranteed investment returns?\nAnswer:{?}",
"options": [
" Yes",
" No"
]
}
]
}
},
)
result = resp.json()["results"][0]
pack = result["packs"][0]
print("unsafe:", pack["decision"]["unsafe"])
for name, c in sorted(pack["categories"].items(), key=lambda x: -x[1]["score"]):
print(name, round(c["score"], 2), c["flagged"])
print("your rule:", result["queries"][0]["combinations"][0]["options"])A live call: the moderation pack (spinf/moderation 0.1.1, forum context) and one rule of your own, 1,708 billed tokens in total. The same rule on a harmless bike-sale post answers Yes 0.09.
The API call behind this example, the docs and the benchmark code are easier to read on a larger screen. Start free now, and pick it up on your laptop.
Calibrate in bulk, then decide live
The on-demand API is built for throughput: use it to measure spinf on your own history and set your thresholds. Real-time decisions then run on an endpoint reserved for you.
1
Turn on the pack
Add the moderation pack to your calls and moderate right away, with the default decision and thresholds. Try it first on your own posts in the playground.
2
Make it yours, in the same pass
Add your platform’s own rules and any other classification as questions in the same call, score your backlog, and set each threshold on your past decisions.
3
Moderate new posts
Score new posts in batches every few minutes on demand, or as they are published on a reserved endpoint.
Content moderation: questions, answered
More in the docs and the guides: custom content moderation policies and zero-shot and few-shot classification, or .
Same engine, other questions
The first 50M tokens are on us
Score a sample of your history today, and talk to us when you are ready to go live.