开发者
文生视频 API
一次 POST,把一句话变成一条带原生声音的短片。按成片秒数计费 —— 固定每秒 40 积分,再无别的费用。
三步开始
1
领一把 key
登录后到账户页新建 API 密钥,只显示一次,记得当场存好。这把 key 同时能调导演 API。
2
充值
同一个页面预付积分。1 美元 = 1,000 积分,12 个月内有效。
3
开始调用
POST 一句提示词,立刻拿到 job_id,轮询到出片。出片以分钟计 —— 请按「任务」来写,别按「请求」来写。
怎么收费
成片固定每秒 40 积分,不分时段。没有单次调用费,没有分辨率档位,失败不收费。定价页上的白天 / 夜间价只适用于网页端,API 不适用,也不使用免费秒数。
| 时长 | 积分 | 出片耗时 |
|---|---|---|
| 4 秒 | 160 | 约 3 分钟 |
| 8 秒 | 320 | 约 8 分钟 |
| 10 秒 | 400 | 约 10 分钟 |
| 15 秒 | 600 | 约 17 分钟 |
三种模式同价,画幅也不影响价格。提交时预扣,成功时预扣即为实扣;失败或取消当分钟全额退回。出片耗时是估计不是承诺 —— 真正作数的是返回里的 deliver_by。
三种出片方式
同一个模型、同一个价、同一个端点,靠 mode 选。
| mode | 做什么 | 要给什么 |
|---|---|---|
text | 一句话出片。默认值,不传 mode 就是它。 | prompt |
animate | 让一张照片动起来。给第一帧;再给一张最后一帧,它就在两张之间运动。 | first_frame,可选 last_frame |
cast | 让指定的人 / 物 / 画风 / 声音出现在片子里。提示词里用 <Picture 1>、<Audio 1> 指代。 | ref_images 和 / 或 ref_audios |
当前开放哪些模式,以 GET /v1/models 的返回为准。我们是一个一个放开的;没开的模式会明确返回 mode_unavailable,不会假装能用。
对口型
给 cast 模式一段参考音频,片子里的人就会把它说出来,口型跟着这段录音走。
- · 录音放在 ref_audios 里,提示词中用 <Audio 1> 指代。收 MP3 / WAV / M4A,最多三段。
- · 再配一张这个人的参考图放进 ref_images,就是这张脸说这句话。
- · 长度要对上。片子严格是 duration_sec 那么长,所以 12 秒的录音塞进 8 秒的片子会被截断 —— 看起来就是「口型对不上」,其实什么都没出错。长度不一致时我们在提交时就会提醒你,提醒放在任务的 warnings 里。
- · 提示词要写成一个「有人在说话」的镜头:谁在说、对谁说、怎么取景。提示词里没有人,就没有嘴可以动。
竖屏、横屏与方屏
传 ratio。所有画幅同价、同耗时,所以按片子发到哪儿选,不用为省钱迁就。
| ratio | 用在哪 |
|---|---|
16:9 | 横屏。默认值,不传就是它。 |
9:16 | 竖屏,给手机 —— 抖音、Reels、Shorts。 |
1:1 | 方屏,给信息流。 |
要等多久,说实话
- · 按队列顺序出片。高档位会员排在低档位之前 —— 但绝不以牺牲已经给出去的交付时间为代价:插队只在「已在队里的每一条仍能在它拿到的 deliver_by 之前完成」时才会发生。
- · 耗时涨得比时长快: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": 200,
"balance": 9800,
"queue_position": 1,
"est_render_sec": 259,
"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": 200,
"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,音频收 MP3 / WAV / M4A —— 认的是字节头,不是文件名也不是你报的类型。
- · 你传的图存在我们自己的服务器上,不进成片所在的那个公开桶;任务一结束(成功或失败)字节立刻删除。任务上会留一份清单(位置、大小、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,最多 4 张。在提示词里按你给的顺序用 <Picture 1> 起往后指代。 |
ref_audios | 文件数组 | 仅 cast,最多 3 段。片中人物要说的声音 —— 对口型靠的就是它。用 <Audio 1> 指代。 |
ratio | 字符串 | 16:9(默认)、9:16、1:1。同价,同耗时。以 GET /v1/models 的返回为准,这个列表会变。 |
model | 字符串 | 默认 h3/768p,目前唯一在售的模型。 |
seed | 整数 | 可选。种子、提示词、图都一样就能复现同一条片。不传就随机取一个,并在任务里回给你。 |
请求头:Authorization: Bearer sk_live_…,以及建议带上的 Idempotency-Key: <你自己生成的任意字符串>。同一账号下这个键会被记住,所以网络重试永远不会把同一条片买两次。
返回什么
提交、轮询、列表拿到的是同一个任务对象,只是当时已知的字段才有值。
- · output.url 是一个 MP4,画幅就是你点的那个,立体声已经混进去了,不需要再单独取音频。
- · output.stored 为 true 表示文件已在我们自己的存储上,链接稳定。少数情况下为 false,说明是渲染机在直供,那台机器一回收链接就失效 —— 请尽快下载。
- · 成功时 credits_held 变成 credits_charged;失败时归零,并在你的流水里出现一笔对应的退款。
- · 成品长度可能比你要的短三分之一秒左右。计费按你要的秒数算。
怎么写提示词才出得好
模型读的是大白话,中英文都行。写得具体它就给你,堆形容词它就还你一堆平均值。
- · 先说主体,再说它在做什么,再说在哪里,再说光,最后说镜头。一样一句。
- · 一条片只给一个运镜。四秒里塞两个运镜,看起来像失误而不像风格。
- · 把该听到的声音也写出来。原生音频同样是从提示词生成的 —— 写「风声与远处车流」,你就会得到风声与远处车流。
- · 一次全改等于什么都没测出来。固定种子,一次只改一句。
出错的时候
| 错误码 | 意思 |
|---|---|
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,吊销立即生效。
- · 成片留在我们的存储上;真要拿去用的,请自己也存一份。
想让导演替你出方案、把整部片出好? 看导演 Agent
有问题,或者哪里不对劲? 告诉我们