メインコンテンツへスキップ

🎯 コアコンセプトを理解する

MidJourney API は Discord のボタン操作をシミュレート します。一般的な REST API とは異なり、各操作が次のステップ用の新しいボタンを返す 状態機械 として動作します。

4 つのコア API

API用途使用するタイミング
POST /mj/submit/imagineテキストから画像を生成すべてのワークフローの開始点
GET /mj/task/\{id\}/fetchタスク状態を照会してボタンを取得submit のたびに実行(完了までポーリング)
POST /mj/submit/actionボタンをクリックする(upscale、vary、zoom など)画像に対して操作したいとき
POST /mj/submit/modal追加の入力を送信status が MODAL の場合のみ

📊 完全なワークフロー図

┌─────────────────────────────────────────────────────────────────────────────┐
│                         MIDJOURNEY API WORKFLOW                             │
└─────────────────────────────────────────────────────────────────────────────┘

  ┌──────────────────┐
  │  POST /submit/   │  ← Step 1: Submit prompt, get task_id
  │     imagine      │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_1" }

  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 2: Poll until status = "SUCCESS"
  │      fetch       │
  └────────┬─────────┘
           │ Returns: imageUrl + buttons[] (U1,U2,U3,U4,V1,V2,V3,V4,🔄)

  ┌──────────────────┐
  │  POST /submit/   │  ← Step 3: Click a button using customId
  │     action       │
  └────────┬─────────┘
           │ Returns: { "result": "task_id_2" }

  ┌──────────────────┐
  │ GET /task/{id}/  │  ← Step 4: Poll the new task
  │      fetch       │
  └────────┬─────────┘

           ├─── status = "SUCCESS" → 完了!imageUrl を取得

           └─── status = "MODAL" → 追加の入力が必要(Step 5 を参照)


           ┌──────────────────┐
           │  POST /submit/   │  ← Step 5: 特殊操作のための mask/prompt を送信
           │      modal       │
           └────────┬─────────┘
                    │ Returns: { "result": "task_id_3" }

           ┌──────────────────┐
           │ GET /task/{id}/  │  ← Step 6: SUCCESS になるまでポーリング
           │      fetch       │
           └──────────────────┘

🔑 重要な概念: Buttons と customId

成功した各タスクは buttons 配列を返します。各ボタンには customId があり、これを使って次のアクションをトリガーします。 /mj/task/\{id\}/fetch からのレスポンス例:
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/xxx",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::abc123", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::abc123", "label": "U2" },
    { "customId": "MJ::JOB::variation::1::abc123", "label": "V1" },
    { "customId": "MJ::JOB::reroll::0::abc123", "emoji": "🔄" }
  ]
}
⚠️ 重要: customId は固定値ではありません。タスクごとに変わります。必ず buttons 配列から取得してください。

📋 ステージ別ボタンリファレンス

IMAGINE 後(4分割グリッド画像)

初回の画像生成が完了すると、以下のボタンが返されます:
ButtoncustomId PatternActionResult
U1-U4MJ::JOB::upsample::1::xxx単一画像をアップスケール高解像度の単一画像
V1-V4MJ::JOB::variation::1::xxxバリエーションを生成新しい4分割グリッド
🔄MJ::JOB::reroll::0::xxx::SOLOすべて再生成新しい4分割グリッド

UPSCALE 後(単一画像)

アップスケール後は、編集ツールにアクセスできます:
LabelNeeds Modal?
Upscale (Subtle) / Upscale (2x)❌ No
Upscale (Creative) / Upscale (4x)❌ No
Vary (Subtle) 🪄❌ No
Vary (Strong) 🪄❌ No
Vary (Region) 🖌️✅ Yes (mask)
Zoom Out 2x / 1.5x 🔍❌ No
Custom Zoom 🔍✅ Yes (prompt)
⬅️➡️⬆️⬇️ Pan❌ No
Animate 🎞️❌ No
🔄 Reroll❌ No
注: ボタンラベルと customId の形式は、プロンプトで指定した MJ バージョン(例: --v 6.1--v 5.2)によって異なる場合があります。必ず API レスポンスからボタンを読み取ってください。
⚠️ Inpaint(Vary Region)ボタンは Upscale 後にのみ表示されます!

⚡ 完全な例: Generate & Upscale

ステップ 1: Imagine リクエストを送信

curl -X POST 'https://api.cometapi.com/mj/submit/imagine' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "botType": "MID_JOURNEY",
    "prompt": "a cute cat --v 6.1",
    "accountFilter": { "modes": ["FAST"] }
  }'
レスポンス:
{ "code": 1, "result": "1768464763141701" }

ステップ 2: タスクステータスをポーリング

curl -X GET 'https://api.cometapi.com/mj/task/1768464763141701/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'
レスポンス(完了時):
{
  "status": "SUCCESS",
  "imageUrl": "https://api.cometapi.com/mj/image/1768464763141701",
  "buttons": [
    { "customId": "MJ::JOB::upsample::1::5f20922e-xxx", "label": "U1" },
    { "customId": "MJ::JOB::upsample::2::5f20922e-xxx", "label": "U2" },
    ...
  ]
}

ステップ 3: U1 をクリックしてアップスケール

curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "1768464763141701",
    "customId": "MJ::JOB::upsample::1::5f20922e-xxx"
  }'
レスポンス:
{ "code": 1, "result": "1768464800000000" }

ステップ 4: 新しいタスクをポーリングして結果を取得

curl -X GET 'https://api.cometapi.com/mj/task/1768464800000000/fetch' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>'

⚠️ Modal が必要になるのはいつですか?

/mj/submit/action を呼び出した際に、タスクステータスが SUCCESS ではなく MODAL になった場合、追加の入力を提供するために /mj/submit/modal を呼び出す必要があります。

確認済みの Modal 操作

OperationButtonWhat to Submit
InpaintVary (Region)maskBase64(PNG マスク)+ prompt
Custom Zoom🔍 Custom Zoomprompt(例: “your prompt —zoom 2”)
例: Inpaint フロー
# 1. Click Vary (Region) button via Action API
curl -X POST 'https://api.cometapi.com/mj/submit/action' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{"taskId": "xxx", "customId": "MJ::Inpaint::xxx", "enableRemix": true}'

# 2. Poll and see status = "MODAL"
curl -X GET 'https://api.cometapi.com/mj/task/new_task_id/fetch'
# Response: { "status": "MODAL" }

# 3. Submit mask and prompt via Modal API
curl -X POST 'https://api.cometapi.com/mj/submit/modal' \
  -H 'Authorization: Bearer <YOUR_COMETAPI_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "taskId": "new_task_id",
    "prompt": "replace with golden crown",
    "maskBase64": "data:image/png;base64,..."
  }'

🚀 速度モードの選択

パスに速度プレフィックスを追加します:
モードパスプレフィックス
Fast/mj-fast/mj-fast/mj/submit/imagine
Turbo/mj-turbo/mj-turbo/mj/submit/imagine
Relax(デフォルト)/mj/submit/imagine

🔗 その他のエントリーポイント

これらの API は、imagine → action フローに従わない独立したエントリーポイントです:
API用途
POST /mj/submit/blend2〜5 枚の画像を 1 枚にブレンド
POST /mj/submit/describe画像からプロンプト(Prompt)を生成
POST /mj/submit/video画像を動画に変換
POST /mj/submit/editsマスクを使って画像を編集

❓ トラブルシューティングのヒント

API の設計とワークフローに基づき、遭遇する可能性のある一般的な問題を以下に示します:
問題考えられる原因解決方法
Vary(Region)ボタンが見つからない4 分割グリッド画像を見ている先にアップスケールします(U1〜U4 をクリック)その後ボタンを確認してください
タスクのステータスが MODAL のまま止まっている操作に追加の入力が必要必要なデータを指定して /mj/submit/modal を呼び出してください
customId が機能しない古い値またはハードコードした値を使用している必ず /mj/task/\{id\}/fetch のレスポンスから最新の customId を取得してください
buttons 配列が空タスクがまだ進行中ボタンにアクセスする前に status: "SUCCESS" になるまで待ってください