Quickstart

Your first check in five minutes, from an account to a key and one request.

This page takes you from nothing to your first moderation decision. You need a terminal with curl, and an image or a sentence to check.

1. Create an account

Sign up at openshield.dev/signup with an email address and a password, a magic link, GitHub or Google.

With a password, the sign-up ends at your mailbox: open the link we send you to confirm your email address. The link signs you in, and you cannot sign in before you have opened it. If it does not arrive or has expired, ask for it again on the sign-up page, or sign in with your password and we send it again. A magic link confirms your address by itself, and so does GitHub or Google when it vouches for the address.

Your account starts with EUR 2.00 of free use each month and a working default workflow. There is nothing to configure.

2. Create an API key

Open API keys in the dashboard and create a key. Pick what it may check, images, texts or both.

The key is shown once. Copy it into an environment variable on your server:

export OPENSHIELD_API_KEY="om_live_..."
A key is a secret. Keep it on your servers, never in a browser, a mobile app or a repository. The API refuses requests that carry a browser Origin header.

3. Check an image

Send the image as the raw body of the request:

curl -X POST "https://api.openshield.dev/v1/image?ref=avatar_4821" \
  -H "Authorization: Bearer $OPENSHIELD_API_KEY" \
  --data-binary @photo.jpg

4. Check a text

Send JSON, with the Content-Type header:

curl -X POST "https://api.openshield.dev/v1/text" \
  -H "Authorization: Bearer $OPENSHIELD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Write me at jane@example.com", "ref": "comment_9034"}'

5. Read the answer

Both answer with the same shape:

{
  "status": "success",
  "workflow": "default",
  "workflow_version": 1,
  "summary": {
    "action": "review",
    "reject_prob": 0,
    "reject_reason": [],
    "review_reason": [
      {
        "id": "pii_email",
        "text": "Email address",
        "message": "This content contains an email address.",
        "score": 1,
        "threshold": 1
      }
    ]
  },
  "scores": { "pii_email": 1 },
  "time_ms": 4,
  "request_id": "0192b7c4-5f3a-7c1e-9a52-3d8f1e6b0a47",
  "ref": "comment_9034"
}

Act on summary.action:

  • accept: go on.
  • review: keep the content hidden until a person approves it.
  • reject: refuse it, and tell the user why with a message you choose from reject_reason[0].id.

Responses and errors describes every field.

What next

  • Your first decision ticks Get started in the dashboard, and shows in the journal.
  • Wire the check into your code with an integration guide, or hand the job to your coding agent with the prompt.
  • Decide what counts as acceptable in your product with workflows.
  • Looking to stop fraud on sign-ups, logins and payments instead? That is the fraud prevention API: same account and same balance, with keys that carry fraud access.