動画は長さぶんだけ消費

Developers

AI から YukkuriGen を動かす

台本(話者+セリフ)を渡すと、音声を合成して MP4 をレンダーします。 あなたのAI(Claude / Cursor / 自作スクリプト)が REST か MCP で直接操作できます。フォーマットはAIに任せ、 純度の高いゆっくり動画を自動生成するための API です。

1. APIキーを発行

https://app.yukkurigen.com/settings/api-keys でキーを発行し、環境変数に入れます(発行時に一度だけ表示されます)。

無料プランの鍵でも、台本づくり・修正・音声の合成・共有リンクでの確認まで使えます。MP4 の書き出しには、 クレジットパック(買い切り・無料プランのままでも買えます)か、有料プラン(スタンダード以上)、または API連携ライセンス(買い切り)が要ります。 鍵から BGM を生成するには、有料プランか API連携ライセンスが要ります。 ChatGPT・Claude(claude.ai)は鍵の発行が要らず、コネクタに https://app.yukkurigen.com/api/mcp を貼って「許可する」を押すだけでつながります。 VS Code も同じで、この URL を種類 HTTP の MCP サーバーとして追加し、ブラウザで開く YukkuriGen の画面で「許可する」を押せば鍵は要りません(2026-10-05 に VS Code 1.139 で確認)。 Cursor などほかのエディタは URL だけでつながるかを確かめていないので、つながらなければ鍵を渡してください。

export YUKKURIGEN_API_KEY=yg_live_xxxxxxxx

2. MCP で繋ぐ(Claude Code / Cursor)

claude mcp add --transport http yukkurigen https://app.yukkurigen.com/api/mcp \
  --header "Authorization: Bearer $YUKKURIGEN_API_KEY"

主なツール: create_yukkuri_video / update_lines / generate_audio / render_mp4 / get_job / get_render / get_project / generate_bgm / list_characters / get_credits ほか多数。 全ツール一覧と使い方は skill.md を参照。

create_yukkuri_video の MP4(output:"mp4")は サーバ側のジョブとして受け付け、数秒で jobId と projectId を返します。まだ完成していないので、get_job が succeeded になったら result.renderId を get_render に渡して完成を待ちます(jobId を get_render に渡さないこと)。 サーバの設定によってはジョブにならず、同期で待ってから renderId を直接返すこともあります。そのときは get_job を挟まず、その renderId を get_render に渡します。output:"draft" はこれまでどおり同期で、数秒で返ります(消費なし)。

3. REST で繋ぐ(1コールで MP4)

curl -X POST https://app.yukkurigen.com/api/v1/agent/generate \
  -H "Authorization: Bearer $YUKKURIGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: ai-video-2026-09-15-sync-001" \
  -d '{
    "title": "AIの解説動画",
    "backgroundImageUrl": "https://example.com/bg.jpg",
    "script": [
      { "speaker": "reimu",  "text": "今日はAIについて解説するわ" },
      { "speaker": "marisa", "text": "よろしく頼むぜ" }
    ]
  }'
# → 200 { "projectId": "...", "renderId": "...", "status": "rendering" }

これは同期の呼び出しで、音声合成とレンダー開始を待ってから返ります。renderId で進捗(/render/{renderId}/progress)をポーリングして完成を待ちます。

10行の台本で45秒を超えることがあり、クライアントによってはそこで切れます。切れてもサーバ側では課金もレンダーも進んでいるので、何もせず投げ直すと二重に払うことになります。上の例のように Idempotency-Key を必ず付け、応答が返らなかったら同じ鍵で投げ直してください。最初の結果が返り、二重には課金されません (まだ処理中なら 409 in_flight が返るので、少し待って同じ鍵で再試行します)。 待ちたくないときは、次の Prefer: respond-async を使います。

待たずに受け付けてもらう(Prefer: respond-async)

Prefer: respond-async を付けると、認証・スコープ・プラン・レート上限・クレジットの確認をその場で済ませてから、 数秒で 202 と jobId / projectId を返します。残高不足などはその場でエラーが返り、 そのときプロジェクトもジョブも作られません。202 には renderId が入りません。

curl -X POST https://app.yukkurigen.com/api/v1/agent/generate \
  -H "Authorization: Bearer $YUKKURIGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: respond-async" \
  -H "Idempotency-Key: ai-video-2026-09-15-001" \
  -d '{
    "title": "AIの解説動画",
    "backgroundImageUrl": "https://example.com/bg.jpg",
    "script": [
      { "speaker": "reimu",  "text": "今日はAIについて解説するわ" },
      { "speaker": "marisa", "text": "よろしく頼むぜ" }
    ]
  }'
# → 202 { "jobId": "...", "status": "queued", "pollUrl": "/api/v1/jobs/{jobId}", "projectId": "..." }
# 1. ジョブが succeeded になるまで待つ(音声合成とレンダー開始)
curl https://app.yukkurigen.com/api/v1/jobs/$JOB_ID \
  -H "Authorization: Bearer $YUKKURIGEN_API_KEY"
# → { "jobId": "...", "kind": "agent_generate", "status": "succeeded", "projectId": "...",
#     "result": { "projectId": "...", "renderId": "...", "status": "rendering" } }

# 2. result.renderId でレンダーの完成を待つ(done === true かつ outputFile が非空で成功)
curl https://app.yukkurigen.com/api/v1/projects/$PROJECT_ID/render/$RENDER_ID/progress \
  -H "Authorization: Bearer $YUKKURIGEN_API_KEY"
  • ジョブの succeeded はレンダーの開始まで済んだという意味です。result は同期の 200 と同じ形(projectId・renderId・status: "rendering")なので、 そのあと進捗で完成を待ちます。
  • 必要なもの: Authorization: Bearer(API キー)と、スコープ render:mp4 と audio:generate の両方(ジョブの状態の取得は projects:read)。
  • クレジットは受け付けの時点で押さえます。MP4 は長さがまだ決まらないので台本の長さから見積もった分を押さえ、 音声ができて実際の長さが決まったら精算します(押さえすぎた分は戻ります)。ジョブが failed になったら error.code に理由が入り、押さえた分は返金されます(反映まで少しかかることがあります)。レンダーを起動したあとは、 押さえた分はそのレンダーに引き継がれ、レンダーの成否に従います。まれにレンダーの起動後にジョブだけが失敗した場合は、 レンダーは課金されたまま動いています——renderId に agent-{jobId} を渡して進捗で結果を確かめてください(not_found なら起動しておらず、返金されます)。
  • Idempotency-Key を必ず付けてください。同じ鍵で投げ直すと、ジョブが処理中・成功済みなら同じ jobId が返り、二重には課金されません。失敗したジョブの鍵は空くので、理由を直して同じ鍵でやり直せます (レンダーの起動後にジョブだけが失敗した場合は鍵が空かず、同じ鍵で投げ直すと起動済みのレンダーが 200 で返ります)。
  • 202 が返ったらジョブを追い、200 が返ったら同期と同じ本文(renderId 入り)として扱ってください。同じ鍵の完了済み結果の再送などでは、Prefer を付けていても 200 が返ります。
  • output:"draft" は常に同期です。Prefer を付けない呼び出しも既定では同期のままですが、 サーバの設定によっては一定時間だけ待ったあと 202 を返すことがあるので、202 も扱えるようにしておいてください。
  • ジョブで受け付ける形(2026-09-15 追加)は、2026-09-25 に本番で最後まで通しました(台本→音声→MP4 の完成まで)。 まとめて作るバッチの MP4 出力はまだ本番で通していないので、初めての形の台本は少数の行で試し、 進捗が完成(done かつ outputFile)を返すことを確かめてから流してください。

エンドポイント

MethodPath用途crScope
POST/api/v1/agent/generate台本→MP4 を1コールで生成(Prefer: respond-async でジョブとして受け付け)1/分render:mp4(ジョブは + audio:generate)
GET/api/v1/jobs/{jobId}ジョブの状態(成功すると result.renderId)0projects:read
POST/api/v1/projects/{id}/renderMP4 レンダー開始(非同期)1/分render:mp4
GET/api/v1/projects/{id}/render/{renderId}/progressレンダー進捗+出力URL0projects:read
PATCH/api/v1/projects/{id}/lines指定した行だけ直す(声の速さ・高さ voice も)0projects:write
PATCH/api/v1/projects/{id}/settings動画全体の読み上げの再生速度を焼かずに変える(voicePlaybackRate。既定 1.1)0projects:write
POST/api/v1/projects/{id}/readings/check読みを確かめる(エンジンが実際に読む音。音声の前に)0projects:read
POST/api/v1/projects/{id}/audio/generate音声を合成(MP4の前に必須)0audio:generate
PUT/api/v1/pronunciations読みの辞書に登録(語→読み。GET で一覧、DELETE ?word= で削除)0projects:write(一覧は projects:read)
GET/api/v1/characters利用可能キャラ一覧0projects:read
GET/api/v1/creditsクレジット残高0credits:read
POST/api/v1/api-keysAPIキー発行(Webのみ)0—

機械可読な定義: https://app.yukkurigen.com/openapi.json ・ エージェント用手順書: /skill.md

スコープ

  • projects:read — プロジェクト/キャラ/テンプレの読み取り
  • projects:write — プロジェクト・台本の作成/更新
  • audio:generate — 音声一括合成
  • render:mp4 — MP4 レンダー(台本→MP4 をジョブで受け付けるときは audio:generate も必要)
  • credits:read — 残高照会
  • youtube:upload — YouTube 投稿(既定では付かない。APIキー画面・OAuth の同意画面で「YouTube への投稿も許可する」を選んだときだけ。AI から投稿できるのはクレジットを使って書き出した MP4 だけ)

エラーコード

  • unauthenticated — 401 — 未認証(キーが無効/失効、またはトークン無し)
  • forbidden — 403 — 他人のプロジェクトなど、対象への権限が無い
  • insufficient_scope — 403 — 必要なスコープが無い
  • plan_required — 402 — 有料の権利が要る(purchaseUrl 同梱)。MP4 は無料プランでクレジットパックの残りも無いとき(purchase=standard と alternative=いちばん小さいパックを同梱。パックは無料プランでも買える)。BGM 生成など鍵からの一部の操作は、有料プラン(スタンダード以上)か買い切りが必要
  • insufficient_credits — 402 — クレジット不足(purchaseUrl 同梱)
  • rate_limited — 429 — レート上限
  • validation_error — 400 — リクエスト不正
  • not_found — 404 — 対象が無い
  • missing_audio — 409 — 音声が無い行がある(課金なし。generate_audio を先に呼ぶ)
  • too_many_concurrent_renders — 429 — 同時レンダーの上限(課金なし)
  • dictionary_full — 409 — 読みの辞書が上限(500語)。使わない語を消してから登録する
  • generate_failed — 500 — 生成失敗

課金と生成の関係

Web・REST・MCP のどの入口からでも同じクレジットを消費します(MP4=動画1分につき1cr・端数は切り上げ、BGM生成=2cr。台本・音声・共有リンク create_preview_link での確認は0cr)。台本は、つないだ AI が書きます(台本はサーバで生成しません。LLM は呼びません)。 クレジット不足や権限不足は purchaseUrl 付きで返るので、AI がユーザーを購入導線へ案内できます。