curl --request POST \
--url https://api.tuteliq.ai/api/v1/safety/image \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tuteliq.ai/api/v1/safety/image', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.tuteliq.ai/api/v1/safety/image"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)val client = OkHttpClient()
val request = Request.Builder()
.url("https://api.tuteliq.ai/api/v1/safety/image")
.post(null)
.addHeader("Authorization", "Bearer <token>")
.build()
val response = client.newCall(request).execute()import Foundation
let url = URL(string: "https://api.tuteliq.ai/api/v1/safety/image")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = ["Authorization": "Bearer <token>"]
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))using RestSharp;
var options = new RestClientOptions("https://api.tuteliq.ai/api/v1/safety/image");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
false{
"file_id": "<string>",
"vision": {
"extracted_text": "<string>",
"visual_categories": [
"<string>"
],
"visual_severity": "<string>",
"visual_confidence": 123,
"visual_description": "<string>",
"contains_text": true,
"contains_faces": true
},
"text_analysis": {},
"overall_risk_score": 123,
"overall_severity": "none",
"detected": true,
"confidence": 123,
"recommended_action": "none",
"action_detail": "<string>",
"rationale": "<string>",
"credits_used": 123,
"external_id": "<string>",
"incident_moderation_enabled": "<string>",
"customer_id": "<string>",
"metadata": {},
"profanity": {
"detected": true,
"matches": [
"<string>"
]
}
}Analyze image for visual and textual safety concerns
Upload an image (png, jpg, gif, webp — max 10MB) for dual-layer analysis: Vision AI classifies visual content (nudity, violence, weapons, drugs, self-harm imagery) while OCR extracts embedded text for separate safety analysis. Returns visual categories, extracted text, face detection, and combined overall risk score. Covers screenshots, memes, shared photos, and profile images.
curl --request POST \
--url https://api.tuteliq.ai/api/v1/safety/image \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tuteliq.ai/api/v1/safety/image', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.tuteliq.ai/api/v1/safety/image"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)val client = OkHttpClient()
val request = Request.Builder()
.url("https://api.tuteliq.ai/api/v1/safety/image")
.post(null)
.addHeader("Authorization", "Bearer <token>")
.build()
val response = client.newCall(request).execute()import Foundation
let url = URL(string: "https://api.tuteliq.ai/api/v1/safety/image")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = ["Authorization": "Bearer <token>"]
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))using RestSharp;
var options = new RestClientOptions("https://api.tuteliq.ai/api/v1/safety/image");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
false{
"file_id": "<string>",
"vision": {
"extracted_text": "<string>",
"visual_categories": [
"<string>"
],
"visual_severity": "<string>",
"visual_confidence": 123,
"visual_description": "<string>",
"contains_text": true,
"contains_faces": true
},
"text_analysis": {},
"overall_risk_score": 123,
"overall_severity": "none",
"detected": true,
"confidence": 123,
"recommended_action": "none",
"action_detail": "<string>",
"rationale": "<string>",
"credits_used": 123,
"external_id": "<string>",
"incident_moderation_enabled": "<string>",
"customer_id": "<string>",
"metadata": {},
"profanity": {
"detected": true,
"matches": [
"<string>"
]
}
}Authorizations
API key as Bearer token
Response
Default Response
Show child attributes
Show child attributes
none, low, medium, high, critical A concern was observed at ANY severity, including monitor-only cases. For production branching prefer recommended_action.
Confidence in the overall verdict (0-1).
Routing key, weakest to strongest: none, monitor, flag_for_review, block, immediate_intervention. Derived from the stronger of the visual verdict and the OCR text verdict, so harmful text in a visually benign image still routes correctly. Safe to switch on.
none, monitor, flag_for_review, block, immediate_intervention Human-readable expansion of recommended_action for a moderator UI. Free text: do not branch on it.
Why this verdict was reached. Built from category and severity labels only; never contains the image description or its extracted text.
Number of credits consumed by this request
Per-call override of account incident logging: "true" forces persistence, "false" suppresses it. Omit for account default.
Echo of the metadata you provided in the request
Present only when the flag_profanity form field (or the account-level default_flag_profanity setting) is true, and only when the image contained OCR text. Deterministic word-list result over the extracted text — additive, never affects vision/text_analysis/overall_severity/recommended_action.
Show child attributes
Show child attributes