跳到文档内容
十方十方MAAS开发者文档进入控制台 →

开发者文档 / API 接口

任务查询 API

查询三个任务 API 的状态、失败原因与下载地址。

GET/v1/tasks/{task_id}

Bearer API Key · JSON · HTTP 200

概览

使用创建任务时返回的 id 查询进度、失败原因和结果地址。三个任务 API 共用此接口,使用创建任务的同一把 API Key。

请求参数

task_id:必填 string 路径参数,使用创建响应的 id;无需查询参数或请求体。三个创建接口共用此查询接口。

查询进度并保存结果,也可选择结果回调接收通知。失败时按任务失败原因处理。

调用示例

Bash / macOS / Linux;Windows 可使用 Git Bash。

# 先按“鉴权与通用约定”设置环境变量
: "${MASS_API_KEY:?请先设置 MASS_API_KEY}"
: "${MASS_TASK_ID:?请先设置 MASS_TASK_ID}"
MASS_BASE_URL="${MASS_BASE_URL:-https://api.vizen.cc}"

curl --silent --show-error --fail-with-body --max-time 120 \
  -X GET "${MASS_BASE_URL%/}/v1/tasks/${MASS_TASK_ID}" \
  -H "Authorization: Bearer $MASS_API_KEY"

Python 3.10+,仅使用标准库。保存为 example.py,运行 python example.py。

import json
import os
import urllib.error
import urllib.parse
import urllib.request

base_url = os.environ.get("MASS_BASE_URL", "https://api.vizen.cc").rstrip("/")
api_key = os.environ["MASS_API_KEY"]
task_id = urllib.parse.quote(os.environ["MASS_TASK_ID"], safe="")
path = "/v1/tasks/{task_id}".replace("{task_id}", task_id)
headers = {"Authorization": "Bearer " + api_key}
body = None
request = urllib.request.Request(
    base_url + path, data=body, headers=headers, method="GET"
)
try:
    with urllib.request.urlopen(request, timeout=120) as response:
        result = json.load(response)
        print(json.dumps(result, ensure_ascii=False, indent=2))
except urllib.error.HTTPError as error:
    print("HTTP", error.code, error.read().decode("utf-8"))
    raise SystemExit(1)
except urllib.error.URLError as error:
    # 创建请求出现网络异常时,保留原幂等键;不要生成新键后盲目重试。
    print("请求未能确认:", error.reason)
    raise SystemExit(1)

JDK 17+,仅使用标准库。保存为 UTF-8 的 Example.java;执行 javac -encoding UTF-8 Example.java,再执行 java Example。

import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class Example {
    static String requireEnv(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) {
            throw new IllegalArgumentException("请设置环境变量 " + name);
        }
        return value;
    }

    public static void main(String[] args) throws Exception {
        String base = System.getenv().getOrDefault("MASS_BASE_URL", "https://api.vizen.cc");
        base = base.replaceAll("/+$", "");
        String taskId = URLEncoder.encode(requireEnv("MASS_TASK_ID"), StandardCharsets.UTF_8)
            .replace("+", "%20");
        String path = "/v1/tasks/{task_id}".replace("{task_id}", taskId);
        HttpRequest request = HttpRequest.newBuilder(URI.create(base + path))
            .timeout(Duration.ofSeconds(120))
            .header("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();
        HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(20)).build();
        // 网络异常会抛出异常;重试创建请求时保留相同幂等键和参数。
        HttpResponse<String> response = client.send(request,
            HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        System.out.println(response.body());
        if (response.statusCode() >= 400) {
            throw new IllegalStateException("HTTP " + response.statusCode());
        }
    }
}

Go 1.20+,仅使用标准库。保存为 main.go,运行 go run main.go。

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "os"
    "strings"
    "time"
)

func requireEnv(name string) string {
    value := os.Getenv(name)
    if value == "" { panic("请设置环境变量 " + name) }
    return value
}

func main() {
    base := os.Getenv("MASS_BASE_URL")
    if base == "" { base = "https://api.vizen.cc" }
    base = strings.TrimRight(base, "/")
    path := strings.ReplaceAll("/v1/tasks/{task_id}", "{task_id}", url.PathEscape(requireEnv("MASS_TASK_ID")))
    req, err := http.NewRequest("GET", base + path, nil)
    if err != nil { panic(err) }
    req.Header.Set("Authorization", "Bearer " + requireEnv("MASS_API_KEY"))
    client := &http.Client{Timeout: 120 * time.Second}
    resp, err := client.Do(req)
    // 网络异常不代表创建失败;重试时保留原幂等键和参数。
    if err != nil { panic(err) }
    defer resp.Body.Close()
    data, err := io.ReadAll(resp.Body)
    if err != nil { panic(err) }
    fmt.Println(string(data))
    if resp.StatusCode >= 400 { panic(fmt.Sprintf("HTTP %d", resp.StatusCode)) }
}

路径参数 task_id 为创建时返回的任务 ID;无请求体。建议间隔 3~5 秒查询一次,避免紧密循环。查询成功返回 HTTP 200,已完成任务的响应示例:

{
  "id": "job_example",
  "type": "video_generation",
  "status": "succeeded",
  "model": "seedance-2.5",
  "resolution": "720p",
  "output": {
    "video_url": "https://your-mass-domain.example/v1/results/job_example?expires=...\u0026token=...",
    "expires_at": "2026-09-16T04:00:00Z"
  },
  "error": null,
  "created_at": "2026-09-15T03:58:00Z",
  "updated_at": "2026-09-15T04:00:00Z",
  "completed_at": "2026-09-15T04:00:00Z"
}

Seedance 任务对象

{
  "id": "job_example",
  "model": "doubao-seedance-2-5-260628",
  "status": "succeeded",
  "content": {
    "video_url": "https://your-mass-domain.example/v1/results/job_example?expires=...\u0026token=..."
  },
  "created_at": 1789444680,
  "updated_at": 1789444800,
  "error": null,
  "resolution": "720p",
  "duration": 5,
  "framespersecond": 24,
  "generate_audio": true,
  "output_format": "mp4",
  "ratio": "16:9",
  "execution_expires_after": 172800,
  "usage": {
    "completion_tokens": 108000,
    "total_tokens": 108000
  }
}
idstring

modelstring

statusstring

contentobject | null

created_atinteger

Unix 时间戳,秒

updated_atinteger

Unix 时间戳,秒

errorobject | null

resolutionstring

最终交付分辨率

durationinteger | null

framespersecondinteger | null

generate_audioboolean | null

output_formatstring | null

ratiostring | null

seedinteger | null

execution_expires_afterinteger | null

safety_identifierstring | null

usageobject | null

toolsarray<object> | null

Seedance 成功结果为 content.video_url;created_at、updated_at 为 Unix 秒级时间戳。usage 为实际生成 token 用量,未取得元信息时对应字段为 null;不返回尾帧。生成、处理和结果保存完成之前保持 running。

Wan 与超分任务对象

Wan 和独立超分使用以下结构,其回调放在 data 内。

idstring

平台任务 ID

typestring

video_generation、wan_video_generation 或 video_upscale

statusstring

queued、running、cancelling、reviewing、succeeded、failed 或 cancelled

modelstring | null

生成模型;超分任务为 null

resolutionstring

请求的最终分辨率

outputobject | null

成功结果;未成功、已过期或账单待补款时为 null,费用状态见任务账单接口

errorobject | null

失败信息;未失败时为 null

created_atstring (date-time)

任务创建时间,ISO 8601 UTC

updated_atstring (date-time)

任务最近更新时间,ISO 8601 UTC

completed_atstring (date-time) | null

任务终止时间;处理中为 null

output 对象

video_urlstring

平台结果下载地址;默认有效 24 小时,请自行保存,实际期限见 expires_at

expires_atstring (date-time) | null

结果 URL 的失效时间,ISO 8601 UTC;无法确定时为 null

error 对象

codestring

平台统一错误码;无法细分的处理异常为 provider_failed

messagestring

平台统一失败原因与处理建议;不包含渠道原始诊断

任务状态

状态含义与下一步
queued等待执行,继续查询或等待通知。
running正在处理。
reviewing结果正在核实;保留任务 ID,不要重新提交同一业务任务。
cancelling正在确认取消,尚未取消成功。
succeeded处理完成:Seedance 从 content.video_url 下载,Wan / 超分从 output.video_url 下载。
failed处理失败,查看 error;确认原因后再决定是否创建新任务。
cancelled已确认取消。

结果默认保存 24 小时,Wan / 超分实际期限看 output.expires_at。请自行下载或转存。直接使用返回的完整 URL,无需拼接签名参数;文件过期后不能通过再次查询延长有效期。

不要只凭 HTTP 200 判断视频成功,应检查任务 status;时间字段使用 ISO 8601 UTC。

下载结果

GET /v1/results/{job_id} 使用 output.video_url 中自带的路径及 expires(Unix 秒级时间戳)、token(签名)查询参数,无需 Bearer 鉴权。链接应保密;直接使用完整 URL,不自行构造。客户端应支持 HTTP 307 重定向;返回文件时为 200,分段下载可返回 206。链接失效为 410、结果不可用为 404、暂时下载失败为 502。此接口返回视频或重定向,不返回任务 JSON。

搜索文档

↑ ↓ 选择 · Enter 跳转

输入关键词,搜索正文、参数和代码示例。