curl --request POST \
--url https://api.tuteliq.ai/api/v1/safety/bullying \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "<string>",
"context": {
"language": "<string>",
"ageGroup": "<string>",
"relationship": "<string>",
"platform": "<string>"
},
"options": {
"verdict_only": false,
"flag_profanity": true
},
"continuation_token": "<string>",
"reset_conversation": true,
"message_id": "<string>",
"external_id": "<string>",
"customer_id": "<string>",
"metadata": {},
"incident_moderation_enabled": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
text: '<string>',
context: {
language: '<string>',
ageGroup: '<string>',
relationship: '<string>',
platform: '<string>'
},
options: {verdict_only: false, flag_profanity: true},
continuation_token: '<string>',
reset_conversation: true,
message_id: '<string>',
external_id: '<string>',
customer_id: '<string>',
metadata: {},
incident_moderation_enabled: true
})
};
fetch('https://api.tuteliq.ai/api/v1/safety/bullying', 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/bullying"
payload = {
"text": "<string>",
"context": {
"language": "<string>",
"ageGroup": "<string>",
"relationship": "<string>",
"platform": "<string>"
},
"options": {
"verdict_only": False,
"flag_profanity": True
},
"continuation_token": "<string>",
"reset_conversation": True,
"message_id": "<string>",
"external_id": "<string>",
"customer_id": "<string>",
"metadata": {},
"incident_moderation_enabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"text\": \"<string>\",\n \"context\": {\n \"language\": \"<string>\",\n \"ageGroup\": \"<string>\",\n \"relationship\": \"<string>\",\n \"platform\": \"<string>\"\n },\n \"options\": {\n \"verdict_only\": false,\n \"flag_profanity\": true\n },\n \"continuation_token\": \"<string>\",\n \"reset_conversation\": true,\n \"message_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"customer_id\": \"<string>\",\n \"metadata\": {},\n \"incident_moderation_enabled\": true\n}")
val request = Request.Builder()
.url("https://api.tuteliq.ai/api/v1/safety/bullying")
.post(body)
.addHeader("Authorization", "Bearer <token>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = [
"text": "<string>",
"context": [
"language": "<string>",
"ageGroup": "<string>",
"relationship": "<string>",
"platform": "<string>"
],
"options": [
"verdict_only": false,
"flag_profanity": true
],
"continuation_token": "<string>",
"reset_conversation": true,
"message_id": "<string>",
"external_id": "<string>",
"customer_id": "<string>",
"metadata": [],
"incident_moderation_enabled": true
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.tuteliq.ai/api/v1/safety/bullying")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
]
request.httpBody = postData
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/bullying");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"text\": \"<string>\",\n \"context\": {\n \"language\": \"<string>\",\n \"ageGroup\": \"<string>\",\n \"relationship\": \"<string>\",\n \"platform\": \"<string>\"\n },\n \"options\": {\n \"verdict_only\": false,\n \"flag_profanity\": true\n },\n \"continuation_token\": \"<string>\",\n \"reset_conversation\": true,\n \"message_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"customer_id\": \"<string>\",\n \"metadata\": {},\n \"incident_moderation_enabled\": true\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
false{
"is_bullying": true,
"bullying_type": [
"exclusion"
],
"confidence": 123,
"severity": "low",
"rationale": "<string>",
"recommended_action": "none",
"action_detail": "<string>",
"risk_score": 123,
"language": "<string>",
"language_status": "stable",
"credits_used": 123,
"continuation_token": "<string>",
"continuation_expires_at": "<string>",
"state_source": "token",
"trajectory_risk": 123,
"trajectory": "rising",
"severity_series": [
123
],
"escalation_capped": true,
"escalation_capped_reason": "<string>",
"profanity": {
"detected": true,
"matches": [
"<string>"
]
},
"external_id": "<string>",
"customer_id": "<string>",
"metadata": {},
"support": {
"country": "<string>",
"country_name": "<string>",
"emergency_number": "<string>",
"helplines": [
{
"name": "<string>",
"number": "<string>",
"description": "<string>",
"category": "<string>",
"available": "<string>"
}
],
"response_guide": {
"category": "<string>",
"immediateActions": [
"<string>"
],
"resources": [
{
"name": "<string>",
"description": "<string>",
"url": "<string>"
}
]
}
}
}Detect bullying, harassment, and intimidation in text
Analyze a message for bullying indicators including verbal abuse, social exclusion, threats, and cyberbullying patterns. Returns severity (low/medium/high/critical), bullying type classification, confidence score, and a recommended action. Risk scores are age-calibrated when context.ageGroup is provided.
curl --request POST \
--url https://api.tuteliq.ai/api/v1/safety/bullying \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "<string>",
"context": {
"language": "<string>",
"ageGroup": "<string>",
"relationship": "<string>",
"platform": "<string>"
},
"options": {
"verdict_only": false,
"flag_profanity": true
},
"continuation_token": "<string>",
"reset_conversation": true,
"message_id": "<string>",
"external_id": "<string>",
"customer_id": "<string>",
"metadata": {},
"incident_moderation_enabled": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
text: '<string>',
context: {
language: '<string>',
ageGroup: '<string>',
relationship: '<string>',
platform: '<string>'
},
options: {verdict_only: false, flag_profanity: true},
continuation_token: '<string>',
reset_conversation: true,
message_id: '<string>',
external_id: '<string>',
customer_id: '<string>',
metadata: {},
incident_moderation_enabled: true
})
};
fetch('https://api.tuteliq.ai/api/v1/safety/bullying', 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/bullying"
payload = {
"text": "<string>",
"context": {
"language": "<string>",
"ageGroup": "<string>",
"relationship": "<string>",
"platform": "<string>"
},
"options": {
"verdict_only": False,
"flag_profanity": True
},
"continuation_token": "<string>",
"reset_conversation": True,
"message_id": "<string>",
"external_id": "<string>",
"customer_id": "<string>",
"metadata": {},
"incident_moderation_enabled": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"text\": \"<string>\",\n \"context\": {\n \"language\": \"<string>\",\n \"ageGroup\": \"<string>\",\n \"relationship\": \"<string>\",\n \"platform\": \"<string>\"\n },\n \"options\": {\n \"verdict_only\": false,\n \"flag_profanity\": true\n },\n \"continuation_token\": \"<string>\",\n \"reset_conversation\": true,\n \"message_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"customer_id\": \"<string>\",\n \"metadata\": {},\n \"incident_moderation_enabled\": true\n}")
val request = Request.Builder()
.url("https://api.tuteliq.ai/api/v1/safety/bullying")
.post(body)
.addHeader("Authorization", "Bearer <token>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = [
"text": "<string>",
"context": [
"language": "<string>",
"ageGroup": "<string>",
"relationship": "<string>",
"platform": "<string>"
],
"options": [
"verdict_only": false,
"flag_profanity": true
],
"continuation_token": "<string>",
"reset_conversation": true,
"message_id": "<string>",
"external_id": "<string>",
"customer_id": "<string>",
"metadata": [],
"incident_moderation_enabled": true
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.tuteliq.ai/api/v1/safety/bullying")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
]
request.httpBody = postData
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/bullying");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"text\": \"<string>\",\n \"context\": {\n \"language\": \"<string>\",\n \"ageGroup\": \"<string>\",\n \"relationship\": \"<string>\",\n \"platform\": \"<string>\"\n },\n \"options\": {\n \"verdict_only\": false,\n \"flag_profanity\": true\n },\n \"continuation_token\": \"<string>\",\n \"reset_conversation\": true,\n \"message_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"customer_id\": \"<string>\",\n \"metadata\": {},\n \"incident_moderation_enabled\": true\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
false{
"is_bullying": true,
"bullying_type": [
"exclusion"
],
"confidence": 123,
"severity": "low",
"rationale": "<string>",
"recommended_action": "none",
"action_detail": "<string>",
"risk_score": 123,
"language": "<string>",
"language_status": "stable",
"credits_used": 123,
"continuation_token": "<string>",
"continuation_expires_at": "<string>",
"state_source": "token",
"trajectory_risk": 123,
"trajectory": "rising",
"severity_series": [
123
],
"escalation_capped": true,
"escalation_capped_reason": "<string>",
"profanity": {
"detected": true,
"matches": [
"<string>"
]
},
"external_id": "<string>",
"customer_id": "<string>",
"metadata": {},
"support": {
"country": "<string>",
"country_name": "<string>",
"emergency_number": "<string>",
"helplines": [
{
"name": "<string>",
"number": "<string>",
"description": "<string>",
"category": "<string>",
"available": "<string>"
}
],
"response_guide": {
"category": "<string>",
"immediateActions": [
"<string>"
],
"resources": [
{
"name": "<string>",
"description": "<string>",
"url": "<string>"
}
]
}
}
}Authorizations
API key as Bearer token
Body
The message text to analyze
10000Show child attributes
Show child attributes
Show child attributes
Show child attributes
Top-level alias for options.support_threshold. Minimum severity to show crisis support resources (default: high). Critical always shows.
low, medium, high, critical Opaque signed token from a previous /bullying call. Carries derived analysis state — no message content is stored server-side.
Discard any continuation_token and start a fresh conversation.
Optional customer-side message id for evidence pointers.
128Your unique identifier (e.g. message ID, content ID) for correlating Tuteliq results with your own system. Echoed back in the response and included in webhook payloads so you can match alerts to the original content.
255Your end-customer identifier for multi-tenant / B2B2C scenarios. If you serve multiple customers (schools, apps, brands) from a single API key, set this to route webhook alerts to the correct customer. Echoed back in the response and included in webhook payloads as "customerId".
255Arbitrary key-value pairs for additional context (e.g. { "channel": "discord", "region": "eu" }). Stored with the detection result, echoed in the response, and included in webhook payloads. Maximum 20 properties.
Per-call override of your account incident logging setting. When set, it takes precedence over the account-level flag for THIS request: true forces the incident to be persisted, false suppresses persistence. Omit to use your account default (which itself defaults to enabled). Lets you control incident logging per request, e.g. suppress logging for test traffic.
Response
Default Response
Bullying signal observed at ANY severity (including low / monitor cases). For production branching prefer recommended_action (flag_for_review / block / immediate_intervention), which is a stable enum, over the bare presence of a signal.
Canonical vocabulary. Values outside this enum are dropped before the response is built, so this field is safe to switch on.
exclusion, verbal_abuse, humiliation, threat, intimidation, sexual_harassment, body_shaming, identity_based, impersonation, outing, pile_on, cyberstalking, exclusion_threat, coded_harassment, cyberbullying, relational low, medium, high, critical Routing key, weakest to strongest: none, monitor, flag_for_review, block, immediate_intervention. Safe to switch on.
none, monitor, flag_for_review, block, immediate_intervention Optional human-readable expansion of recommended_action for a moderator UI. Free text: do not branch on it.
Language code used for analysis (auto-detected or provided)
Language support maturity: "stable" (en) or "beta" (all others)
stable, beta Number of credits consumed by this request
Signed token carrying derived analysis state for the next call. Server stores nothing.
ISO 8601 expiry timestamp of the continuation_token.
How prior state was sourced.
token, fresh, reset Conversation-level risk 0-1, distinct from risk_score which scores only this message. Anchored on the highest severity seen so far and decaying slowly across benign turns, so a friendly message after an escalation does not reset it. Absent on the first turn. Derived from the signed token: no message content is stored to produce it.
Direction of travel across the conversation so far.
rising, stable, declining, none Per-turn severity, oldest first — the evidence behind trajectory_risk, so a moderator can see why a benign-looking message carries elevated conversation risk.
True when a coded-term match pushed severity toward critical but this endpoint's corroboration-cap logic held recommended_action below immediate_intervention pending independent confirmation. Absent when no cap applied.
Human-readable explanation of the cap. Present only when escalation_capped is true.
Present only when options.flag_profanity (or the account-level default_flag_profanity setting) is true. Deterministic word-list result — additive, never affects is_bullying/severity/risk_score/recommended_action.
Show child attributes
Show child attributes
Echo of the external_id you provided in the request
Echo of the customer_id you provided in the request
Echo of the metadata you provided in the request
Country-specific crisis helplines and response guidance (only included for high/critical severity)
Show child attributes
Show child attributes