Image moderation that reads the photo and the text in it
Send an image's URL and Infrared answers 202, scores the picture, checks any text in it, then sends the verdict to your webhook.
- On every plan, Free included
- One image costs 2 checks
POST/v1/moderations{ "type": "image", "input": "https://cdn.example.com/

202Accepted"status": "screening"
- Violence
- Self-harm
- Sexual content
- Illicit & regulated goods
POSTmoderation.completedNot sent yet
Sample data
Four policies score the picture on every plan
Violence, self-harm, sexual content and illicit goods each return a score from 0 to 1, and the rest of the catalog needs a template.
On Starter and upA template can also score screenshots, low image quality, watermarks and photos that are really contact cards.
On Growth and upMade with AI is experimental, observes by default and costs one more check per image.
- ViolenceTextImage
violence0.701.00 - Self-harmTextImage
self_harm0.701.00 - Sexual contentTextImage
sexual0.701.00 - Links & contact detailsTextImage
links_contact0.500.95 - Illicit & regulated goodsTextImage
illicit0.701.00 - Made with AIExperimentalTextImage
made_with_aiAdvancedExperimental0.900.60 - Screenshot instead of photoImage
screenshot0.700.50 - Low image qualityImage
image_quality0.700.50 - Stock or third-party watermarkImage
watermark0.700.50
Catalog defaults
Text in a photo is transcribed, then checked
The call that scores the picture also transcribes its text, and swear words are checked in that text on every plan.
With a template, on Starter and upWordlists, lookalike characters, contact details and personal data are checked too.
Evidence only, by defaultA phone number read from a photo's text scores at most 0.30 and does not trigger unless the template sets Flag.

Match, trimmed
"matches": [{
"label": "phone",
"value": "+44 7700 900155",
"source": "ocr"
}]phoneimage_textocrCapped at 0.30
Personal data in images
Evidence only- Evidence only
- Flag
- Ignore
Sample data
Send a link, not a file
Infrared downloads the image itself, so the URL has to be reachable from the public internet.
- input
- One http or https URL: a JPEG, PNG, WebP or GIF of up to 10 MB.
- mode
- Send
"sync"to wait for the result and get it with a 200. - usage
- One image costs 2 checks: one for the object, one for the image.
- status
- Ends partial when the image cannot be fetched or read. The request is still accepted and the checks are charged.
{"type": "image","input": "https://cdn.example.com/1.jpg","content_id": "item_18342"}{"id": "mod_1B7lY4kzM9n2Qx8sRt3wVu","template": { "slug": "basic" },"status": "completed","flagged": false,"recommendation": "allow","policies": {"violence": 0.02, "self_harm": 0,"sexual": 0.01, "illicit": 0,"toxicity": 0, "hate_speech": 0,"profanity": 0, "spam": 0},"details": {"violence": {"explanation":"A hand holding a phone."}},"usage": { "checks": 2 }}Reviewers see a blurred copy first
On Starter and up, one click in the live console shows the original for two minutes and writes the reveal to the audit log.
Media
Blurred by default. Revealing the original is recorded in the audit log.
Blurred copyphotos · 471 KBReveal original- Blurred copyphotos · 482 KBReveal original
Sample data
media.reveal_original- No entries match

Start moderating your users' content
Create an API key, send your first request and get a verdict back.