Query API
Actively query video file moderation results. Supports results from the last 3 days.
DeepCleer Video Result Query is the polling complement to the Async Video Moderation API — it returns moderation results for a previously submitted video keyed by your client-side btId.
API Description
Use this endpoint to actively poll for moderation results when you cannot host a callback URL or when a callback delivery has been missed. Suggested polling interval: 30 seconds. Results remain available for up to 3 days from the original submission, after which they are purged from DeepCleer storage.
The response payload mirrors the asynchronous callback delivered by the Async Video Moderation API — the same frameDetail, audioDetail, auxInfo, and token-label structures are returned, with code = 1101 returned while moderation is still in progress.
Requirements
| Item | Specification |
|---|---|
| Protocol | HTTP or HTTPS |
| Method | POST |
| Encoding | UTF-8 |
| Format | All request and response parameters use JSON |
Timeout Suggestion
Recommended request timeout: 7 seconds.
Internal processing timeout is 3 seconds with one automatic retry. Normal request latency is approximately 5 ms.
Request
Request URL
| Cluster | Endpoint |
|---|---|
| Singapore Video | http://api-video-xjp.fengkongcloud.com/video/query/v4 |
Request Parameters
| Parameter | Type | Required | Max Length | Description |
|---|---|---|---|---|
accessKey | string | Yes | 20 | API authentication key. The default accessKey is sent in your onboarding email. |
btId | string | Yes | 64 | Client-side unique request identifier — must match the btId used in the original Async Video Moderation submission. |
Response
The response payload mirrors the asynchronous callback delivered by the Async Video Moderation API. While moderation is still in progress, the endpoint returns code = 1101; once processing is complete, the full result envelope (frame details, audio details, token labels, etc.) is returned with code = 1100.
Response Parameters
Parameters other than
code,message, andrequestIdare only guaranteed to be returned whencodeis1100.
| Parameter | Type | Required | Description |
|---|---|---|---|
requestId | string | Yes | Unique DeepCleer request identifier. |
code | int32 | Yes | Response code. See Response Codes. |
message | string | Yes | Response message corresponding to the code. |
btId | string | Yes | Client-side unique request identifier (echoed from the request). |
riskLevel | string | Yes | Overall risk level. PASS: normal (allow). REVIEW: suspicious (manual review). REJECT: violation (block). |
auxInfo | object | Yes | Auxiliary information. See auxInfo Object. |
frameDetail | array | No | Frame image risk details. Returned when risky frames exist or returnAllImg was set to 1 on the original submission. See frameDetail Array. |
audioDetail | array | No | Audio segment risk details. Returned when risky segments exist or returnAllAudio was set to 1 on the original submission. See audioDetail Array. |
tokenProfileLabels | array | No | Account attribute labels. Returned only when tokenId was provided on the original submission and the labeling service is enabled. See Token Labels. |
tokenRiskLabels | array | No | Account risk labels. Returned only when tokenId was provided on the original submission and the labeling service is enabled. See Token Labels. |
Response Codes
| Code | Message | Description |
|---|---|---|
1100 | Success | The request completed successfully. |
1101 | Video processing | The video is still being processed. Continue polling. |
1901 | QPS limit exceeded | The request rate limit has been exceeded. |
1902 | Invalid parameters | One or more request parameters are invalid. |
1903 | Service failure | An internal service error occurred. |
1905 | Invalid content format | The content to be moderated does not meet format requirements. |
9101 | Unauthorized operation | The provided accessKey does not have permission for this operation. |
When
codeis1101, the video is still being processed. Continue polling at the recommended 30-second interval. Result fields (frameDetail,audioDetail,auxInfo, etc.) are not present in this response.
auxInfo Object
auxInfo Object| Parameter | Type | Required | Description |
|---|---|---|---|
billingAudioDuration | float | Yes | Audio duration (in seconds) in the current video for billing purposes. If the audio track duration differs from the video duration, billing is based on the actual audio track duration (may be 0 if no audio track exists). |
billingImgNum | int32 | Yes | Number of captured frame images in the current video for billing purposes. |
frameCount | int32 | Yes | Number of returned video frames. When returnAllImg was 0, this is the risk-frame count; when returnAllImg was 1, this is the total count. |
time | float | Yes | Video duration in seconds. |
passThrough | object | No | Client pass-through field returned as-is. |
frameDetail Array
frameDetail ArrayEach element in the array represents a captured frame:
| Parameter | Type | Required | Description |
|---|---|---|---|
imgUrl | string | Yes | URL of the captured frame image. |
requestId | string | Yes | Unique DeepCleer request identifier for this frame. |
riskLevel | string | Yes | Risk level. PASS: normal. REVIEW: suspicious. REJECT: violation. |
riskLabel1 | string | Yes | Level 1 risk label. Returns normal when riskLevel is PASS. |
riskLabel2 | string | Yes | Level 2 risk label. Empty when riskLevel is PASS. |
riskLabel3 | string | Yes | Level 3 risk label. Empty when riskLevel is PASS. |
riskDescription | string | Yes | Risk description. Returns "Normal" when riskLevel is PASS. Hits against custom lists return "Matched custom list". Otherwise format: "Level 1: Level 2: Level 3". For reference only — do not use for programmatic logic. |
allLabels | array | Yes | All risk labels detected for this frame. See Frame allLabels. |
auxInfo | object | Yes | Frame auxiliary information. See Frame auxInfo. |
riskDetail | object | Yes | Risk detail information. See Frame riskDetail. |
imgText | string | No | OCR text content of the frame. Returned only when the original imgType included ADVERT or IMGTEXTRISK. |
time | float | No | Timestamp of this frame relative to the video start, in seconds. |
businessLabels | array | No | Business label list. See Frame businessLabels. |
Frame allLabels
allLabelsEach element in the allLabels array:
| Parameter | Type | Required | Description |
|---|---|---|---|
riskLevel | string | No | Risk level: PASS, REVIEW, or REJECT. |
riskLabel1 | string | No | Level 1 risk label. |
riskLabel2 | string | No | Level 2 risk label. |
riskLabel3 | string | No | Level 3 risk label. |
riskDescription | string | No | Risk description. Returns "Normal" when riskLevel is PASS. Format: "Level 1: Level 2: Level 3". For reference only — do not use for programmatic logic. |
probability | float | No | Confidence score (0–1). Higher values indicate greater confidence. |
riskDetail | object | No | Risk detail information. See Frame riskDetail. |
Frame auxInfo
auxInfo| Parameter | Type | Required | Description |
|---|---|---|---|
similarity | float | Yes | Similarity between the current frame and the previous frame. The first frame is compared against a pure black background image. Range: 0–1 (closer to 1 = more similar). |
qrContent | string | No | QR code URL detected in the image. |
Frame riskDetail
riskDetail| Parameter | Type | Required | Description |
|---|---|---|---|
riskSource | int32 | Yes | Risk source. 1000: no risk. 1001: text risk. 1002: visual image risk. |
face_num | int32 | No | Number of faces detected. |
person_num | int32 | No | Number of persons detected. |
faces | array | No | Names and positions of politically sensitive individuals in the image. Up to 10 entries (highest probability selected if more than 10). See Face Object. |
objects | array | No | Detected objects/logos with names and positions. See Object Info. |
ocrText | object | No | OCR text content. Present when the original imgType included IMGTEXTRISK or ADVERT. Contains text (string): recognized text in the image. |
matchedLists | array | No | Matched custom list information. Returned only when a custom list is hit. See Matched Lists. |
riskSegments | array | No | High-risk content segments. Present when political, terrorism, prohibited, competitive, or advertising-law content is detected. See Risk Segments. |
persons | array | No | Person names and positions. When the "person — multiple persons" label is hit, the array contains multiple elements (up to 10, highest probability selected). See Person Object. |
Face Object
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | No | Identifier. The same person at the same position has the same ID across different labels. If the same person appears N times, N IDs are assigned. |
name | string | No | Person name. |
face_ratio | float | No | Face-to-image ratio (0–1). Higher values indicate a larger face proportion. |
probability | float | No | Confidence score (0–1). |
location | array | No | Face position coordinates [x1, y1, x2, y2] representing the top-left and bottom-right corners. Example: [207, 522, 340, 567] where 207=top-left X, 522=top-left Y, 340=bottom-right X, 567=bottom-right Y. |
Object Info
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | No | Object/logo identifier. The same object at the same position has the same ID across different labels. |
name | string | No | Object name. |
probability | float | No | Confidence score (0–1). |
qrContent | string | No | QR code URL detected in the image. |
location | array | No | Object position coordinates [x1, y1, x2, y2] representing the top-left and bottom-right corners. |
Matched Lists
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | No | Name of the matched list. |
words | array | No | Sensitive word information from the matched list. |
words[].word | string | No | The matched sensitive word. |
words[].position | array | No | Position of the sensitive word. |
Risk Segments
| Parameter | Type | Required | Description |
|---|---|---|---|
segment | string | No | High-risk content segment. |
position | array | No | Position of the high-risk content segment (0-indexed). |
Person Object
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | No | Identifier. The same person has the same ID across different labels. If the same person appears N times, N IDs are assigned. |
person_ratio | float | No | Person-to-image ratio (0–1). Higher values indicate a larger person proportion. |
probability | float | No | Confidence score (0–1). |
location | array | No | Person position coordinates. |
Frame businessLabels
businessLabelsEach element in the businessLabels array:
| Parameter | Type | Required | Description |
|---|---|---|---|
businessLabel1 | string | Yes | Level 1 business label. |
businessLabel2 | string | Yes | Level 2 business label. |
businessLabel3 | string | Yes | Level 3 business label. |
businessDescription | string | Yes | Business label description. Format: "Level 1: Level 2: Level 3". For reference only — do not use for programmatic logic. |
probability | float | Yes | Confidence score (0–1). |
confidenceLevel | int32 | No | Confidence level (0–2). Higher values indicate greater confidence. |
businessDetail | object | No | Business label details. May contain face_num, person_num, faces, objects, and persons with the same structure as described in Frame riskDetail. |
audioDetail Array
audioDetail ArrayEach element in the array represents an audio segment:
| Parameter | Type | Required | Description |
|---|---|---|---|
audioUrl | string | Yes | URL of the audio segment. |
requestId | string | Yes | Unique DeepCleer request identifier for this segment. |
riskLevel | string | Yes | Risk level. PASS: normal. REVIEW: suspicious. REJECT: violation. |
riskLabel1 | string | Yes | Level 1 risk label. Returns normal when riskLevel is PASS. |
riskLabel2 | string | Yes | Level 2 risk label. Empty when riskLevel is PASS. |
riskLabel3 | string | Yes | Level 3 risk label. Empty when riskLevel is PASS. |
riskDescription | string | Yes | Risk description. Format: "Level 1: Level 2: Level 3". Returns "Matched custom list" when a custom list is hit. For reference only — do not use for programmatic logic. |
allLabels | array | Yes | All risk labels detected for this segment. See Audio allLabels. |
audioText | string | No | Recognized text content of this audio segment. |
audioStarttime | float | No | Audio segment start time relative to the audio beginning, in seconds. (Note: this field uses lowercase t here. The Audio Stream Moderation API returns the same conceptual field as audioStartTime (uppercase T). On-the-wire casing is preserved as-returned and is a candidate for v5 alignment.) |
audioEndtime | float | No | Audio segment end time relative to the audio beginning, in seconds. (Same casing-inconsistency note as audioStarttime.) |
businessLabels | array | No | Business label list. See Audio businessLabels. |
Audio allLabels
allLabelsEach element in the allLabels array:
| Parameter | Type | Required | Description |
|---|---|---|---|
riskLevel | string | No | Risk level: PASS, REVIEW, or REJECT. |
riskLabel1 | string | No | Level 1 risk label. |
riskLabel2 | string | No | Level 2 risk label. |
riskLabel3 | string | No | Level 3 risk label. |
riskDescription | string | No | Risk description. For reference only — do not use for programmatic logic. |
probability | float | No | Confidence score (0–1). |
riskDetail | object | No | Risk detail information. See Audio riskDetail. |
Audio riskDetail
riskDetail| Parameter | Type | Required | Description |
|---|---|---|---|
riskSource | int32 | Yes | Risk source. 1000: no risk. 1001: text risk. 1003: audio voice risk. |
audioText | string | No | Recognized text content of this segment. |
matchedLists | array | No | Matched custom list information. See Matched Lists. |
riskSegments | array | No | High-risk content segments. Present when political, terrorism, prohibited, competitive, or advertising-law content is detected. See Risk Segments. |
Audio businessLabels
businessLabelsEach element in the businessLabels array:
| Parameter | Type | Required | Description |
|---|---|---|---|
businessLabel1 | string | Yes | Level 1 business label. |
businessLabel2 | string | Yes | Level 2 business label. |
businessLabel3 | string | Yes | Level 3 business label. |
businessDescription | string | Yes | Business label description. Format: "Level 1: Level 2: Level 3". For reference only — do not use for programmatic logic. |
probability | float | Yes | Confidence score (0–1). |
confidenceLevel | int32 | No | Confidence level (0–2). Higher values indicate greater confidence. |
businessDetail | object | No | Business label details. |
businessDetail.riskSource | int32 | No | Risk source. 1000: no risk. 1001: text risk. 1003: audio voice risk. |
businessDetail.audioText | string | No | Recognized text content. |
businessDetail.matchedLists | array | No | Matched custom list information. See Matched Lists. |
businessDetail.riskSegments | array | No | High-risk content segments. See Risk Segments. |
Token Labels
Both tokenProfileLabels and tokenRiskLabels share the same structure:
| Parameter | Type | Required | Description |
|---|---|---|---|
label1 | string | No | Level 1 label. |
label2 | string | No | Level 2 label. |
label3 | string | No | Level 3 label. |
description | string | No | Label description. For reference only — do not use for programmatic logic. |
timestamp | int64 | No | Label assignment time. 13-digit Unix timestamp in milliseconds (UTC). |
Examples
Request Example
{
"accessKey": "YOUR_ACCESS_KEY",
"btId": "1639824316368"
}Processing Response Example
Returned while moderation is still in progress:
{
"btId": "1639824316368",
"code": 1101,
"message": "Video processing",
"requestId": "66fb85e3149bb9e13d6c72161cc6c6cf"
}Completed Response Example
{
"audioDetail": [
{
"allLabels": [
{
"probability": 0.998463273048401,
"riskDescription": "Abuse: Personal attack: Severe personal attack",
"riskDetail": {
"audioText": "Recognized audio text content...",
"riskSource": 1001
},
"riskLabel1": "abuse",
"riskLabel2": "renshengongji",
"riskLabel3": "zhongdurenshengongji",
"riskLevel": "REJECT"
}
],
"audioEndtime": 20,
"audioStarttime": 10,
"audioText": "Recognized audio text content...",
"audioUrl": "http://example.com/audio_segment_a0001.wav",
"businessLabels": [],
"requestId": "edaa113581ec1c18df7b44c86d36ae3b_a0001",
"riskDescription": "Abuse: Personal attack: Severe personal attack",
"riskDetail": {
"audioText": "Recognized audio text content...",
"riskSource": 1001
},
"riskLabel1": "abuse",
"riskLabel2": "renshengongji",
"riskLabel3": "zhongdurenshengongji",
"riskLevel": "REJECT"
},
{
"allLabels": [
{
"probability": 0.857458027460472,
"riskDescription": "Politics: State institution: State institution",
"riskDetail": {
"audioText": "Recognized audio text content...",
"riskSource": 1001
},
"riskLabel1": "politics",
"riskLabel2": "guojiajigou",
"riskLabel3": "guojiajigou",
"riskLevel": "REJECT"
}
],
"audioEndtime": 40,
"audioStarttime": 30,
"audioText": "Recognized audio text content...",
"audioUrl": "http://example.com/audio_segment_a0003.wav",
"businessLabels": [],
"requestId": "edaa113581ec1c18df7b44c86d36ae3b_a0003",
"riskDescription": "Politics: State institution: State institution",
"riskDetail": {
"audioText": "Recognized audio text content...",
"riskSource": 1001
},
"riskLabel1": "politics",
"riskLabel2": "guojiajigou",
"riskLabel3": "guojiajigou",
"riskLevel": "REJECT"
}
],
"auxInfo": {
"billingAudioDuration": 85,
"billingImgNum": 2,
"frameCount": 2,
"time": 85
},
"btId": "1666684506188",
"code": 1100,
"frameDetail": [
{
"allLabels": [
{
"probability": 0.665125370025635,
"riskDescription": "Politics: Political symbols: Party emblem",
"riskDetail": {
"ocrText": {
"text": "2022/10/25 09:05"
},
"riskSource": 1002
},
"riskLabel1": "politics",
"riskLabel2": "zhengzhixiangzheng",
"riskLabel3": "danghui",
"riskLevel": "REJECT"
}
],
"auxInfo": {
"similarity": 0.4765625
},
"businessLabels": [
{
"businessDescription": "Face: Face pose: Frontal face",
"businessDetail": {},
"businessLabel1": "face",
"businessLabel2": "renlianzitai",
"businessLabel3": "zhenglian",
"confidenceLevel": 1,
"probability": 0.450656906102068
},
{
"businessDescription": "Face: Face type: Real person",
"businessDetail": {
"face_num": 1,
"faces": [
{
"face_ratio": 0.00227673095650971,
"id": "f7bf8842f80a5a2192781064bd69e776",
"location": [352, 237, 381, 278],
"name": "Example Person",
"probability": 0.499512671029603
}
]
},
"businessLabel1": "face",
"businessLabel2": "renlianleixing",
"businessLabel3": "zhenren",
"confidenceLevel": 2,
"probability": 0.979977369308472
}
],
"imgText": "2022/10/25 09:05",
"imgUrl": "http://example.com/frame_v81.jpg",
"requestId": "edaa113581ec1c18df7b44c86d36ae3b_v81",
"riskDescription": "Politics: Political symbols: Party emblem",
"riskDetail": {
"ocrText": {
"text": "2022/10/25 09:05"
},
"riskSource": 1002
},
"riskLabel1": "politics",
"riskLabel2": "zhengzhixiangzheng",
"riskLabel3": "danghui",
"riskLevel": "REJECT",
"time": 81
}
],
"message": "Success",
"requestId": "66fb85e3149bb9e13d6c72161cc6c6cf",
"riskLevel": "REJECT"
}Updated 17 days ago