画像および動画生成モデルを、1つのAPIキーと統一されたリクエスト形式で利用できます。画像はレスポンスで返され、動画はポーリングまたはWebhookで結果を受け取るタスクとして実行されます。
コンソール → APIキーでキーを作成します。完全なキーは一度しか表示されないため、MLMUX_API_KEYなどの環境変数にすぐに保存してください。
モデルIDとプロンプトを指定して画像または動画エンドポイントを呼び出します。利用料金はキーを所有するアカウントに請求されます。
画像リクエストはレスポンス内にURLを返します。動画リクエストはタスクを返すため、そのpoll_urlをポーリングするか、webhookをサブスクライブしてください。
https://api.mlmux.comへのすべてのリクエストで、Authorization: Bearerヘッダーにキーを含めて送信してください。キーはsk-で始まります。APIは他のヘッダーやクエリ文字列でのキーを受け付けません。
キーが機能することを確認するには、呼び出し可能なモデルを一覧取得します:
https://api.mlmux.com/v1/modelscurl https://api.mlmux.com/v1/models \
-H "Authorization: Bearer $MLMUX_API_KEY"{
"object": "list",
"data": [
{ "id": "nano-banana-2", "object": "model", "owned_by": "platform" },
{ "id": "model/seedance-2.5-max", "object": "model", "owned_by": "platform" }
]
}すべてのエンドポイントはhttps://api.mlmux.com配下にあります。特段の記載がない限り、リクエストボディおよびレスポンスボディはJSONです。
| メソッド | パス | 説明 |
|---|---|---|
GET | /v1/models | 呼び出し可能なモデルIDを一覧表示します。 |
POST | /v1/images/generations | プロンプトから画像を生成します。 |
POST | /v1/images/edits | 入力画像を編集または結合します。JSONまたはマルチパートを受け付けます。 |
GET | /v1/images/generations/{task_id} | 非同期画像タスクを取得します。編集には/v1/images/edits/{task_id}を使用します。 |
POST | /v1/videos/generations | 動画タスクを作成します。 |
GET | /v1/videos/generations/{task_id} | 動画タスクを取得します。 |
GET | /v1/tasks/{task_id} | IDで任意のタスクを取得します。 |
POST | /v1/tasks/{task_id}/cancel | 未完了のタスクをキャンセルします。 |
POST | /v1/uploads | 参照ファイルをアップロードしてURLを取得します。 |
GET | /v1/account/balance | クレジット残高を取得します。 |
リクエストボディに route_mode を設定して、アップストリーム層を選択します。リクエストはその層内に留まり、自動的に別の層へ移行することはありません。そのモデルで該当の層が無効化されている場合、リクエストは route_mode_disabled で失敗します。このフィールドを省略した場合、MLMux は API キーに設定された route mode、次にモデルのデフォルトである official-cheap を使用します。
| 値 | 説明 |
|---|---|
official | プロバイダーの公式ルート。プロバイダーの定価で請求されます。 |
official-cheap | 低コストの公式ルート。新規リクエストおよびAPIキーのデフォルトです。 |
利用料金はクレジットで請求され、1クレジットは1米ドルに相当します。動画モデルは出力トークン単位、画像モデルはモデルに応じてアップストリームのトークン単位または画像単位で課金されます。各ルートの料金については料金ページをご覧ください。
タスクレスポンスには、タスク作成時にestimated_charge_credits、成功後にactual_charge_creditsが表示されます(いずれもクレジット単位)。Webhookペイロードにはactual_charge_nano_creditsが整数で表示され、1,000,000,000ナノクレジットが1クレジットに相当します。
GET /v1/account/balanceで残高を確認できます。
動画リクエスト、および"async": trueで送信された画像リクエストは、タスクとともにHTTP 202を返します。ステータスがsucceeded、failed、expired、またはcanceledになるまで、タスクのpoll_urlを数秒おきにポーリングしてください。
| ステータス | 説明 |
|---|---|
queued | 受付済み、開始待機中。 |
submitted | アップストリームプロバイダーに送信済み。 |
running | 生成中。progressは0から100まで進みます。 |
succeeded | 完了。レスポンスに出力URLが含まれます。 |
failed | 失敗。messageに理由が示されます。 |
expired | タスクの制限時間内に完了しませんでした。 |
canceled | キャンセルエンドポイントからキャンセルされました。 |
https://api.mlmux.com/v1/tasks/{task_id}/cancelキュー中、送信済み、または実行中のタスクはキャンセル可能で、保留されていたクレジットは解放されます。レスポンスは{"id": "task_…", "status": "canceled"}になります。その他のステータスにあるタスクは409 task_not_cancelableを返します。
非同期の動画および画像生成リクエストでは、最大160文字のIdempotency-Keyヘッダーを使用できます。同じキーと同じリクエストボディを再送すると、新規タスクを作成する代わりに元のタスクが返されます。同じキーで異なるリクエストボディを送信すると、409 idempotency_key_reusedが返されます。同期リクエストおよび画像編集ではこのヘッダーを受け付けません。
ローカルファイルを参照として使用するには、マルチパートフィールドfileとしてアップロードしてください。最大50 MBまでの画像、動画、音声を受け付け、3日間保持されます。返されたurlを生成リクエストの任意のURLフィールドに渡してください。
https://api.mlmux.com/v1/uploadscurl https://api.mlmux.com/v1/uploads \
-H "Authorization: Bearer $MLMUX_API_KEY" \
-F "file=@start-frame.jpg"{
"url": "https://.../uploads/3f8a....jpg",
"asset_id": 1024,
"mime_type": "image/jpeg",
"size_bytes": 482113,
"asset_type": "image"
}Console → Webhooksでエンドポイントを作成し、受信するイベントを選択します。リクエストまたはタスクが完了すると、MLMuxは指定のURLにJSONボディを含むPOSTリクエストを送信します。
| イベント | 説明 |
|---|---|
request.succeeded | リクエストまたはタスクが成功しました。 |
request.failed | リクエストまたはタスクが失敗しました。理由はdata.error_codeとdata.error_messageに記載されています。 |
webhook.test | Consoleでエンドポイントをテストしたときに送信されます。 |
{
"event_id": "evt_5b0d...",
"event_type": "request.succeeded",
"created_at": "2026-10-26T08:00:00Z",
"data": {
"request_id": "task_task_01a9...",
"task_id": "task_01a9...",
"public_model_id": "model/seedance-2.5-max",
"api_method": "videos.generations.create",
"image_count": 0,
"image_resolution": "",
"video_seconds": 8,
"video_resolution": "720p",
"actual_charge_nano_credits": 1790000000,
"latency_ms": 94210
}
}各配信はエンドポイントの署名シークレット(whsec_…)で署名されます。これは作成時またはローテーション時に1度だけ表示されます。X-MLMux-SignatureヘッダーにはUnixタイムスタンプtと署名v1が含まれます。これはタイムスタンプ、ピリオド、生のリクエストボディの16進数HMAC-SHA256値です。同じ値を計算して比較し、古いタイムスタンプは拒絶してください。
import crypto from "node:crypto";
// header: X-MLMux-Signature: t=1767225600,v1=5f8c...
export function verifyMLMuxSignature(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 ?? ""));
}10秒以内に任意の2xxステータスを返してください。MLMuxは約11時間かけて最大6回配信を再試行します。X-MLMux-Event-IDを使用して重複した配信を無視してください。
エラーは共通のJSON構造を持ちます。messageではなくcodeで分岐処理を行ってください。サポートにお問い合わせの際は、X-Request-IDヘッダーにも返されるrequest_idをお知らせください。
{
"error": {
"message": "Invalid API key",
"type": "invalid_request_error",
"code": "invalid_api_key",
"request_id": "req_9f2c..."
}
}| HTTP | コード | 意味 |
|---|---|---|
| 400 | invalid_request | リクエストボディが有効なJSONでないか、画像生成での不明なroute_modeなどフィールドの型が正しくありません。 |
| 400 | invalid_value | resolution、size、aspect_ratio、nなどの値がモデルでサポートされていません。 |
| 400 | model_not_found | モデルIDが存在しないか、利用できません。 |
| 400 | invalid_video_request | 動画モード、参照数、アスペクト比、解像度、または再生時間が無効です。 |
| 400 | content_policy_violation | プロンプトまたは入力がコンテンツモデレーションによってブロックされました。 |
| 401 | invalid_api_key | APIキーが存在しないか、無効であるか、有効期限切れ、または無効化されています。 |
| 402 | insufficient_credits | 残高が見積もり請求額を満たしていません。クレジットを追加して再試行してください。 |
| 402 | spend_limit_exceeded | リクエストがConsoleで設定された利用限度額を超過します。 |
| 402 | api_key_monthly_limit_exceeded | リクエストがこのAPIキーの月間予算を超過します。 |
| 403 | email_verification_required | APIを利用する前にアカウントのメールアドレスを認証してください。 |
| 403 | model_not_allowed | このAPIキーは他のモデルに制限されています。 |
| 403 | forbidden_asset_reference | asset://の参照がこのアカウントに属していません。 |
| 404 | task_not_found | タスクが存在しないか、別のアカウントに属しています。 |
| 409 | idempotency_key_reused | Idempotency-Keyがすでに異なるリクエストボディで使用されています。 |
| 409 | task_not_cancelable | タスクはすでに完了しています。 |
| 429 | rate_limit_exceeded | このキーまたはアカウントの1分あたりのリクエスト数が多すぎます。 |
| 429 | capacity_exhausted | 選択したルート上のすべてのアップストリームがビジー状態です。 |
| 502 | model_unavailable | 選択したルートにはこのモデルで利用可能なアップストリームがありません。 |
| 502 | generation_failed | アップストリームプロバイダーが出力の生成に失敗しました。 |
| 503 | generation_unavailable | アップストリームプロバイダーが一時的に利用できません。 |
| 503 | route_mode_disabled | 選択した route mode はこのモデルで無効化されています。別の route_mode を送信してください。 |
| 504 | generation_timeout | アップストリームプロバイダーがタイムアウトしました。 |
429レスポンスにはRetry-Afterヘッダーが含まれます。その秒数待機してから再試行し、5xxエラーは指数バックオフで再試行してください。