ナビゲーションにスキップ

Kling V4

テキスト、時間順に並べたフレーム、または参照画像・参照動画・参照音声と名前付きのエレメントから、720p または 1080p、3~30 秒の音声付き動画を生成します。料金は秒単位です。

  • 非同期です。作成の呼び出しはタスク ID を返し、動画はタスクが成功した時点で得られます。
  • 入力方法は 4 通りです。テキストのみ、フレーム(時間順に並べた images)、参照画像・参照動画・参照音声、そして名前付きの elements(最大 7 つ)です。フレームは参照素材やエレメントと組み合わせられません。
  • プロンプトでは各入力をメンションで指定します。@image_1、@video_1、@voice_1、@ とエレメント名、@first_frame、@keyframe_1、@last_frame です。すべての @ は同じリクエストの入力を指す必要があります。
  • 音声は常に生成されます。keep_original_sound を使うと、代わりに参照動画そのものの音声を残します。
  • duration は 3~30 秒(デフォルト 5)、解像度は 720p(デフォルト)または 1080p です。料金は選んだ解像度での動画の秒数で決まり、失敗したタスクには課金されません。
POST/v1/videos/tasks試してみる

このモデルをテスト画面で開きます。BeatAPI の API キーを入力するとタスクを作成できます。実際に呼び出され、ご自身の残高から課金されます。

モデル ID

このエンドポイントには Kling の生成モデルが 2 つあります。以下の値はゲートウェイの契約から直接取得しています。参照素材、3 枚以上のフレーム、最大 7 つのエレメントを受け付けるのは Kling V4 だけです。

モデル IDduration(秒)resolutionフレームの上限参照画像の上限エレメントの上限選ぶ場面
kling-v43–30720p, 1080p10107最長 30 秒の動画、参照画像・参照動画・参照音声、中間フレーム、または 4 つ以上のエレメントが必要な場合。
kling-v33–15std, pro2—3マルチショットのストーリーボード、音声なしの動画、またはより低い秒単価が必要な場合。

エンドポイントと認証

POST https://api.beatapi.io/v1/videos/tasks

Authorization string 必須

BeatAPI の API キーを Bearer <BEATAPI_API_KEY> の形式で送信します。キーはダッシュボードで作成できます。キーはサーバー側で保管し、ブラウザーやモバイルアプリに含めないでください。

ボディは JSON で送信し、Content-Type: application/json を指定します。Idempotency-Key は任意です。論理的に 1 件のリクエストごとに一意の値(255 文字以内)を送り、まったく同じボディを再試行するときだけ再利用してください。24 時間以内に同じキーと同じボディで再試行すると、最初のレスポンスが Idempotent-Replayed: true 付きで再度返されます。同じキーで異なるボディを送ると 409 idempotency_conflict が返ります。2xx 以外のレスポンスは保存されないため、400 や 402 の後の再試行は改めて実行されます。

リクエストの流れ

1

タスクを作成する

下記のパラメーターをエンドポイントに POST します。201 が返れば、タスクが受け付けられ、料金が残高から仮確保されたことを意味します。処理はバックグラウンドで実行されます。data.id を保存してください。

2

完了を待つ

GET /v1/tasks/{task_id} を呼び出し、status が succeeded または failed になるまで、呼び出しの間隔を data.poll_after_seconds(画像は 5 秒、動画は 8 秒)だけ空けてください。あるいは task.succeeded と task.failed のWebhookを登録することもできます。処理タイムアウトで停止したタスクはイベントを送信しないため、フォールバックとしてポーリングも続けてください。

3

結果を保存する

succeeded の場合は、すべての data.output.media[].url をダウンロードし、必要なファイルを保存してください。結果 URL がいつまで利用できるかは保証されません。failed の場合は、data.error_code と data.error_message を確認してください。仮確保された金額は残高に戻されます。data.retryable は、同じリクエストをもう一度送れば成功する可能性があるかどうかを示します。

入力モード

モード必須の入力備考
テキストから動画model、promptメディアは送りません。aspect_ratio を省略すると 16:9 になります。
開始フレームmodel、prompt、images(リンク 1 個)動画はその画像から始まり、画像の形を引き継ぎます。
開始フレームと終了フレームmodel、prompt、images(リンク 2 個)images[0] が開始フレーム、images[1] が終了フレームです。
複数フレームmodel、prompt、images(リンク 3~10 個)開始フレーム、中間フレーム、終了フレームを時間順に並べます。画像は動画の秒数より最大 1 枚多くまでです。
参照素材とエレメントmodel、prompt、および reference_images、reference_videos、reference_audios、elements のいずれか下記の上限内で自由に組み合わせられます。images とは組み合わせられません。各入力をプロンプトでメンションしてください。

リクエストパラメーター

model string 必須

実行するモデルです。

値:kling-v4

値が正しくない場合

  • 指定がない場合:"model" is required
  • 画像モデルをこのエンドポイントに送った場合:"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint

prompt string 必須

動画の中で起きること(被写体、動き、カメラワーク、スタイル、音)です。各入力は @ のメンションで指定します。

長さ:1–5000 文字

  • 長さは文字数で数えます(CJK 文字も 1 文字として数えます)。
  • メンションの書き方:reference_images は @image_1、@image_2 …、reference_videos は @video_1 …、reference_audios は @voice_1 …、エレメントは @ に続けてその name を書きます。フレームは @first_frame、@keyframe_1、@keyframe_2 … と @last_frame です。
  • すべての @ は同じリクエストの入力を指す必要があります。参照画像が 2 枚なのに @image_3 と書く、画像が 1 枚なのに @last_frame と書くなど、対応する入力がない番号付きメンションやフレームのメンションは、タスク作成時に拒否されます。

値が正しくない場合

  • 指定がない場合:"prompt" is required
  • 空、または上限を超える長さの場合:"prompt" has an unsupported length
  • リクエストに含まれない入力をメンションした場合:the prompt names @image_3, which this request does not send

images string[] 任意

時間順に並べたフレームです。リンク 1 個は開始フレーム、2 個は開始フレームと終了フレームで、それ以上はその間に中間フレームを加えます。

要素数:1–10
各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • リンクが 3 個以上の場合、images[0] が開始フレーム、最後のリンクが終了フレームで、その間のリンクが中間フレームです。images[1] が @keyframe_1、images[2] が @keyframe_2 というように続きます。
  • 画像は動画の秒数より最大 1 枚多くまで(duration + 1。duration を省略した場合は 5 秒として数えます)で、どの場合も 10 枚を超えられません。
  • フレームは reference_images、reference_videos、reference_audios、elements、aspect_ratio と一緒に送れません。動画は開始フレームの形を引き継ぎます。

値が正しくない場合

  • リンクが 10 個を超える場合:"images" accepts at most 10 items
  • リンクが duration + 1 個を超える場合(この例は 5 秒の動画に 7 個):Kling V4 takes at most 6 images for a 5-second video
  • いずれかの reference_* フィールドと組み合わせた場合:Cannot combine "images" with reference inputs in one task
  • elements と組み合わせた場合:Kling V4 cannot combine elements with images
  • aspect_ratio と組み合わせた場合:Kling V4 takes the first frame's shape; do not send aspect_ratio with images
  • https:// のリンクではない場合:"images[0]" must be a public HTTPS URL

reference_images string[] 任意

動画の内容、キャラクター、商品、スタイルを導く画像です。プロンプトではリストの順に @image_1、@image_2 … と書きます。

要素数:1–10
各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • images とは組み合わせられません。
  • 参照素材とエレメントの合計 15 個の上限に含まれます。

値が正しくない場合

  • 上限を超える場合:"reference_images" accepts at most 10 items
  • 参照素材とエレメントが合計 15 個を超える場合:Kling V4 takes at most 15 reference inputs and elements together

reference_videos string[] 任意

動き、カメラワーク、内容を取り入れる動画です。プロンプトではリストの順に @video_1、@video_2 … と書きます。

要素数:1–5
各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • 各クリップは 2~30 秒、すべてのクリップの合計は 30 秒以内です。ゲートウェイはタスク作成前に各クリップを測定し、上限を外れたクリップはどれかを示したうえで拒否します。
  • 参照動画と動画エレメントは合計 5 個までで、参照素材とエレメントの合計 15 個の上限にも含まれます。
  • 完成した動画には生成された音声が付きます。keep_original_sound: true を送ると、参照動画そのものの音声を残します。

値が正しくない場合

  • 上限を超える場合:"reference_videos" accepts at most 5 items
  • クリップが 2 秒より短い、または 30 秒より長い場合:reference_videos[0] is 35 seconds long; this model takes reference video of 2 to 30 seconds.
  • クリップの合計が 30 秒を超える場合:The reference videos run 36 seconds in total; this model takes at most 30.
  • 参照動画と動画エレメントが合計 5 個を超える場合:Kling V4 takes at most 5 reference videos and video elements together

reference_audios string[] 任意

動画で使う声です。プロンプトではリストの順に @voice_1、@voice_2 … と書きます。

要素数:1–3
各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • images とは組み合わせられません。
  • 参照素材とエレメントの合計 15 個の上限に含まれます。

値が正しくない場合

  • 上限を超える場合:"reference_audios" accepts at most 3 items

elements object[] 任意

キャラクター、動物、小道具、衣装、シーン、エフェクトなど、名前を付けた被写体を最大 7 つ定義します。それぞれ一度だけ定義し、プロンプトでは @ に続けてその name を書きます。

要素数:≤ 7

  • 最大 7 個のオブジェクトからなる配列です。各オブジェクトは次のキーだけを受け付けます。
  • elements[].name(文字列、必須):英字、数字、アンダースコア、漢字の 1~20 文字で、同じリクエスト内で大文字と小文字を区別せずに重複できません。image_N、video_N、voice_N、keyframe_N、object_N、audio_N、first_frame、last_frame は使えません。
  • elements[].element_input_urls(文字列の配列):エレメントを写した画像の公開 HTTPS リンク 2~4 個です。最初の画像がメインビューです。
  • elements[].element_input_video_urls(文字列の配列):キャラクターを写した 3~8 秒のワンショット動画の公開 HTTPS リンクをちょうど 1 個です。element_input_urls とはどちらか一方だけを送ります。
  • elements[].element_input_audio_urls(文字列の配列、任意):キャラクターのエレメントの声となる公開 HTTPS 音声リンクをちょうど 1 個です。
  • elements[].tag(文字列、任意):エレメントの種類です。動画エレメント、または声を持つエレメントはキャラクターである必要があります。tag を省略するか、character を送ってください。
  • elements[].description(文字列、任意):エレメントの説明で、最大 100 文字です。
  • 動画エレメントは最大 3 個、reference_videos との合計は最大 5 個です。すべてのエレメントが参照素材とエレメントの合計 15 個の上限に含まれます。
  • エレメントは images と一緒に送れません。

値が正しくない場合

  • エレメントが 7 個を超える場合:"elements" accepts at most 7 items
  • エレメントがオブジェクトではない場合:"elements[0]" must be an object
  • エレメントに name がない場合:"name" is required in "elements[0]"
  • name が空、または 20 文字を超える場合:"elements[0].name" has an unsupported length
  • name に他の文字が含まれる、または予約名を使った場合:elements[0].name "image_1" is not a name Kling V4 accepts
  • 同じ name が 2 回出てくる場合(大文字と小文字は区別しません):elements[1].name "Hero" is used twice
  • 画像と動画の両方がある、またはどちらもない場合:elements[0] takes either element_input_urls or element_input_video_urls
  • 画像が 2 枚未満の場合:"elements[0].element_input_urls" requires at least 2 item
  • 画像が 4 枚を超える場合:"elements[0].element_input_urls" accepts at most 4 items
  • 動画エレメントの tag が character ではない場合:elements[0] is a video element, which is always a character
  • tag が character ではないエレメントに声がある場合:elements[0] has a voice, which only a character element takes
  • tag が一覧にない値の場合:"elements[0].tag" must be one of: [character animal prop costume scene effect others]
  • description が 100 文字を超える場合:"elements[0].description" has an unsupported length
  • エレメントが受け付けないキーがある場合:field "start_time" is not supported in "elements[0]"
  • 動画エレメントが 3 個を超える場合:Kling V4 takes at most 3 video elements
  • images と組み合わせた場合:Kling V4 cannot combine elements with images

duration integer 任意デフォルト: 5

動画の長さ(秒、整数)です。課金はこの値に基づきます。

デフォルト:5
範囲:3–30

  • 省略すると 5 が使われ、その分が課金されます。
  • フレームを使う場合は画像の枚数の上限にもなります。最大 duration + 1 枚で、10 枚を超えられません。

値が正しくない場合

  • 範囲外、整数ではない、または文字列として送った場合:"duration" is outside its supported range

aspect_ratio string 任意デフォルト: 16:9

動画の形(幅:高さ)です。

指定できる値:16:9, 9:16, 1:1, 21:9
デフォルト:16:9

  • 省略すると 16:9 になります。
  • images と一緒に送らないでください。動画は開始フレームの形を引き継ぎます。

値が正しくない場合

  • 一覧にない値の場合:"aspect_ratio" must be one of: [16:9 9:16 1:1 21:9]
  • images と一緒に送った場合:Kling V4 takes the first frame's shape; do not send aspect_ratio with images

resolution string 任意デフォルト: 720p

出力解像度です。1080p は 720p より秒単価が高くなります。

指定できる値:720p, 1080p
デフォルト:720p

  • 省略すると 720p が使われ、その分が課金されます。
  • このモデルでは 4K は使えません。

値が正しくない場合

  • 一覧にない値の場合(例:4K や pro):"resolution" must be one of: [720p 1080p]

keep_original_sound boolean 任意

生成された音声の代わりに、参照動画そのものの音声を完成した動画に残します。

  • reference_videos と一緒の場合だけ有効です。参照動画なしで送ると、false であっても拒否されます。
  • 省略すると、動画には生成された音声が付きます。音声をオフにするフィールドはありません。

値が正しくない場合

  • true または false ではない場合:"keep_original_sound" must be a boolean
  • reference_videos なしで送った場合:"keep_original_sound" needs reference_videos

ゲートウェイはタスク作成前に、次の組み合わせも確認します。

  • images と参照メディアのフィールドは同時に使用できません。
  • images は時間順に並べたフレームです。1 枚は開始フレーム、2 枚は開始フレームと終了フレームで、それ以上はその間に中間フレームを加えます。プロンプトではそれぞれ @first_frame、@keyframe_1、@keyframe_2 … と @last_frame と書きます。
  • 画像は動画の秒数より最大 1 枚多くまでで、どの場合も 10 枚を超えられません。
  • プロンプトでは、reference_images を @image_1、@image_2 …、reference_videos を @video_1 …、reference_audios を @voice_1 …、エレメントを @ とその名前で指定します。プロンプト内のすべての @ は、同じリクエストの入力を指す必要があります。
  • 参照動画は各 2~30 秒、合計 30 秒までです。参照動画と動画エレメントは合計 5 個まで、そのうち動画エレメントは 3 個までです。reference_images、reference_videos、reference_audios、elements は合計 15 個までです。
  • エレメントは、element_input_urls の画像 2~4 枚(1 枚目がメインビュー)か、element_input_video_urls の 3~8 秒のワンショットのキャラクター動画 1 本で構成します。element_input_audio_urls はキャラクターのエレメントに声を与えます。
  • エレメント名は英字、数字、アンダースコア、漢字の 1~20 文字で、大文字と小文字を区別せずに重複できません。image_N、video_N、voice_N、keyframe_N、object_N、audio_N、first_frame、last_frame は使えません。
  • elements と aspect_ratio は images と一緒に送れません。出力は開始フレームの形を引き継ぎます。images がない場合、aspect_ratio の既定値は 16:9 です。
  • keep_original_sound は参照動画そのものの音声を残し、reference_videos が必要です。それ以外の場合、動画には生成された音声が付きます。

入力メディアの上限

ゲートウェイはタスク作成前にすべての入力を読み取り、次の上限を超えるものは、その入力を示す 400 bad_request で拒否します。課金はされません。

メディアタスク作成前に確認される上限
画像幅・高さとも 300~65536 px;アスペクト比(幅 ÷ 高さ)0.4~2.5
動画1 本あたり 2~30 秒;合計 30 秒以内
  • ゲートウェイはタスク作成前に images、reference_images、reference_videos を測定し、上限を外れた入力を、リストと位置を示すメッセージで拒否します。例:reference_videos[0] is 35 seconds long; this model takes reference video of 2 to 30 seconds. 課金はされません。
  • エレメントのリンクと reference_audios については、タスク作成前には公開 HTTPS リンクかどうかだけを確認します。エレメントの動画は 3~8 秒である必要があります。
  • ローカルのファイルを使う場合は、POST /v1/files でアップロードし、返された data.url を渡してください。

プロンプトのメンション

入力の種類ごとにメンションがあり、リストの順に 1 から番号を付けます。

メンション指す入力使える条件
@image_1、@image_2 …reference_imagesその番号以上の枚数の参照画像を送っている
@video_1、@video_2 …reference_videosその番号以上の本数の参照動画を送っている
@voice_1、@voice_2 …reference_audiosその番号以上の数の参照音声を送っている
@ + エレメント名同じ name のエレメントそのエレメントが elements にある
@first_frameimages[0]画像を 1 枚以上送っている
@keyframe_1、@keyframe_2 …images[1] 以降の中間フレーム画像を 3 枚以上送っている
@last_frameimages の最後のリンク画像を 2 枚以上送っている
  • 対応する入力がない番号付きメンションやフレームのメンションは、タスク作成時に拒否されます。例:the prompt names @last_frame, which this request does not send

組み合わせのルール

以下はタスク作成時に確認されます。いずれかに違反したリクエストは 400 bad_request で拒否され、課金されません。

ルールメッセージ
images といずれかの reference_* フィールドCannot combine "images" with reference inputs in one task
images と elementsKling V4 cannot combine elements with images
images と aspect_ratioKling V4 takes the first frame's shape; do not send aspect_ratio with images
画像が duration + 1 枚を超える(この例は 5 秒の動画)Kling V4 takes at most 6 images for a 5-second video
reference_videos なしの keep_original_sound"keep_original_sound" needs reference_videos
動画エレメントが 3 個を超えるKling V4 takes at most 3 video elements
参照動画と動画エレメントが合計 5 個を超えるKling V4 takes at most 5 reference videos and video elements together
参照画像、参照動画、参照音声、エレメントが合計 15 個を超えるKling V4 takes at most 15 reference inputs and elements together

このモデルが受け付けないフィールド

次のフィールドを送ると、無視されるのではなく、課金前に拒否されます。

  • sound、generate_audio、seed、multi_shots、multi_prompt、quality、watermark、task_type、output_format → field "sound" is not supported by model kling-v4(送ったフィールド名が入ります)。
  • その他の不明なフィールド → unknown field: <name>。

リクエスト例

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "kling-v4",
"prompt": "A dramatic product reveal of a glass water bottle, slow orbiting camera, soft studio reflections, a low ambient synth tone",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
}'

テキストから動画

生成音声付きの 5 秒、16:9、720p のクリップです。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "kling-v4",
"prompt": "A dramatic product reveal of a glass water bottle, slow orbiting camera, soft studio reflections, a low ambient synth tone",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
}'

開始フレームと終了フレーム

1080p で 1 枚目の画像から 2 枚目の画像へ移り、開始フレームの形を引き継ぎます。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "kling-v4",
"prompt": "The camera moves from the bottle in @first_frame to the singer on a neon stage in @last_frame in one continuous shot",
"images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
],
"duration": 5,
"resolution": "1080p"
}'

参照画像と声

参照画像 2 枚と声 1 つを使い、それぞれをプロンプトでメンションします。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "kling-v4",
"prompt": "The singer from @image_1 lifts the bottle from @image_2 toward the camera and says a short line in the voice of @voice_1",
"reference_images": [
"https://media.beatapi.io/samples/neon-singer.png",
"https://media.beatapi.io/samples/smart-bottle.png"
],
"reference_audios": [
"https://media.beatapi.io/samples/neon-singer-preview.mp3"
],
"duration": 8,
"aspect_ratio": "9:16",
"resolution": "720p"
}'

元の音声を残す参照動画

プレースホルダーを 2~30 秒の自分のクリップに置き換えてください。keep_original_sound で、生成音声の代わりにその音声を残します。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "kling-v4",
"prompt": "Restyle @video_1 as a neon-lit night scene and keep its camera movement",
"reference_videos": [
"https://your-cdn.example.com/clips/source.mp4"
],
"keep_original_sound": true,
"duration": 10,
"resolution": "720p"
}'

名前付きのエレメント

キャラクターと小道具を、それぞれ 2 枚の画像(1 枚目がメインビュー)で定義します。プレースホルダーのリンクは自分の画像に置き換えてください。

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "kling-v4",
"prompt": "@singer walks across a neon stage holding @bottle and smiles at the camera",
"duration": 6,
"aspect_ratio": "16:9",
"resolution": "720p",
"elements": [
{
"name": "singer",
"tag": "character",
"description": "A performer in a silver jacket",
"element_input_urls": [
"https://your-cdn.example.com/elements/singer-front.png",
"https://your-cdn.example.com/elements/singer-side.png"
]
},
{
"name": "bottle",
"tag": "prop",
"element_input_urls": [
"https://your-cdn.example.com/elements/bottle-front.png",
"https://your-cdn.example.com/elements/bottle-back.png"
]
}
]
}'

レスポンス

タスクの作成(201)

タスクオブジェクトです。タスクが成功するまで output は null です。「実行中」と記載されたフィールドは、タスクの完了後に表示されなくなります。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "kling-v4",
"capability_version": 1,
"media_type": "video",
"model": "kling-v4",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 8,
"output": null,
"usage": {
"credits_reserved": 1,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 1,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
フィールド型説明
data.idstringタスク ID です。task_ の後に英数字 32 文字が続きます。ポーリングや Webhook イベントとの照合に使います。
data.objectstring常に task です。
data.task_kindstringimage または video です。
data.capability_idstring送信したモデル ID です。
data.capability_versionintegerモデルの仕様バージョンです。現在は 1 です。
data.media_typestringimage または video です。
data.modelstring送信したモデル ID です(capability_id と同じ)。
data.statusstringqueued、processing、succeeded、failed のいずれかです。最終状態は後ろの 2 つだけです。
data.stagestringstatus と同じ値です。古いクライアント向けに残されています。
data.created_atintegerタスクの作成日時(Unix 秒)です。
data.updated_atinteger最終更新日時(Unix 秒)です。
data.completed_atinteger | nullタスクの完了日時(Unix 秒)です。実行中は null です。
data.poll_after_secondsinteger実行中のみ。次のポーリングまでに待つ秒数です(画像は 5、動画は 8)。
data.typical_secondsobject実行中のみ、直近のタスクが十分にある場合に含まれます。直近 window の samples 件のタスクについて、完了までの時間(秒)の p50 と p90 を示します。
data.outputobject | null結果です。status が succeeded になるまでは null です。下の出力フィールドを参照してください。
data.usage.credits_reservednumberタスク作成時に残高から仮確保された金額(USD)です。
data.usage.credits_chargednumberこのタスクの料金(USD)です。失敗したタスクでは 0 です。
data.usage.credits_settlednumber最終的に差し引かれた金額(USD)です。タスクが成功した時点で設定され、それ以外では 0 です。
data.usage.credits_refundednumber残高に戻された金額(USD)です。失敗したタスクでは、返金が記録された時点で仮確保した金額と一致します。
data.usage.billable_duration_secondsinteger動画のみ。料金の算定に使われた秒数です。モデルが長さを報告しない場合は含まれません。
data.request_idstringリクエスト ID です。サポートに問い合わせる際に添えてください。
data.error_codestring | null失敗コードです。タスクが失敗した場合以外は null です。
data.error_messagestring | null何が問題で、何を変更すればよいかを示します。タスクが失敗した場合以外は null です。

完了したタスク

GET /v1/tasks/{task_id} は HTTP 200 と status: "succeeded" を返し、結果は data.output に入ります。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "kling-v4",
"capability_version": 1,
"media_type": "video",
"model": "kling-v4",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "video",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4",
"mime_type": "video/mp4"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4"
},
"usage": {
"credits_reserved": 1,
"credits_settled": 1,
"credits_refunded": 0,
"credits_charged": 1,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

出力フィールド

フィールド型説明
output.mediaobject[]生成されたファイルです。このモデルでは動画が 1 本です。
output.media[].typestring常に video です。
output.media[].urlstring保存された動画への HTTPS リンクです。ダウンロードして保管してください。保持期間は保証されません。
output.media[].mime_typestringファイルのメディアタイプです。通常は video/mp4 です。
output.r2_urlstring古いクライアント向けに、動画の URL を再掲したものです。代わりに media を読んでください。

失敗したタスク

失敗したタスクも、GET /v1/tasks/{task_id} では HTTP 200 になります。失敗はボディに示されます。仮確保された金額は全額戻されるため、課金されません。

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "kling-v4",
"capability_version": 1,
"media_type": "video",
"model": "kling-v4",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 1,
"credits_settled": 0,
"credits_refunded": 1,
"credits_charged": 0,
"billable_duration_seconds": 5
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
フィールド型説明
data.error_codestringbad_request と content_policy_violation(リクエストを修正してください)、または processing_unavailable、processing_timeout、processing_failed、result_transfer_failed(時間をおいて再試行してください)のいずれかです。エラーを参照してください。
data.error_messagestring問題と対処方法を示す文です。
data.retryableboolean失敗したタスクにのみ含まれます。同じリクエストをもう一度送れば成功する可能性がある場合は true です。
data.usageobject返金が記録された時点(通常はタスクが失敗した瞬間)で、credits_charged と credits_settled は 0 になり、credits_refunded は credits_reserved と一致します。

完全なコード例

タスクを作成し、サーバーが示すポーリング間隔で完了を待ち、結果の URL を出力します。環境変数に BEATAPI_API_KEY を設定し、requests をインストールしてください。

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/videos/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "kling-v4",
"prompt": "A dramatic product reveal of a glass water bottle, slow orbiting camera, soft studio reflections, a low ambient synth tone",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

課金

  • 料金は、選んだ解像度での動画の秒数で決まります。720p は 1 秒あたり 0.20、‘1080p‘は1秒あたり0.20、`1080p` は 1 秒あたり 0.30 です。下の一覧は 8 秒のクリップの料金です。
  • 秒数は duration で、省略すると 5 です。タスクの usage.billable_duration_seconds に表示されます。
  • どの動画にも音声(生成された音声、または残した参照動画の音声)が付き、追加料金はかかりません。
  • 料金はタスクの作成時に予約され、動画の完成時に確定します。失敗したタスク(送信後にモデレーションで拒否されたものを含む)は全額返金されます。

現在の定価です。料金ページと同じ金額です。割引を個別に契約しているアカウントでは、より低い金額になります。実際に課金された金額は、タスクの data.usage で確認できます。

オプション定価(USD)
8 秒 · 720p$1.6
8 秒 · 1080p$2.4

よくあるエラー

エラーまたは症状原因対処
400 the prompt names @image_3, which this request does not send参照画像が 2 枚なのに 3 枚目を指すなど、リクエストに含まれない入力をメンションしています。すべての @ を同じリクエストの入力に対応させてください。番号はリストの順に 1 から数えます。
400 Cannot combine "images" with reference inputs in one taskimages のフレームを、reference_images、reference_videos、reference_audios と一緒に送っています。フレームか参照素材のどちらか一方を使ってください。フレームとしてではなく動画を導く画像は reference_images に入れます。
400 Kling V4 cannot combine elements with imageselements をフレームと一緒に送っています。images か elements のどちらかを削除してください。
400 Kling V4 takes the first frame's shape; do not send aspect_ratio with imagesaspect_ratio をフレームと一緒に送っています。aspect_ratio を削除し、開始フレームを希望の形に切り抜いてください。
400 Kling V4 takes at most 6 images for a 5-second videoフレームが duration + 1 枚を超えています。フレームを減らすか、duration を長くしてください。どの場合も 10 枚が上限です。
400 elements[0] takes either element_input_urls or element_input_video_urlsエレメントに画像と動画の両方がある、またはどちらもありません。各エレメントには、画像 2~4 枚か、キャラクター動画 1 本を指定してください。
400 "elements[0].element_input_urls" requires at least 2 itemエレメントの画像が 1 枚しかありません。エレメントの画像を 2~4 枚送り、メインビューを 1 枚目にしてください。
400 elements[0].name "image_1" is not a name Kling V4 accepts名前に英字、数字、アンダースコア、漢字以外の文字が含まれている、または image_1 や first_frame のような予約名です。singer や hero_bottle のような名前に変え、その名前でメンションしてください。
400 "keep_original_sound" needs reference_videosreference_videos なしで keep_original_sound を送っています。このフィールドを削除するか、音声を残したい参照動画を追加してください。
400 reference_videos[0] is 35 seconds long; this model takes reference video of 2 to 30 seconds.参照クリップが 2 秒より短い、または 30 秒より長いです。すべてのクリップの合計は 30 秒までです。クリップを必要な部分だけに切り詰めてください。
400 field "sound" is not supported by model kling-v4音声は常に生成され、音声のオン・オフを切り替える設定はありません(generate_audio、seed、multi_shots も拒否されます)。そのフィールドを削除してください。参照動画の音声を残すには keep_original_sound: true を送ります。
400 "resolution" must be one of: [720p 1080p]4K、または pro のような区分名を送っています。720p または 1080p を送ってください。
400 "duration" is outside its supported range3~30 の整数ではない、または文字列として送っています。5 のような整数を送ってください。
タスクが failed になり、content_policy_violation が返るプロンプト、入力、または生成結果がモデレーションで拒否されました。プロンプトまたは入力を変更してください。そのまま再試行しても再び失敗します。課金はされません。
402 insufficient_credits残高が、この長さと解像度の予約額を下回っています。チャージするか、duration を短くするか、720p を使ってください。

HTTP エラー早見表

タスクが作られる前のエラーは、2xx 以外のレスポンスで返されます。課金はされません。error.code または error.retryable で処理を分岐してください。message には問題の内容が示されます。全一覧と再試行のルールはエラーにあります。

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP ステータスerror.code対処方法
400bad_request, content_policy_violationリクエストを修正してください。メッセージにフィールド名が示されます。そのまま再試行しないでください。
401missing_api_key, invalid_api_key(古いクライアントでは unauthorized が返ることがあります)有効なキーを Authorization: Bearer <key> で送信してください。
402insufficient_credits残高をチャージするか、キーのクォータを引き上げてから、再度送信してください。
403forbiddenこのキーまたはアカウントでは、このモデルを利用できない可能性があります(たとえば、無料クレジットは一部のモデルにのみ使えます)。そのまま再試行しないでください。
404not_foundGET /v1/tasks/{task_id} の場合:このキーのアカウントに該当するタスクが存在しません。ID を確認してください。
409idempotency_conflict新しい Idempotency-Key を使うか、同じキーの最初のリクエストが完了するまで待ってください。
429rate_limit_exceededRetry-After の秒数(error.retry_after_seconds にも含まれます)だけ待ってから再試行してください。
500internal_errorバックオフを入れて再試行してください。解消しない場合は、request_id を添えてサポートにお問い合わせください。
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failed課金はされていません。指数バックオフで再試行してください。

認証

AuthorizationBearer

Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.

ヘッダー

Idempotency-Keystringオプション<=255 characters

ボディは JSON で送信し、Content-Type: application/json を指定します。Idempotency-Key は任意です。論理的に 1 件のリクエストごとに一意の値(255 文字以内)を送り、まったく同じボディを再試行するときだけ再利用してください。24 時間以内に同じキーと同じボディで再試行すると、最初のレスポンスが Idempotent-Replayed: true 付きで再度返されます。同じキーで異なるボディを送ると 409 idempotency_conflict が返ります。2xx 以外のレスポンスは保存されないため、400 や 402 の後の再試行は改めて実行されます。

リクエスト

This endpoint expects an object.
modelenum必須

実行するモデルです。

値:kling-v4

値が正しくない場合

  • 指定がない場合:"model" is required
  • 画像モデルをこのエンドポイントに送った場合:"model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
許可された値:
promptstring必須1-5000 characters

動画の中で起きること(被写体、動き、カメラワーク、スタイル、音)です。各入力は @ のメンションで指定します。

長さ:1–5000 文字

  • 長さは文字数で数えます(CJK 文字も 1 文字として数えます)。
  • メンションの書き方:reference_images は @image_1、@image_2 …、reference_videos は @video_1 …、reference_audios は @voice_1 …、エレメントは @ に続けてその name を書きます。フレームは @first_frame、@keyframe_1、@keyframe_2 … と @last_frame です。
  • すべての @ は同じリクエストの入力を指す必要があります。参照画像が 2 枚なのに @image_3 と書く、画像が 1 枚なのに @last_frame と書くなど、対応する入力がない番号付きメンションやフレームのメンションは、タスク作成時に拒否されます。

値が正しくない場合

  • 指定がない場合:"prompt" is required
  • 空、または上限を超える長さの場合:"prompt" has an unsupported length
  • リクエストに含まれない入力をメンションした場合:the prompt names @image_3, which this request does not send
aspect_ratioenumオプションデフォルト値 16:9

動画の形(幅:高さ)です。

指定できる値:16:9, 9:16, 1:1, 21:9

デフォルト:16:9

  • 省略すると 16:9 になります。
  • images と一緒に送らないでください。動画は開始フレームの形を引き継ぎます。

値が正しくない場合

  • 一覧にない値の場合:"aspect_ratio" must be one of: [16:9 9:16 1:1 21:9]
  • images と一緒に送った場合:Kling V4 takes the first frame's shape; do not send aspect_ratio with images
許可された値:
durationintegerオプション3-30デフォルト値 5

動画の長さ(秒、整数)です。課金はこの値に基づきます。

デフォルト:5

範囲:3–30

  • 省略すると 5 が使われ、その分が課金されます。
  • フレームを使う場合は画像の枚数の上限にもなります。最大 duration + 1 枚で、10 枚を超えられません。

値が正しくない場合

  • 範囲外、整数ではない、または文字列として送った場合:"duration" is outside its supported range
elementslist of objectsオプション

キャラクター、動物、小道具、衣装、シーン、エフェクトなど、名前を付けた被写体を最大 7 つ定義します。それぞれ一度だけ定義し、プロンプトでは @ に続けてその name を書きます。

要素数:≤ 7

  • 最大 7 個のオブジェクトからなる配列です。各オブジェクトは次のキーだけを受け付けます。
  • elements[].name(文字列、必須):英字、数字、アンダースコア、漢字の 1~20 文字で、同じリクエスト内で大文字と小文字を区別せずに重複できません。image_N、video_N、voice_N、keyframe_N、object_N、audio_N、first_frame、last_frame は使えません。
  • elements[].element_input_urls(文字列の配列):エレメントを写した画像の公開 HTTPS リンク 2~4 個です。最初の画像がメインビューです。
  • elements[].element_input_video_urls(文字列の配列):キャラクターを写した 3~8 秒のワンショット動画の公開 HTTPS リンクをちょうど 1 個です。element_input_urls とはどちらか一方だけを送ります。
  • elements[].element_input_audio_urls(文字列の配列、任意):キャラクターのエレメントの声となる公開 HTTPS 音声リンクをちょうど 1 個です。
  • elements[].tag(文字列、任意):エレメントの種類です。動画エレメント、または声を持つエレメントはキャラクターである必要があります。tag を省略するか、character を送ってください。
  • elements[].description(文字列、任意):エレメントの説明で、最大 100 文字です。
  • 動画エレメントは最大 3 個、reference_videos との合計は最大 5 個です。すべてのエレメントが参照素材とエレメントの合計 15 個の上限に含まれます。
  • エレメントは images と一緒に送れません。

値が正しくない場合

  • エレメントが 7 個を超える場合:"elements" accepts at most 7 items
  • エレメントがオブジェクトではない場合:"elements[0]" must be an object
  • エレメントに name がない場合:"name" is required in "elements[0]"
  • name が空、または 20 文字を超える場合:"elements[0].name" has an unsupported length
  • name に他の文字が含まれる、または予約名を使った場合:elements[0].name "image_1" is not a name Kling V4 accepts
  • 同じ name が 2 回出てくる場合(大文字と小文字は区別しません):elements[1].name "Hero" is used twice
  • 画像と動画の両方がある、またはどちらもない場合:elements[0] takes either element_input_urls or element_input_video_urls
  • 画像が 2 枚未満の場合:"elements[0].element_input_urls" requires at least 2 item
  • 画像が 4 枚を超える場合:"elements[0].element_input_urls" accepts at most 4 items
  • 動画エレメントの tag が character ではない場合:elements[0] is a video element, which is always a character
  • tag が character ではないエレメントに声がある場合:elements[0] has a voice, which only a character element takes
  • tag が一覧にない値の場合:"elements[0].tag" must be one of: [character animal prop costume scene effect others]
  • description が 100 文字を超える場合:"elements[0].description" has an unsupported length
  • エレメントが受け付けないキーがある場合:field "start_time" is not supported in "elements[0]"
  • 動画エレメントが 3 個を超える場合:Kling V4 takes at most 3 video elements
  • images と組み合わせた場合:Kling V4 cannot combine elements with images
imageslist of stringsオプション

時間順に並べたフレームです。リンク 1 個は開始フレーム、2 個は開始フレームと終了フレームで、それ以上はその間に中間フレームを加えます。

要素数:1–10

各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • リンクが 3 個以上の場合、images[0] が開始フレーム、最後のリンクが終了フレームで、その間のリンクが中間フレームです。images[1] が @keyframe_1、images[2] が @keyframe_2 というように続きます。
  • 画像は動画の秒数より最大 1 枚多くまで(duration + 1。duration を省略した場合は 5 秒として数えます)で、どの場合も 10 枚を超えられません。
  • フレームは reference_images、reference_videos、reference_audios、elements、aspect_ratio と一緒に送れません。動画は開始フレームの形を引き継ぎます。

値が正しくない場合

  • リンクが 10 個を超える場合:"images" accepts at most 10 items
  • リンクが duration + 1 個を超える場合(この例は 5 秒の動画に 7 個):Kling V4 takes at most 6 images for a 5-second video
  • いずれかの reference_* フィールドと組み合わせた場合:Cannot combine "images" with reference inputs in one task
  • elements と組み合わせた場合:Kling V4 cannot combine elements with images
  • aspect_ratio と組み合わせた場合:Kling V4 takes the first frame's shape; do not send aspect_ratio with images
  • https:// のリンクではない場合:"images[0]" must be a public HTTPS URL
keep_original_soundbooleanオプション

生成された音声の代わりに、参照動画そのものの音声を完成した動画に残します。

  • reference_videos と一緒の場合だけ有効です。参照動画なしで送ると、false であっても拒否されます。
  • 省略すると、動画には生成された音声が付きます。音声をオフにするフィールドはありません。

値が正しくない場合

  • true または false ではない場合:"keep_original_sound" must be a boolean
  • reference_videos なしで送った場合:"keep_original_sound" needs reference_videos
reference_audioslist of stringsオプション

動画で使う声です。プロンプトではリストの順に @voice_1、@voice_2 … と書きます。

要素数:1–3

各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • images とは組み合わせられません。
  • 参照素材とエレメントの合計 15 個の上限に含まれます。

値が正しくない場合

  • 上限を超える場合:"reference_audios" accepts at most 3 items
reference_imageslist of stringsオプション

動画の内容、キャラクター、商品、スタイルを導く画像です。プロンプトではリストの順に @image_1、@image_2 … と書きます。

要素数:1–10

各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • images とは組み合わせられません。
  • 参照素材とエレメントの合計 15 個の上限に含まれます。

値が正しくない場合

  • 上限を超える場合:"reference_images" accepts at most 10 items
  • 参照素材とエレメントが合計 15 個を超える場合:Kling V4 takes at most 15 reference inputs and elements together
reference_videoslist of stringsオプション

動き、カメラワーク、内容を取り入れる動画です。プロンプトではリストの順に @video_1、@video_2 … と書きます。

要素数:1–5

各要素は公開されている https:// の URL です。ローカルファイルは先に アップロード(POST /v1/files)し、返された data.url を渡してください。

  • 各クリップは 2~30 秒、すべてのクリップの合計は 30 秒以内です。ゲートウェイはタスク作成前に各クリップを測定し、上限を外れたクリップはどれかを示したうえで拒否します。
  • 参照動画と動画エレメントは合計 5 個までで、参照素材とエレメントの合計 15 個の上限にも含まれます。
  • 完成した動画には生成された音声が付きます。keep_original_sound: true を送ると、参照動画そのものの音声を残します。

値が正しくない場合

  • 上限を超える場合:"reference_videos" accepts at most 5 items
  • クリップが 2 秒より短い、または 30 秒より長い場合:reference_videos[0] is 35 seconds long; this model takes reference video of 2 to 30 seconds.
  • クリップの合計が 30 秒を超える場合:The reference videos run 36 seconds in total; this model takes at most 30.
  • 参照動画と動画エレメントが合計 5 個を超える場合:Kling V4 takes at most 5 reference videos and video elements together
resolutionenumオプションデフォルト値 720p

出力解像度です。1080p は 720p より秒単価が高くなります。

指定できる値:720p, 1080p

デフォルト:720p

  • 省略すると 720p が使われ、その分が課金されます。
  • このモデルでは 4K は使えません。

値が正しくない場合

  • 一覧にない値の場合(例:4K や pro):"resolution" must be one of: [720p 1080p]
許可された値:

レスポンス

タスクオブジェクトです。タスクが成功するまで output は null です。「実行中」と記載されたフィールドは、タスクの完了後に表示されなくなります。

エラー

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error