MiniMax H3 Task Query API Integration Guide
This document introduces the integration and usage of the MiniMax H3 Task Query API. This API is used to query, batch list, or delete asynchronous tasks created by the MiniMax H3 Video Generation API.
¶ Application Process
To use the MiniMax H3 Task Query API, first go to the qiyaov Console to obtain your API Token and keep it for later use.

If you have not logged in or registered yet, you will be automatically redirected to the login page and invited to register and log in. After completion, you will automatically return to the current page.
One API Token can call all platform services, with no need to apply separately for each service. Your first application will include free credits for a free trial; when credits are insufficient, you can recharge your general balance in the Console.
📘 Full documentation: MiniMax H3 Task Query API →
When querying a task, you should use the same Token that created the task. It is recommended to save the Token as an environment variable and not write it into source code or commit it to a version repository:
export ACEDATACLOUD_API_KEY="YOUR_API_KEY"
¶ API Overview
- Base URL:
https://api.qiyaov.com - Endpoint:
POST /minimax/tasks - Authentication Method: Include
authorization: Bearer {token}in the HTTP Header - Request Headers:
accept: application/jsoncontent-type: application/json
- Query a Single Task:
action=retrieve, pass inid - Batch Query Tasks:
action=retrieve_batch, can filter by task ID, time range, and pagination conditions - Delete a Task:
action=delete, pass inid - Billing Notes: Task queries are free and will not result in repeated charges
You must save the task_id after creating a video. It is recommended to query approximately every 10 seconds until the task enters a terminal state.
¶ Request Parameters
| Parameter | Type | Required | Applicable Actions | Description |
|---|---|---|---|---|
action |
string | No | All | retrieve, retrieve_batch, or delete; defaults to retrieve |
id |
string | Conditionally required | retrieve, delete |
Single task ID |
ids |
string[] | No | retrieve_batch |
Returns only specified task IDs; when omitted, lists tasks according to other conditions |
limit |
integer | No | retrieve_batch |
Maximum number of tasks returned in this request |
offset |
integer | No | retrieve_batch |
Number of tasks to skip from the result list, used for pagination |
created_at_min |
number | No | retrieve_batch |
Lower bound of creation time, Unix timestamp in seconds |
created_at_max |
number | No | retrieve_batch |
Upper bound of creation time, Unix timestamp in seconds |
The purposes of the three actions are as follows:
action |
Purpose | Required Parameters | Response Structure |
|---|---|---|---|
retrieve |
Query the status and result of one task | id |
{ "task": {...} } |
retrieve_batch |
Batch query by task ID, time, and pagination conditions | Optional ids, time range, offset, limit |
{ "items": [...], "total": number } |
delete |
Cancel or delete a task record according to the current task status | id |
{ "id": "...", "deleted": true } |
¶ Query a Single Task
curl -X POST 'https://api.qiyaov.com/minimax/tasks' \
-H "Authorization: Bearer $ACEDATACLOUD_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"action": "retrieve",
"id": "f5977217-ed2c-40da-adbe-93d08235618f"
}'
Below is the response from a real successful task:
{
"task": {
"id": "f5977217-ed2c-40da-adbe-93d08235618f",
"model": "MiniMax-H3",
"status": "succeeded",
"created_at": 1786184658,
"updated_at": 1786184758,
"content": {
"url": "https://cdn.acedata.cloud/assets/examples/minimax/f5977217-ed2c-40da-adbe-93d08235618f-b080c998dde2.mp4"
},
"resolution": "768P",
"duration": 4,
"usage": {
"total_seconds": 4,
"input_seconds": 0,
"output_seconds": 4,
"input_image_count": 0
},
"ratio": "16:9",
"task_type": "generation",
"modality": "video"
}
}
Open the real video result of this task
¶ Task Status
status |
Meaning | Client Handling |
|---|---|---|
queued |
Has entered the queue, waiting for execution | Continue polling |
running |
Being generated | Continue polling |
succeeded |
Generated successfully | Read task.content.url, stop polling |
failed |
Generation failed | Read task.error, stop polling |
cancelled |
Task has been cancelled | Stop polling |
succeeded, failed, and cancelled are all terminal states. Do not continue polling after entering a terminal state.
¶ task Response Fields
| Field | Type | Description |
|---|---|---|
id |
string | Task ID |
model |
string | The model used by the task, currently MiniMax-H3 |
status |
string | Current task status |
error.code |
string | Failure error code, returned only on failure |
error.message |
string | Failure reason, returned only on failure |
created_at |
integer | Creation time, Unix timestamp in seconds |
updated_at |
integer | Most recent status update time, Unix timestamp in seconds |
content.url |
string | Video URL after success |
resolution |
string | Output resolution, 768P or 2K |
duration |
integer | Output video duration, in seconds |
usage.total_seconds |
integer | Total billable usage, equal to the sum of input video seconds and output seconds |
usage.input_seconds |
integer | Billable usage generated by reference video input |
usage.output_seconds |
integer | Billable usage generated by output video |
usage.input_image_count |
integer | Number of input images in billing statistics |
ratio |
string | Actual output aspect ratio; when using adaptive, refer to the result here |
task_type |
string | Video generation task is generation |
modality |
string | Video task is video |
¶ Complete Python Polling Example
The following code reads the Token from an environment variable, creates a task, and queries it every 10 seconds:
import os
import time
import requests
BASE_URL = "https://api.qiyaov.com"
HEADERS = {
"Authorization": f"Bearer {os.environ['ACEDATACLOUD_API_KEY']}",
"Content-Type": "application/json",
}
create_response = requests.post(
f"{BASE_URL}/minimax/videos",
headers=HEADERS,
json={
"model": "MiniMax-H3",
"content": [
{
"type": "text",
"text": "At the seaside in the early morning, a white sailboat sails across the calm sea, and the camera slowly pans horizontally",
}
],
"resolution": "768P",
"duration": 4,
"ratio": "16:9",
},
timeout=30,
)
create_response.raise_for_status()
task_id = create_response.json()["task_id"]
while True:
time.sleep(10)
query_response = requests.post(
f"{BASE_URL}/minimax/tasks",
headers=HEADERS,
json={"action": "retrieve", "id": task_id},
timeout=30,
)
query_response.raise_for_status()
task = query_response.json()["task"]
print(f"task={task_id} status={task['status']}")
if task["status"] == "succeeded":
print(f"video_url={task['content']['url']}")
break
if task["status"] in ("failed", "cancelled"):
raise RuntimeError(task.get("error") or task["status"])
Production environments should set an overall timeout for polling and use exponential backoff for 429 and temporary 5xx responses. A network timeout does not mean generation has failed; you can continue querying using the same task_id.
¶ Batch Querying
Specify multiple task IDs:
curl -X POST 'https://api.qiyaov.com/minimax/tasks' \
-H "Authorization: Bearer $ACEDATACLOUD_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"action": "retrieve_batch",
"ids": ["TASK_ID_1", "TASK_ID_2"],
"offset": 0,
"limit": 20
}'
List tasks by time range with pagination:
{
"action": "retrieve_batch",
"created_at_min": 1786000000,
"created_at_max": 1786200000,
"offset": 0,
"limit": 20
}
The items in the batch response use the same task fields as a single-task query, and total is the total number of tasks matching the filter criteria:
{
"items": [
{
"id": "TASK_ID_1",
"model": "MiniMax-H3",
"status": "running",
"resolution": "2K",
"duration": 5,
"ratio": "adaptive",
"task_type": "generation",
"modality": "video"
}
],
"total": 1
}
The task query window covers the most recent 7 days. A task_id beyond this window may return an invalid task; business systems should save the ID when creating a task and promptly persist the result URL after success.
¶ Cancel or Delete a Task
curl -X POST 'https://api.qiyaov.com/minimax/tasks' \
-H "Authorization: Bearer $ACEDATACLOUD_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"action": "delete",
"id": "YOUR_TASK_ID"
}'
The action depends on the task's current status:
| Current Status | Behavior |
|---|---|
queued |
Cancel a task that has not started yet |
succeeded |
Delete the task record |
failed |
Delete the task record |
running |
Deletion or cancellation is not allowed; an error is returned |
cancelled |
Repeated operations are not allowed; an error is returned |
Example of a successful deletion:
{
"id": "YOUR_TASK_ID",
"deleted": true
}
Deleting a task record does not reverse charges that have already been incurred, nor does it guarantee that saved video copies will be deleted at the same time.
¶ Failure Responses and Troubleshooting
Failed tasks still return a task object with HTTP 200, and the reason is provided in task.error:
{
"task": {
"id": "YOUR_TASK_ID",
"model": "MiniMax-H3",
"status": "failed",
"error": {
"code": "1026",
"message": "video description contains sensitive content"
},
"task_type": "generation",
"modality": "video"
}
}
When the API itself returns 400, check the action and condition parameters. 401 indicates an invalid Token, 429 indicates that queries are too frequent, and 500 indicates that the service is temporarily unavailable. Failed generation tasks are not billed; successful tasks are charged based on the final usage record.