ULTIVOX · OPEN API · WAN3.0 EDITION

Wan3.0 专用接口文档(v1.7 · Wan3.0 专用)

本文档从平台总文档中抽出 Wan3.0 模型在自主创作模式(free-video,纯文生视频 / 图生视频)下的全部接口行为与参数,并已按 2026-09-30 实测结论修正时长能力。创作台中的模板类功能不在本文档范围内(如需请见平台总文档)。适用读者:您本人与您的 AI 助手(附「如何对 AI 说」对话模板)。

Base URL:https://ultivox.cn/api/open/v1 模型:Wan3.0 版本 v1.7 · 2026-10-14 自主创作 free-video

RULESWan3.0 核心红线(先读这个)

⏱️ 时长:仅支持 2 ~ 30 的整数秒。传 1 秒或超 30 秒,任务都会执行失败。API 层已做硬校验:超限直接 400。小数秒向下取整。
🎵 音频素材:最多 5 段,所有音频的总时长之和不得超过 15 秒。服务端不解析音频时长,总时长超限时任务会执行失败,请调用方自行控制总时长。
维度Wan3.0 的行为
时长 duration2–30 整数秒(默认 15)。实践建议:短视频 5–30 秒效果最好
分辨率 resolution仅 480P(缺省值)。⚠️ 720P / 1080P(超分)档 2026-10-04 起暂时下线,传了直接 400(报错给出可用档位)
画幅 aspect_ratio9:16(默认,竖屏)/ 16:9(横屏)。仅 Wan3.0 支持该参数
音频素材 audios✅ 可选,最多 5 段,每项为音频 https URL 或 {"asset_id": "..."};所有音频总时长之和 ≤ 15 秒
参考图 images≤ 10 张(注意:Seedance 2.0 系参考图上限为 9 张,与 Wan3.0 不同)。超限 400
参考视频 benchmark_video / benchmark_videos✅ 可选:最多 5 个、单个 ≤15 秒、总时长 ≤60 秒,超限 400;按参考视频时长额外计费(每个视频向上取整秒、不足 1 秒按 1 秒计:480P=14 星点/秒 × 条数)
条数 quantity1–5,默认 1
不支持首帧 / 尾帧(不支持);720P / 1080P 分辨率档(暂时下线);多参考视频 ✅(benchmark_videos,≤5 个)

AUTH认证与端点清单

所有请求携带请求头:Authorization: Bearer sk-rh-xxxxxxxx...(密钥在网页端「用户详情 → 中转站 API 密钥」)。限频 60 次/分钟,超限返回 429 + Retry-After。

方法端点用途
GET/me当前账户信息
GET/pricing实时价目表(视频每秒单价 / 生图单价 / 对话费率)
POST/videos提交视频任务(自主创作 free-video,见下)
GET/videos任务列表(?status=&limit=,limit 默认 10 最大 50)
GET/videos/{job_id}查询单任务进度与结果
POST/assets导入外部素材(图片/视频 URL → asset_id)
POST/images提交生图任务
GET/images/{job_id}查询单个生图任务
POST/chat/completionsAI 对话(OpenAI 兼容,按 token 计费)
📌 素材建议:直接传公网 https 直链即可;大文件或需复用的素材先走 POST /assets 换成 {"asset_id": "..."} 引用(图片格式 JPG/JPEG/PNG/WebP,单张建议 ≤10MB)。素材 URL 必须公网 https 可匿名 GET。

MODE自主创作 free-video(纯文 / 图生视频)

POST /videosmode=free-video

参数必填说明
mode否free-video(自主创作)
model否Wan3.0(默认)
prompt必填视频创作要求描述(建议 ≤2000 字符,中英文可换行;硬上限 100000 字符,超限提交失败)
duration否2–30 整数秒(默认 15)。⚠️ 1 秒 / 超 30 秒 → 400
resolution否仅 480P(缺省值)。⚠️ 720P / 1080P 档暂时下线,传了 400
aspect_ratio否画幅:9:16(默认,竖屏)/ 16:9(横屏)。仅 Wan3.0 支持;传其他值 400
audios否音频素材数组,每项为音频 https URL 或 {"asset_id": "..."}。最多 5 段,所有音频总时长之和 ≤ 15 秒(服务端不解析音频时长,总时长超限任务会失败,请自行控制)。仅 Wan3.0 支持
images否参考图数组,最多 10 张(URL 字符串或 {"asset_id"} 对象均可),超限 400
benchmark_videos否✅ 可选:参考视频数组,每项为 https URL 或 {"asset_id": "..."};最多 5 个、单个 ≤15 秒、总时长 ≤60 秒,超限 400。按参考视频时长额外计费(每个视频向上取整秒、不足 1 秒按 1 秒计,如 1.56 秒按 2 秒收费:480P=14 星点/秒 × 条数)。也接受单个 benchmark_video
quantity否1–5,默认 1
POST /api/open/v1/videos
{
  "mode": "free-video",
  "model": "Wan3.0",
  "prompt": "黄色亚麻衬衫套装平铺展示,柔光,电商白底风格",
  "duration": 10,
  "aspect_ratio": "16:9",
  "images": ["https://my-cdn.com/product.jpg"],
  "audios": ["https://my-cdn.com/voiceover.mp3"]
}
# 201 返回:{ "job_id": "...", "status": "queued" }
「用 ULTIVOX 开放 API 的自主创作模式(mode=free-video)生成一条视频:Wan3.0、10 秒、16:9 横屏,prompt=「把图中的产品放在大理石台面上,环绕运镜展示细节,电商质感」,参考图 https://my-cdn.com/product.jpg,配音音频 https://my-cdn.com/voiceover.mp3(注意所有音频总时长不超过 15 秒)。提交后每 10 秒轮询一次,出片后下载保存。密钥从环境变量 ULTIVOX_API_KEY 读取。」

POLL轮询查询与状态机

GET /videos/{job_id}GET /videos?status=&limit=

字段说明
statusqueued(排队中)/ uploading(素材上传中)/ generating(生成中)/ succeeded / failed(终态)。Wan3.0 不走夜间队列(那是 seedance2 基础款的 scheduled)
progress0–100
video_url成片签名 URL,6 小时有效,请及时转存
archive_statusarchived = 已永久保存到平台资产库
error失败原因
📌 状态机:queued → uploading → generating → succeeded | failed。单任务最长 5100 秒超时自动失败。提交后立刻查询可能短暂 404(退避 2 秒重试);查询 5xx 是服务抖动、不代表任务失败。quantity > 1 仍是一个 job_id,多条结果全部永久存平台资产库。
# 查询
GET /api/open/v1/videos/<job_id>
{ "job_id": "...", "status": "generating", "progress": 42 }

# Wan3.0 时长超限 → 400
{ "error": "Wan3.0 时长支持 2-30 的整数秒;更长的视频请改用 Seedance 2.0 系列(4-15 秒,成片固定 720P 竖屏)。",
  "code": "validation_error" }

CODEPython 全流程示例(提交 → 轮询 → 下载)

import os, time, urllib.request, json

BASE = "https://ultivox.cn/api/open/v1"
KEY = os.environ["ULTIVOX_API_KEY"]   # sk-rh-...

def call(path, payload=None, method=None):
    data = json.dumps(payload).encode() if payload is not None else None
    req = urllib.request.Request(
        BASE + path, data=data,
        method=method or ("POST" if data else "GET"),
        headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"})
    return json.loads(urllib.request.urlopen(req).read())

# 1) 提交:Wan3.0,10 秒 480P(分辨率仅 480P 可用;duration 必须在 2~30 之间)
job = call("/videos", {
    "mode": "free-video", "model": "Wan3.0",
    "prompt": "产品在暖光厨房台面上,手持展示细节,电商质感",
    "duration": 10,
    "images": ["https://my-cdn.com/product.jpg"]})
print("job:", job["job_id"])

# 2) 轮询(每 10 秒;404 退避重试;5xx 继续等)
while True:
    time.sleep(10)
    try:
        st = call("/videos/" + job["job_id"])
    except Exception:
        continue
    print(st["status"], st.get("progress"))
    if st["status"] in ("succeeded", "failed"):
        break

# 3) 下载(video_url 6 小时有效,及时转存)
if st["status"] == "succeeded":
    urllib.request.urlretrieve(st["video_url"], "output.mp4")
else:
    print("failed:", st.get("error"))

ERRORSWan3.0 高频错误速查

HTTPcode场景与处理
400validation_errorduration 不在 2–30、缺 prompt、参考图 >10、free-video 传了 benchmark_video 等——改参数重提
401invalid_api_key密钥缺失/无效
402insufficient_credits账户余额不足,请充值后再试(响应附 balance / required)
404not_found任务不存在;刚提交就查会短暂 404,退避 2 秒重试
409asset_not_ready引用的 asset 尚未归档完成,稍后重试
429rate_limited超 60 次/分钟,按 Retry-After 退避
502submit_failed平台提交失败,请稍后重试
错误响应统一格式:{"error": "人类可读说明", "code": "机器可读错误码"}。