Get moderation result
curl --request GET \
--url https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id} \
--header 'Authorization: <authorization>'import requests
url = "https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_bodySeedance 2.0(/generations)
Get moderation result
GET /v1/video/generations/moderation-result/
GET
/
v1
/
video
/
generations
/
moderation-result
/
{task_id}
Get moderation result
curl --request GET \
--url https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id} \
--header 'Authorization: <authorization>'import requests
url = "https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gravitex.ai/v1/video/generations/moderation-result/{task_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_bodyIntroduction
When a Seedance 2.0 taskfailed due to content safety / copyright / public figures / real human face policies, GET /v1/video/generations/{task_id} may only return a generic error. Use this endpoint for upstream block categories and details.
Disabled by default—requires BytePlus whitelist. Contact BytePlus sales and have an admin enable “moderation result query” on the channel. Without it:
403 channel_not_whitelisted.Authentication
string
required
Bearer Token, e.g.
Bearer sk-xxxxxxxxxxPath parameters
string
required
Failed task
task_id (seedance-2-0 / seedance-2-0-fast only)Limits
| Limit | Description |
|---|---|
| Models | seedance-2-0 series failed tasks only |
| Window | 14 days after create; else 400 query_window_expired |
| Status | failed only; else 400 invalid_task_status |
| Ownership | Own tasks only (token user_id) |
| Rate | 10 QPM per channel; 429 rate_limited |
| Cache | First successful query persisted; repeats return "cached": true without QPM cost |
Example
curl "https://api.gravitex.ai/v1/video/generations/moderation-result/cgt-20260430135030-xxxxx" \
-H "Authorization: Bearer sk-xxxxxxxxxx"
Response
{
"task_id": "cgt-20260430135030-xxxxx",
"block_reasons": [
{
"label": "Celebrity",
"sub_label": "Celebrity",
"detail": "Potentially contains Public Figures."
},
{
"label": "Copyright",
"sub_label": "IP",
"detail": "Potential copyright restriction. Potentially related content: Spider-Man: Homecoming-Peter Parker"
}
],
"cached": false,
"queried_at": 1715140800
}
block_reasons fields
| Field | Description |
|---|---|
label | Category: Safety / Copyright / Celebrity / Deepfake |
sub_label | Sub-category: Safety; IP / Other under Copyright; Celebrity; RealHuman under Deepfake |
detail | Human-readable detail; may include IP or public figure names |
Common errors
| HTTP | error.type | Meaning |
|---|---|---|
400 | invalid_request | Missing task_id |
400 | invalid_task_status | Task is not failed; no moderation block to query |
400 | unsupported_model | Task is not seedance-2-0 series |
400 | query_window_expired | Task is outside the 14-day query window |
403 | channel_not_whitelisted | Moderation result query not enabled on channel |
404 | not_found | Task missing, or upstream NotFound.Id (not moderation-blocked / invalid ID / channel not whitelisted) |
429 | rate_limited | Channel 10 QPM limit exceeded; retry later |
502 | upstream_error | Non-404 upstream error; see error.message |
{
"error": {
"message": "moderation query is not enabled on this channel; please contact admin to apply for BytePlus whitelist activation",
"type": "channel_not_whitelisted"
}
}
An emptyblock_reasonsarray means the taskfailedbut was not blocked by moderation (another failure cause).
⌘I
