Text Moderation 2.0 Multilingual PLUS detects harmful content across 38 languages in a single API call. The service automatically identifies the input language, runs multiple specialized models in parallel, and returns risk labels, confidence scores, and translated English content to support downstream review workflows.
Comparison with Text Moderation 1.0
| Feature | Text Moderation 2.0 | Text Moderation 1.0 |
|---|---|---|
| Language coverage | 38 languages | 18 languages |
| Moderation models | Multiple models run in parallel; policies are tuned per language and region | Single model; policies balance accuracy and recall by language |
| Tag system | Internationalized — includes profanity, regional, and other tags; supports multiple risk labels and sub-labels per request | Chinese-scenario tag system; single risk label per request |
| Detection scope | All detection scopes are configurable in the console and map directly to API results | General scopes that do not map directly to results |
| Language input | Automatically identified — no need to specify | Must be specified in the request |
| Response extras | Returns the detected language and translated English content | No language detection or translation |
Supported languages
The service supports the following 38 languages. Language detection is automatic — submit text in any supported language without specifying a language code.
| Language | English name | Language code |
|---|---|---|
| English | English | en |
| Simplified Chinese | Chinese | zh |
| Traditional Chinese | Traditional Chinese | zh-tw |
| Indonesian | Indonesian | id |
| Malay | Malay | ms |
| Thai | Thai | th |
| Vietnamese | Vietnamese | vi |
| Tagalog | Tagalog | tl |
| Hindi | Hindi | hi |
| Arabic | Arabic | ar |
| Turkish | Turkish | tr |
| French | French | fr |
| German | German | de |
| Russian | Russian | ru |
| Portuguese | Portuguese | pt |
| Spanish | Spanish | es |
| Italian | Italian | it |
| Dutch | Dutch | nl |
| Polish | Polish | pl |
| Japanese | Japanese | ja |
| Korean | Korean | ko |
| Urdu | Urdu | ur |
| Uighur | Uighur | ug |
| Bengali | Bengali | bn |
| Persian | Persian | fa |
| Swedish | Swedish | sv |
| Danish | Danish | da |
| Norwegian | Norwegian | no |
| Icelandic | Icelandic | is |
| Finnish | Finnish | fi |
| Belarusian | Belarusian | be |
| Lithuanian | Lithuanian | lt |
| Czech | Czech | cs |
| Slovak | Slovak | sk |
| Hungarian | Hungarian | hu |
| Modern Greek | Modern Greek | el |
| Romanian | Romanian | ro |
| Irish | Irish | ga |
Internationalized tags
The service uses an internationalized tag system designed for international business scenarios. A single piece of content can match multiple risk categories simultaneously — for example, a message that contains both profanity and drug-related terms returns both the inappropriate_profanity and contraband_drug labels. Design your downstream processing logic to handle this multi-label behavior.
Tag categories include, but are not limited to, the following:
| Label | Confidence score range | Description |
|---|---|---|
| pornographic_adult | 0–100 | Suspected pornographic content |
| sexual_terms | 0–100 | Suspected sexual health content |
| sexual_suggestive | 0–100 | Suspected vulgar content |
| sexual_orientation | 0–100 | Suspected sexual orientation content |
| regional_cn | 0–100 | Suspected domestic political content |
| regional_illegal | 0–100 | Suspected illegal political content |
| regional_controversial | 0–100 | Suspected political controversy |
| regional_racism | 0–100 | Suspected racism |
| violent_extremist | 0–100 | Suspected extremist organizations |
| violent_incidents | 0–100 | Suspected extremist content |
| violent_weapons | 0–100 | Suspected weapons and ammunition |
| violence_unscList | 0–100 | United Nations Security Council Consolidated List |
| contraband_drug | 0–100 | Suspected drug-related content |
| contraband_gambling | 0–100 | Suspected gambling-related content |
| inappropriate_ethics | 0–100 | Suspected content with undesirable values |
| inappropriate_profanity | 0–100 | Suspected abusive or insulting content |
| inappropriate_oral | 0–100 | Suspected vulgar oral content |
| inappropriate_religion | 0–100 | Suspected religious profanity |
| pt_to_contact | 0–100 | Suspected contact information for advertising |
| pt_to_sites | 0–100 | Suspected off-site traffic diversion |
| customized | 0–100 | Hit a custom keyword library |
Understanding confidence scores and risk levels
Each label includes a Confidence score from 0 to 100 (accurate to two decimal places). The overall RiskLevel field is derived from the high and low risk thresholds you configure in the console:
high: Take action immediately. Custom keyword library hits always returnhigh.medium: Route for manual review.low: Act only when you have high recall requirements; otherwise treat the same asnone.none: No risk detected.
Configure your risk score thresholds in the Content Moderation console.
Billing
The service uses pay-as-you-go billing by default. Charges are based on actual usage, calculated daily. Calls that do not return HTTP 200 are not billed.
| Moderation type | Service | Unit price |
|---|---|---|
Basic text moderation (text_standard) | Multilingual detection for international business (comment_multilingual_pro_global) | USD 0.3 per 1,000 calls |
Get started
Step 1: Activate the service
Go to Activate Service and activate Text Moderation 2.0.
After activation, billing starts automatically when you make API calls.
Step 2: Grant permissions to a RAM user
Before integrating the SDK or API, grant API access to a Resource Access Management (RAM) user. You can create an AccessKey pair for an Alibaba Cloud account or a RAM user. You must use an AccessKey pair to complete identity verification when you call an Alibaba Cloud API.
Log on to the RAM console as a RAM administrator.
Create a RAM user. For details, see Create a RAM user.
Grant the
AliyunYundunGreenWebFullAccesssystem policy to the RAM user. For details, see Grant permissions to a RAM user.Create an AccessKey pair for the RAM user. For details, see Obtain an AccessKey pair.
Step 3: Install the SDK and configure your endpoint
Choose the endpoint for your region. For the full SDK integration guide, see Integration guide.
| Region | Public endpoint | VPC endpoint |
|---|---|---|
| Singapore | green-cip.ap-southeast-1.aliyuncs.com | green-cip-vpc.ap-southeast-1.aliyuncs.com |
| UK (London) | green-cip.eu-west-1.aliyuncs.com | Not available |
| US (Virginia) | green-cip.us-east-1.aliyuncs.com | green-cip-vpc.us-east-1.aliyuncs.com |
| US (Silicon Valley) | green-cip.us-west-1.aliyuncs.com | Not available |
| Germany (Frankfurt) | green-cip.eu-central-1.aliyuncs.com | green-cip-vpc.eu-central-1.aliyuncs.com |
The UK (London) region uses the Singapore console configuration. The US (Silicon Valley) and Germany (Frankfurt) regions use the US (Virginia) console configuration.
API reference
Usage notes
| Item | Details |
|---|---|
| Business interface | TextModerationPlus |
| QPS limit | 100 calls per second per single user. Exceeding this limit throttles your requests. |
| Billing | Only requests that return HTTP 200 are billed. |
For details on constructing HTTP requests, see Request structure. For SDK examples, see Integration guide.
Request parameters
| Name | Type | Required | Example | Description |
|---|---|---|---|---|
Service | String | Yes | text_multilingual_pro_global | The moderation service type. Set to text_multilingual_pro_global for multilingual detection. |
ServiceParameters | JSONString | Yes | — | A JSON string containing the moderation parameters. See the table below. |
ServiceParameters fields
| Name | Type | Required | Example | Description |
|---|---|---|---|---|
content | String | Yes | Content to be detected | The text to moderate. Maximum 600 characters. |
dataId | String | No | text0424**** | A unique identifier for the content item. Accepts uppercase letters, lowercase letters, digits, underscores (_), hyphens (-), and periods (.). Maximum 64 characters. |
Response parameters
| Name | Type | Example | Description |
|---|---|---|---|
Code | Integer | 200 | HTTP status code. See Status codes. |
Data | JSONObject | — | Moderation results. See the table below. |
Message | String | OK | Response message. |
RequestId | String | AAAAAA-BBBB-CCCCC-DDDD-EEEEEEEE**** | The request ID. |
Data fields
| Name | Type | Example | Description |
|---|---|---|---|
Result | JSONArray | — | Detected risk labels and confidence scores. See the table below. |
DataId | String | text0424**** | The data ID from the request, if provided. |
RiskLevel | String | high | Overall risk level: high, medium, low, or none. |
TranslatedContent | String | Translated text | The translated English content. |
DetectedLanguage | String | en | The detected input language code. |
Result fields
| Name | Type | Example | Description |
|---|---|---|---|
Label | String | political_xxx | The risk label. Multiple labels may be returned. See Internationalized tags. |
Confidence | Float | 81.22 | Confidence score from 0 to 100, accurate to two decimal places. Not all labels include a score. |
Riskwords | String | AA,BB,CC | Detected sensitive words, comma-separated. Not all labels return sensitive words. |
CustomizedHit | JSONArray | [{"LibName":"...","Keywords":"..."}] | Custom library hits. Populated when Label is customized. See the table below. |
Description | String | Suspected pornographic content | Human-readable label description. For result processing, use Label — this field may change without notice. |
CustomizedHit fields
| Name | Type | Example | Description |
|---|---|---|---|
LibName | String | Custom library 1 | The name of the custom keyword library. |
Keywords | String | Custom word 1,Custom word 2 | The matched keywords, comma-separated. |
Examples
Request
{
"Service": "text_multilingual_pro_global",
"ServiceParameters": {
"content": "testing content",
"dataId": "text0424****"
}
}Response: system policy hit
{
"Code": 200,
"Data": {
"Result": [
{
"Label": "political_entity",
"Description": "Suspected political entity",
"Confidence": 100.0,
"RiskWords": "Word A,Word B,Word C"
},
{
"Label": "political_figure",
"Description": "Suspected political figure",
"Confidence": 100.0,
"RiskWords": "Word A,Word B,Word C"
}
],
"RiskLevel": "high",
"DetectedLanguage": "en",
"TranslatedContent": "Translated text content",
"DataId": "text0424****"
},
"Message": "OK",
"RequestId": "AAAAAA-BBBB-CCCCC-DDDD-EEEEEEEE****"
}Response: custom keyword library hit
{
"Code": 200,
"Data": {
"Result": [
{
"Description": "Hit a custom library",
"CustomizedHit": [
{
"LibName": "Custom library name 1",
"KeyWords": "Custom keyword"
}
],
"Confidence": 100,
"Label": "customized"
}
],
"RiskLevel": "high",
"DataId": "text0424****"
},
"Message": "OK",
"RequestId": "AAAAAA-BBBB-CCCCC-DDDD-EEEEEEEE****"
}Status codes
| Code | Status | Description |
|---|---|---|
| 200 | OK | Request successful. |
| 400 | BAD_REQUEST | Invalid request. Check your request parameters. |
| 407 | NOT_SUPPORT | The language type cannot be identified or is not supported. |
| 408 | PERMISSION_DENY | The account is not authorized, has an overdue payment, has not been activated, or has been disabled. |
| 500 | GENERAL_ERROR | Temporary server-side error. Retry the request. If this persists, contact online supportonline support. |
| 581 | TIMEOUT | Request timed out. Retry the request. If this persists, contact online supportonline support. |
| 588 | EXCEED_QUOTA | Request frequency exceeds the quota. |