curl --request POST \
--url https://api.tuteliq.ai/api/v1/safety/video \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tuteliq.ai/api/v1/safety/video', 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/video"
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/video")
.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/video")!
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/video");
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>",
"frames_analyzed": 123,
"duration_seconds": 123,
"frame_results": [
{
"frame_index": 123,
"timestamp_s": 123,
"vision": {},
"risk_score": 123,
"severity": "<string>"
}
],
"categories": [
"<string>"
],
"overall_risk_score": 123,
"overall_severity": "none",
"detected": true,
"confidence": 123,
"recommended_action": "none",
"action_detail": "<string>",
"rationale": "<string>",
"flagged_timestamps": [
{
"timestamp_s": 123,
"reason": "<string>",
"severity": "<string>"
}
],
"credits_used": 123,
"external_id": "<string>",
"incident_moderation_enabled": "<string>",
"customer_id": "<string>",
"metadata": {},
"profanity": {
"detected": true,
"matches": [
"<string>"
]
}
}Analyze video for visual safety concerns across extracted frames
Upload a video file (mp4, webm, quicktime, avi — max 100MB, max 10 min). Extracts key frames at even intervals and runs vision analysis on each frame. Returns per-frame results, flagged timestamps, and an aggregated overall risk score. Ideal for moderating uploaded video content, screen recordings, and video messages.
curl --request POST \
--url https://api.tuteliq.ai/api/v1/safety/video \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tuteliq.ai/api/v1/safety/video', 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/video"
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/video")
.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/video")!
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/video");
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>",
"frames_analyzed": 123,
"duration_seconds": 123,
"frame_results": [
{
"frame_index": 123,
"timestamp_s": 123,
"vision": {},
"risk_score": 123,
"severity": "<string>"
}
],
"categories": [
"<string>"
],
"overall_risk_score": 123,
"overall_severity": "none",
"detected": true,
"confidence": 123,
"recommended_action": "none",
"action_detail": "<string>",
"rationale": "<string>",
"flagged_timestamps": [
{
"timestamp_s": 123,
"reason": "<string>",
"severity": "<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
Visual harm categories across every flagged frame, deduped.
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), from the frame that drove it.
Routing key, weakest to strongest: none, monitor, flag_for_review, block, immediate_intervention. Safe to switch on. A video whose frames could not be decoded returns flag_for_review, never none.
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 frame descriptions.
Show child attributes
Show child attributes
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 at least one frame contained OCR text. Deterministic word-list result over the OCR text aggregated across frames — additive, never affects frame_results/overall_severity/recommended_action.
Show child attributes
Show child attributes