Kling 3.0 API:テキストto動画のリクエストコードと実測クリップ
テキストto動画のタスクは、model に kling-3.0 を指定した 1 回の POST で始まります。リクエストコードと必須フィールド、2026 年 10 月 29 日に作成して計測した 5 秒クリップ 2 本を掲載します。
このページの内容
Kling 3.0 のテキストto動画タスクは、https://api.omniakey.com/v1/media/tasks への 1 回の POST です。model id に kling-3.0、operation に text_to_video を指定し、duration(5・10・15 秒)と mode(std または pro)の 2 つが必須パラメータになります。応答にはタスク id が入るので、成功するまでポーリングしてから MP4 をダウンロードします。2026 年 10 月 29 日には 5 秒・standard モードのクリップを 1280×720 で 2 本作成し、ファイルとフレームを計測しました。
Kling 3.0 のリクエストで指定するもの
ボディに入れるフィールドは 7 つです。このうち duration と mode は Kling では必須で、クリップの長さと画質のグレードを決めます。
| フィールド | 指定する値 |
|---|---|
model | kling-3.0 |
type | video |
operation | text_to_video |
input.prompt | シーン・動作・カメラを 1 つの文字列で |
parameters.duration | 5、10、15 のいずれか(秒単位の整数) |
parameters.mode | std または pro |
parameters.aspect_ratio | 16:9、9:16、1:1 |
モデルページのサンプルは duration 6 と resolution 720p を送っていますが、どちらもここでは無効です。このページが受け付けるのは 5・10・15 秒だけで、resolution という独立したフィールドはないと明記されています(モデルページ、2026 年 10 月 29 日確認)。FAQ では standard の出力が 720P、pro が 1080P に対応するとされています。
音声はデフォルトで付き、オン・オフの切り替えはページに記載がありません(2026 年 10 月 29 日確認)。aspect_ratio はテキストto動画に適用され、image to video は最初のフレームから縦横比を決めるため、明示的な比率は拒否されます。今回の 2 本は std・5 秒・16:9 で、pro モード、10 秒と 15 秒、9:16 と 1:1、image to video、last frame は範囲外です。
結果を左右するのはプロンプトの書き方です。シーン・動作・カメラをどう書くかは Kling 3.0 プロンプトガイド で解説しています。
リクエストコード
Python ファイル 1 つで、ボディの送信、タスクのポーリング、MP4 のダウンロードまで完結します。キーは環境変数 OMNIAKEY_API_KEY から読み、作成リクエストにはランダムな Idempotency-Key を付け、ポーリングの間隔は 5 秒で最大 180 回です。ボディの内容は次の節の 2 本と同じで、model kling-3.0、type は video、operation は text_to_video、duration 5、mode std、アスペクト比 16:9 です。
import json
import os
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def poll(url, attempts=5):
for attempt in range(attempts):
try:
return request("GET", url)
except urllib.error.HTTPError as err:
if err.code < 500 or attempt == attempts - 1:
raise
except urllib.error.URLError:
if attempt == attempts - 1:
raise
time.sleep(5 * (attempt + 1))
def text_to_video(prompt, out_path, duration=5, mode="std", aspect_ratio="16:9"):
body = {
"model": "kling-3.0",
"type": "video",
"operation": "text_to_video",
"input": {"prompt": prompt},
"parameters": {"duration": duration, "mode": mode, "aspect_ratio": aspect_ratio},
}
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
print("task", task, flush=True)
for _ in range(180):
time.sleep(5)
state = poll(f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # 署名付きリンクは有効期限が短いので、すぐダウンロードする
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
if __name__ == "__main__":
task = text_to_video(
"A paper boat drifts slowly down a rain-soaked street at dusk. Warm streetlights reflect on "
"the wet cobblestones. The camera follows the boat at a steady pace. No people, no text.",
"paper-boat.mp4",
)
print("done", task)
各ポーリングはタスクの URL への GET です。ループが見るのは status で、progress.percent はクリップのレンダリング中に 0 のままになることがあるため使いません。status が queued と processing 以外になったら停止し、succeeded なら assets[0].url からダウンロード、それ以外ならタスク自身のエラーメッセージを送出します。ダウンロードはすぐに行ってください。アセットのリンクは有効期限が短く、切れていたらタスクを再取得して新しい URL を入手します。接続断やサーバーエラー(5xx)が起きたポーリングは最大 5 回まで再試行し、待ち時間を少しずつ延ばします。
2026 年 10 月 29 日に同じ設定でもう一度このファイルを実行しました。最初の試行はポーリング中に接続が切れたため、現在のポーリングには再試行が入っています。2 回目の実行で返ってきたタスクは task_PNB1kPopriUyfcHsXhVWY2hBOEoSUIqM で、MP4 は 5.04 秒、1280×720、ステレオ AAC トラックでした。作成からダウンロードまで 807 秒かかり、下の 2 本は 82.2 秒と 110.7 秒だったので、待ち時間は長めに見込んでください。
作成した 2 本のクリップ
2 回のリクエストはどちらも 2026 年 10 月 29 日に上のボディで送信しました。paper boat のタスクは task_cbOtsBxO75cml3nOmVUu9YG3PkYXW2ja、teapot のタスクは task_M2Ub1EoCaCUa1FjOZDdWDOuEOS9nRjnt です。プロンプトはどちらも書いたままの形で送っています。
紙の舟
A paper boat drifts slowly down a rain-soaked street at dusk. Warm streetlights reflect on the wet cobblestones. The camera follows the boat at a steady pace. No people, no text.

ティーポット
A ceramic teapot sits on a wooden table by a window. Steam rises in slow curls. Soft morning light moves across the table. The camera pushes in slowly. No people, no text.

ファイルの計測結果
クリップ用のツールで、2026 年 10 月 29 日に各ダウンロードを計測しました。
- 紙の舟 — サイズ: 1280×720; フレームレート: 24.0 fps; 長さ: 5.04 秒; 音声: AAC、2 チャンネル、44.1 kHz; 平均レベル: −50.9 dB; 最大レベル: −34.0 dB; カット: なし
- ティーポット — サイズ: 1280×720; フレームレート: 24.0 fps; 長さ: 5.04 秒; 音声: AAC、2 チャンネル、44.1 kHz; 平均レベル: −54.3 dB; 最大レベル: −35.9 dB; カット: なし
- コード実行のクリップ — サイズ: 1280×720; フレームレート: 24.0 fps; 長さ: 5.04 秒; 音声: AAC、2 チャンネル、44.1 kHz; 平均レベル: −48.4 dB; 最大レベル: −20.0 dB; カット: なし
最初の 2 本はかなり静かで、平均レベルは −50.9 dB と −54.3 dB、ピークは −34.0 dB と −35.9 dB です。コード実行のクリップはより大きく、平均 −48.4 dB、ピーク −20.0 dB でした。計測したのはレベルだけで、トラックの中身は対象外としています。ショットチェンジ検出は 3 本とも強いカットも弱いカットも見つけず、どのクリップも 1 ショットとして再生されます。
フレームから分かること
どちらのクリップもプロンプトに沿っており、ティーポットの方は小さな動きが 1 つ加わっています。
紙の舟のクリップでは、舟が 5.04 秒間ずっと画面の中央付近にとどまり、濡れた街並みが背後を流れていくため、カメラが舟を追うショットに見えます。街灯の暖かな反射は最後のフレームまで石畳に残っています(2026 年 10 月 29 日にフレームを確認)。追従を遮るカットはありません。
ティーポットのクリップでは、湯気がゆっくりと巻き上がって消え、朝の光が木のテーブルの上を移動します。最後のフレームではティーポットが最初より大きく、右下寄りに位置しており、寄りのカメラに少し横方向の移動が加わったように見えます。プロンプトが求めたのはゆっくりした寄りで、この横移動はプロンプトにはない動きです(2026 年 10 月 29 日にフレームを確認)。

エラーと制限
duration が 5・10・15 以外だと HTTP 400 model_price_error が返り、ジョブは作成されません(動画 API ドキュメント、2026 年 10 月 29 日確認)。許可された 3 つの値から秒単位の整数で送ってください。
Idempotency-Key なしで作成リクエストを送ると 400 missing_idempotency_key が返ります。キーは最大 255 文字です。同じキーと同じボディなら既存のタスクが HTTP 200 で返り、新たな課金は発生しません。同じキーでボディを変えると 409 idempotency_key_reused になります(メディア API の概要、2026 年 10 月 29 日確認)。
2026 年 10 月 29 日、Python の urllib の既定の User-Agent で POST すると、Cloudflare から HTTP 403 とボディ error code: 1010 が返りました。独自の User-Agent ヘッダーを付けると API に到達しました。作成リクエストとダウンロードの両方で User-Agent を設定してください。
出力リンクは短命です。assets[].url を保存せず、タスクを再ポーリングして新しい URL を取得してください(動画 API ドキュメント、2026 年 10 月 29 日確認)。タスクの記録は作成後 24 時間保持されます(メディア API の概要、2026 年 10 月 29 日確認)。
Kling 3.0 の課金は秒単位ではなく生成ごとです(動画 API ドキュメント、2026 年 10 月 29 日確認)。現在の料金は OmniaKey の料金ページ を確認してください。
よくある質問
kling-3.0 が受け付ける長さは?
5・10・15 秒です。それ以外の値は HTTP 400 model_price_error を返し、ジョブは作成されません(動画 API ドキュメント、2026 年 10 月 29 日確認)。
std と pro の違いは?
モデルページでは Standard と Pro と呼び、standard の出力は 720P、pro は 1080P に対応します(2026 年 10 月 29 日確認)。std のみを実行したため、両者の差は実測できていません。
クリップに音声は入りますか?
どのクリップにも 44.1 kHz・2 チャンネルの AAC トラックが入っています。最初の 2 本は非常に静かで、平均レベルは −50.9 dB と −54.3 dB、コード実行のクリップは平均 −48.4 dB、ピーク −20.0 dB でした。レベルだけを計測し、中身は特定していません。
画像からクリップを始められますか?
モデルページには、最初のフレームと任意の最後のフレームを使う image to video が記載されています(2026 年 10 月 29 日確認)。最初のフレームがアスペクト比を決め、この operation では明示的なアスペクト比は拒否されます。
クリップの生成にはどれくらいかかりますか?
2026 年 10 月 29 日の 2 回の実行では、紙の舟が 110.7 秒、ティーポットが 82.2 秒で完了しました。どちらも 5 秒・std・16:9 のクリップです。
Kling 3.0 のモデルページ から始めて、同じボディに自分のプロンプトを入れて送ってください。
この記事で紹介しているモデル
関連記事
Kling 3.0 プロンプトガイド:構造・例文・実際に生成した動画
4つのプロンプトと、実際に生成した4本の動画。カットがどこで入ったか、セリフがどこまで通ったか、カメラがどこで止まったかを見ます。
Kling 3.0 vs Seedance 2.5
どちらもOmniaKeyで稼働中で、同じカットを担当できます。違いは課金の作り方です。片方はmodeとdurationの行列で1生成ごとに固定課金、もう片方は出力秒数かける解像度で課金され、参照画像を使えるのは片方だけです。
HappyHorse 1.1 vs Kling 3.0:同じプロンプトで比較、仕上がりと料金
同じ3本のプロンプトで、HappyHorse 1.1 は屋台と香水瓶の周回を制し、Kling 3.0 はスケートの技を決めました。

