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 的行为 |
| 时长 duration | 2–30 整数秒(默认 15)。实践建议:短视频 5–30 秒效果最好 |
| 分辨率 resolution | 仅 480P(缺省值)。⚠️ 720P / 1080P(超分)档 2026-10-04 起暂时下线,传了直接 400(报错给出可用档位) |
| 画幅 aspect_ratio | 9: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 星点/秒 × 条数) |
| 条数 quantity | 1–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/completions | AI 对话(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=
| 字段 | 说明 |
status | queued(排队中)/ uploading(素材上传中)/ generating(生成中)/ succeeded / failed(终态)。Wan3.0 不走夜间队列(那是 seedance2 基础款的 scheduled) |
progress | 0–100 |
video_url | 成片签名 URL,6 小时有效,请及时转存 |
archive_status | archived = 已永久保存到平台资产库 |
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 高频错误速查
| HTTP | code | 场景与处理 |
| 400 | validation_error | duration 不在 2–30、缺 prompt、参考图 >10、free-video 传了 benchmark_video 等——改参数重提 |
| 401 | invalid_api_key | 密钥缺失/无效 |
| 402 | insufficient_credits | 账户余额不足,请充值后再试(响应附 balance / required) |
| 404 | not_found | 任务不存在;刚提交就查会短暂 404,退避 2 秒重试 |
| 409 | asset_not_ready | 引用的 asset 尚未归档完成,稍后重试 |
| 429 | rate_limited | 超 60 次/分钟,按 Retry-After 退避 |
| 502 | submit_failed | 平台提交失败,请稍后重试 |
错误响应统一格式:{"error": "人类可读说明", "code": "机器可读错误码"}。