動画生成
POST /v1/videos · GET /v1/videos/{id} · DELETE /v1/videos/{id}
テキストプロンプトから短い動画を生成します。参照フレーム(先頭/末尾)で画面を制御することもできます。業界標準の create + poll 形式による非同期ジョブ API です:POST /v1/videos が約 2 秒でタスクを返し、完了までポーリングします。Prefer: wait ヘッダーを付ければ、速い生成は 1 回の同期呼び出しで完結します。Seedance 系モデル、1 つの API キー、課金は他のエンドポイントと共通です。
動画 API は現在、限定プレビュー(招待制テスト)です。モデルはカタログと価格に表示されますが、タスクの作成にはワークスペースの許可リスト登録が必要です——有効化のご相談は当社までご連絡ください。
エンドポイントとタスクのライフサイクル
1 つのタスクリソースに 4 つの操作。タスクは queued → in_progress → 終了状態(completed・failed・cancelled のいずれか)へ遷移します。作成レスポンスには status_url / cancel_url リンクが含まれるため、URL を手で組み立てる必要はありません。
| エンドポイント | 説明 |
|---|---|
POST /v1/videos | 生成タスクを作成します。約 2 秒でタスクオブジェクト(status queued)とポーリング用リンクを返します。 |
GET /v1/videos/{id} | タスクをポーリングします。completed では data[0].url、usage.completion_tokens、実際に適用されたパラメータを返します。failed ではプロバイダのコードとメッセージを含む構造化エラーを返します。 |
DELETE /v1/videos/{id} | タスクをキャンセルします。キャンセルできるのは queued のタスクのみで、キャンセルされたタスクは課金されません。 |
GET /v1/videos/models | キーで利用できる動画モデルを、モデルごとの解像度/長さの制約と価格つきで一覧します。 |
同期シュガー — Prefer: wait
作成リクエストに Prefer: wait または Prefer: wait=N ヘッダー(N は 1..60 秒に制限)を付けると、ゲートウェイはリクエストを開いたまま待ちます。ウィンドウ内にタスクが完了すれば、動画 URL と usage を含む終了オブジェクトがそのまま返り、ポーリングは不要です。間に合わなければ呼び出しは正常に退避し、現在の状態オブジェクトが返ります(エラーにはならず、タスクは動き続けます)。あとは通常どおりポーリングしてください。
リクエストボディ
| パラメータ | 型 | 説明 |
|---|---|---|
model* | string | 使用する動画モデル(例:seedance-1-5-pro-251215)。利用可能なモデルは GET /v1/videos/models で一覧できます。 |
prompt* | string | 生成したい動画のテキスト記述。 |
image | string | string[] | image-to-video 入力:画像 1 枚 = 先頭フレーム、2 枚 = 先頭 + 末尾フレーム。各要素は data URI または https URL です。 |
resolution | string | 出力解像度:480p・720p・1080p・4k。対応セットはモデルごとに異なります——モデル表を参照。 |
ratio | string | アスペクト比:16:9・4:3・1:1・3:4・9:16・21:9・adaptive。 |
duration | integer | クリップの長さ(秒。モデルごとの範囲は 2..15 内)。一部のモデルは -1 も受け付け、モデルが長さを自動選択します。 |
seed | integer | 再現可能な出力のためのオプションのシード(対応モデルのみ)。 |
watermark | boolean | プロバイダのウォーターマークを描画するかどうか。 |
generate_audio | boolean | 音声トラックを生成するか(デフォルト true)。二段階料金のモデルでは価格が変わります——モデル表を参照。 |
利用可能なモデル
モデルの可用性はデプロイ環境によって異なります。各モデルの解像度/長さの制約と価格を含む、コンプライアンス対応のライブ一覧は GET /v1/videos/modelsで取得できます。現在のラインアップ:
| モデル | 解像度 | 長さ | 料金 | 備考 |
|---|---|---|---|---|
dreamina-seedance-2-0-260128 | 480p · 720p · 1080p · 4k | 4–15 s | 480p/720p $7.0 · 1080p $7.7 · 4k $4.0 | 2.0 フラッグシップ;最大 4K |
dreamina-seedance-2-0-fast-260128 | 480p · 720p | 4–15 s | $5.6 | 2.0 高速版 |
dreamina-seedance-2-0-mini-260615 | 480p · 720p | 4–15 s | $3.5 | 2.0 最小版 |
seedance-1-5-pro-251215 | 480p · 720p · 1080p | 4–12 s | $2.4 audio · $1.2 muted | generate_audio で料金が変動 |
seedance-1-0-pro-fast-251015 | 480p · 720p · 1080p | 2–12 s | $1.0 | 最安 |
価格:USD / 1M video tokens。seedance-1-5-pro-251215 は音声トラック有効(generate_audio: true、デフォルト)で $2.4、無効で $1.2。その他のモデルは解像度の段階ごとに単一料金です。
video token と料金
動画は実際の出力から導出される video token で課金されます:tokens ≈ 幅 × 高さ × 24 fps × 秒 / 1024。料金は 1M video tokens あたりで、実際に適用されたパラメータ(completed タスクにエコーバック)に従います——そのため ratio: "adaptive" や duration: -1 も、モデルが実際に生成した内容で課金されます。
seedance-1-5-pro-251215(音声あり)の目安:480p / 16:9 / 4 秒のクリップ ≈ 40.6K video tokens ≈ $0.10、720p / 5 秒 ≈ 108.9K tokens ≈ $0.26。
課金
課金は成功時のみ:タスクが最初に completed に到達したときに一度だけ、返された video token 使用量に基づいて課金されます。失敗したタスク(コンテンツモデレーションによる拒否を含む)とキャンセルされたタスクは課金されません——プロバイダのエラーは原文のまま透過されるため、原因を確認できます。
返される data[0].url は署名付きのプロバイダ URL で、約 24 時間で失効します——速やかにダウンロードし、長期保存が必要な場合はご自身のストレージへ移してください。
例 — curl 一発完結(Prefer: wait)
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer $SYNTHORAI_API_KEY" \
-H "Content-Type: application/json" \
-H "Prefer: wait=60" \
-d '{
"model": "seedance-1-0-pro-fast-251015",
"prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
"resolution": "480p",
"ratio": "16:9",
"duration": 4
}'
# Finished inside the wait window → the terminal object comes straight back:
{
"id": "vid_6091d8d1af805818b1470488",
"object": "video",
"model": "seedance-1-0-pro-fast-251015",
"status": "completed",
"data": [{ "url": "https://…tos….mp4?…" }],
"usage": { "completion_tokens": 40594, "total_tokens": 40594 },
"resolution": "480p", "ratio": "16:9", "duration": 4, "fps": 24,
"seed": 34142
}
# Not done in time → the current status object is returned instead (no error,
# the task keeps running) — continue polling status_url as usual. 例 — curl 作成 + ポーリング
# 1) Create — returns in ~2 s with a queued task object
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer $SYNTHORAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-1-5-pro-251215",
"prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
"resolution": "720p",
"duration": 5,
"generate_audio": true
}'
{
"id": "vid_6091d8d1af805818b1470488",
"object": "video",
"model": "seedance-1-5-pro-251215",
"status": "queued",
"created_at": 1784619862,
"status_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488",
"cancel_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488"
}
# 2) Poll until status is terminal (completed | failed | cancelled)
curl https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488 \
-H "Authorization: Bearer $SYNTHORAI_API_KEY"
{
"id": "vid_6091d8d1af805818b1470488",
"object": "video",
"model": "seedance-1-5-pro-251215",
"status": "completed",
"data": [{ "url": "https://…tos….mp4?…" }],
"usage": { "completion_tokens": 108900, "total_tokens": 108900 },
"resolution": "720p", "ratio": "16:9", "duration": 5, "fps": 24,
"seed": 34142, "generate_audio": true
}
# 3) Download the video — the URL is pre-signed (no auth header) and expires
# in ~24 h: fetch promptly and re-host if you need it long-term.
curl -o out.mp4 "https://…tos….mp4?…" 例 — Python(requests)
import time
import requests
BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
task = requests.post(f"{BASE}/videos", headers=HEADERS, json={
"model": "seedance-1-5-pro-251215",
"prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
"resolution": "720p",
"duration": 5,
}).json()
while task["status"] not in ("completed", "failed", "cancelled"):
time.sleep(5)
task = requests.get(task["status_url"], headers=HEADERS).json()
if task["status"] == "completed":
url = task["data"][0]["url"] # pre-signed, valid ~24 h — re-host promptly
with open("out.mp4", "wb") as f:
f.write(requests.get(url).content)
else:
print(task["error"]) # provider code + message, passed through verbatim 例 — Node(fetch)
import fs from "node:fs";
const BASE = "https://synthorai.io/v1";
const HEADERS = { Authorization: `Bearer ${process.env.SYNTHORAI_API_KEY}` };
let task = await (await fetch(`${BASE}/videos`, {
method: "POST",
headers: { ...HEADERS, "Content-Type": "application/json" },
body: JSON.stringify({
model: "seedance-1-5-pro-251215",
prompt: "A corgi puppy chasing a butterfly across a meadow, cinematic",
resolution: "720p",
duration: 5,
}),
})).json();
while (!["completed", "failed", "cancelled"].includes(task.status)) {
await new Promise((r) => setTimeout(r, 5000));
task = await (await fetch(task.status_url, { headers: HEADERS })).json();
}
if (task.status === "completed") {
const url = task.data[0].url; // pre-signed, valid ~24 h — re-host promptly
fs.writeFileSync("out.mp4", Buffer.from(await (await fetch(url)).arrayBuffer()));
} else {
console.error(task.error); // provider code + message, passed through verbatim
} 冪等性
作成呼び出しに X-Idempotency-Key ヘッダーを付けると再試行が安全になります:同じキーの重複リクエストは、タスクを二重に作成(・課金)せず 409 を返します。動画生成は遅く再試行が起きやすいため、二重課金を防げます。