Seedance 2.5
Seedance 2.5 は ByteDance の動画生成モデルで、2026-07-31 に公開されました。Lazu ではモデル ID seedance-2.5 を指定して動画 API を呼び出します。キーは他のエンドポイントと共通です。
| 機能 | Seedance 2.5 |
|---|---|
| モデル ID | seedance-2.5 |
| 入力 | テキスト、先頭フレーム、末尾フレーム、参照画像、参照動画、参照音声 |
| 動画の長さ | 4〜30 秒 |
| 解像度 | 480p、720p、1080p |
| アスペクト比 | 16:9、9:16、1:1、4:3、3:4、21:9、adaptive |
| 音声 | 既定で動画と一緒に生成。追加料金なし |
| 参照素材 | 1 リクエストあたり最大 30 個 |
| 料金 | 480p で 1 秒あたり $0.103 から。成功した動画にのみ課金 |
| コード不要 | Lazu Studio |
クイックスタート
動画生成はジョブです。送信し、終わるのを待ってから、ファイルをダウンロードします。すべて同じキーで呼び出します。
ジョブを送信します。Lazu は HTTP 202 とジョブオブジェクトを返します。cost_snapshot は残高から予約された金額です。
curl https://api.lazu.ai/v1/videos \
-H "Authorization: Bearer $LAZU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "雨上がりの通りを紙の舟が流れていく、クローズアップ、柔らかな朝の光",
"seconds": 5,
"resolution": "480p"
}'ジョブの id で結果を待ちます。?wait=60 を付けると、ジョブの状態が変わった時(待機中から生成中へ)や完了した時点ですぐに応答し、それ以外は最長 60 秒で応答します。毎回の応答には progress(0–100)と eta_seconds が含まれ、このモデルの最近のジョブの所要時間から推定します。status が succeeded か failed になるまで同じ呼び出しを繰り返してください。4–5 秒の 480p 動画は通常 2 分半ほどかかります。送信した時点から、ジョブはコンソールの利用ログと「タスク」タブに「実行中」として表示されます。
curl "https://api.lazu.ai/v1/videos/mjob_...?wait=60" \
-H "Authorization: Bearer $LAZU_API_KEY"進捗をリアルタイムで見たい場合は、ジョブのイベントストリームを開きます。接続直後に現在の状態を送り、その後は数秒ごとに進捗を、完了時には結果とダウンロードリンクを含む done イベントを送ってから切断します。
curl -N https://api.lazu.ai/v1/videos/mjob_.../events \
-H "Authorization: Bearer $LAZU_API_KEY"status が succeeded になると、artifact.url は MP4 へのリンクになり、1 時間はキーなしで開けます。<video> タグに入れる、共有する、ダウンロードするなどに使えます。期限が切れたらジョブを再取得すると新しいリンクが返ります。artifact.expires_at はファイルの削除時刻で、生成から 3 日後です。キーを付けてダウンロードする場合:
curl --fail https://api.lazu.ai/v1/videos/mjob_.../content \
-H "Authorization: Bearer $LAZU_API_KEY" \
-o seedance.mp4--fail を付けると、エラー時にエラーメッセージを seedance.mp4 として保存せず、curl が終了します。
次のスクリプトは、ジョブを送信し、終わるまで待ち、動画を保存して請求額を表示します。Python 3 と requests(python -m pip install requests)が必要です。送信済みのジョブを再開するには ID を渡します:python seedance.py mjob_...。
import os
import sys
import time
import requests
BASE = "https://api.lazu.ai"
headers = {"Authorization": "Bearer " + os.environ["LAZU_API_KEY"]}
if len(sys.argv) > 1:
# Resume a job that was already submitted. Do not submit it again.
job = {"id": sys.argv[1], "status": "pending"}
else:
response = requests.post(BASE + "/v1/videos", headers=headers, json={
"model": "seedance-2.5",
"prompt": "雨上がりの通りを紙の舟が流れていく、クローズアップ、柔らかな朝の光",
"seconds": 5,
"resolution": "480p",
"aspect_ratio": "16:9",
}, timeout=60)
response.raise_for_status()
job = response.json()
print("Job:", job["id"], "held:", job["cost_snapshot"]["customer_charge_usd"], "USD", flush=True)
job_id = job["id"]
while job["status"] in ("pending", "running"):
# wait=60 answers as soon as the job finishes, or after 60 s.
response = requests.get(BASE + "/v1/videos/" + job_id, params={"wait": 60},
headers=headers, timeout=90)
if response.status_code in (429, 503):
retry_after = response.headers.get("Retry-After", "15")
time.sleep(float(retry_after) if retry_after.isdecimal() else 15)
continue
response.raise_for_status()
job = response.json()
print("Status:", job["status"], flush=True)
if job["status"] == "failed":
error = job.get("error", {})
sys.exit(f"Job failed: {error.get('code')}: {error.get('message')} (the hold was refunded)")
# artifact.url needs no key and works for an hour.
with requests.get(job["artifact"]["url"], stream=True, timeout=300) as download:
download.raise_for_status()
with open(job_id + ".mp4", "wb") as out:
for chunk in download.iter_content(chunk_size=1024 * 1024):
out.write(chunk)
print("Saved", job_id + ".mp4")
print("Charged:", job["cost_snapshot"]["customer_charge_usd"], "USD")クライアント側のタイムアウトでジョブはキャンセルされません。スクリプトが途中で止まったら、同じ ID で取得を続けてください。再送信すると、もう 1 本分の動画が生成され課金されます。
パラメーター
POST /v1/videos に JSON で送信します。必須は model と prompt だけです。
| 項目 | 型 | 既定値 | 値 |
|---|---|---|---|
model | string | seedance-2.5 | |
prompt | string | 生成する内容。参照素材は @图片1、@视频1、@音频1 で指します(後述)。 | |
seconds | integer | 5 | 4〜30 |
resolution | string | 720p | 480p、720p、1080p |
aspect_ratio | string | 16:9 | 16:9、9:16、1:1、4:3、3:4、21:9、adaptive |
generate_audio | boolean | true | 既定で音声を生成します。無音にするには false。 |
seed | integer | 乱数シードを固定します。 | |
frame_images | array | 要素は {"url", "frame_type"}。frame_type は first_frame か last_frame。 | |
input_references | array | 要素は {"url", "type"}。type は image、video、audio のいずれか。 | |
watermark | boolean | そのままプロバイダーに渡します。 | |
return_last_frame | boolean | そのままプロバイダーに渡します。 |
これ以外の値は、課金前に HTTP 400 で拒否されます。エラーにはその項目で使える値が示されます。
プロンプトでは、参照素材を種類と順番で指します。順番は 1 から始まり、リクエスト内でその種類の素材が現れる順に数えます。1 枚目の画像は @图片1、2 枚目は @图片2、1 本目の動画は @视频1、1 本目の音声は @音频1 です。プロンプトの言語にかかわらず、この表記(中国語の簡体字)のまま使ってください。
frame_images と input_references の URL は公開アクセスできる必要があります。プロバイダーが直接ダウンロードします。
例
いずれも POST /v1/videos のリクエストボディです。
テキストから動画
{
"model": "seedance-2.5",
"prompt": "夕暮れの新雪の上を赤いキツネが歩く、ゆっくりした追従ショット",
"seconds": 8,
"resolution": "720p",
"aspect_ratio": "16:9"
}先頭フレームと末尾フレーム
動画は先頭フレームで始まり、末尾フレームで終わります。出力は入力画像の形に合わせるため、aspect_ratio: "adaptive" を指定します。
{
"model": "seedance-2.5",
"prompt": "朝の光の中でつぼみがゆっくり開く",
"seconds": 5,
"resolution": "720p",
"aspect_ratio": "adaptive",
"frame_images": [
{ "url": "https://example.com/bud.png", "frame_type": "first_frame" },
{ "url": "https://example.com/bloom.png", "frame_type": "last_frame" }
]
}参照画像
{
"model": "seedance-2.5",
"prompt": "@图片1 の猫が日の当たる窓辺に跳び乗り、外を眺める",
"seconds": 5,
"resolution": "720p",
"aspect_ratio": "9:16",
"input_references": [
{ "url": "https://example.com/cat.jpg", "type": "image" }
]
}参照動画と参照音声
動画のカメラワークと楽曲のリズムを取り入れます。参照動画を使うときは aspect_ratio: "adaptive" を指定します。
{
"model": "seedance-2.5",
"prompt": "@视频1 のカメラワークで、@图片1 のダンサーが踊り、@音频1 のビートに合わせてカットを切り替える",
"seconds": 10,
"resolution": "720p",
"aspect_ratio": "adaptive",
"input_references": [
{ "url": "https://example.com/camera-move.mp4", "type": "video" },
{ "url": "https://example.com/dancer.png", "type": "image" },
{ "url": "https://example.com/track.mp3", "type": "audio" }
]
}無音の動画
Seedance は既定で音声を生成します。無音にするには generate_audio: false を送ります。料金は変わりません。
{
"model": "seedance-2.5",
"prompt": "山の稜線を流れる雲のタイムラプス",
"seconds": 6,
"resolution": "1080p",
"aspect_ratio": "21:9",
"generate_audio": false
}料金
Lazu は ByteDance の BytePlus 公式定価で課金します。単位は 1 秒あたりの米ドルです。
| 解像度 | 参照動画なし(出力秒数) | 参照動画あり(参照秒数 + 出力秒数) |
|---|---|---|
480p | $0.103 | 約 $0.0615 |
720p | $0.231 | 約 $0.138 |
1080p | $0.569 | 約 $0.340 |
参照動画なしの料金は 16:9 出力の場合です。参照動画があると、プロバイダーは参照動画の秒数と出力秒数の合計を、より低い入力単価で課金します。音声の追加料金はありません。成功した動画にのみ課金します。
予約と精算。 送信時、Lazu は seconds × 1 秒あたりの単価 を残高から予約します。この額が 202 レスポンスの cost_snapshot です。残高が予約額に満たない場合、リクエストは拒否されます。ジョブが終わると、プロバイダーが報告した使用量を公式単価で請求し、残りの予約額をすぐに解放します。
参照動画。 参照動画の実際の長さはプロバイダーにしかわからないため、参照動画を含むリクエストは、参照動画を上限の 30 秒として出力単価で予約します。精算では実際の参照秒数と出力秒数で請求し、差額を解放します。
返金。 失敗したジョブは全額返金されます。
実際の実行例:
| リクエスト | 予約額 | 請求額 | 解放額 |
|---|---|---|---|
| 480p、4 秒、無音 | $0.412(4 秒 × $0.103) | 約 $0.41 | $0.01 未満 |
| 480p、出力 4 秒、参照動画 4 秒 | $3.502((4 + 30) 秒 × $0.103) | 約 $0.49 | 約 $3.01 |
制限とよくあるエラー
プロバイダーによる参照素材の制限:
| 素材 | 制限 |
|---|---|
| 参照素材全体 | 1 リクエストあたり最大 30 個。URL は公開アクセスできること。 |
| 参照動画 | 最大 10 本、各 2〜30 秒、合計 30 秒まで。mp4 または mov、1 本 200 MB まで、24〜60 fps、1 フレーム 409,600〜8,295,044 ピクセル。 |
| 参照画像 | jpeg、png、webp、bmp、tiff、gif、heic。各辺 300〜6000 ピクセル、縦横比(幅 / 高さ)0.4〜2.5、30 MB 未満。 |
| 参照音声 | wav または mp3。最大 10 本、各 2〜30 秒、合計 30 秒まで、1 本 15 MB まで。 |
参照動画や先頭・末尾フレームを使うときは adaptive を指定します。 プロバイダーがタスクを参照動画の編集・延長、または先頭・末尾フレームからの生成と判断した場合、出力は入力に合わせるため、aspect_ratio は adaptive でなければなりません。それ以外の比率ではジョブが失敗します(全額返金)。参照動画や先頭・末尾フレームがあり aspect_ratio がないリクエストでは、Lazu が adaptive を送ります。
モデルが受け付けない値は、課金前に HTTP 400 で拒否されます。param と details.field が該当項目、details.allowed が使える値です。LZ-1001 を参照してください。
{
"error": {
"message": "Invalid request: resolution \"4k\" is not supported by this model; allowed: 480p, 720p, 1080p.",
"type": "invalid_request_error",
"param": "resolution",
"code": "invalid_request",
"lazu": "LZ-1001",
"docs": "https://lazu.ai/docs/errors#lz-1001",
"request_id": "req_lazu_...",
"details": {
"field": "resolution",
"reason": "resolution \"4k\" is not supported by this model; allowed: 480p, 720p, 1080p",
"allowed": "480p, 720p, 1080p"
}
}
}プロバイダーが完了できなかったジョブは status: "failed" で終わります。error.code と error.message に理由が入り、予約額は全額返金されます。再送信の前に、アスペクト比や上記の制限を超える参照素材など、リクエストを直してください。
{
"id": "mjob_...",
"object": "video",
"kind": "video",
"source": "media_job",
"model": "seedance-2.5",
"status": "failed",
"created_at": 1792466151,
"completed_at": 1792466190,
"error": {
"code": "task_failed",
"message": "..."
}
}残高が予約額に満たない場合は HTTP 429 と insufficient_quota が返ります。エラーコードを参照してください。
レスポンスオブジェクト
POST /v1/videos は HTTP 202 を返します。cost_snapshot は予約額です。
{
"id": "mjob_...",
"object": "video",
"kind": "video",
"source": "media_job",
"model": "seedance-2.5",
"status": "pending",
"created_at": 1792466151,
"cost_snapshot": {
"customer_charge_microusd": 412000,
"customer_charge_usd": 0.412,
"line_items": [...],
"pricing_version": ...
}
}成功したジョブの GET /v1/videos/{id}。cost_snapshot は最終的な請求額、usage はプロバイダーが報告した使用量です。
{
"id": "mjob_...",
"object": "video",
"kind": "video",
"source": "media_job",
"model": "seedance-2.5",
"status": "succeeded",
"created_at": 1792466151,
"completed_at": 1792466297,
"progress": 100,
"artifact": {
"file_id": "file-lazu-...",
"url": "https://...?X-Amz-Signature=...",
"url_expires_at": 1792469897,
"mime_type": "video/mp4",
"bytes": 441133,
"expires_at": 1792725497
},
"cost_snapshot": {
"customer_charge_microusd": 411500,
"customer_charge_usd": 0.4115,
"line_items": [
{
"dimension": "video_provider_cost",
"quantity": 1,
"unit_microusd": 411500,
"amount_microusd": 411500
}
],
"pricing_version": ...
},
"usage": { "seconds": 4, "resolution": "480p", "ratio": "16:9", "fps": 24 }
}完成した動画は Lazu がダウンロードして保存するため、プロバイダーの短期リンクが届くことはありません。API で生成した動画の保存期間は 3 日で、その後削除されます。長く使う場合はファイルを保存してください。