For your SaaS
Moderate what your users post
Posts, comments, avatars and uploads: one API call before anything goes live. You get accept, review or reject, with the reasons, so you can tell the user why.
2,000 free checks a month. No card needed.
curl -X POST \
-H "Authorization: Bearer $OPENMOD_API_KEY" \
--data-binary @photo.jpg \
"https://api.openshield.dev/v1/image?ref=avatar_4821"{
"summary": {
"action": "reject",
"reject_reason": [
{ "id": "nudity", "score": 0.97, "threshold": 0.8 }
]
},
"scores": { "nudity": 0.97, "gore": 0.01 },
"ref": "avatar_4821"
}What you check
Everything a user can publish
One API for the two things people put in your product.
Images and uploads
Avatars, photos, listings and screenshots, as JPEG, PNG, WebP or GIF up to 15 MB. Text written on an image and the links in its QR codes are read and checked too.
Comments, messages and profiles
Comments, messages, names, bios and reviews, up to 20,000 characters. Personal data and links are found by rules on the text itself.
Links
Links to adult, gambling and unsafe sites are found in texts, in the text of an image and in QR codes.
Why it fits a product
A decision your code can act on
Accept, review or reject
Accept: publish. Review: hold it for your team. Reject: refuse it, with a message you choose from the category id.
Rules per part of your product
A workflow sets the categories and the review and reject thresholds. Use a stricter one for a children's section and a looser one for a private chat. Every change is a new version you can compare.
A key per service
Limit a key to images or texts, and to the workflows it needs. Rotate it with a grace delay, so a deploy never has a gap.
A journal you can search
Each decision is kept with your ref, the reasons, the scores and the workflow version: 7 days on the free plan, 30 days on paid plans. When a user asks why an upload was refused, you find the row. The content is never kept.
Nothing stored, in the EU
Content is checked in memory and forgotten when the answer is sent. The checking server and the databases are in the European Union.
Switch from SightEngine
The workflow routes keep SightEngine's paths and fields. Change the base URL and the key, and map the category ids.
How it fits
Check before you publish
Your server calls the API with your own id for the content, then publishes, holds or refuses. If the check itself fails, hold the content.
- 01
Receive the content
A user posts a comment or uploads an avatar. Your server gets it, as it does today.
- 02
Check it
Call POST /v1/text or POST /v1/image with the content and your ref, a post id for example. The answer carries the decision and the reasons.
- 03
Publish, hold or refuse
Act on summary.action, and keep the request_id with your record: it is the id of the journal row.
import { checkText, ModerationError } from "./moderation"
// A request the API refuses as it is: it will never be accepted.
const refused = [400, 413, 415]
export async function moderateComment(text: string, commentId: string) {
try {
const decision = await checkText(text, commentId)
if (decision.action === "accept") return "publish"
if (decision.action === "review") return "hold"
return "refuse"
} catch (error) {
const status = error instanceof ModerationError ? error.status : 0
if (refused.includes(status)) return "refuse"
// A timeout or any other failure: keep it hidden for now.
return "hold"
}
}Categories
What a check can find
These come from openmod's catalogue. A workflow picks the ones you care about and the thresholds for each.
Images
- Nudity
- Suggestive content
- Underwear
- Swimwear
- Gore
- Violence
- Weapon
- Drugs
- Hate symbol
- Self-harm
- Minor
- and your own
Texts
- Unsafe text
- Hate speech
- Sexual content
- Violence
- Illegal activity
- Self-harm
- Child safety
- Email address
- Phone number
- Spam
- Scam
- Adult site link
- Unsafe site link
In the docs
Read how it works
- Quickstart Your first check in five minutes, from an account to a key and one request.
- Best practices Server-side only, fail closed, and messages chosen by category id.
- Workflows Categories, thresholds, custom categories and versions.
- The journal and ref What the journal keeps, and how your own id finds a decision.
- Migrating from SightEngine The same paths and fields: change the base URL and the key, and map the category ids.
- Node.js and TypeScript A small module with timeouts and a decision that fails closed.
More
Other ways in
- For your AI agents Moderate what an agent reads and what it writes.
- Image moderation API Nudity, gore, weapons and more, with a score per category.
- Text moderation API Unsafe text, personal data, spam and scams, with the reasons.
- SightEngine alternative The same workflow routes: a new base URL and a new key.
- Pricing A free plan, then by the started thousand.
Questions
Before you start
- What do I do with the review outcome?
- Hide the content from other users until someone on your team approves it. If your product has no moderation queue, add the smallest one that fits: a flag on the row and a screen that lists the flagged rows. openshield does not review content for you.
- What if a check fails or times out?
- Hold the content until a retry succeeds or someone has looked at it. Publishing what was never checked is the case a moderation service exists to prevent. A request that does not end in an answer is not counted as a check.
- Can I call the API from my front end?
- No. Keys are secret and belong on your servers, and the API refuses calls that carry a browser Origin header. Call it from your backend and give your front end the decision.
- Do you keep what my users post?
- No. Images and texts are checked in memory and forgotten when the answer is sent. The journal keeps the decision, the reasons and your ref, never the content.
- What does it cost at my volume?
- 2,000 checks a month are free, with the full answer. Starter is €29 a month with 15,000 checks, and each started thousand past them costs €2.00. Growth and Scale have more room. One image or one text is one check.
Start with 2,000 free checks
No card needed. Create a key and send your first request in five minutes.
Beta prices, in euros, excluding VAT