curl --request POST \
--url https://direct.evolink.ai/v1/moderations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "evolink-moderation-1.0",
"input": [
{
"type": "text",
"text": "I want to kill them."
}
]
}
'{
"evolink_summary": {
"risk_level": "medium",
"flagged": false,
"violations": [],
"max_score": 0.597383272,
"max_category": "sexual"
},
"id": "modr-0d9740456c391e43c445bf0f010940c7",
"model": "evolink-moderation-1.0",
"results": [
{
"flagged": false,
"categories": {
"harassment": false,
"harassment/threatening": false,
"hate": false,
"hate/threatening": false,
"illicit": false,
"illicit/violent": false,
"self-harm": false,
"self-harm/intent": false,
"self-harm/instructions": false,
"sexual": false,
"sexual/minors": false,
"violence": false,
"violence/graphic": false
},
"category_scores": {
"harassment": 0.0006,
"harassment/threatening": 0.0007,
"hate": 0.00003,
"hate/threatening": 0.0000025,
"illicit": 0.000013,
"illicit/violent": 0.0000096,
"self-harm": 0.0000166,
"self-harm/intent": 0.000004,
"self-harm/instructions": 0.0000031,
"sexual": 0.597383272,
"sexual/minors": 0.000004,
"violence": 0.0231,
"violence/graphic": 0.0089
},
"category_applied_input_types": {
"harassment": [
"text"
],
"harassment/threatening": [
"text"
],
"hate": [
"text"
],
"hate/threatening": [
"text"
],
"illicit": [
"text"
],
"illicit/violent": [
"text"
],
"self-harm": [
"text"
],
"self-harm/intent": [
"text"
],
"self-harm/instructions": [
"text"
],
"sexual": [
"text"
],
"sexual/minors": [
"text"
],
"violence": [
"text"
],
"violence/graphic": [
"text"
]
}
}
]
}{
"error": {
"code": 400,
"message": "field input is required",
"type": "invalid_request_error",
"param": "input"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Insufficient quota",
"type": "insufficient_quota_error",
"fallback_suggestion": "https://evolink.ai/dashboard/credits"
}
}{
"error": {
"code": 403,
"message": "Access denied for this model",
"type": "permission_error",
"param": "model"
}
}{
"error": {
"code": 404,
"message": "Specified model not found",
"type": "not_found_error",
"param": "model",
"fallback_suggestion": "evolink-moderation-1.0"
}
}{
"error": {
"code": 413,
"message": "Image file too large",
"type": "request_too_large_error",
"param": "input",
"fallback_suggestion": "compress image to under 20MB"
}
}{
"error": {
"code": 429,
"message": "Rate limit exceeded",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Internal server error",
"type": "internal_server_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 502,
"message": "Bad gateway",
"type": "bad_gateway_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 503,
"message": "Service temporarily unavailable",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}EvoLink Moderation 1.0 - Complete API Reference
- Synchronous endpoint that detects harmful content across 13 dimensions for the input text and/or image
- The response returns a unified summary via the
evolink_summaryfield withrisk_level/flagged/violations/max_score/max_category
Core capabilities:
- Multimodal moderation: supports text-only, image-only, and combined text + image input
- 13 categories: harassment, hate, sexual, violence, self-harm, illicit, sexual/minors, and more
- Risk grading: each category has its own medium / high thresholds, providing differentiated judgement based on sensitivity (the red-line category sexual/minors uses the strictest thresholds)
- Explainable: the response returns both per-category
category_scoresand a simplifiedevolink_summary— you can use either depending on your needs
Input limits:
- At most 1 image per request (split into concurrent requests if you need to moderate multiple images)
- Images must be provided as HTTPS URLs
Typical usage: see the examples below, covering the three typical scenarios — text-only, text + image, and image-only.
curl --request POST \
--url https://direct.evolink.ai/v1/moderations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "evolink-moderation-1.0",
"input": [
{
"type": "text",
"text": "I want to kill them."
}
]
}
'{
"evolink_summary": {
"risk_level": "medium",
"flagged": false,
"violations": [],
"max_score": 0.597383272,
"max_category": "sexual"
},
"id": "modr-0d9740456c391e43c445bf0f010940c7",
"model": "evolink-moderation-1.0",
"results": [
{
"flagged": false,
"categories": {
"harassment": false,
"harassment/threatening": false,
"hate": false,
"hate/threatening": false,
"illicit": false,
"illicit/violent": false,
"self-harm": false,
"self-harm/intent": false,
"self-harm/instructions": false,
"sexual": false,
"sexual/minors": false,
"violence": false,
"violence/graphic": false
},
"category_scores": {
"harassment": 0.0006,
"harassment/threatening": 0.0007,
"hate": 0.00003,
"hate/threatening": 0.0000025,
"illicit": 0.000013,
"illicit/violent": 0.0000096,
"self-harm": 0.0000166,
"self-harm/intent": 0.000004,
"self-harm/instructions": 0.0000031,
"sexual": 0.597383272,
"sexual/minors": 0.000004,
"violence": 0.0231,
"violence/graphic": 0.0089
},
"category_applied_input_types": {
"harassment": [
"text"
],
"harassment/threatening": [
"text"
],
"hate": [
"text"
],
"hate/threatening": [
"text"
],
"illicit": [
"text"
],
"illicit/violent": [
"text"
],
"self-harm": [
"text"
],
"self-harm/intent": [
"text"
],
"self-harm/instructions": [
"text"
],
"sexual": [
"text"
],
"sexual/minors": [
"text"
],
"violence": [
"text"
],
"violence/graphic": [
"text"
]
}
}
]
}{
"error": {
"code": 400,
"message": "field input is required",
"type": "invalid_request_error",
"param": "input"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Insufficient quota",
"type": "insufficient_quota_error",
"fallback_suggestion": "https://evolink.ai/dashboard/credits"
}
}{
"error": {
"code": 403,
"message": "Access denied for this model",
"type": "permission_error",
"param": "model"
}
}{
"error": {
"code": 404,
"message": "Specified model not found",
"type": "not_found_error",
"param": "model",
"fallback_suggestion": "evolink-moderation-1.0"
}
}{
"error": {
"code": 413,
"message": "Image file too large",
"type": "request_too_large_error",
"param": "input",
"fallback_suggestion": "compress image to under 20MB"
}
}{
"error": {
"code": 429,
"message": "Rate limit exceeded",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Internal server error",
"type": "internal_server_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 502,
"message": "Bad gateway",
"type": "bad_gateway_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 503,
"message": "Service temporarily unavailable",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}https://direct.evolink.ai, which has better support for text models and long-lived connections. https://api.evolink.ai is the primary endpoint for multimodal services and serves as a fallback address for text models.Authorizations
##All endpoints require Bearer Token authentication##
Get your API Key:
Visit the API Key management page to obtain your API Key.
Include it in the request header:
Authorization: Bearer YOUR_API_KEY
Body
Moderation model name. Fixed value evolink-moderation-1.0.
evolink-moderation-1.0 "evolink-moderation-1.0"
Content to moderate, expressed uniformly as an array of objects. Each element is either a text or image_url object.
"input": [
{"type": "text", "text": "text to moderate"},
{"type": "image_url", "image_url": {"url": "https://..."}}
]
Limits:
- The array can contain at most 1 object with
type=image_url. To moderate multiple images, split into concurrent requests. - The number of
type=textobjects is unlimited.
- Text input item
- Image input item
Show child attributes
Show child attributes
Response
Moderation succeeded
Moderation response. The top-level evolink_summary is the recommended unified risk summary for application use; results provides per-category detailed scores.
EvoLink risk summary: a unified summary derived from the 13 categories' category_scores using differentiated thresholds tuned to each category's sensitivity. Your application can directly use it to allow / reject / send for review.
Risk grading thresholds
| Category | medium threshold | high threshold | Notes |
|---|---|---|---|
sexual/minors | 0.05 | 0.20 | Red-line category, strictest thresholds |
self-harm / self-harm/intent / self-harm/instructions | 0.30 | 0.60 | Life-threatening, strict |
violence/graphic | 0.40 | 0.70 | Graphic violence |
illicit/violent | 0.40 | 0.70 | Violent illicit |
sexual | 0.50 | 0.80 | General sexual |
violence | 0.50 | 0.80 | General violence |
harassment/threatening | 0.50 | 0.80 | Threatening harassment |
hate/threatening | 0.50 | 0.80 | Threatening hate |
harassment | 0.60 | 0.85 | General harassment |
hate | 0.60 | 0.85 | General hate |
illicit | 0.60 | 0.85 | General illicit instructions |
Decision rules
any category score >= its high threshold → risk_level = "high", flagged = true, added to violations
any category score >= its medium threshold → risk_level = "medium", flagged = false
otherwise → risk_level = "low", flagged = false
Recommended usage
summary = response["evolink_summary"]
if summary["flagged"]: # high → reject directly
reject(reason=summary["violations"])
elif summary["risk_level"] == "medium": # gray area
log_for_review(summary) # log for manual sampling
proceed()
else: # low → allow
proceed()
Show child attributes
Show child attributes
Unique identifier for this moderation request.
"modr-0d9740456c391e43c445bf0f010940c7"
Name of the model actually used. Fixed value evolink-moderation-1.0.
"evolink-moderation-1.0"
List of moderation results. Always returns 1 result (array-form input is merged into a single scoring pass).
Multimodal evaluation scope
Among the 13 categories, some are evaluated on text only and are not evaluated on images:
| Category | Evaluation scope |
|---|---|
harassment / harassment/threatening | Text only |
hate / hate/threatening | Text only |
illicit / illicit/violent | Text only |
sexual/minors | Text only (red-line category — handle with care) |
self-harm / self-harm/intent / self-harm/instructions | Text + image |
sexual | Text + image |
violence / violence/graphic | Text + image |
Key facts:
- When only an image is sent, the scores for the 7 text-only categories above will always be
0andcategory_applied_input_typeswill be an empty array — this does NOT mean the content is safe, only that it was not evaluated. - If your business involves risks to minors (the
sexual/minorsred-line category), you must submit text context together for moderation and cannot rely on image scores alone.
Show child attributes
Show child attributes