Jordan
“you're so mature for your age. send me a pic, just for me. don't tell your mom”
- Condition: minor context0.96
- sexual solicitation0.92
- sexual0.91
- harassment0.53
Content moderation APIYour platform, your rules
Vettly scores what your users post, applies the policy you wrote, and hands back allow, warn, flag or block, with a permanent record of why.
Jordan
“you're so mature for your age. send me a pic, just for me. don't tell your mom”
Your stack, our API
Shipping a UGC app?App Store 1.2 Google Play
01The Bench
Pick a case, send a message, then rewrite the policy. Every decision on this page is evaluated live by the Vettly API, not faked.
Change a threshold or an action and watch the verdict update.
// 1. POST /v1/check/fast{"decisionId": "7e4f4c06-fd25-43af-8b37-70f95134f30e","signals": {"minor_context": 0.96,"sexual_solicitation": 0.92,"sexual": 0.91,"illegal": 0.73,"harassment": 0.53,"scam": 0.12,"spam": 0.05,"hate_speech": 0.03,"profanity": 0.03,"violence": 0.02,"self_harm": 0.01}}// 2. POST /v1/check/dry-run (trimmed){"action": "block","categories": [{ "category": "sexual", "score": 0.91, "threshold": 0.50, "triggered": true },{ "category": "scam", "score": 0.12, "threshold": 0.75, "triggered": false },{ "category": "self_harm", "score": 0.01, "threshold": 0.50, "triggered": false },{ "category": "harassment", "score": 0.53, "threshold": 0.60, "triggered": true }]}
02How it works
Most teams wire this up in an afternoon. Start from a template policy, ship, then tighten the thresholds as you learn what your community actually posts.
Text, an image URL or video, plus the policy that should judge it. That is the whole request.
Get back allow, warn, flag or block and decide what your product does with it. You stay in control of the UX.
Every decision is stored with the policy version that made it, so you can search, replay and defend it later.
import { createClient } from "@vettly/sdk"; const vettly = createClient(process.env.VETTLY_API_KEY!); // Before the post goes live const decision = await vettly.check({ content: message, policyId: "teen-safety", }); if (decision.action === "block") { return reject(message); }
import os, requests res = requests.post( "https://api.vettly.dev/v1/check", headers={"Authorization": f"Bearer {os.environ['VETTLY_API_KEY']}"}, json={"content": message, "policyId": "teen-safety"}, ) if res.json()["action"] == "block": reject(message)
curl https://api.vettly.dev/v1/check \ -H "Authorization: Bearer $VETTLY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"content": "hello there", "policyId": "teen-safety"}'
Scored in 176 ms · searchable · replayable · appealable
03The record
App reviewers, auditors and angry users all ask the same thing: why was this removed? Vettly keeps the answer, and the tools around it.
Thresholds, conditions and confidence bands in plain YAML. Versioned, dry-runnable, with custom blocklists for the words only you care about.
POST /v1/policiesOne request shape across media, with batch and fast-path endpoints for when volume or latency starts to matter.
POST /v1/check/multimodalEvery decision is stored with the policy version that made it. Search it, tag it, add reviewer notes, replay it as a cURL.
GET /v1/decisions/searchUsers contest a decision, a reviewer rules on it, and the outcome stays linked to the original verdict.
PATCH /v1/appeals/:idPush decisions into your own systems as they happen, with a delivery log and test events so you can trust the wiring.
POST /v1/webhooks/:id/testScheduled daily, weekly or monthly summaries as PDF, CSV or JSON, delivered to whoever needs to see them.
POST /v1/reports04Who it's for
The engine is the same. What changes is the rulebook, and the rulebook is yours to write.
Comments, chat, profiles, photos and video shared between members.
harassment ≥ 0.60 → flag≥ 0.40 → warnListings, reviews and buyer-seller messages, before they go live.
scam ≥ 0.70 → blockspam ≥ 0.80 → flagModel output is user-generated content too. Check it on the way out.
hate speech ≥ 0.80 → blockself harm ≥ 0.60 → blockAge-sensitive spaces where minors talk to each other, and to strangers.
sexual ≥ 0.50 → blockwhen minor context ≥ 0.7005Built with Vettly
Guardian and Discord are products we built on Vettly. They run on the same decisions, policy controls and review workflows you get through the API.
Family safety
A parent-and-teen safety app. When a message crosses a line, the teen sees a calm explanation and the parent sees a focused alert with context, not a firehose of their kid's chats.
Community moderation
A bot that turns Vettly decisions into channel actions and moderator logs, and hands the judgment calls to a human.
Want the primitives behind both? Build with Vettly
06Rate card
Start free. Upgrade when you need more volume, longer decision history, or advanced policy workflows. Every plan includes searchable decision IDs, policy versioning and the full audit trail.
Enough for a 5,000-user app
$0forever
Ship your MVP securely
$19/ month
Ship publicly with protection
$49/ month
Overage on paid plans, billed monthly: text $0.0001 / unitimage $0.001 / unitvideo $0.01 / unit
07Questions
The things developers ask before they wire up a moderation API. The rest is in the docs.
A UGC moderation API screens user-generated text, images, and video against your policy, then returns an action such as allow, warn, flag, or block. Vettly also keeps the supporting record: appeals, webhooks, and an audit history of every decision, so moderation can run as part of your product.
Vettly combines content scoring, a programmable policy engine, appeals, webhooks, and immutable audit trails in one API, so teams do not need to build each piece from scratch. It covers day-to-day trust and safety operations and supports common platform requirements from app stores, regulators, and enterprise buyers.
Vettly is a REST API that works with any HTTP client in any language. We provide a TypeScript SDK and integration guides for popular frameworks including React Native, Swift, Python, and Go. The API response format is the same regardless of client platform.
Most teams integrate Vettly in under a day. Start with a default policy template, add the check call before content is published, and then tune thresholds as your product grows.
Vettly scores hate speech, harassment, sexual content, violence, self-harm, scams, spam, and more. Each signal returns a confidence score from 0 to 1, and your policy defines the threshold for each action (allow, warn, flag, or block).
Yes. Policies are versioned and configurable with explicit thresholds, conditions and actions, and every decision is logged with its policy version. You can start from templates and customize rules as your moderation standards evolve.
08Get started
Start with 15,000 free decisions a month. Make the rules your own.
npm install @vettly/sdk