查询视频任务
curl --request GET \
--url https://api.mixroute.ai/v1/video/generations/{task_id}import requests
url = "https://api.mixroute.ai/v1/video/generations/{task_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.mixroute.ai/v1/video/generations/{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.mixroute.ai/v1/video/generations/{task_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.mixroute.ai/v1/video/generations/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
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.mixroute.ai/v1/video/generations/{task_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixroute.ai/v1/video/generations/{task_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body视频系列
查询视频任务
查询视频生成任务的状态和结果
GET
/
v1
/
video
/
generations
/
{task_id}
查询视频任务
curl --request GET \
--url https://api.mixroute.ai/v1/video/generations/{task_id}import requests
url = "https://api.mixroute.ai/v1/video/generations/{task_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.mixroute.ai/v1/video/generations/{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.mixroute.ai/v1/video/generations/{task_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.mixroute.ai/v1/video/generations/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
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.mixroute.ai/v1/video/generations/{task_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixroute.ai/v1/video/generations/{task_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body使用创建接口返回的 MixRoute 任务 ID 查询视频任务。各模型分类页共用这里的轮询流程。
以当前路由的实际响应为准。只检查顶层
建议约每 10 秒查询一次,限流或临时服务错误时退避。任务成功后及时下载产物。
Seedance | Doubao | Dreamina | Veo | MiniMax H3
万相建议每 15 秒轮询一次。失败任务的 result_url 可能包含失败原因,必须先确认 status 为 SUCCESS,再将其作为下载地址。
GET https://api.mixroute.ai/v1/video/generations/{task_id}
string
required
提交时返回的 MixRoute 任务 ID。
curl "https://api.mixroute.ai/v1/video/generations/TASK_ID" \
--header "Authorization: Bearer $MIXROUTE_API_KEY"
响应与状态
不同路由可能直接返回任务,也可能包装在data 或厂商 task 对象中。比较状态前统一大小写;这些是不同返回结构,不是每次响应都必须同时具备的字段。
| 状态 | 取值 | 处理 |
|---|---|---|
| 等待 | queued, pending, submitted, NOT_START | 继续轮询。 |
| 运行 | running, in_progress | 继续轮询。 |
| 成功 | succeeded, SUCCESS, completed | 读取结果对象并获取视频。 |
| 终止失败 | failed, FAILURE, expired, cancelled, canceled | 停止轮询,检查 error/fail_reason。 |
结果位置
| 返回结构 | 视频位置 |
|---|---|
| MixRoute 包装 | data.result_url / data.url |
| 直接任务 | url / result_url |
| Seedance 原生结果 | content.video_url 位于任务内部(例如 data.data.content.video_url)。 |
| MiniMax H3 结果 | data.result_url 或任务封装中的 data.data.task.content.video_url;厂商原生响应可能使用 task.content.url。 |
| Veo 原生结果 | 检查返回的全部 samples/videos;Google 原生结果可能提供 URI 或编码数据,而不是单个顶层 URL。 |
| 通义万相 | SUCCESS 后读取 data.result_url;原生 output 与 usage 在 data.data。万相说明。 |
| Sora 2 | 下载视频 |
response.status 或 response.url 的客户端会漏掉包装后的成功状态与结果。
示例:包装后的成功响应
{
"code": "success",
"message": "",
"data": {
"task_id": "TASK_ID",
"status": "SUCCESS",
"result_url": "https://example.com/generated-video.mp4"
}
}
轮询示例
下例检查 HTTP 与业务错误,处理常见包装结构,在终止状态停止,并设置客户端超时。函数返回任务对象,由调用方处理该路由的输出字段。import os
import time
from urllib.parse import quote
import requests
def unpack_task(payload):
task = payload
for _ in range(6):
if not isinstance(task, dict):
raise ValueError("Unexpected task response")
if task.get("error"):
raise RuntimeError(task["error"])
code = task.get("code")
if code not in (None, 0, 200, "0", "200", "success"):
raise RuntimeError(task.get("message") or task)
if task.get("status"):
return str(task["status"]).lower(), task
nested = task.get("task")
if not isinstance(nested, dict):
nested = task.get("data")
if not isinstance(nested, dict):
break
task = nested
raise ValueError("Task status is missing from the response")
def wait_for_video(task_id, timeout_seconds=1200):
deadline = time.monotonic() + timeout_seconds
url = "https://api.mixroute.ai/v1/video/generations/" + quote(task_id, safe="")
delay = 10
pending = {"queued", "pending", "submitted", "not_start", "running", "in_progress"}
terminal = {"failed", "failure", "expired", "cancelled", "canceled"}
with requests.Session() as session:
session.headers["Authorization"] = "Bearer " + os.environ["MIXROUTE_API_KEY"]
while time.monotonic() < deadline:
remaining = deadline - time.monotonic()
if remaining <= 0:
break
response = session.get(url, timeout=min(30, remaining))
if response.status_code in (429, 500, 502, 503, 504):
delay = min(delay * 2, 30)
else:
response.raise_for_status()
status, task = unpack_task(response.json())
if status in {"success", "succeeded", "completed"}:
return task
if status in terminal:
raise RuntimeError(task.get("fail_reason") or task.get("error") or task)
if status not in pending:
raise ValueError("Unknown task status: " + status)
delay = 10
remaining = deadline - time.monotonic()
if remaining <= 0:
break
time.sleep(min(delay, remaining))
raise TimeoutError("Video task did not finish before the client deadline")
if __name__ == "__main__":
print(wait_for_video("TASK_ID"))