GPT-6 Sol・Claude Opus 5.5 提供開始GPT-6 Sol の料金は 5.6 Sol の半額

Kling 3.0 API:テキストto動画のリクエストコードと実測クリップ

テキストto動画のタスクは、model に kling-3.0 を指定した 1 回の POST で始まります。リクエストコードと必須フィールド、2026 年 10 月 29 日に作成して計測した 5 秒クリップ 2 本を掲載します。

Kiki, OmniaKey COO読了目安 7分
このページの内容

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 では必須で、クリップの長さと画質のグレードを決めます。

フィールド指定する値
modelkling-3.0
typevideo
operationtext_to_video
input.promptシーン・動作・カメラを 1 つの文字列で
parameters.duration5、10、15 のいずれか(秒単位の整数)
parameters.modestd または pro
parameters.aspect_ratio16: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 です。

python
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 です。プロンプトはどちらも書いたままの形で送っています。

紙の舟

prompt
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.
紙の舟のクリップからのフレーム。夕暮れの濡れた石畳に浮かぶ折り紙の舟と、街灯の暖かな反射。
紙の舟のクリップを時系列に並べたフレーム。Kling 3.0、テキストto動画、5 秒、standard モード、16:9、2026 年 10 月 29 日作成。

ティーポット

prompt
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.
ティーポットのクリップからのフレーム。窓辺の木のテーブルに置かれた青磁のポットと、立ち上る湯気。
ティーポットのクリップを時系列に並べたフレーム。Kling 3.0、テキストto動画、5 秒、standard モード、16:9、2026 年 10 月 29 日作成。

ファイルの計測結果

クリップ用のツールで、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.0AI動画動画APIテキストto動画API

関連記事

最近の記事