DEV Community

Brian Palmer
Brian Palmer

Posted on

Building Vettly: A Developer-First API for Multi-Modal Content Moderation

If your product accepts posts, messages, reviews, profiles, or marketplace listings, moderation usually starts as a small feature and turns into infrastructure.

You add a text check. Then images arrive. Then video. Then you need consistent policy decisions, provider fallbacks, audit logs, a review workflow, and a way to explain why something was blocked.

That is the problem I’m building Vettly to solve.

What Vettly does

Vettly is a TypeScript-first API and SDK for moderating text, images, and video through one integration. A simple text check looks like this:

import { ModerationClient } from '@vettly/sdk'

const vettly = new ModerationClient({
  apiKey: process.env.VETTLY_API_KEY
})

const result = await vettly.check({
  content: userPost,
  policyId: 'moderate'
})

if (result.action === 'block') {
  return { error: 'Content violates community guidelines' }
}
Enter fullscreen mode Exit fullscreen mode

The result is an explicit decision — allow, flag, or block — rather than a raw provider response that every application has to interpret differently.

Why multi-modal matters

A clean caption can still accompany an unsafe image. A harmless thumbnail can still lead to a problematic video. Treating each content type as a separate integration makes policy behavior inconsistent and creates more edge cases for product teams to own.

Vettly gives text, image, and video checks a common decision model while keeping the individual item results available for debugging and review.

Policies without starting from YAML

Most teams need a useful default before they need a policy language. Vettly includes strict, moderate, and permissive policies for common product contexts. When those are not enough, custom YAML policies can be managed through the dashboard.

That gives a team a short path from “I need a check before publishing” to “I need rules specific to my community.”

The API is only part of the system

Moderation decisions become operational data quickly. Vettly is designed around the surrounding workflow too:

  • a dashboard for decision logs, search, filtering, and usage analytics
  • webhooks for flagged and blocked events
  • audit trails with the policy and provider context
  • an appeals workflow for decisions that need human review
  • provider flexibility so application code does not have to change when the underlying provider changes

The goal is to make moderation observable and explainable, not just synchronous.

A few design questions I’m still working through

There are no universal answers for moderation infrastructure. Different communities have different tolerance for false positives, different review capacity, and different failure policies.

The questions I’m most interested in are:

  1. When moderation is temporarily unavailable, do you fail open, fail closed, or queue the content?
  2. What evidence do moderators need to understand and overturn a decision?
  3. How much policy customization do teams actually want to own?
  4. When does a hosted moderation service stop being attractive compared with self-hosting?

Try it

Install the SDK with:

npm install @vettly/sdk
Enter fullscreen mode Exit fullscreen mode

The project is at vettly.dev, with the dashboard and documentation linked from there. I’d love feedback from anyone who has built moderation for a social app, marketplace, forum, game, or AI-generated content product — especially on the failure modes and review workflows that are easy to underestimate.

Top comments (1)

Collapse
 
citedy profile image
Dmitry Sergeev

We need to write a short YouTube comment: one or two sentences, maybe a fragment. Should start with lowercase, talk about specific reaction or question about this video. No marketing. No URLs. No double hyphen. No em-dash. Use straight quotes. No quotes at all? It's okay. Just a comment. Possible comment: "kinda wondering how Vettly handles image vs text moderation latency?" Or "ngl the multi-modal part sounds cool, does it support video streams too?" Must be short. Let's