开发者
文生视频 API
一次 POST,把一句话变成一条带原生声音的短片。跑在我们自己的显卡上,不是转手别人的账号:MiniMax H3、20 步、不挂蒸馏加速。按成片秒数计费 —— 每秒 $0.08,再无别的费用。
三步开始
1
领一把 key
登录后到账户页新建 API 密钥,只显示一次,记得当场存好。这把 key 同时能调导演 API。
2
充值
同一个页面预付积分。1 积分 = $0.01,不过期。
3
开始调用
POST 一句提示词,立刻拿到 job_id,轮询到出片。出片以分钟计 —— 请按「任务」来写,别按「请求」来写。
怎么收费
成片每秒 8 积分。没有单次调用费,没有分辨率档位,失败不收费。
| 时长 | 积分 | 约合 | 出片耗时 |
|---|---|---|---|
| 4 秒 | 32 | $0.32 | 约 3 分钟 |
| 8 秒 | 64 | $0.64 | 约 8 分钟 |
| 10 秒 | 80 | $0.80 | 约 10 分钟 |
| 15 秒 | 120 | $1.20 | 约 17 分钟 |
三种模式同价。参考模式多出来的是约 25 秒的固定开销,不是倍数 —— 它占 4 秒片的 10%、15 秒片的 2%,为它加价等于自己编一个数。提交时预扣,成功时预扣即为实扣;失败或取消当分钟全额退回。出片耗时是这张卡上的实测值,是估计不是承诺 —— 真正作数的是返回里的 deliver_by。
三种出片方式
同一个模型、同一个价、同一个端点,靠 mode 选。
| mode | 做什么 | 要给什么 |
|---|---|---|
text | 一句话出片。默认值,不传 mode 就是它。 | prompt |
animate | 让一张照片动起来。给第一帧;再给一张最后一帧,它就在两张之间运动。 | first_frame,可选 last_frame |
cast | 让指定的人 / 物 / 画风出现在片子里。提示词里用 <Picture 1>、<Picture 2> 指代。 | ref_images:1~4 张图 |
当前开放哪些模式,以 GET /v1/models 的返回为准。我们是一个一个放开的;没开的模式会明确返回 mode_unavailable,不会假装能用。
要等多久,说实话
- · 单卡,严格串行。你的任务排在此前提交的所有任务之后。顺序就是提交顺序,没有插队档位可买。
- · 耗时涨得比时长快:15 秒不是四条 4 秒,大约是十条。这是模型本身的性质,不是我们队列的问题。
- · 每个返回都带 deliver_by,里面已经算进了你前面的队列。轮询 15~30 秒一次就够,问得再勤也不会更快。
- · 如果队列已经排到六小时以后,我们直接以 capacity_deadline_infeasible 拒收,而不是先接下来再失约。
提交一个任务
curl -X POST https://spaceskills.shop/v1/videos \
-H "Authorization: Bearer $SPACESKILLS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-clip-0001" \
-d '{
"prompt": "A red paper boat drifting on a calm pond at sunrise, soft golden light, gentle ripples on the water, slow push-in, cinematic",
"duration_sec": 5
}'HTTP/1.1 202 Accepted
{
"job_id": "vid_8Qk2ZrX1c0Nn",
"status": "queued",
"model": "h3/768p",
"duration_sec": 5,
"credits_held": 40,
"balance": 460,
"queue_position": 2,
"est_render_sec": 168,
"deliver_by": "2026-09-09T14:31:07.000Z",
"poll": "/v1/videos/vid_8Qk2ZrX1c0Nn"
}返回 202,带 job_id 和预扣的积分。带上 Idempotency-Key,重试的 POST 会返回同一个任务,不会扣第二次钱。
curl https://spaceskills.shop/v1/videos/vid_8Qk2ZrX1c0Nn \ -H "Authorization: Bearer $SPACESKILLS_API_KEY"
{
"job_id": "vid_8Qk2ZrX1c0Nn",
"status": "succeeded",
"duration_sec": 5,
"seed": 774512900183,
"credits_held": 0,
"credits_charged": 40,
"output": {
"url": "https://media.spaceskills.shop/relay/vid_8Qk2ZrX1c0Nn.mp4",
"stored": true
},
"error": null,
"created_at": "2026-09-09T14:21:44.910Z",
"updated_at": "2026-09-09T14:25:12.338Z"
}status 有五种:queued、running、succeeded、failed、cancelled。succeeded 时 output.url 就是已经混好音的成品 MP4。
图怎么传
和导演 API 同一套写法:每张图要么内联 base64,要么给一个我们去拉的 https 地址。
- · 一个文件是 { "name": "hero.jpg", "data_base64": "…" } 或 { "name": "hero.jpg", "url": "https://…" }。URL 必须是 https,且不能解析到内网地址。
- · 单张 8 MB,单次请求图片合计 16 MB,请求体上限 24 MB。收 JPEG / PNG / WebP —— 认的是字节头,不是文件名也不是你报的类型。
- · 你传的图存在我们自己的服务器上,不进成片所在的那个公开桶;任务一结束(成功或失败)字节立刻删除。任务上会留一份清单(位置、大小、sha256),你随时能核对我们收到的是什么。
- · cast 模式下提示词必须提到这些图。写「一个女人走在雨里」参考图不会生效,写「<Picture 1> 里的女人走在雨里」才会。
# cast: put a specific face, object or look in the shot
curl -X POST https://spaceskills.shop/v1/videos \
-H "Authorization: Bearer $SPACESKILLS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "cast",
"prompt": "The woman from <Picture 1> walks slowly through a rainy neon street at night, reflections on wet asphalt, rain and distant traffic, slow tracking shot",
"duration_sec": 6,
"ref_images": [
{ "name": "her.jpg", "url": "https://example.com/her.jpg" }
]
}'
# animate: start from a photo
curl -X POST https://spaceskills.shop/v1/videos \
-H "Authorization: Bearer $SPACESKILLS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "animate",
"prompt": "The lake ripples as the sun sinks lower, drifting clouds, distant birdsong, slow push-in",
"duration_sec": 5,
"first_frame": { "name": "lake.jpg", "url": "https://example.com/lake.jpg" }
}'端点
| 端点 | 做什么 |
|---|---|
GET /v1/models | 目录:时长区间、每秒单价、当前队列深度。免费,不需要 key。 |
POST /v1/videos | 提交提示词,预扣积分,返回 job_id。 |
GET /v1/videos/{id} | 查状态,出好了就一并给文件。 |
GET /v1/videos | 你最近 30 个任务和当前余额,用来对账。 |
POST /v1/videos/{id}/cancel | 还在排队时可取消,全额退回。已经开跑的显卡时间已经花掉了,不能取消。 |
请求字段
| 字段 | 类型 | 说明 |
|---|---|---|
prompt | 字符串 | 这条片子要拍什么。8 到 20000 字。主体、动作、环境、光线、镜头 —— 按这个顺序写效果好。 |
duration_sec | 整数 | 4 到 15。它是计价基准。不传默认 5。 |
mode | 字符串 | text、animate 或 cast。不传默认 text。 |
first_frame | 文件 | 仅 animate,必填。片子从这一帧开始。 |
last_frame | 文件 | 仅 animate,可选。片子在这一帧结束。 |
ref_images | 文件数组 | 仅 cast,1~4 张。在提示词里按你给的顺序用 <Picture 1> 起往后指代。 |
model | 字符串 | 默认 h3/768p,目前唯一在售的模型。 |
seed | 整数 | 可选。种子、提示词、图都一样就能复现同一条片。不传就随机取一个,并在任务里回给你。 |
请求头:Authorization: Bearer sk_live_…,以及建议带上的 Idempotency-Key: <你自己生成的任意字符串>。同一账号下这个键会被记住,所以网络重试永远不会把同一条片买两次。
返回什么
提交、轮询、列表拿到的是同一个任务对象,只是当时已知的字段才有值。
- · output.url 是 1152×640 的 MP4,原生立体声已经混进去了,不需要再单独取音频。
- · output.stored 为 true 表示文件已在我们自己的存储上,链接稳定。少数情况下为 false,说明是渲染机在直供,那台机器一回收链接就失效 —— 请尽快下载。
- · 成功时 credits_held 变成 credits_charged;失败时归零,并在你的流水里出现一笔对应的退款。
- · 成品长度要落在模型的帧网格上,所以可能比你要的秒数短最多 0.35 秒。计费按你要的秒数算。
怎么写提示词才出得好
模型读的是大白话,中英文都行。写得具体它就给你,堆形容词它就还你一堆平均值。
- · 先说主体,再说它在做什么,再说在哪里,再说光,最后说镜头。一样一句。
- · 一条片只给一个运镜。四秒里塞两个运镜,看起来像失误而不像风格。
- · 把该听到的声音也写出来。原生音频同样是从提示词生成的 —— 写「风声与远处车流」,你就会得到风声与远处车流。
- · 一次全改等于什么都没测出来。固定种子,一次只改一句。
出错的时候
| 错误码 | 意思 |
|---|---|
unauthorized | key 没带或不对。用 Authorization: Bearer sk_live_… |
insufficient_credits | 余额不够。返回里会同时给出所需与现有两个数。 |
bad_params | 没给提示词、提示词过长,或者 duration_sec 不在 4~15 之间。 |
unknown_model | 没有这个在售模型。查 GET /v1/models。 |
mode_unavailable | 这个模式还没开放。返回里会列出当前开着的。 |
bad_material | 有图太大、不是真的 JPEG/PNG/WebP、拉不到,或者不是 https。消息里会说是哪一张。 |
payload_too_large | 请求体超过 24 MB。把图改成 https 链接,别内联 base64。 |
model_unavailable | 当前没有可用的渲染后端,通常是在换机。过几分钟再试,这次没有扣费。 |
capacity_deadline_infeasible | 队列已排到六小时以后。稍后再来,这次没有扣费。 |
idempotency_conflict | 这个 Idempotency-Key 已经被另一个请求占用了。 |
not_cancellable | 任务已经在跑或已经结束了。 |
rate_limited | 请求太密。Retry-After 会告诉你该等多久。 |
限额
- · 每 IP 每 10 分钟 30 次提交;同一窗口内目录接口 120 次。轮询任务不限频。
- · 全服务同一时刻只跑一条 —— 这是单卡诚实的上限,也正是 deliver_by 存在的理由。
- · 每个账号最多 5 把 API key,吊销立即生效。
- · 成片留在我们的存储上;真要拿去用的,请自己也存一份。
在找导演 API —— 给说明和素材,出逐场逐镜的方案? 文档在这里
有问题,或者哪里不对劲? 告诉我们