spicyapiドキュメント
ガイド
本文

チュートリアル:画像から動画を作る

パソコンにある 1 枚の画像から始めて、動画ファイルをダウンロードするまでを案内します。すべてのステップで、CLI、TypeScript SDK、そのままの HTTP の 3 通りの書き方を示します。

このチュートリアルでは、パソコンにある画像を 1 枚使って短い動画クリップを作り、ダウンロードして手元に保存するところまで進めます。モデルを選ぶ、画像をアップロードする、価格を確認する、生成を開始する、完了を待つ、結果をダウンロードする、うまくいかなかったときに対処する、という一連の作業を順番どおりにすべて扱うので、リファレンスの各ページを読み合わせて自分で組み立てる必要はありません。

どのステップでも、同じことを 3 通りの方法で示します。どれか 1 つを選び、最後までその方法で進めてください。

方法こんな場合に選ぶ必要なもの
CLIコードは書かずに、コマンドを入力して進めたいNode.js 22.13 以降
TypeScript SDKNode.js のプログラムを作っていて、そのプログラムが行う呼び出しを確認したいNode.js 22.13 以降
HTTP (curl)API をそのままの形で見たい(たとえば、あとで別のプログラミング言語から使うため)curl と jq が使える bash のターミナル(macOS、Linux、または Windows の WSL)

AI アシスタントに頼んで進めたい場合は、AI アシスタントから行うを参照してください。

作るもの

  • できあがるもの: 短い動画ファイル(通常は MP4)です。あなたの画像から始まり、あなたが書いた文のとおりに動きます。
  • かかる時間: 初回は約 20 分を見込んでください。そのほとんどは読む時間です。生成そのものはふつう数分で終わりますが、モデルや設定によってはもっとかかります。
  • どこで実行されるか: SpicyAPI 上です。あなたのパソコンは画像と指示を送り、完成したファイルをダウンロードするだけです。

かかる費用と、支払う前に確認する方法

価格は米ドル建てです。選ぶモデルと、動画の長さや解像度などの設定によって変わるため、このページでは具体的な金額は挙げません。価格は次の 3 か所で確認でき、どれも費用はかかりません。

  1. ライブカタログ(ステップ 1)には、あなたのアカウントで使えるすべてのモデルが、あなたのアカウントに適用される価格とともに並びます。動画の価格は、ふつう出力 1 秒あたり(per_second)で決まっています。1 つのモデルに複数の価格が並んでいる場合は、それぞれが解像度などの設定ごとの価格です。
  2. 見積もり(ステップ 3)では、あなたのリクエストそのものの正確な価格がわかります。何も開始されず、お金が仮押さえされることもありません。
  3. 確認:CLI はもう一度価格を表示し、あなたが y と入力するまで何も始めません。

お金の動きは次のとおりです。

  • お金がかかるのはステップ 4 だけです。失敗したタスクをもう一度実行する場合も費用がかかります。モデルの一覧表示、アップロード、見積もり、待機、ダウンロードは無料です。
  • 生成を開始すると、見積額が残高から確保されます(これを「仮押さえ」と呼びます)。この金額は、その動画にかかりうる最大額でもあります。
  • 動画の生成に成功した場合は、生成された分が課金されます。仮押さえ額を超えることはなく、余った分は残高に戻ります。
  • 失敗・期限切れのタスクでは通常、仮押さえ額が全額解放されます。ただし、モデルページに明記された一部のコンテンツ拒否は、受理時の見積額で課金されます。最終請求額は settled と cost で確認してください。
  • 新しいアカウントには無料枠がないため、先に残高が必要です。課金を参照してください。

しくみ

あなたの画像 ──アップロード──▶ spicy:// アドレス(1 日有効)
                                          │
あなたの文 + 設定 ────────────────────────┴──▶ 見積もり(無料)──▶ タスクを開始(お金を仮押さえ)
                                                                           │
                                                queued ──▶ running ──▶ succeeded / failed / expired
                                                                           │
                                           ダウンロードリンク(約 20 分)──▶ あなたのファイル

タスクとは、1 回分の生成作業のことです。SpicyAPI はタスクをバックグラウンドで処理するので、開始することと結果を受け取ることは、別々の 2 つの操作になります。すべてのタスクには job_ で始まる ID が付きます。あとでタスクを探し出すにはこの ID が必要なので、控えておいてください。このページに出てくるほかの用語は、用語集で説明しています。

始める前に

アカウント、残高、API キーを用意する

まずアカウントの準備の手順を済ませてください。終わった時点で、次のものがそろっているはずです。

  • 残高にお金が入っている SpicyAPI アカウント
  • sk-spicy- で始まる API キー
  • そのキーを SPICY_API_KEY という名前の環境変数に保存した状態。環境変数とは、ターミナルが自分の実行するプログラムに渡す、名前の付いた値のことです。これを使えば、キーをコマンドやコードに書かずに済みます。

いま使っているターミナルウィンドウでキーが設定されているかを、キー全体は表示せずに確認します。

echo "${SPICY_API_KEY:0:9}"

期待される結果: sk-spicy- と表示されます。何も表示されない場合やエラーになる場合は、このウィンドウではキーが設定されていません。アカウントの準備に戻ってください。

画像を作業フォルダーに置く

このチュートリアル用のフォルダーを作り、そのフォルダーでターミナルを開きます。このページのコマンドはすべてこのフォルダーで実行し、コマンドが作るファイルもすべてここに保存されます。

mkdir -p ~/spicy-video
cd ~/spicy-video

画像をそのフォルダーにコピーし、start-frame.jpg という名前にします(PNG の場合は start-frame.png にして、このページで start-frame.jpg と書かれている箇所はすべてその名前に読み替えてください)。

最初のフレームに向いている画像の条件は次のとおりです。

  • 形式とサイズ: JPEG、PNG、WebP、GIF のいずれかで、10 MiB(約 10 メガバイト)までです。モデルによっては独自により厳しい制限があり、それはステップ 1 で確認できます。
  • ファイルが実際にその形式であること。 SpicyAPI は、ファイル名だけでなくファイルの中身を確認します。スマートフォンの写真は HEIC 形式であることが多く、名前を .jpg に変えても変換はされません。いったん画像を開き、JPEG として書き出すか保存し直してください。
  • 縦横の形: 画像は動画の最初のフレームになります。横長の動画には横長の画像を、縦長の動画には縦長の画像を使ってください。aspect_ratio という設定を用意しているモデルもあります。
  • 権利: 使用が認められている画像を使ってください。

選んだツールを準備する

CLI は、ターミナルで実行する spicyapi というプログラムです。一度だけインストールします(Node.js を含む詳しい手順は CLI:始める前に)。

npm install -g @spicyapi/cli
spicyapi --version

インストールが EACCES で失敗した場合はインストールを飛ばし、このページで spicyapi と入力している箇所で、代わりに npx @spicyapi/cli と入力してください。

続いて、キーが使えることと、残高があることを確認します。

spicyapi balance

期待される結果: 米ドル建ての available、held、total が表示されます。available が 0 より大きくなければなりません。

7 つのステップ

MODEL_ID_FROM_CATALOG を実際のモデル ID に置き換えてください

MODEL_ID_FROM_CATALOG はプレースホルダーで、モデルではありません。ステップ 1 で、ライブカタログ(spicyapi models list、SDK の listModels()、または GET /api/v1/models)から実際のモデル ID を選びます。このページでプレースホルダーが書かれている箇所には、すべてその ID を貼り付けてください。プレースホルダーのまま送ると、「見つからない」というエラーが返るだけです。

Windows の場合は CLI か SDK のタブを選んでください

HTTP のタブは bash 向けに書いています。Windows PowerShell では、引用符、改行(\)、$(...) の扱いが異なるため、書かれたとおりに実行しても動きません。Windows では CLI か SDK のタブを使うか、HTTP のコマンドを WSL(Windows Subsystem for Linux)の中で実行してください。

1. モデルを選び、その設定を確認する

やること: あなたのアカウントで使える、画像から動画を作るモデルを一覧表示して 1 つ選び、そのモデルが受け付ける設定を確認します。

モデルを一覧表示します。

spicyapi models list --modality video --task image-to-video --json

期待される結果: JSON の一覧が表示されます。以下は一部を省略したもので、金額は … で示しています。

{
  "total": 1,
  "items": [
    {
      "model": "MODEL_ID_FROM_CATALOG",
      "displayName": "Example video model",
      "modality": "video",
      "tasks": ["image-to-video"],
      "enabled": true,
      "available": true,
      "quantityField": "duration_seconds",
      "maxOutputDurationSeconds": 10,
      "taskTimeoutSeconds": 1800,
      "pricing": [
        { "variant": "720p", "unit": "per_second", "price": "…", "currency": "USD" },
        { "variant": "1080p", "unit": "per_second", "price": "…", "currency": "USD" }
      ]
    }
  ]
}

enabled と available がどちらも true のモデルを選び、その model の値をコピーします。次に、そのモデルの設定を確認します。

spicyapi models get MODEL_ID_FROM_CATALOG --json

返ってくる内容には、同じフィールドに加えて、inputSchema(設定)と examples(サーバーが検証済みの入力例)が含まれます。

一覧で見るポイント:

フィールドわかること
model以降のすべてのステップで使うモデル ID です
enabled、available両方が true のモデルだけを使ってください
pricing価格の段階ごとに 1 項目あります。variant(その価格が適用される設定で、解像度であることが多い)、unit(動画ならたいてい per_second)、米ドル建ての price です。割引が適用される場合は regularPrice と offerLabel も表示されます
quantityField何単位分を支払うかを決める設定で、たいていは duration_seconds です。空の場合は、動画 1 本につき 1 単位です
maxOutputDurationSecondsそのモデルで作れる動画の最大の長さです
taskTimeoutSeconds生成がこの時間を超えて続くと expired として止まります(その場合は課金されません)

設定の読み方。 inputSchema は、そのモデルの設定の一覧を JSON Schema で書いたものです。

  • required には、必ず送る必要がある設定が並びます。この種類のモデルでは image_url が必ず含まれ、ほとんどのモデルでは prompt も必須です。
  • properties には、そのモデルが受け付けるすべての設定が並びます。それぞれに type と、平易な英語で書かれた description があり、多くの場合は enum(許される値の一覧)、minimum と maximum、default(その設定を省略したときに使われる値)も付いています。
  • 各設定の中にある x-ui には、表示用のヒントが入っています。x-ui.affects_price: true は、その設定を変えると価格が変わることを意味します。
  • 「A を送る場合は B も送る必要がある」といった条件を最上位に追加しているモデルもあります。その読み方は Spicy Schema で説明しています。
  • examples には、サーバーが検証済みの完全な入力例が入っています。安心して出発点にできます。

よく使う設定。 名前はすべてのモデルで共通ですが、各モデルが受け付けるのはその一部だけで、使える値もモデルごとに異なります。

設定役割価格は変わる?
image_url出発点になる画像で、最初のフレームとして使われます。ステップ 2 で得た spicy:// アドレスか、公開されている https:// リンクを指定します変わりません
prompt何が起きるか(動き、カメラ、雰囲気)を書きます。画像にすでに写っているものを繰り返すのではなく、動きを書いてくださいたいてい変わりません
duration_seconds動画の長さ(秒)です。使える値は enum にあるか、minimum と maximum の間です。特別な値を受け付けるモデルもあり、その説明は設定の description にありますほとんどのモデルで変わります。動画はたいてい秒単位で課金されるため、長いクリップほど高くなります
resolution720p や 1080p などの出力サイズですたいてい変わります。解像度が高いほど、別に高い価格が設定されていることが多いです
aspect_ratio16:9、9:16、1:1 などの動画の縦横比です。画像に合わせる adaptive を用意しているモデルもありますx-ui.affects_price で確認してください
generate_audio映像に合った音声もあわせて生成します一部のモデルで変わります
last_image_url最後のフレームにする画像です。最初と最後のフレームを参照してください見積もりで確認してください
negative_prompt動画で避けたいものを書きますたいてい変わりません
seed実行ごとの結果を比べやすくする数値です。まったく同じ動画になることは保証されません変わりません

このモデルが挙げている設定だけを送ってください

設定の一覧はモデルごとに異なります。そのモデルの properties にない設定、つづりの間違った名前、enum にない値が 1 つでもあると、リクエスト全体が 400 で拒否されます。課金はされませんが、別のモデルの入力を確認せずにコピーしないでください。

ここで起きたこと: あなたのアカウント向けのライブカタログを、あなたの価格も含めて読みました。何も課金されていません。カタログの読み取りはアカウントのリクエスト数の上限にカウントされるため、動画を作るたびに繰り返す必要はありません。モデルを変えたときや 400 が返ってきたときに、もう一度確認してください。

2. 画像をアップロードする

やること: start-frame.jpg をアップロードし、返ってきた spicy:// アドレスをコピーします。アップロードは無料です。

spicyapi files upload start-frame.jpg

期待される結果:

fileId: fil_01k3m8x9q2z4v7n5p6r8s0t1w3
status: ready
bytes: 402118
contentType: image/jpeg
sha256: a91f4c2e5b7d16809e3f2a4c8d0b61e7c4a890e5d2f71b3c609ae8427d15f0c6
uri: spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3
expiresAt: 2026-09-18T09:12:11Z

uri の値を、表示されたとおり正確にコピーしてください。

ここで起きたこと: 画像があなたのアカウント用に非公開で保存され、検証され(実際の形式が申告した種類と一致している必要があります)、spicy:// アドレスが付けられました。このアドレスは Web のリンクではありません。使えるのはあなたのアカウントだけで、しかもタスクの入力の中でしか使えません。使える期間は 1 日です(expiresAt を参照)。それを過ぎたら、画像をもう一度アップロードしてください。

画像がすでにネット上にある場合は?

画像が、ログインせずに開ける公開の https:// アドレスにすでに置かれている場合は、このステップを飛ばし、代わりにそのアドレスを image_url に入れてかまいません。動画の生成中は、そのアドレスにアクセスできる状態を保ってください。

アップロードに失敗した場合:

表示される内容意味対処
Unsupported file type、または CLI や SDK が種類を判別できないと表示するファイルが JPEG、PNG、WebP、GIF のいずれでもありません画像を変換するか、正しい拡張子の名前を付けてください
File exceeds the 10 MB limit画像が 10 MiB を超えていますもっと小さいサイズで書き出してください
The uploaded file does not match the upload ticketファイルの中身が、名前や申告した種類と一致していません(たとえば、HEIC の写真の名前を .jpg に変えた場合)本物の JPEG か PNG として書き出し、もう一度アップロードしてください
The upload ticket has expiredチケットの発行から確定までに約 20 分以上たちましたアップロードを最初からやり直してください

3. 動画の内容を書き、価格を確認する

やること: 設定を input.json というファイルに書き、見積もりを取ります。

input.json を書く。 まずは、画像から動画へのモデルならどれでも受け付ける 2 つの設定から始めます。prompt には自分の文を書き、image_url の値は、ステップ 2 でコピーした uri に置き換えてください。

input.json
{
  "prompt": "The camera slowly pushes in while rain runs down the window and neon light flickers",
  "image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3"
}

省略した設定には、そのモデルの default が使われます。自分で指定したい場合は、そのモデルの properties に載っている設定だけを、許されている値で追加します。たとえば、モデルに duration_seconds と resolution があり、次の値が使える場合は、このようになります。

{
  "prompt": "The camera slowly pushes in while rain runs down the window and neon light flickers",
  "image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
  "duration_seconds": 5,
  "resolution": "720p"
}

作業フォルダーにファイルを保存します。

自分の文と uri に書き換えてから、すべての行をまとめて貼り付けます。

cat > input.json <<'EOF'
{
  "prompt": "The camera slowly pushes in while rain runs down the window and neon light flickers",
  "image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3"
}
EOF

引用符は、曲がった引用符ではなく、まっすぐな普通の引用符(")を使ってください。また、最後の設定のあとにはカンマを付けないでください。

見積もりを取る:

spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.json

期待される結果: 次のように表示されます。金額は … で示しています。

quoteId: eyJ2IjoxLCJtIjoi…
model: MODEL_ID_FROM_CATALOG
estimatedCost: …
maxCharge: …
currency: USD
quantity: 5
unit: per_second
expiresAt: 2026-09-17T08:05:00Z

ここで起きたこと: SpicyAPI が入力をモデルの設定と照らし合わせ、このリクエストそのものの価格を計算しました。何も開始されておらず、何も課金されていません。 estimatedCost はいま開始した場合に仮押さえされる金額で、maxCharge はかかりうる最大の金額です。quantity と unit は、何に対して支払うのか(たとえば 5 秒分)を示します。

見積もりの有効期間は 5 分で、まったく同じ入力に対してだけ有効です。長さや解像度を変えたら、もう一度見積もりを取って価格を比べてください。見積もりではタスクを開始するときと同じ確認が行われるので、問題があればここで無料で見つかります。400 は入力がモデルの設定に合っていないことを意味し(ステップ 1 を見ながら input.json を直してください)、40201 は残高が足りないことを意味します。それ以外のコードはステップ 7 にまとめています。

自分の画像を使わずに試したい場合は?

ステップ 1 で見たモデルの examples は、サーバーが検証済みの完全な入力例です。1 つをそのまま input.json に入れて見積もりを取り、生成してみれば、自分の画像を使う前に一連の流れが動くことを確認できます。

4. 生成を開始する

このステップではお金がかかります

生成を開始すると、見積額が残高から仮押さえされます。SpicyAPI が受理したタスクはキャンセルできません。最後まで実行され、成功すれば課金されます。失敗・期限切れのタスクでは通常、仮押さえ額が全額解放されます。ただし、モデルページに明記された一部のコンテンツ拒否は、受理時の見積額で課金されます。最終請求額は settled と cost で確認してください。

冪等キーをわかりやすく言うと。 注文番号のように、1 本の動画に付けるラベルです。接続が切れて、動画の生成が始まったかどうかわからなくなったら、同じリクエストを同じラベルでもう一度送ってください。SpicyAPI は 2 本目を開始して課金するのではなく、すでに開始したタスクを返します。ラベルは、同じ API キーで 24 時間有効です。別の動画には新しいラベルを使ってください。同じラベルで別の入力を送ると、409 で拒否されます。詳しくは冪等性を参照してください。

やること:

spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json

CLI はもう一度見積もりを取り、価格を表示して、あなたの返事を待ちます。

Estimated charge: USD …; maximum charge: USD …. Quote expires: 2026-09-17T08:05:00Z.
Idempotency-Key: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
Create a billable task with model MODEL_ID_FROM_CATALOG? … Continue? [y/N]

y と入力して Enter を押します。それ以外の入力ではキャンセルされ、何も課金されません。答える前に、Idempotency-Key の値をどこかにコピーしておいてください。CLI は実行のたびに新しいラベルを作るので、接続が切れたときにはこの値が必要になります。

期待される結果:

idempotencyKey: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
taskId: job_01k3m8x9q2z4v7n5p6r8s0t1w3
state: queued
estimatedCost: …
deadlineAt: 2026-09-17T08:35:00Z

taskId をコピーしてください。

ここで起きたこと: SpicyAPI が生成を受理し(ここからはタスクと呼びます)、estimatedCost を残高から仮押さえしました。この金額は、この動画にかかりうる最大額でもあります。state: queued は、順番を待っていることを意味します。deadlineAt は完了の期限で、それまでに終わらなければ expired で終了し、何も課金されません。deadlineAt は、ファイルの保存期限ではありません。

見積もりを添えて送ることは、「表示された価格でなければ受け付けないでほしい」という意味になります。その間に価格や入力が変わっていれば、別の金額が仮押さえされるのではなく、リクエストが 40901 で拒否されます。CLI はこれを自動で行います。

接続が切れてタスク ID が表示されなかった場合は、 新しいラベルでやり直すことはしないでください。2 本目の動画が作られ、その分も課金されてしまいます。代わりに、同じラベルでリクエストを繰り返します。

  • CLI:spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key <the value you copied>(<the value you copied> はコピーしておいた値に置き換えます)。待機が中断されたタスクを再開するを参照してください。
  • SDK:node generate.mjs --yes をもう一度実行します。idempotency-key.txt が再利用されます。
  • HTTP:「動画の生成を開始する」のブロックをもう一度実行します。idempotency-key.txt が再利用されます。

ステップ 4 が拒否された場合は、何も作成されておらず、何も課金されていません。理由と対処法はステップ 7 にあります。

5. 動画の完成を待つ

やること: タスクが終わるまで状態を確認します。動画はふつう数分かかります。

spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000 --json

タスク ID は自分のものを使ってください。--wait-timeout-ms 1800000 を付けると、既定の 10 分ではなく、最大 30 分まで待ちます。

期待される結果: 完了すると、次のように表示されます(一部省略)。

{
  "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
  "model": "MODEL_ID_FROM_CATALOG",
  "state": "succeeded",
  "output": {
    "assets": [
      {
        "key": "tasks/2026/09/17/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4",
        "url": "https://…",
        "expiresAt": "2026-09-17T08:40:00Z",
        "mime": "video/mp4",
        "durationSeconds": 5,
        "width": 1280,
        "height": 720,
        "bytes": 4839211
      }
    ]
  },
  "cost": "…",
  "settled": true
}

次回からは、tasks create に --wait を付ければ、ステップ 4 と 5 をまとめて行えます。

ここで起きたこと: 使っているツールが、数秒ごとに SpicyAPI にタスクの状態を問い合わせました。状態は queued(待機中)、running(生成中)と進み、最後に succeeded、failed、expired のいずれか 1 つの最終状態になります。成功したあと、ファイルは SpicyAPI 自身のストレージにコピーされます。これにはさらに数秒かかり、それまでは結果に pending: true が表示されます。settled が true になれば、cost は確定しています。

  • ターミナルを閉じても、Ctrl + C を押しても、タスクはキャンセルされません。 止まるのは待機だけです。タスク ID を控えておき、あとでこのステップをもう一度実行してください。
  • 数秒に 1 回より頻繁には確認しないでください。 タスクの確認は、開始とは独立した、アカウントの読み取り枠を使います。レート制限を参照してください。
  • アプリやサーバーの場合は、 こちらから問い合わせるのではなく、タスクが終わったときに SpicyAPI から知らせてもらいましょう。待たずに通知を受け取るを参照してください。

6. 動画をダウンロードして保存する

やること: 新しいダウンロードリンクを取得し、ファイルをパソコンに保存します。

新しいリンクを取得します。

spicyapi files download-url job_01k3m8x9q2z4v7n5p6r8s0t1w3
key: tasks/2026/09/17/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4
url: https://…
expiresAt: 2026-09-17T08:52:00Z

url をブラウザーに貼り付けてダウンロードするか、ターミナルから保存します(リンクには & が含まれるので、引用符は消さないでください)。

curl -L -o my-video.mp4 "PASTE_THE_URL_HERE"

Windows PowerShell では、curl ではなく curl.exe と入力してください。1 つのタスクが複数のファイルを作った場合は、spicyapi tasks get <task-id> --json で一覧を確認し、--key で 1 つを選べます。

ここで起きたこと: どの結果にも、直接ダウンロードできるリンクが付いています。リンクは約 20 分有効で、API キーは要りません。リンクにキーを付け加えることは絶対にしないでください。期限が切れたら、タスクをもう一度照会する(または files download-url を使う)と、新しいリンクが得られます。

自分用のコピーを保存してください

SpicyAPI が生成したファイルを保存するのは最長で約 14 日です(アカウントの保存期間の設定がそれより短ければ、その期間です)。そのあとは完全に削除されます。アップロードした画像を使えるのは 1 日で、プロンプトの本文は既定で 30 日後に消去されます。タスクとその費用の記録は残ります。終了したタスクのファイルとプロンプトをもっと早く削除したい場合は、spicyapi tasks purge、purgeTask()、POST /api/v1/jobs/purge のいずれかを使ってください。削除されるのは内容だけで、返金ではありません。データ保存と破棄を参照してください。

7. うまくいかないとき

問題には 2 種類あり、それぞれ対処の仕方が異なります。

リクエストが拒否される。 コマンドや呼び出しに、すぐにエラーが返ります。何も作成されておらず、何も課金されていません。 メッセージに理由が書かれており、エラーには code と、サポートに問い合わせるときに伝えるリクエスト ID(req_…)が付いています。

コード意味対処
400、または 400 で始まるより具体的なコード入力がモデルの設定に合っていません。必須の設定が足りない、未知の設定やつづりの間違った設定がある、許されていない値がある、期限切れの spicy:// アドレスや別のアカウントの spicy:// アドレスを使っている、そのモデルがいまは対応できない設定の組み合わせになっている、コールバックアドレスが無効である、のいずれかですinput.json をステップ 1 で確認した設定と見比べて直してください。アドレスが期限切れの場合は、画像をもう一度アップロードしてください
401API キーがない、打ち間違えている、または無効化されています始める前にの手順で SPICY_API_KEY を確認してください
40201仮押さえする金額に対して、残高が足りませんコンソールの請求でチャージしてください
40202キーの利用上限(日次、月次、累計のいずれか)に達しましたAPI キーページで上限を引き上げるか、リセットされるのを待ってください
403、40301このキーではこのモデルを使えないか、許可されていない場所からリクエストが送られましたAPI キーページで、そのキーの利用可能モデルと IP 許可リストを確認してください
404あなたのアカウントにその ID のモデルがない(またはプレースホルダーを送った)か、このキーにその ID のタスクがありませんID を正確にコピーし直してください。タスクを照会するときは、作成したときと同じキーを使ってください
409この冪等キーは、すでに別のリクエストに使われています新しい動画には新しいラベルを使ってください
40901見積もりの期限(5 分)が切れたか、価格が変わりました見積もりを取り直してから、もう一度開始してください
429短い時間にリクエストが多すぎますエラーに示された秒数だけ待ち、ペースを落として続けてください
50301そのモデルは、いま新しい作業を受け付けられません時間をおいてもう一度試すか、別のモデルを選んでください

タスクが失敗する。 タスクは受理されたものの、succeeded ではなく failed か expired で終わります。タスクには理由を示す errorCode と、詳しい内容を文章で伝える errorMessage が付いています。 失敗・期限切れのタスクでは通常、仮押さえ額が全額解放されます。ただし、モデルページに明記された一部のコンテンツ拒否は、受理時の見積額で課金されます。最終請求額は settled と cost で確認してください。

確認するには、次のようにします。

spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3

state、errorCode、errorMessage を見てください。

そのうえで、メッセージの文面ではなく errorCode に基づいて、どうするかを決めます。

errorCode意味対処
rate_limited、upstream_unavailable、upstream_failed生成が混み合っていたか、一時的に使えませんでした少し間をおいてから、もう一度実行してください
timeout(または状態が expired)動画が時間内に完成しませんでしたもう一度だけ試してください。再び起きる場合は、長さを短くするか解像度を下げて、新しいタスクを開始してください
generation_failed生成は実行されましたが、何も作られませんでした同じ入力では、たいてい同じように失敗します。プロンプトか画像を変えて、新しいタスクを開始してください
invalid_asset画像を使えませんでした(アップロードの期限が切れていた、ファイルを読み取れなかった、など)画像をもう一度アップロードし、新しいアドレスで新しいタスクを開始してください
invalid_request、unsupported_combination設定が受け付けられませんでした設定を変えて、新しいタスクを開始してください
content_rejected選んだモデルが、そのモデル自身のポリシーに基づいてこのリクエストを断りましたプロンプトか画像を変えるか、別のモデルを選んでください

これ以外の値は、upstream_failed と同じように扱ってください。すべての一覧はエラーにあります。

失敗したタスクをもう一度実行する。 再試行すると、同じモデルと同じ入力で、モデルの現在の価格による新しいタスクが作られます。ステップ 4 と同じくお金がかかります。また、元の入力がそのまま使われるので、その入力で使ったアップロードの期限がすでに切れている場合は、再試行ではなく、もう一度アップロードして新しいタスクを開始してください。

spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait --wait-timeout-ms 1800000

確認を求められますが、tasks create と違って、その前に価格は表示されません。価格を知りたい場合は、ステップ 3 の tasks quote コマンドを実行してください。

再試行できるのは、failed と expired のタスクだけです。成功した動画の別バージョンを作りたい場合は、新しいラベルを用意してステップ 3 に戻ってください。受理されたタスクをキャンセルする方法はありません。詳しくはタスク確定と再試行を参照してください。

代わりに AI アシスタントから行う

Claude Code、Cursor、Codex など、MCP に対応した AI アシスタントを使っている場合は、SpicyAPI の MCP サーバーを使えば、7 つのステップをすべてアシスタントに任せられます。MCP サーバー:クライアントを設定するで一度だけ設定し、あとは自分の言葉で頼んでください。たとえば次のようにします。

/Users/me/spicy-video/start-frame.jpg にある画像を SpicyAPI にアップロードして。私のキーで使える画像から動画へのモデルを探して、いちばん安い 2 つで 5 秒のクリップの見積もりを取って。私が確認したら安いほうで動画を生成して、完成を待ってからダウンロードリンクを教えて。

Windows では、パスを C:\Users\me\spicy-video\start-frame.jpg のように指定します。

処理の流れは次のとおりです。

  1. spicyapi_upload_file が画像をアップロードし、spicy:// アドレスを取得します。無料ですが、ファイルは実際に送信されるので、対象のファイルを正確に指定してください。既定では、ホームフォルダーの中にあるファイルしか読み取れません。手元のファイルを参照してください。
  2. spicyapi_models_list と spicyapi_model_get がモデルとその設定を探し、spicyapi_task_quote が候補ごとに価格を計算します。どれも無料です。
  3. spicyapi_task_create はいったん止まって、あなたに確認します。モデル、見積額と最大請求額、見積もりの有効期限が示されます。あなたが確認するまで何も課金されず、アシスタントがあなたの代わりに確認することはできません。
  4. spicyapi_task_wait は 1 回につき最大 5 分待つので、長い動画ではアシスタントが何度か待つことがあります。そのあと、約 20 分有効なダウンロードリンクを渡してくれます。

ほかの例とすべてのツールについては、MCP サーバーを参照してください。

さらに進んだ使い方

最初と最後のフレーム

画像から動画へのモデルの中には、last_image_url を受け付けるものもあります。動画の終わりに使う 2 枚目の画像です。使っているモデルが対応しているかどうかは、ステップ 1 の properties に last_image_url があるかどうかで確認できます。ない場合、そのモデルは対応しておらず、送ると 400 で拒否されます。

ステップ 2 と同じように両方の画像をアップロードし、2 つのアドレスを input.json に入れます。

{
  "prompt": "The flower slowly opens as morning light spreads across the table",
  "image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
  "last_image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w4"
}

そのモデルが最後の画像をどう使うかは、その設定の description に書かれています。2 枚目の画像で価格が変わるかどうかを確かめるため、開始する前にもう一度見積もりを取ってください。

複数の動画を作る

  • アップロードを使い回す。 1 つの spicy:// アドレスは、expiresAt までの間、複数のタスクで使えます。ただし、アカウントのアップロードの保存期間が「タスクが終わったらすぐに削除する」設定になっている場合は除きます。
  • 動画 1 本にラベル 1 つ。 campaign-clip-1、campaign-clip-2 のように、動画ごとに別の冪等キーを付けます。こうしておけば、スクリプトをもう一度実行しても、すでに開始した動画が返ってくるだけで、二重に支払うことはありません。
  • 一度にすべてを開始しない。 実行中のタスクにはそれぞれお金が仮押さえされ、利用上限を超える分のタスクは 40202 で拒否され、状態の確認はすべてリクエスト数の上限にカウントされます。まずは 2 本ずつ始めてください。

すぐに使えるスクリプトは、同時実行数を絞ってバッチを実行する(SDK)とスクリプトから CLI を実行するにあります。

待たずに通知を受け取る

Web サイトやバックグラウンドサービスで、「もう終わった?」と尋ねるためだけにプログラムを動かし続けるのは無駄です。代わりに、タスクにコールバックアドレスを指定しましょう。これは、あなた自身のサーバー上にある公開の Web アドレスです。タスクが終わったときに SpicyAPI がそこを 1 回呼び出し、ステップ 5 で表示されるのと同じタスクの詳細を送ります。

必要なものは次のとおりです。

  • インターネットから https:// アドレスの標準のポートでアクセスできるサーバー(localhost は拒否されます)
  • コンソールで取得する Webhook の署名キー。届いた呼び出しが本当に SpicyAPI からのものかを、サーバーが確かめるために使います
  • 署名を確認し、すぐに応答し、同じ通知が 2 回届いても正しく処理できるコード

形式、署名、再試行のスケジュールは Webhook で説明しています。SDK のページには最小限の受信側の例もあります。念のための備えも用意しておいてください。通知が届かないまま deadlineAt を大きく過ぎたタスクを、ときどき確認するようにします。

見積もりを取るときとタスクを開始するときに、コールバックアドレスを付け加えます。

spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --callback-url https://your-app.example.com/hooks/spicy

CLI は自分で取る見積もりにもこのアドレスを含めるので、価格の照合はそのまま一致します。

次のステップ

このページの内容