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.

Request
curl -X POST \
  -H "Authorization: Bearer $OPENMOD_API_KEY" \
  --data-binary @photo.jpg \
  "https://api.openshield.dev/v1/image?ref=avatar_4821"
Answer, trimmedreject
{
  "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.

    Workflows

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

    Authentication and keys

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

    The journal and ref

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

    Privacy and data

  • Switch from SightEngine

    The workflow routes keep SightEngine's paths and fields. Change the base URL and the key, and map the category ids.

    SightEngine alternative

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.

  1. 01

    Receive the content

    A user posts a comment or uploads an avatar. Your server gets it, as it does today.

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

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

TypeScript
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

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