Quickstart

From zero to a working request in three steps.

1. Sign up and get your key

Sign up, go to the dashboardAPI keysNew key. We show the full sk_live_… key once — copy it right away.

2. Send an image

curl -X POST https://modwall.dev/v1/moderate \
  -H "Authorization: Bearer sk_live_..." \
  -F "image=@zdjecie.jpg"
import requests

r = requests.post(
    "https://modwall.dev/v1/moderate",
    headers={"Authorization": "Bearer sk_live_..."},
    files={"image": open("zdjecie.jpg", "rb")},
)
print(r.json())
import fs from "node:fs";

const fd = new FormData();
fd.append("image", new Blob([fs.readFileSync("zdjecie.jpg")]), "zdjecie.jpg");
const r = await fetch("https://modwall.dev/v1/moderate", {
  method: "POST",
  headers: { Authorization: "Bearer sk_live_..." },
  body: fd,
});
console.log(await r.json());

3. Read the response

{
  "scores": { "nsfw": 0.97, "safe": 0.03 },
  "decision": "allow",
  "recommended_action": "block",
  "mode": "monitor",
  "threshold": 0.8,
  "model_version": "falconsai-int8-1"
}

scores are raw probabilities (always returned). recommended_action is the model's recommendation, and decision is the action for you based on your account mode.

A new account starts in monitor mode — modwall blocks nothing (decision is always allow), it only shows what it would flag. This is deliberate: you integrate with no risk to your platform and see in the dashboard how much modwall catches on your traffic, and how accurately. Once you trust the numbers, switch the mode to review (HITL queue) or enforce (auto-block) in the dashboard. Details: Policy and moderation.

Next