Content moderation APIYour platform, your rules

Every message gets a verdict.

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.

  • 15,000 decisions a month free
  • No credit card required
  • Live in an afternoon
Case № 7E4F-4C06Captured example

Jordan

“you're so mature for your age. send me a pic, just for me. don't tell your mom”
VerdictBlocked0.91 · teen-safety
  • Condition: minor context0.96
  • sexual solicitation0.92
  • sexual0.91
  • harassment0.53
Scored in 176 msPolicy teen-safety v1
Or try
11
signals scored on every message
4
graduated actions: allow, warn, flag, block
3
media types: text, image and video
15,000
decisions a month, free

Your stack, our API

  • REST
  • TypeScript
  • Python
  • Swift
  • React Native
  • Go

Shipping a UGC app?App Store 1.2 Google Play

01The Bench

The rules are a file. Edit it and watch the verdict change.

Pick a case, send a message, then rewrite the policy. Every decision on this page is evaluated live by the Vettly API, not faked.

teen-safety.yamleditable · evaluated by the API

Change a threshold or an action and watch the verdict update.

Or try
See the raw API responses behind this verdict
// 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

One call in. A record out.

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.

  1. Send the content

    Text, an image URL or video, plus the policy that should judge it. That is the whole request.

  2. Act on the action

    Get back allow, warn, flag or block and decide what your product does with it. You stay in control of the UX.

  3. Keep the record

    Every decision is stored with the policy version that made it, so you can search, replay and defend it later.

POST /v1/check
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"}'
Decision record
decision
7e4f4c06-fd25-43af…
policy
teen-safety · v1
action
BLOCK
Blocked0.91 · teen-safety v1
  • sexual0.91 ≥ 0.50
  • + minor context0.96 ≥ 0.70
  • harassment0.53 ≥ 0.40
  • scam0.12 < 0.75

Scored in 176 ms · searchable · replayable · appealable

03The record

Built for the question that comes after the verdict.

App reviewers, auditors and angry users all ask the same thing: why was this removed? Vettly keeps the answer, and the tools around it.

  • Policy as code

    Thresholds, conditions and confidence bands in plain YAML. Versioned, dry-runnable, with custom blocklists for the words only you care about.

    POST /v1/policies
  • Text, image and video

    One request shape across media, with batch and fast-path endpoints for when volume or latency starts to matter.

    POST /v1/check/multimodal
  • The decision record

    Every 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/search
  • Appeals

    Users contest a decision, a reviewer rules on it, and the outcome stays linked to the original verdict.

    PATCH /v1/appeals/:id
  • Webhooks

    Push 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/test
  • Compliance reports

    Scheduled daily, weekly or monthly summaries as PDF, CSV or JSON, delivered to whoever needs to see them.

    POST /v1/reports

04Who it's for

Anywhere your users can post.

The engine is the same. What changes is the rulebook, and the rulebook is yours to write.

  • Social & community

    Comments, chat, profiles, photos and video shared between members.

    Example ruleharassment ≥ 0.60 → flag≥ 0.40 → warn
  • Marketplaces

    Listings, reviews and buyer-seller messages, before they go live.

    Example rulescam ≥ 0.70 → blockspam ≥ 0.80 → flag
  • AI & chatbots

    Model output is user-generated content too. Check it on the way out.

    Example rulehate speech ≥ 0.80 → blockself harm ≥ 0.60 → block
  • Kids & education

    Age-sensitive spaces where minors talk to each other, and to strangers.

    Example rulesexual ≥ 0.50 → blockwhen minor context ≥ 0.70

05Built with Vettly

Real products. Same developer platform.

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

Vettly Guardian

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.

  • Focused signals, not surveillance
  • Review context for parents
  • Traceable decisions
See what we builtwith Vettly Guardian

Community moderation

Vettly Discord

A bot that turns Vettly decisions into channel actions and moderator logs, and hands the judgment calls to a human.

See what we builtwith Vettly Discord

Want the primitives behind both? Build with Vettly

06Rate card

Simple, predictable pricing.

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.

Free

Enough for a 5,000-user app

$0forever

  • 15,000 decisions / month
  • Text, images & video
  • Starter policy templates
  • Decision IDs & audit trail
  • 24-hour decision history
Get a free API key

Starter

Ship your MVP securely

$19/ month

  • 100,000 decisions / month
  • Everything in Free
  • 1-year decision history
  • Custom policy rules
  • Decision webhooks
Upgrade to Starter

Overage on paid plans, billed monthly: text $0.0001 / unitimage $0.001 / unitvideo $0.01 / unit

07Questions

Asked and answered.

The things developers ask before they wire up a moderation API. The rest is in the docs.

What is a UGC moderation API?

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.

How does Vettly reduce moderation engineering work?

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.

What languages and frameworks does Vettly support?

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.

How fast can I integrate Vettly?

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.

What content categories does Vettly detect?

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).

Can I customize moderation policies and keep audit history?

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

Build something worth protecting.

Start with 15,000 free decisions a month. Make the rules your own.

npm install @vettly/sdk
  • Free tier, no credit card
  • Starter policy templates
  • Every decision on the record