0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Seedance 2 APIを最短で動かす:送信 → 状態確認 → 保存(モデル別の料金つき)

0
Last updated at Posted at 2026-10-29

img-W44-Qiita-01.png

この記事では、BeatAPI 経由で Seedance 2 の動画タスクを1本送り、状態を確認して、完成した動画を保存するまでの最小構成をまとめます。

Seedance 2 は非同期 API です。送信した瞬間に動画は返ってきません。「タスクIDを保存して、終わるまで確認する」という流れを最初に作っておくと、通信の切断やタイムアウトで同じ動画を二重に生成してしまうミスを防げます。

前提

  • BeatAPI の API キー(サーバー側の環境変数 BEATAPI_API_KEY に置く。ブラウザの JavaScript には入れない)
  • curl、Node.js 18 以上
  • 料金は 2026年10月28日時点の beatapi.io の表示価格です。まとめて生成する前に料金ページで再確認してください。

1. モデルを選ぶ(条件を固定する)

Seedance 2 には3つのモデルIDがあり、同じエンドポイントのまま model だけで切り替えられます。

モデルID 向いている用途 解像度 8秒・480p 8秒・720p
seedance-2-mini 安く試す下書き 480p / 720p $0.28 $0.60
seedance-2-fast 速度重視 480p / 720p $0.45 $0.97
seedance-2 本番用。1080p・4K も可 480p〜4K $0.56 $1.20

※テキストから動画(動画入力なし)の場合。

おすすめは「下書きは Mini の 480p で回し、採用するカットだけ seedance-2 で作り直す」です。比較するときは、尺・解像度・比率・プロンプトを固定して、モデルIDだけを変えます。

2. タスクを送信して ID を保存する

curl --fail-with-body -X POST https://api.beatapi.io/v1/videos/tasks \
  -H "Authorization: Bearer $BEATAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: product-0001-draft-v1" \
  -d '{
    "model": "seedance-2-mini",
    "prompt": "A white serum bottle on a wet black stone. Soft side light, slow push-in, no text overlay.",
    "duration": 8,
    "aspect_ratio": "16:9",
    "resolution": "480p"
  }'

generate_audio は Fast と Standard で指定できるパラメータです。Mini のリクエストには含めません。

作成に成功すると HTTP 201 で、data にタスクが返ります。

{
  "data": {
    "id": "task_8K2qA",
    "object": "task",
    "task_kind": "video",
    "model": "seedance-2-mini",
    "status": "queued",
    "output": null,
    "request_id": "req_abc123",
    "error_code": null,
    "error_message": null
  }
}

ここで大事なのは2つです。

  • data.id は、画面を更新するより先に保存する。自社のジョブID、Idempotency-Key、送った設定も一緒に残す。
  • 応答を受け取る前に通信が切れたら、同じ本文・同じ Idempotency-Key で再送する。キーを変えると別のタスクになり、同じ動画を二重に作ってしまうことがあります。

3. 状態を確認する

curl --fail-with-body https://api.beatapi.io/v1/tasks/task_8K2qA \
  -H "Authorization: Bearer $BEATAPI_API_KEY"

status は queued → processing → succeeded または failed と進みます。前の2つの間は待ち、後ろの2つで止めます。

Node.js で書くとこうなります。5秒前後から始めて、少し揺らぎを入れ、だんだん間隔を伸ばします。

const baseUrl = "https://api.beatapi.io";
const headers = { Authorization: `Bearer ${process.env.BEATAPI_API_KEY}` };
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));

export async function waitForTask(taskId: string) {
  const terminal = new Set(["succeeded", "failed"]);
  let delayMs = 5_000;
  const deadline = Date.now() + 12 * 60_000;

  while (Date.now() < deadline) {
    const res = await fetch(`${baseUrl}/v1/tasks/${taskId}`, { headers });
    if (res.status === 429) {
      // Retry-After を秒で読む。読めなければ 10 秒待つ
      const ra = Number(res.headers.get("retry-after"));
      await sleep((Number.isFinite(ra) && ra > 0 ? ra : 10) * 1_000);
      continue;
    }
    if (!res.ok) throw new Error(`task query failed: ${res.status}`);

    const { data } = await res.json();
    if (terminal.has(data.status)) return data;

    await sleep(delayMs + Math.floor(Math.random() * 1_000));
    delayMs = Math.min(Math.round(delayMs * 1.35), 15_000);
  }
  // 待つのをやめるだけ。タスクIDは残して、あとで照合する
  throw new Error("client deadline reached; keep the task id");
}

期限に達しても、それは「こちらが待つのをやめた」というだけで、タスクが失敗したわけではありません。新しく送り直す前に、保存したIDでもう一度確認してください。

4. 動画を保存する

成功すると data.output.media[] に動画が入ります。

{
  "data": {
    "id": "task_8K2qA",
    "status": "succeeded",
    "output": {
      "media": [
        {
          "type": "video",
          "url": "https://media.beatapi.io/outputs/task_8K2qA/video.mp4",
          "mime_type": "video/mp4"
        }
      ]
    }
  }
}

type: "video"、mime_type、URL に実際に届くかを確認してから「完成」にします。URL は永久保存ではないので、長く使う動画は自社のストレージにコピーし、タスクIDと紐づけておきます。

5. 条件を固定すると、予算が読める

商品動画を1本採用するまでの例です(いずれも8秒、動画入力なし)。

工程 モデル・設定 本数 金額
下書き seedance-2-mini・480p 5本 $1.40
仕上げ seedance-2・720p 2本 $2.40
合計 $3.80

高くつくのは1回の生成ではなく、やり直しです。「何本まで下書きするか」「どの条件で仕上げるか」を先に決めておくと、10商品なら約 $38、と見積もれます。

6. うまくいかないとき

現象 やること
queued のまま長い 同じIDで確認を続ける。代わりのタスクを送らない
こちらの通信がタイムアウト 新規送信の前に、保存したIDを確認する
failed で終わった error_code と error_message を保存し、入力を直すか判断する
成功後に URL に届かない タスクを再取得する。必要なときだけ意図的に新規生成する

まとめ

  • model を変えるだけで Mini / Fast / Standard を切り替えられる
  • 「IDを保存 → 状態確認 → 出力を検証して保存」の順を崩さない
  • 下書きは安いモデル、本番だけ良いモデル。条件を固定すれば予算が読める

出典・確認日

  • BeatAPI 公開 API ドキュメント(Seedance 2 の動画タスク、タスク取得、ウェブフック):2026年10月28日確認
  • 料金:beatapi.io 料金ページ(8秒・動画入力なし):2026年10月28日確認
  • 記事中のレスポンス例は公開スキーマに沿った例で、実際の請求額と照合したものではありません

モデルの仕様と料金:https://beatapi.io/seedance-2-api

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?