01快速开始
三个模型都是异步任务:提交拿 task_id,轮询到 completed 后取成片。
最容易踩的坑:端点别用错。Seedance 系列走 POST /v1/videos,不能用 /v1/chat/completions——用对话接口调会直接返回 404,且换任何模型名都无法解决。
- Base URL
https://www.salpx.com/v1- 鉴权
Authorization: Bearer <SalpX Token>- 提交任务
POST /v1/videos- 查询状态
GET /v1/videos/{task_id}- 代理取片
GET /v1/videos/{task_id}/content- 令牌分组
- 必须是
default或大额优惠,其它分组报No available channel - 出片耗时
- 通常 5–15 分钟;超过 45 分钟自动置失败并全额退款
02模型与价格
两种计费方式,填错会差 10 倍——按秒 的价格是每秒价,按次 的价格是整条片的价格。
| 模型名 | 计费 | 时长 | 价格 | 单条花费 |
|---|---|---|---|---|
seedance-2-mini-特价版 |
按秒 | 10 或 15 秒 | ¥0.20 / 秒 | 10s = ¥2.00 15s = ¥3.00 |
seedance-2-fast-特价版 |
按秒 | 10 或 15 秒 | ¥0.20 / 秒 | 10s = ¥2.00 15s = ¥3.00 |
seedance-2-5-补贴版 |
按次 | 固定 30 秒 | 面议 | 面议 |
mini 与 fast 的 seconds 只接受 10 或 15。这是必填字段,不传报 400;传其它值(例如 5)会被拒:400 invalid_duration · 时长需在 10~15 秒之间。
seedance-2-5-补贴版 按次固定 30 秒,不需要传时长,传了也不改变成片长度和价格。
2026-09-10 更新:seedance-2-fast-特价版 新增 15 秒规格。原先它是固定 10 秒、按次 ¥2.10;现在支持 10 / 15 两档,计费改为按秒 ¥0.20 / 秒,因此 10 秒由 ¥2.10 降为 ¥2.00,15 秒为 ¥3.00。
请确认你的请求带上了 seconds。这个字段现在必填、没有默认值——原先靠"不传时长自动出 10 秒"的写法需要显式补上 "seconds": 10。
15 秒的产能明显小于 10 秒,排队时间可能更长;当日产能用尽会返回 409(该模型今日产能已排满),此时改用 10 秒或次日再试。
15 秒失败即退款,不会自动改投其它渠道重跑。不要按"失败也可能最终成功"的预期去设计重试逻辑——失败就是失败,钱原路退回。
03提交任务
3.1 文生视频 · 按秒(mini / fast)
curl -X POST https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $SALPX_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-mini-特价版", "prompt": "一只蓝色果冻水母在霓虹海中缓缓游动,电影感运镜", "seconds": 10 }'
返回:
{
"task_id": "task_HbomjItwROBzAYE8ugjgl37iqpSbf87A",
"object": "video",
"model": "seedance-2-mini-特价版",
"status": "queued",
"progress": 0,
"seconds": "10"
}
seedance-2-fast-特价版 写法完全一致,只是换个模型名。下面这条是 15 秒规格:
curl -X POST https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $SALPX_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-fast-特价版", "prompt": "金色麦田上空掠过一群飞鸟,逆光,慢镜头,电影感", "seconds": 15 }'
3.2 文生视频 · 按次(2.5 补贴版)
seedance-2-5-补贴版 固定 30 秒、按次计费,不需要传时长,其余完全一致。
curl -X POST https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $SALPX_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-5-补贴版", "prompt": "金色麦田上空掠过一群飞鸟,逆光,慢镜头,电影感" }'
3.3 图生视频(参考图)
在请求上加一个参考图字段即可,最多 6 张,重复图自动去重,超出报 400。
优先直接传图片内容(multipart 文件或 base64)。传 URL 也支持,但我方需要先把图下载下来再转给渲染端 —— 你的图床只要对第三方不可读,这一单就会在提交阶段被拒。
curl -X POST https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $SALPX_KEY" \ -F "model=seedance-2-mini-特价版" \ -F "prompt=镜头缓缓推近,光影流动" \ -F "seconds=10" \ -F "input_reference=@ref.png"
IMG=$(base64 -w0 ref.png) # macOS 用 base64 -i ref.png cat > req.json <<EOF { "model": "seedance-2-mini-特价版", "prompt": "镜头缓缓推近,光影流动", "seconds": 10, "input_reference": "data:image/png;base64,$IMG" } EOF curl -X POST https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $SALPX_KEY" \ -H "Content-Type: application/json" \ --data-binary @req.json
curl -X POST https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $SALPX_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-mini-特价版", "prompt": "镜头缓缓推近,光影流动", "seconds": 10, "input_reference": "https://your-cdn.com/ref.jpg" }'
传 URL 的硬要求:地址必须能被任意第三方直接 GET 下载。对象存储的预签名地址(带 X-Amz-Signature 那种)、需要登录 / Referer / IP 白名单才能访问的地址,我方一律拉不到。这时提交会直接返回 400 reference_image_unreachable,并把你的图床原样返回的报错一并带出来(例如 SignatureDoesNotMatch),方便你定位。
这类失败发生在扣费之前,不产生任何费用,任务也不会建。拿不准就别传 URL,直接用上面 ① 或 ② 的写法。
不支持首尾帧。特价版只吃参考图,first_frame / last_frame 那套写法不生效——传了不报错,但成片不会按首尾帧生成。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 完整模型名,含中文后缀 |
prompt | string | 是 | 提示词,不可为空白 |
seconds | number / string | mini / fast 必填 | 只接受 10 或 15;数字 10 与字符串 "10" 都认。seedance-2-5-补贴版 可省略 |
duration | number / string | 否 | seconds 的等价别名,二选一 |
input_reference | string / string[] | 否 | 参考图,≤ 6 张,合计 ≤ 10 MB。可传 multipart 文件、base64、data:image/png;base64, 前缀写法,或图片 URL(URL 须第三方可直接下载)。不传即纯文生视频 |
images / image | string / string[] | 否 | input_reference 的等价别名,写法与限制完全相同 |
04轮询与取片
提交后每 30–60 秒查一次即可,出片通常在 5–15 分钟。
curl https://www.salpx.com/v1/videos/task_HbomjItwROBzAYE8ugjgl37iqpSbf87A \ -H "Authorization: Bearer $SALPX_KEY"
完成后的返回:
{
"id": "task_HbomjItwROBzAYE8ugjgl37iqpSbf87A",
"status": "completed",
"progress": 100,
"seconds": "10",
"url": "https://video.example.com/20260921/selfd_xxxx.mp4",
"video_url": "https://video.example.com/20260921/selfd_xxxx.mp4",
"result": { "data": [ { "url": "https://..." } ] }
}
取片的两种方式
- 直链下载:
url字段是公网绝对地址,直接GET即可,不需要带任何鉴权头。 - 代理取片:
GET /v1/videos/{task_id}/content,需带Authorization。走 SalpX 中转,返回同一个文件。
curl -L -o out.mp4 \ https://www.salpx.com/v1/videos/task_xxxx/content \ -H "Authorization: Bearer $SALPX_KEY"
两种方式返回的都是 video/mp4,字节数完全一致。下载慢时把客户端超时调到 ≥ 600 秒。
05计费与退款
提交成功即冻结额度,任务失败或超时自动全额退回(账单里是一条退款流水)。
| 模型 | 计费公式 | 账单显示 | 实测扣费 |
|---|---|---|---|
mini-特价版 | ¥0.20 × seconds | 按秒计费:N 秒 | 10s → ¥2.00 |
fast-特价版 | ¥0.20 × seconds | 按秒计费:N 秒 | 10s → ¥2.00 15s → ¥3.00 |
2.5-补贴版 | 面议 | 按次计费 | 面议 |
失败自动退款。上游 5xx、45 分钟超时、或任务进入 failed → SalpX 自动退还该次冻结额度,不产生实际扣费。
fast 15 秒失败不会自动改投其它渠道重跑——直接判失败并退款。规格对不上的改投等于换了个模型还多收一份钱,所以刻意不做。
06错误处理
| HTTP | 典型信息 | 原因 | 处理 |
|---|---|---|---|
| 404 | bad response status code 404 | 用了 /v1/chat/completions |
改用 POST /v1/videos |
| 400 | 时长需在 10~15 秒之间, 收到 5 | mini / fast 的 seconds 越界 | 只传 10 或 15 |
| 400 | 必须传 duration 字段 | mini / fast 没传 seconds | 补上 seconds |
| 400 | reference_image_unreachable | 参考图我方拉不到(预签名 / 私有 / 需鉴权的地址) | 改用 multipart 或 base64 直传;报错里带图床原文 |
| 400 | reference_image_too_large | 参考图合计超过 10 MB | 压缩后再传 |
| 400 | too_many_reference_images | 参考图超过 6 张 | 减到 6 张以内 |
| 403 | token quota is not enough | 令牌余额不足以冻结 | 确认账户额度或联系商务确认本次任务所需额度 |
| 503 | No available channel | 模型名拼错,或令牌分组不对 | 核对模型名;分组须为 default |
| 429 | capacity_exhausted | 渲染队列已满 | 退避几分钟后重试 |
| 409 | 该模型今日产能已排满 | fast 15 秒规格当日产能用尽 | 改用 10 秒,或次日再试;本次不扣费 |
三个 reference_image_* / too_many_reference_images 错误都发生在扣费之前:不冻结额度、不建任务、不产生账单,直接改请求重发即可。
中文模型名请确保以 UTF-8 编码发送。用 shell 变量拼 JSON 时容易被转义破坏,建议把请求体写进文件再用 --data-binary @file.json 提交。
07完整示例
提交 → 轮询 → 下载,一段可直接运行的 Python。
# pip install requests import time, requests BASE = "https://www.salpx.com/v1" KEY = "sk-你的令牌" H = {"Authorization": f"Bearer {KEY}"} # 1. 提交(mini / fast 必须传 seconds=10 或 15) r = requests.post(f"{BASE}/videos", headers=H, json={ "model": "seedance-2-mini-特价版", "prompt": "一只蓝色果冻水母在霓虹海中缓缓游动,电影感运镜", "seconds": 10, }, timeout=60) r.raise_for_status() task_id = r.json()["task_id"] print("已提交:", task_id) # 2. 轮询,最多等 45 分钟 deadline = time.time() + 45 * 60 url = None while time.time() < deadline: time.sleep(45) d = requests.get(f"{BASE}/videos/{task_id}", headers=H, timeout=60).json() st = d.get("status") print(st, d.get("progress"), "%") if st == "completed": url = d.get("url") or d["result"]["data"][0]["url"] break if st in ("failed", "FAILURE"): raise RuntimeError(d.get("fail_reason") or "生成失败,已自动退款") if not url: raise TimeoutError("超过 45 分钟未出片,系统将自动退款") # 3. 下载(直链无需鉴权) mp4 = requests.get(url, timeout=600).content open("out.mp4", "wb").write(mp4) print("已保存 out.mp4", len(mp4), "bytes")