文生视频
不需要源素材时从文字提示词开始。选择 seedance-2.0 或 seedance-2.5,并检查该模型支持的输出设置。
面向具体任务
不需要源素材时从文字提示词开始。选择 seedance-2.0 或 seedance-2.5,并检查该模型支持的输出设置。
用动作提示词让起始图片动起来。遵循所选模型的图生视频指南,不混用其他输入模式的字段。
提供首帧,并在需要时加入尾帧,约束镜头的起止画面。检查模型指南中的帧角色与媒体要求。
按文档定义的图片、视频和音频角色组合参考素材。至少需要一份图片或视频参考,仅有音频参考并不足够。
计费单位
按每百万 completion tokens 的美元费率结算。适用费率取决于模型、输出分辨率及视频参考等条件。
运行限制
接入指南
当前目录覆盖范围
比较 API ID、操作、提供商和价格。估算用量成本前,请检查目录日期和各操作的计费单位。
通过文字或媒体参考使用 Seedance 2.0 生成最长 15 秒的视频,比较 completion token 费率,并通过异步 Jobs 获取结果。
480p · 包含视频参考
官方价格
API Hop 当前价格 降低 5%
480p · 无视频参考
官方价格
API Hop 当前价格 降低 5%
720p · 包含视频参考
官方价格
API Hop 当前价格 降低 5%
720p · 无视频参考
官方价格
API Hop 当前价格 降低 5%
1080p · 包含视频参考
官方价格
API Hop 当前价格 降低 5%
1080p · 无视频参考
官方价格
API Hop 当前价格 降低 5%
4k · 包含视频参考
官方价格
API Hop 当前价格 降低 5%
4k · 无视频参考
官方价格
API Hop 当前价格 降低 5%
参考价格,尚未独立核验。比较成本前,请核对供应商当前价格、计费单位及适用条件。
查看 Seedance 2.5 视频生成 API 的 completion token 费率、媒体参考输入和异步任务示例;时长与分辨率影响用量,不按秒结算。
480p · 包含视频参考
官方价格
API Hop 当前价格 降低 2%
480p · 无视频参考
官方价格
API Hop 当前价格 降低 2%
720p · 包含视频参考
官方价格
API Hop 当前价格 降低 2%
720p · 无视频参考
官方价格
API Hop 当前价格 降低 2%
1080p · 包含视频参考
官方价格
API Hop 当前价格 降低 2%
1080p · 无视频参考
官方价格
API Hop 当前价格 降低 2%
参考价格,尚未独立核验。比较成本前,请核对供应商当前价格、计费单位及适用条件。
请求示例
以下视频生成请求示例提交一次 Seedance 2.5 文生视频任务,保存 jobId,并在限定时间内轮询 GET /v1/jobs/{jobId}。仅在 COMPLETED 后读取 outputResult,分别处理 FAILED 和 CANCELLED。这些是接入示例,不是生成视频效果演示。
# Requires bash, curl and jq. A polling timeout does not cancel the job.
set -euo pipefail
BASE_URL="https://api.apihop.ai"
API_KEY='YOUR_API_KEY'
created=$(curl --fail-with-body --silent --show-error --max-time 30 \
"$BASE_URL/v1/video/seedance" \
-H "Authorization: Bearer $API_KEY" -H 'Content-Type: application/json' \
--data '{"model":"seedance-2.5","prompt":"A calm city street at dawn","duration":5,"resolution":"720p"}')
job_id=$(printf '%s' "$created" | jq -er '.data.jobId | select(. != null) | tostring')
deadline=$((SECONDS + 600))
while (( SECONDS < deadline )); do
job=$(curl --fail-with-body --silent --show-error --max-time 30 \
"$BASE_URL/v1/jobs/$job_id" -H "Authorization: Bearer $API_KEY")
status=$(printf '%s' "$job" | jq -er '.data.status')
case "$status" in
COMPLETED) printf '%s' "$job" | jq -e '.data.outputResult'; exit 0 ;;
FAILED|CANCELLED) printf 'Job %s: %s\n' "$job_id" "$status" >&2; exit 1 ;;
esac
sleep 5
done
printf 'Polling timed out; retain jobId for a later status check: %s\n' "$job_id" >&2
exit 1const baseUrl = "https://api.apihop.ai";
const headers = { Authorization: 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' };
async function request(path, options = {}) {
const response = await fetch(baseUrl + path, { ...options, headers, signal: AbortSignal.timeout(30000) });
if (!response.ok) throw new Error('HTTP ' + response.status);
const result = await response.json();
if (result.success === false) throw new Error(JSON.stringify(result.error));
return result.data;
}
const created = await request('/v1/video/seedance', { method: 'POST', body: JSON.stringify({"model":"seedance-2.5","prompt":"A calm city street at dawn","duration":5,"resolution":"720p"}) });
if (!created?.jobId) throw new Error('Missing data.jobId');
const deadline = Date.now() + 10 * 60 * 1000;
let completed = false;
while (Date.now() < deadline) {
const job = await request('/v1/jobs/' + encodeURIComponent(created.jobId));
if (job.status === 'COMPLETED') {
if (job.outputResult == null) throw new Error('Completed job has no outputResult');
console.log(job.outputResult);
completed = true;
break;
}
if (['FAILED', 'CANCELLED'].includes(job.status)) throw new Error('Job ' + job.status);
await new Promise(resolve => setTimeout(resolve, 5000));
}
if (!completed) throw new Error('Polling timed out; retain jobId for a later status check: ' + created.jobId);import json
import time
import urllib.request
base_url = "https://api.apihop.ai"
headers = {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'}
def request(path, body=None):
data = json.dumps(body).encode() if body is not None else None
req = urllib.request.Request(base_url + path, data=data, headers=headers)
with urllib.request.urlopen(req, timeout=30) as response:
result = json.load(response)
if result.get('success') is False:
raise RuntimeError(result.get('error'))
return result['data']
created = request('/v1/video/seedance', json.loads("{\"model\":\"seedance-2.5\",\"prompt\":\"A calm city street at dawn\",\"duration\":5,\"resolution\":\"720p\"}"))
job_id = str(created['jobId'])
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
job = request('/v1/jobs/' + job_id)
if job['status'] == 'COMPLETED':
if job.get('outputResult') is None:
raise RuntimeError('Completed job has no outputResult')
print(job['outputResult'])
break
if job['status'] in ('FAILED', 'CANCELLED'):
raise RuntimeError('Job ' + job['status'])
time.sleep(5)
else:
raise TimeoutError('Polling timed out; retain jobId for a later status check: ' + job_id) 使用账户文档中的 API 基础 URL 并替换示例占位符。通过 Authorization 请求头发送 API 密钥,切勿将其放在 URL 或提交到版本库的文件中。