Long Video
API 对接文档 · v1

Long Video 生成 API

一句话 prompt 生成最长 180 秒的成片。本接口为异步任务模型:创建任务后,通过轮询或 Webhook 获取进度与成片地址。下文覆盖全部对外接口、认证方式、回调与计费。

概览 Overview

  • Base URL:所有接口以 /v1 为前缀,生产环境 base 为你的部署域名(例 https://your-domain.com/v1/videos)。
  • Content-Type:请求与响应均为 application/json
  • 流程POST /v1/videos 创建任务 → 轮询 GET /v1/videos/{id} 或等待 Webhook → result_url 即成片。

认证 Authentication

所有 /v1 接口都需要 Bearer API 密钥。

在请求头携带 Authorization: Bearer sk-...。密钥以哈希存储,缺失、格式错误或未知/停用密钥统一返回 401 invalid_api_key

Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

幂等 Idempotency

创建任务时可携带 Idempotency-Key 请求头(建议用 UUID)。同一密钥 + 相同 key 的重复请求不会重复创建,而是直接返回已存在任务的 202。强烈建议在创建时带上,以避免网络重试导致重复扣费。

创建任务 Create

POST/v1/videos

创建一个视频生成任务,立即返回 task_id(异步执行)。

请求体

字段类型必填 / 默认说明
promptstring必填视频内容描述,1–2500 字符
durationinteger必填成片总时长(秒),范围 3–180
aspect_ratioenum默认 16:916:9 / 9:16 / 1:1 / 4:3 / 3:4
resolutionenum默认 720p720p / 1080p(须为所选 provider 支持的清晰度)
continuity_modeenum默认 consistentconsistent:参考图锁定角色、分段并行;seamless:尾帧衔接、连续运镜
stylestring可选风格描述,≤500 字符
voiceoverboolean默认 true是否生成旁白
musicboolean默认 true是否生成背景音乐
subtitleboolean默认 true是否烧录字幕
seedinteger默认 42随机种子,0–2147483647
webhook_urlstring (URL)可选完成/失败/取消后回调的地址,须公网可达
metadataobject可选透传的自定义键值,查询与回调时原样返回
providerstring可选指定视频 provider,缺省用服务端配置

请求示例

curl -X POST $BASE/v1/videos \
  -H "Authorization: Bearer sk-..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "一个女孩在雨夜寻找走失的猫,最后在便利店找到",
    "duration": 60,
    "aspect_ratio": "9:16",
    "resolution": "720p",
    "continuity_mode": "consistent",
    "voiceover": true, "music": true, "subtitle": true,
    "webhook_url": "https://you/cb"
  }'

响应 202 Accepted

{ "task_id": "vid_abc", "status": "queued", "cost_estimate": 1650 }

错误:400 invalid_request(校验失败或 provider 不支持该清晰度)、402 insufficient_credits(余额不足)。

任务列表 List

GET/v1/videos

返回该密钥最近的 20 条任务,按创建时间倒序。

响应 200

{
  "data": [
    {
      "task_id": "vid_abc",
      "status": "generating",
      "progress": 0,
      "result_url": null,
      "created_at": "2026-06-16T08:30:00.000Z"
    }
  ]
}

查询任务 Get

GET/v1/videos/{id}

查询单个任务的状态、进度与成片地址。轮询此接口跟踪进度。

响应字段

字段类型说明
task_idstring任务 ID
statusenum任务状态,见下方「状态机」
progressnumber0–1 浮点;完成时置 1,过程中不递增。细粒度进度请用 shots_done / shots_total
shots_totalinteger分段总数
shots_doneinteger已完成分段数
continuity_modeenumconsistent / seamless
providerstring实际使用的 provider
preview_urlsstring[]已完成分段的视频地址,可用于进度预览
result_urlstring | null成片地址,未完成时为 null
cost_estimatenumber | null预估消耗 credits
cost_actualnumber当前实际已消耗 credits
errorobject | null失败时为 { code, message, stage? },否则 null

响应示例

{
  "task_id": "vid_abc",
  "status": "generating",
  "progress": 0,
  "shots_total": 10,
  "shots_done": 4,
  "continuity_mode": "consistent",
  "provider": "happyhorse",
  "preview_urls": ["https://.../seg-0.mp4", "https://.../seg-1.mp4"],
  "result_url": null,
  "cost_estimate": 1650,
  "cost_actual": 660,
  "error": null
}

错误:404 task_not_found(任务不存在或不属于该密钥)。

取消任务 Cancel

DELETE/v1/videos/{id}

尽力而为地取消任务;在途分段会在回调到达时被丢弃。

进行中的任务被标记为 canceled 并退款(退款额 = 预估 − 已完成分段成本)。若任务已是终态(completed / failed / canceled),原样返回当前状态、不退款。

响应 200(取消成功)

{ "task_id": "vid_abc", "status": "canceled", "refunded": 990 }

响应 200(已是终态)

{ "task_id": "vid_abc", "status": "completed" }

重新合成 Compose

POST/v1/videos/{id}/compose

恢复用途:分段都已生成,但合成步骤失败或未到达时,手动把分段拼成成片。

幂等:若任务已完成则直接返回现有 result_urlrecomposed: false。注意手动合成不含音轨(仅当 voiceover/music 均为 false 时无损),字幕保留。

响应 200

{
  "task_id": "vid_abc",
  "status": "completed",
  "result_url": "https://.../final.mp4",
  "cost_actual": 1650,
  "recomposed": true
}

错误 409

code说明
not_composable任务当前状态不允许合成
no_segments任务没有可合成的分段
segments_not_ready部分分段尚未就绪,响应 error.details.missing[] 含 { shot_index, status, reason }

余额 Credits

GET/v1/credits

查询该密钥当前的 credits 余额。

响应 200

{ "credits": 998350 }

任务状态机 Status

GET /v1/videos/{id} 返回的 status 取值。

status说明
queued已入队,等待开始
scripting生成分镜脚本(Claude)
moderation内容安全审核
anchoring角色锚定(生成参考图)
generating分段视频生成中
audio生成旁白 / 配乐
composing合成成片
delivering上传交付
completed成功,result_url 就绪 —— 终态
failed失败,error 就绪 —— 终态
canceled已取消 —— 终态

严格失败:任一分段失败会使整个任务转为 failed,未使用的 credits 自动退回。

Webhook 回调

任务进入终态(completed / failed / canceled)且设置了 webhook_url 时,服务端 POST 一个 JSON。

回调请求体

{
  "task_id": "vid_abc",
  "status": "completed",
  "result_url": "https://.../final.mp4",
  "duration": 60,
  "cost_actual": 1650,
  "error": null,
  "metadata": { "user_ref": "..." }
}

重试:尽力而为,间隔 0 / 1s / 5s,三次仍失败即放弃。请同时用轮询 GET /v1/videos/{id} 兜底。

错误码 Errors

所有错误响应体统一为 { error: { code, message } }。

codeHTTP说明
invalid_api_key401缺失或无效的 Bearer 密钥
invalid_request400请求体校验失败 / provider 不支持该清晰度
insufficient_credits402余额不足
task_not_found404任务不存在或不属于该密钥
not_composable409当前状态不可重新合成
no_segments409任务无可合成分段
segments_not_ready409部分分段尚未就绪(含 details.missing)
internal_error500服务端内部错误
{ "error": { "code": "invalid_request", "message": "duration: Number must be ..." } }

计费与限制 Billing

  • 计费单位为 credits。HappyHorse 费率:720p 27.5 / 秒,1080p 47.2 / 秒。
  • cost_estimate:把 duration 按 ≤8s 分段,每段按 provider 费率计价后累加。例:60s × 720p ≈ 1650 credits。
  • 创建任务即预扣 cost_estimate;任务失败自动退回未使用部分;取消按已完成分段结算后退回余额。
  • 限制:duration 3–180 秒;单段 ≤8 秒。

快速开始 Quickstart

1 · 创建任务并轮询(bash)

BASE="https://your-domain.com"
KEY="sk-..."

TASK=$(curl -s -X POST $BASE/v1/videos \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{ "prompt": "城市清晨的延时风光", "duration": 30 }' | jq -r .task_id)

# 轮询直到 completed / failed
while true; do
  curl -s $BASE/v1/videos/$TASK -H "Authorization: Bearer $KEY" | jq '{status, progress, shots_done, shots_total, result_url}'
  sleep 5
done

2 · Node.js(fetch)

const BASE = 'https://your-domain.com';
const KEY = process.env.LONGVIDEO_KEY;

const res = await fetch(`${BASE}/v1/videos`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(),
  },
  body: JSON.stringify({ prompt: '城市清晨的延时风光', duration: 30 }),
});
const { task_id } = await res.json();

// 之后轮询 GET /v1/videos/${task_id},或在 webhook_url 接收完成回调