Seedance 2.0 APIは、ByteDanceのAI動画生成モデルへのプログラマティックなアクセスを提供します。このガイドでは、認証から非同期ポーリング、Webhook駆動のアーキテクチャまで、開発者がSeedanceをアプリケーションや本番ワークフローに統合するために必要なすべてを解説します。
API概要
Seedance 2.0 REST APIは、テキストから動画の生成、画像から動画の生成、ステータスポーリング、結果取得のエンドポイントを提供します。すべての生成は非同期で行われます:リクエストを送信し、タスクIDを受け取り、ポーリングまたはWebhookで結果を取得します。
| 機能 | エンドポイント | メソッド |
|---|---|---|
| Text-to-Video | /v2/generate/text | POST |
| Image-to-Video | /v2/generate/image | POST |
| ステータス確認 | /v2/tasks/{task_id} | GET |
| 結果ダウンロード | /v2/tasks/{task_id}/result | GET |
| Webhook設定 | /v2/webhooks | POST |
| アカウント情報 | /v2/account | GET |
ベースURL: https://api.seedance.ai
レスポンス形式: すべてのエンドポイントはstatus、data、errorフィールドを含む一貫した構造のJSONを返します。
クイックスタート(5分)
ゼロから最初の動画生成まで3ステップで到達します。
ステップ1:APIキーを取得。 Dreamina開発者ポータルでアカウントを作成し、設定 > APIキーに移動してキーを生成します。
ステップ2:生成リクエストを送信。
curl -X POST https://api.seedance.ai/v2/generate/text \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0",
"prompt": "A golden retriever running through a field of sunflowers at sunset, slow motion, cinematic lighting",
"aspect_ratio": "16:9",
"duration": 4
}'ステップ3:結果をポーリング。
curl https://api.seedance.ai/v2/tasks/TASK_ID \
-H "Authorization: Bearer YOUR_API_KEY"statusが"completed"を返したら、レスポンスに24時間有効な署名付きダウンロードリンクを含むvideo_urlフィールドが含まれます。
認証
すべてのAPIリクエストにはAuthorizationヘッダーにBearerトークンが必要です。APIキーはアカウントと課金プランに紐付けられています。
JavaScript
const SEEDANCE_API_KEY = process.env.SEEDANCE_API_KEY
const headers = {
'Authorization': `Bearer ${SEEDANCE_API_KEY}`,
'Content-Type': 'application/json',
}Python
import os
import requests
SEEDANCE_API_KEY = os.environ["SEEDANCE_API_KEY"]
headers = {
"Authorization": f"Bearer {SEEDANCE_API_KEY}",
"Content-Type": "application/json",
}cURL
curl -H "Authorization: Bearer $SEEDANCE_API_KEY" \
-H "Content-Type: application/json" \
https://api.seedance.ai/v2/accountセキュリティのベストプラクティス:
- APIキーはソースコードではなく環境変数に保存
- 開発者ダッシュボードで定期的にキーをローテーション
- 開発環境と本番環境で別々のキーを使用
- アカウントダッシュボードで使用量を監視して不正使用を検出
Text-to-Videoエンドポイント
テキスト説明から動画を生成します。ほとんどのユースケースで主要なエンドポイントです。
リクエストパラメータ:
| パラメータ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
model | string | はい | - | モデルバージョン(seedance-2.0) |
prompt | string | はい | - | 動画の説明(30〜500文字) |
negative_prompt | string | いいえ | - | 除外する要素 |
aspect_ratio | string | いいえ | 16:9 | 16:9、9:16、または1:1 |
duration | integer | いいえ | 4 | 4または8秒 |
seed | integer | いいえ | ランダム | 再現性のためのシード |
webhook_url | string | いいえ | - | 完了通知用URL |
JavaScript例
async function generateTextToVideo(prompt) {
const response = await fetch('https://api.seedance.ai/v2/generate/text', {
method: 'POST',
headers,
body: JSON.stringify({
model: 'seedance-2.0',
prompt,
aspect_ratio: '16:9',
duration: 4,
}),
})
const data = await response.json()
if (!data.data?.task_id) {
throw new Error(`Generation failed: ${data.error?.message ?? 'Unknown error'}`)
}
return data.data.task_id
}Python例
def generate_text_to_video(prompt: str) -> str:
response = requests.post(
"https://api.seedance.ai/v2/generate/text",
headers=headers,
json={
"model": "seedance-2.0",
"prompt": prompt,
"aspect_ratio": "16:9",
"duration": 4,
},
)
response.raise_for_status()
data = response.json()
task_id = data.get("data", {}).get("task_id")
if not task_id:
raise ValueError(f"Generation failed: {data.get('error', {}).get('message', 'Unknown')}")
return task_id効果的なプロンプトの書き方については、50以上のすぐに使えるテンプレートを掲載したSeedanceプロンプトガイドをご覧ください。
Image-to-Videoエンドポイント
モーションプロンプトで静止画像をアニメーション化します。画像がビジュアルの出発点を提供し、モーションプロンプトがシーンの動き方を記述します。
リクエストパラメータ:
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
model | string | はい | seedance-2.0 |
image | file/URL | はい | ソース画像(JPEG/PNG、最大10MB) |
motion_prompt | string | はい | 望むモーションの説明 |
duration | integer | いいえ | 4または8秒 |
seed | integer | いいえ | 再現性のためのシード |
webhook_url | string | いいえ | 完了通知用URL |
JavaScript例(ファイルアップロード)
async function generateImageToVideo(imagePath, motionPrompt) {
const imageBuffer = await fs.promises.readFile(imagePath)
const blob = new Blob([imageBuffer], { type: 'image/png' })
const formData = new FormData()
formData.append('model', 'seedance-2.0')
formData.append('image', blob, 'input.png')
formData.append('motion_prompt', motionPrompt)
formData.append('duration', '4')
const response = await fetch('https://api.seedance.ai/v2/generate/image', {
method: 'POST',
headers: { 'Authorization': `Bearer ${SEEDANCE_API_KEY}` },
body: formData,
})
const data = await response.json()
return data.data.task_id
}Python例
def generate_image_to_video(image_path: str, motion_prompt: str) -> str:
with open(image_path, "rb") as f:
files = {"image": ("input.png", f, "image/png")}
data = {
"model": "seedance-2.0",
"motion_prompt": motion_prompt,
"duration": "4",
}
response = requests.post(
"https://api.seedance.ai/v2/generate/image",
headers={"Authorization": f"Bearer {SEEDANCE_API_KEY}"},
files=files,
data=data,
)
response.raise_for_status()
return response.json()["data"]["task_id"]非同期生成とステータスポーリング
Seedance APIのすべての生成は非同期です。リクエスト送信後にtask_idを受け取り、完了をポーリングする必要があります。一般的な生成時間は、動画長とサーバー負荷に応じて30〜120秒です。
タスクステータス値:
| ステータス | 説明 |
|---|---|
pending | リクエスト受信、処理キュー待ち |
processing | 生成進行中 |
completed | 動画ダウンロード準備完了 |
failed | 生成失敗(errorフィールドを確認) |
JavaScriptポーリング実装
async function pollForResult(taskId, maxAttempts = 60, intervalMs = 3000) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
const response = await fetch(
`https://api.seedance.ai/v2/tasks/${taskId}`,
{ headers }
)
const data = await response.json()
const status = data.data?.status
if (status === 'completed') {
return data.data.video_url
}
if (status === 'failed') {
throw new Error(`Generation failed: ${data.data?.error ?? 'Unknown error'}`)
}
await new Promise((resolve) => setTimeout(resolve, intervalMs))
}
throw new Error('Generation timed out after maximum polling attempts')
}ポーリングのベストプラクティス:
- 最初の30秒は3秒間隔で開始
- 30秒後は5秒間隔に延長
- 最大タイムアウトは3〜5分に設定
- レート制限レスポンスにはエクスポネンシャルバックオフを実装
Webhook統合
Webhookはポーリングの必要性を排除し、生成完了時にサーバーに通知をプッシュします。本番システムには推奨のアプローチです。
Express.js Webhookハンドラー
app.post('/webhooks/seedance', express.json(), (req, res) => {
const { event, task_id, video_url, status } = req.body
if (event === 'generation.completed') {
processCompletedVideo(task_id, video_url)
}
if (event === 'generation.failed') {
handleGenerationFailure(task_id)
}
res.status(200).json({ received: true })
})エラーハンドリング
Seedance APIは標準的なHTTPステータスコードと構造化されたエラーレスポンスを使用します。
一般的なエラーコード:
| HTTPステータス | エラーコード | 説明 | 対応 |
|---|---|---|---|
| 400 | INVALID_PARAMS | 不正なリクエストパラメータ | リクエストボディを修正 |
| 401 | UNAUTHORIZED | 無効または期限切れのAPIキー | キーを確認/ローテーション |
| 429 | RATE_LIMITED | 同時リクエスト数超過 | 待ってからリトライ |
| 500 | INTERNAL_ERROR | サーバー側の障害 | バックオフ付きリトライ |
レート制限とクォータ
レート制限はプランによって異なり、1日の合計ではなく同時リクエスト数に適用されます。
| プラン | 同時リクエスト | リクエスト/分 | 1日の上限 |
|---|---|---|---|
| 無料 | 2 | 10 | 5生成 |
| Pro | 10 | 60 | 100生成 |
| Business | 50以上 | カスタム | 無制限 |
FAQ
Seedance APIキーの取得方法は?
Seedance開発者ポータル(Dreaminaプラットフォーム)でアカウントを作成し、ダッシュボードに移動してAPIキーを生成します。無料プランでもAPIアクセスが利用可能です。
Seedance APIはどのプログラミング言語に対応していますか?
Seedance APIはHTTPリクエストを送信できるあらゆる言語で動作するREST APIです。公式のサンプルはJavaScript、Python、cURLで提供されています。
Seedance APIの生成にはどのくらい時間がかかりますか?
生成には通常、解像度と動画長の設定に応じて30〜120秒かかります。APIは非同期ポーリングを使用して生成ステータスを確認します。
Seedance APIはWebhookに対応していますか?
はい。Webhook URLを設定して、動画生成完了時に通知を受け取ることができ、ステータスポーリングの必要がなくなります。
関連記事
- Seedance 2.0チュートリアル — Seedanceの初心者向け完全ガイド
- Seedanceプロンプトガイド — より良いAPI結果のための50以上のプロンプトテンプレート
- Seedance料金プラン — API料金プランとボリュームディスカウント
- Seedance vs Sora 2026 — OpenAI SoraとのAPI比較

